ElasticSql2DslParser.java 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package org.es.sql.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.ParserException;
  5. import com.alibaba.druid.sql.parser.Token;
  6. import com.google.common.collect.ImmutableList;
  7. import org.es.sql.bean.ElasticDslContext;
  8. import org.es.sql.bean.ElasticSqlParseResult;
  9. import org.es.sql.bean.SQLArgs;
  10. import org.es.sql.druid.ElasticSqlExprParser;
  11. import org.es.sql.druid.ElasticSqlSelectQueryBlock;
  12. import org.es.sql.exception.ElasticSql2DslException;
  13. import org.es.sql.listener.ParseActionListener;
  14. import org.es.sql.listener.ParseActionListenerAdapter;
  15. import org.es.sql.parser.sql.*;
  16. import java.lang.reflect.Array;
  17. import java.util.Collection;
  18. import java.util.List;
  19. public class ElasticSql2DslParser {
  20. public ElasticSqlParseResult parse(String sql) throws ElasticSql2DslException {
  21. return parse(sql, null, new ParseActionListenerAdapter());
  22. }
  23. public ElasticSqlParseResult parse(String sql, ParseActionListener parseActionListener) throws ElasticSql2DslException {
  24. return parse(sql, null, parseActionListener);
  25. }
  26. public ElasticSqlParseResult parse(String sql, Object[] sqlArgs) throws ElasticSql2DslException {
  27. return parse(sql, sqlArgs, new ParseActionListenerAdapter());
  28. }
  29. public ElasticSqlParseResult parse(String sql, Object[] sqlArgs, ParseActionListener parseActionListener) throws ElasticSql2DslException {
  30. SQLQueryExpr queryExpr = null;
  31. try {
  32. ElasticSqlExprParser elasticSqlExprParser = new ElasticSqlExprParser(sql);
  33. SQLExpr sqlQueryExpr = elasticSqlExprParser.expr();
  34. check(elasticSqlExprParser, sqlQueryExpr, sqlArgs);
  35. queryExpr = (SQLQueryExpr) sqlQueryExpr;
  36. }
  37. catch (ParserException ex) {
  38. throw new ElasticSql2DslException(ex);
  39. }
  40. SQLArgs sqlParamValues = (sqlArgs != null && sqlArgs.length > 0) ? new SQLArgs(sqlArgs) : null;
  41. ElasticDslContext elasticDslContext = new ElasticDslContext(queryExpr, sqlParamValues);
  42. if (queryExpr.getSubQuery().getQuery() instanceof ElasticSqlSelectQueryBlock) {
  43. for (QueryParser sqlParser : buildSqlParserChain(parseActionListener)) {
  44. sqlParser.parse(elasticDslContext);
  45. }
  46. }
  47. else {
  48. throw new ElasticSql2DslException("[syntax error] Sql only support Select Sql");
  49. }
  50. return elasticDslContext.getParseResult();
  51. }
  52. private void check(ElasticSqlExprParser sqlExprParser, SQLExpr sqlQueryExpr, Object[] sqlArgs) {
  53. if (sqlExprParser.getLexer().token() != Token.EOF) {
  54. throw new ElasticSql2DslException("[syntax error] Sql last token is not EOF");
  55. }
  56. if (!(sqlQueryExpr instanceof SQLQueryExpr)) {
  57. throw new ElasticSql2DslException("[syntax error] Sql is not select druid");
  58. }
  59. if (sqlArgs != null && sqlArgs.length > 0) {
  60. for (Object arg : sqlArgs) {
  61. if (arg instanceof Array || arg instanceof Collection) {
  62. throw new ElasticSql2DslException("[syntax error] Sql arg cannot support collection type");
  63. }
  64. }
  65. }
  66. }
  67. private List<QueryParser> buildSqlParserChain(ParseActionListener parseActionListener) {
  68. //SQL解析器的顺序不能改变
  69. return ImmutableList.of(
  70. //解析SQL指定的索引和文档类型
  71. new QueryFromParser(parseActionListener),
  72. //解析SQL查询指定的match条件
  73. new QueryMatchConditionParser(parseActionListener),
  74. //解析SQL查询指定的where条件
  75. new QueryWhereConditionParser(parseActionListener),
  76. //解析SQL排序条件
  77. new QueryOrderConditionParser(parseActionListener),
  78. //解析路由参数
  79. new QueryRoutingValParser(parseActionListener),
  80. //解析分组统计
  81. new QueryGroupByParser(parseActionListener),
  82. //解析SQL查询指定的字段
  83. new QuerySelectFieldListParser(parseActionListener),
  84. //解析SQL的分页条数
  85. new QueryLimitSizeParser(parseActionListener)
  86. );
  87. }
  88. }