ElasticSql2DslParser.java 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package org.elasticsearch.dsl.parser;
  2. import com.alibaba.druid.sql.ast.SQLExpr;
  3. import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
  4. import com.alibaba.druid.sql.parser.Token;
  5. import org.elasticsearch.common.lang3.StringUtils;
  6. import org.elasticsearch.dsl.ElasticDslBuilder;
  7. import org.elasticsearch.dsl.ElasticDslContext;
  8. import org.elasticsearch.dsl.exception.ElasticSql2DslException;
  9. import org.elasticsearch.sql.ElasticSqlExprParser;
  10. public class ElasticSql2DslParser {
  11. private String sql;
  12. public ElasticSql2DslParser(String sql) {
  13. if (StringUtils.isBlank(sql)) {
  14. throw new IllegalArgumentException("constructor args [sql] cannot be blank!");
  15. }
  16. this.sql = sql;
  17. }
  18. /**
  19. * 执行sql到dsl转换
  20. *
  21. * @return 解析后dsl上下文
  22. * @throws ElasticSql2DslException 当解析出现语法错误时抛出
  23. */
  24. public ElasticDslContext parse() {
  25. ElasticSqlExprParser elasticSqlExprParser = new ElasticSqlExprParser(sql);
  26. SQLExpr sqlQueryExpr = elasticSqlExprParser.expr();
  27. check(elasticSqlExprParser, sqlQueryExpr);
  28. ElasticDslBuilder dslBuilder = new ElasticDslBuilder((SQLQueryExpr) sqlQueryExpr);
  29. return dslBuilder.build();
  30. }
  31. private void check(ElasticSqlExprParser sqlExprParser, SQLExpr sqlQueryExpr) {
  32. if (sqlExprParser.getLexer().token() != Token.EOF) {
  33. throw new ElasticSql2DslException("[syntax error] Sql last token is not EOF");
  34. }
  35. if (!(sqlQueryExpr instanceof SQLQueryExpr)) {
  36. throw new ElasticSql2DslException("[syntax error] Sql is not select sql");
  37. }
  38. }
  39. }