ElasticDslBuilder.java 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package org.elasticsearch.dsl;
  2. import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
  3. import com.google.common.collect.ImmutableList;
  4. import org.elasticsearch.dsl.exception.ElasticSql2DslException;
  5. import org.elasticsearch.dsl.parser.*;
  6. import org.elasticsearch.sql.ElasticSqlSelectQueryBlock;
  7. import java.util.List;
  8. public class ElasticDslBuilder {
  9. private SQLQueryExpr queryExpr;
  10. public ElasticDslBuilder(SQLQueryExpr queryExpr) {
  11. this.queryExpr = queryExpr;
  12. }
  13. //SQL解析器的顺序不能改变
  14. private static final List<ElasticSqlParser> sqlParseProcessors = ImmutableList.of(
  15. //解析SQL指定的索引和文档类型
  16. QueryFromParser::parseQueryIndicesAndTypes,
  17. //解析SQL查询指定的where条件
  18. QueryWhereConditionParser::parseFilterCondition,
  19. //解析SQL排序条件
  20. QueryOrderConditionParser::parseOrderCondition,
  21. //解析SQL查询指定的字段
  22. QuerySelectFieldListParser::parseSelectFieldList
  23. );
  24. public ElasticDslContext build() {
  25. ElasticDslContext dslContext = new ElasticDslContext(queryExpr);
  26. if (queryExpr.getSubQuery().getQuery() instanceof ElasticSqlSelectQueryBlock) {
  27. sqlParseProcessors.stream().forEach(sqlParser -> sqlParser.parse(dslContext));
  28. return dslContext;
  29. }
  30. throw new ElasticSql2DslException("[syntax error] ElasticSql only support Select Sql, but get: " + queryExpr.getSubQuery().getQuery().getClass());
  31. }
  32. }