ElasticDslBuilder.java 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  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. private List<ElasticSqlParser> buildSqlParserChain() {
  14. //SQL解析器的顺序不能改变
  15. return ImmutableList.of(
  16. //解析SQL指定的索引和文档类型
  17. new QueryFromParser(),
  18. //解析SQL查询指定的where条件
  19. new QueryWhereConditionParser(),
  20. //解析SQL排序条件
  21. new QueryOrderConditionParser(),
  22. //解析SQL查询指定的字段
  23. new QuerySelectFieldListParser(),
  24. //解析SQL的分页条数
  25. new QueryLimitSizeParser()
  26. );
  27. }
  28. public ElasticDslContext build() {
  29. ElasticDslContext dslContext = new ElasticDslContext(queryExpr);
  30. if (queryExpr.getSubQuery().getQuery() instanceof ElasticSqlSelectQueryBlock) {
  31. buildSqlParserChain().stream().forEach(sqlParser -> sqlParser.parse(dslContext));
  32. return dslContext;
  33. }
  34. throw new ElasticSql2DslException("[syntax error] ElasticSql only support Select Sql, but get: " + queryExpr.getSubQuery().getQuery().getClass());
  35. }
  36. }