Bladeren bron

Merge branch 'master' into 2.x

spuerx 9 jaren geleden
bovenliggende
commit
4cefcc21ee

+ 20 - 3
src/main/java/org/elasticsearch/dsl/bean/ElasticSqlParseResult.java

@@ -32,6 +32,8 @@ public class ElasticSqlParseResult {
     private List<String> queryFieldList;
     /*SQL的where条件*/
     private transient BoolQueryBuilder whereCondition;
+    /*SQL的where条件*/
+    private transient BoolQueryBuilder matchCondition;
     /*SQL的order by条件*/
     private transient List<SortBuilder> orderBy;
 
@@ -95,6 +97,14 @@ public class ElasticSqlParseResult {
         this.whereCondition = whereCondition;
     }
 
+    public BoolQueryBuilder getMatchCondition() {
+        return matchCondition;
+    }
+
+    public void setMatchCondition(BoolQueryBuilder matchCondition) {
+        this.matchCondition = matchCondition;
+    }
+
     public List<SortBuilder> getOrderBy() {
         return orderBy;
     }
@@ -140,10 +150,17 @@ public class ElasticSqlParseResult {
         }
 
         if (whereCondition != null && whereCondition.hasClauses()) {
-            requestBuilder.setQuery(QueryBuilders.boolQuery().filter(whereCondition));
-            //requestBuilder.setQuery(QueryBuilders.filteredQuery(null, whereCondition));
+            if(matchCondition != null && matchCondition.hasClauses()) {
+                requestBuilder.setQuery(QueryBuilders.boolQuery().must(matchCondition).filter(whereCondition));
+            } else {
+                requestBuilder.setQuery(QueryBuilders.boolQuery().filter(whereCondition));
+            }
         } else {
-            requestBuilder.setQuery(QueryBuilders.matchAllQuery());
+            if(matchCondition != null && matchCondition.hasClauses()) {
+                requestBuilder.setQuery(QueryBuilders.boolQuery().must(matchCondition));
+            } else {
+                requestBuilder.setQuery(QueryBuilders.matchAllQuery());
+            }
         }
 
         if (CollectionUtils.isNotEmpty(orderBy)) {

+ 2 - 0
src/main/java/org/elasticsearch/dsl/parser/ElasticSql2DslParser.java

@@ -77,6 +77,8 @@ public class ElasticSql2DslParser {
         return ImmutableList.of(
                 //解析SQL指定的索引和文档类型
                 new QueryFromParser(parseActionListener),
+                //解析SQL查询指定的match条件
+                new MatchQueryConditionParser(parseActionListener),
                 //解析SQL查询指定的where条件
                 new QueryWhereConditionParser(parseActionListener),
                 //解析SQL排序条件

+ 33 - 0
src/main/java/org/elasticsearch/dsl/parser/syntax/MatchQueryConditionParser.java

@@ -0,0 +1,33 @@
+package org.elasticsearch.dsl.parser.syntax;
+
+import org.elasticsearch.dsl.bean.ElasticDslContext;
+import org.elasticsearch.dsl.bean.SQLCondition;
+import org.elasticsearch.dsl.enums.SQLBoolOperator;
+import org.elasticsearch.dsl.enums.SQLConditionType;
+import org.elasticsearch.dsl.parser.listener.ParseActionListener;
+import org.elasticsearch.index.query.BoolQueryBuilder;
+import org.elasticsearch.sql.ElasticSqlSelectQueryBlock;
+
+public class MatchQueryConditionParser extends QueryWhereConditionParser {
+
+    public MatchQueryConditionParser(ParseActionListener parseActionListener) {
+        super(parseActionListener);
+    }
+
+    @Override
+    public void parse(ElasticDslContext dslContext) {
+        ElasticSqlSelectQueryBlock queryBlock = (ElasticSqlSelectQueryBlock) dslContext.getQueryExpr().getSubQuery().getQuery();
+
+        if (queryBlock.getMatchQuery() != null) {
+            SQLCondition matchQueryCondition = parseFilterCondition(dslContext, queryBlock.getMatchQuery());
+
+            SQLBoolOperator operator = matchQueryCondition.getOperator();
+            if(SQLConditionType.Atom == matchQueryCondition.getSQLConditionType()) {
+                operator = SQLBoolOperator.AND;
+            }
+
+            BoolQueryBuilder boolQuery = mergeAtomFilter(matchQueryCondition.getFilterList(), operator);
+            dslContext.getParseResult().setMatchCondition(boolQuery);
+        }
+    }
+}

+ 2 - 2
src/main/java/org/elasticsearch/dsl/parser/syntax/QueryWhereConditionParser.java

@@ -50,7 +50,7 @@ public class QueryWhereConditionParser implements QueryParser {
         }
     }
 
-    private SQLCondition parseFilterCondition(ElasticDslContext dslContext, SQLExpr sqlExpr) {
+    protected SQLCondition parseFilterCondition(ElasticDslContext dslContext, SQLExpr sqlExpr) {
         if (sqlExpr instanceof SQLBinaryOpExpr) {
             SQLBinaryOpExpr sqlBinOpExpr = (SQLBinaryOpExpr) sqlExpr;
             SQLBinaryOperator binaryOperator = sqlBinOpExpr.getOperator();
@@ -83,7 +83,7 @@ public class QueryWhereConditionParser implements QueryParser {
         }
     }
 
-    private BoolQueryBuilder mergeAtomFilter(List<AtomFilter> atomFilterList, SQLBoolOperator operator) {
+    protected BoolQueryBuilder mergeAtomFilter(List<AtomFilter> atomFilterList, SQLBoolOperator operator) {
         BoolQueryBuilder subboolQuery = QueryBuilders.boolQuery();
         ListMultimap<String, QueryBuilder> listMultiMap = ArrayListMultimap.create();
 

+ 1 - 0
src/main/java/org/elasticsearch/sql/ElasticSqlLexer.java

@@ -47,6 +47,7 @@ public class ElasticSqlLexer extends Lexer {
         map.put("XOR", Token.XOR);
         map.put("COMMENT", Token.COMMENT);
 
+        map.put("QUERY", Token.INDEX);
         map.put("ROUTING", Token.INDEX);
         map.put("NESTED", Token.INDEX);
         map.put("INNER", Token.INNER);

+ 15 - 0
src/main/java/org/elasticsearch/sql/ElasticSqlSelectParser.java

@@ -1,14 +1,18 @@
 package org.elasticsearch.sql;
 
+import com.alibaba.druid.sql.ast.SQLExpr;
 import com.alibaba.druid.sql.ast.SQLSetQuantifier;
 import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
 import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
+import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
 import com.alibaba.druid.sql.ast.statement.SQLTableSource;
 import com.alibaba.druid.sql.parser.ParserException;
 import com.alibaba.druid.sql.parser.SQLExprParser;
 import com.alibaba.druid.sql.parser.SQLSelectParser;
 import com.alibaba.druid.sql.parser.Token;
 
+import java.util.List;
+
 public class ElasticSqlSelectParser extends SQLSelectParser {
 
     public ElasticSqlSelectParser(SQLExprParser exprParser) {
@@ -53,6 +57,7 @@ public class ElasticSqlSelectParser extends SQLSelectParser {
 
         parseSelectList(queryBlock);
         parseFrom(queryBlock);
+        parseMatchQuery(queryBlock);
         parseWhere(queryBlock);
         parseGroupBy(queryBlock);
         queryBlock.setOrderBy(this.exprParser.parseOrderBy());
@@ -83,4 +88,14 @@ public class ElasticSqlSelectParser extends SQLSelectParser {
 
         return tableSrc;
     }
+
+    protected void parseMatchQuery(ElasticSqlSelectQueryBlock queryBlock) {
+        if (lexer.token() == Token.INDEX && "QUERY".equalsIgnoreCase(lexer.stringVal())) {
+            lexer.nextToken();
+
+            SQLExpr matchQuery = expr();
+
+            queryBlock.setMatchQuery(matchQuery);
+        }
+    }
 }

+ 10 - 0
src/main/java/org/elasticsearch/sql/ElasticSqlSelectQueryBlock.java

@@ -16,6 +16,16 @@ public class ElasticSqlSelectQueryBlock extends SQLSelectQueryBlock implements S
 
     private Routing routing;
 
+    private SQLExpr matchQuery;
+
+    public void setMatchQuery(SQLExpr matchQuery) {
+        this.matchQuery = matchQuery;
+    }
+
+    public SQLExpr getMatchQuery() {
+        return matchQuery;
+    }
+
     public Limit getLimit() {
         return limit;
     }

+ 3 - 1
src/test/java/org/elasticsearch/SqlParserOrderByTest.java

@@ -70,7 +70,9 @@ public class SqlParserOrderByTest {
     @Test
     public void testX() {
 
-        String sql = "select * from index.order where status='SUCCESS' limit 0,100";
+        //String sql = "select * from index.order where status='SUCCESS' match_query id=123 limit 0,100";
+
+        String sql = "select * from index.order query id=123 where status='SUCCESS' limit 0,100";
 
         ElasticSql2DslParser sql2DslParser = new ElasticSql2DslParser();
         ElasticSqlParseResult parseResult = sql2DslParser.parse(sql);