@@ -28,23 +28,7 @@ public class NestedQuery extends LuceneQuery {
2828 @ Override
2929 public QueryBuilder build (FunctionExpression func ) {
3030 BoolQueryBuilder boolQuery = QueryBuilders .boolQuery ();
31- // WHERE nested(message, message.info = '' AND comment.data = '')
32- if (func .getFunctionName ().getFunctionName ().equalsIgnoreCase (BuiltinFunctionName .NESTED .name ())) {
33- switch (((FunctionExpression )func .getArguments ().get (1 )).getFunctionName ().getFunctionName ()) {
34- case "and" :
35- applyInnerQueryOrRecurse (((FunctionExpression )func .getArguments ().get (1 )), BoolQueryBuilder ::must , boolQuery );
36- break ;
37- case "or" :
38- applyInnerQueryOrRecurse (((FunctionExpression )func .getArguments ().get (1 )), BoolQueryBuilder ::should , boolQuery );
39- break ;
40- case "not" :
41- applyInnerQueryOrRecurse (((FunctionExpression )func .getArguments ().get (1 )), BoolQueryBuilder ::mustNot , boolQuery );
42- break ;
43- default :
44- applyInnerQueryOrRecurse (((FunctionExpression )func .getArguments ().get (1 )), BoolQueryBuilder ::filter , boolQuery );
45- }
46- // No recursion for operators needed
47- } else if (func .getArguments ().get (0 ) instanceof ReferenceExpression ) { // TODO can this be handled in just the else?
31+ if (func .getArguments ().get (0 ) instanceof ReferenceExpression ) { // TODO can this be handled in just the else?
4832 applyInnerQuery (func , BoolQueryBuilder ::filter , boolQuery );
4933 } else if (func .getArguments ().get (0 ) instanceof FunctionExpression &&
5034 ((FunctionExpression )func .getArguments ().get (0 )).getFunctionName ().getFunctionName ().equalsIgnoreCase ("nested" )) { // Is predicate expression
@@ -53,85 +37,22 @@ public QueryBuilder build(FunctionExpression func) {
5337 return boolQuery ;
5438 }
5539
56- private QueryBuilder applyInnerQueryOrRecurse (FunctionExpression func , BiFunction <BoolQueryBuilder , QueryBuilder ,
57- QueryBuilder > accumulator , BoolQueryBuilder boolQuery ) {
58- if (func .getFunctionName ().getFunctionName ().equalsIgnoreCase ("nested" )) {
59- ReferenceExpression nestedPath = (ReferenceExpression ) func .getArguments ().get (0 );
60- ReferenceExpression nestedField = (ReferenceExpression ) ((FunctionExpression )func .getArguments ().get (1 )).getArguments ().get (0 );
61- ExprValue literal = ((FunctionExpression )func .getArguments ().get (1 )).getArguments ().get (1 ).valueOf ();
62- String fieldName = convertTextToKeyword (nestedField .toString (), nestedField .type ());
63- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (literal ));
64- NestedQueryBuilder ret = QueryBuilders .nestedQuery (nestedPath .toString (), termQuery , ScoreMode .None );
65- return ret ;
66- } else if (func .getArguments ().get (0 ) instanceof ReferenceExpression ) {
67- // innerNestedQuery
68- // nested(message, message.info = 'a' AND comment.data = 'ab' OR message.dayOfWeek = 1)
69- // nested(message, message.info = 'a' AND message.dayOfWeek = 1)
70- ReferenceExpression field = (ReferenceExpression )func .getArguments ().get (0 );
71- String fieldName = convertTextToKeyword (field .toString (), field .type ());// function ret type?
72- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (func .getArguments ().get (1 ).valueOf ()));
73- NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (getNestedPathString (field ), termQuery , ScoreMode .None );
74- return nestedQueryBuilder ;
75- } else if (func .getArguments ().get (1 ) instanceof LiteralExpression ) { // Syntax: 'WHERE nested(message.info) = 'a'
76- ReferenceExpression field = (ReferenceExpression )((FunctionExpression )func .getArguments ().get (0 )).getArguments ().get (0 );
77- String fieldName = convertTextToKeyword (field .toString (), field .type ());// function ret type?
78- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (func .getArguments ().get (1 ).valueOf ()));
79- NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (getNestedPathString (field ), termQuery , ScoreMode .None );
80- return nestedQueryBuilder ;
81- } else { // Syntax: recursion...
82- for (Expression arg : func .getArguments ()) {
83- if (arg instanceof FunctionExpression ) {
84- switch (((FunctionExpression )arg ).getFunctionName ().getFunctionName ()) {
85- case "and" :
86- accumulator .apply (boolQuery , applyInnerQueryOrRecurse (((FunctionExpression )arg ), BoolQueryBuilder ::must , QueryBuilders .boolQuery ()));
87- break ;
88- case "or" :
89- accumulator .apply (boolQuery , applyInnerQueryOrRecurse (((FunctionExpression )arg ), BoolQueryBuilder ::should , QueryBuilders .boolQuery ()));
90- break ;
91- case "not" :
92- accumulator .apply (boolQuery , applyInnerQueryOrRecurse (((FunctionExpression )arg ), BoolQueryBuilder ::mustNot , QueryBuilders .boolQuery ()));
93- break ;
94- default :
95- accumulator .apply (boolQuery , applyInnerQueryOrRecurse (((FunctionExpression )arg ), BoolQueryBuilder ::filter , QueryBuilders .boolQuery ()));
96- }
97- } else {
98- // Throw exception? Shouldn't get here.
99- }
100- }
101- }
102- return boolQuery ;
40+ public QueryBuilder adInnerQuery (QueryBuilder builder , String path ) {
41+ // BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
42+ NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (path , builder , ScoreMode .None );
43+ return nestedQueryBuilder ;
10344 }
10445
10546 private QueryBuilder applyInnerQuery (FunctionExpression func , BiFunction <BoolQueryBuilder , QueryBuilder ,
10647 QueryBuilder > accumulator , BoolQueryBuilder boolQuery ) {
107- if (func .getFunctionName ().getFunctionName ().equalsIgnoreCase ("nested" )) { // Not sure if we need this case anymore.
108- ReferenceExpression nestedPath = (ReferenceExpression ) func .getArguments ().get (0 );
109- ReferenceExpression nestedField = (ReferenceExpression ) ((FunctionExpression )func .getArguments ().get (1 )).getArguments ().get (0 );
110- ExprValue literal = ((FunctionExpression )func .getArguments ().get (1 )).getArguments ().get (1 ).valueOf ();
111- String fieldName = convertTextToKeyword (nestedField .toString (), nestedField .type ());
112- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (literal ));
113- NestedQueryBuilder ret = QueryBuilders .nestedQuery (nestedPath .toString (), termQuery , ScoreMode .None );
114- return accumulator .apply (boolQuery , ret );
115- } else if (func .getArguments ().get (0 ) instanceof ReferenceExpression ) {
116- // innerNestedQuery
117- // nested(message, message.info = 'a' AND comment.data = 'ab' OR message.dayOfWeek = 1)
118- ReferenceExpression field = (ReferenceExpression )func .getArguments ().get (0 );
119- String fieldName = convertTextToKeyword (field .toString (), field .type ());// function ret type?
120- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (func .getArguments ().get (1 ).valueOf ()));
121- NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (getNestedPathString (field ), termQuery , ScoreMode .None );
122- return accumulator .apply (boolQuery , nestedQueryBuilder );
123- } else if (func .getArguments ().get (1 ) instanceof LiteralExpression ) {
124- // Syntax: 'WHERE nested(message.info) = 'a'
125- // nestedFunctionAsPredicateExpression
126- ReferenceExpression field = (ReferenceExpression )((FunctionExpression )func .getArguments ().get (0 )).getArguments ().get (0 );
127- String fieldName = convertTextToKeyword (field .toString (), field .type ());// function ret type?
128- TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (func .getArguments ().get (1 ).valueOf ()));
129- NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (getNestedPathString (field ), termQuery , ScoreMode .None );
130- return accumulator .apply (boolQuery , nestedQueryBuilder );
131- } else {
132- // Error? Shouldn't get here.
133- return null ;
134- }
48+ // Syntax: 'WHERE nested(message.info) = 'a'
49+ // nestedFunctionAsPredicateExpression
50+ ReferenceExpression field = (ReferenceExpression )((FunctionExpression )func .getArguments ().get (0 )).getArguments ().get (0 );
51+ String fieldName = convertTextToKeyword (field .toString (), field .type ());// function ret type?
52+ TermQueryBuilder termQuery = QueryBuilders .termQuery (fieldName , value (func .getArguments ().get (1 ).valueOf ()));
53+ NestedQueryBuilder nestedQueryBuilder = QueryBuilders .nestedQuery (getNestedPathString (field ), termQuery , ScoreMode .None );
54+ return accumulator .apply (boolQuery , nestedQueryBuilder );
55+ // TODO add range query and others that may apply...
13556 }
13657
13758 private String getNestedPathString (ReferenceExpression field ) {
0 commit comments