20
20
/**
21
21
* Transform SQL query to standard Elasticsearch search query
22
22
*/
23
- public class
24
- DefaultQueryAction extends QueryAction {
23
+ public class DefaultQueryAction extends QueryAction {
25
24
26
25
private final Select select ;
27
26
private SearchRequestBuilder request ;
@@ -42,122 +41,126 @@ public SqlElasticSearchRequestBuilder explain() throws SqlParseException {
42
41
setSorts (select .getOrderBys ());
43
42
setLimit (select .getOffset (), select .getRowCount ());
44
43
45
- boolean usedScroll = useScrollIfNeeded (select .isOrderdSelect ());
46
- if (!usedScroll ){
47
- request .setSearchType (SearchType .DFS_QUERY_THEN_FETCH );
48
- }
49
- updateRequestWithIndexAndRoutingOptions (select , request );
50
- updateRequestWithHighlight (select , request );
44
+ boolean usedScroll = useScrollIfNeeded (select .isOrderdSelect ());
45
+ if (!usedScroll ) {
46
+ request .setSearchType (SearchType .DFS_QUERY_THEN_FETCH );
47
+ }
48
+ updateRequestWithIndexAndRoutingOptions (select , request );
49
+ updateRequestWithHighlight (select , request );
51
50
52
- SqlElasticSearchRequestBuilder sqlElasticRequestBuilder = new SqlElasticSearchRequestBuilder (request );
51
+ SqlElasticSearchRequestBuilder sqlElasticRequestBuilder = new SqlElasticSearchRequestBuilder (request );
53
52
54
53
return sqlElasticRequestBuilder ;
55
54
}
56
55
57
- private boolean useScrollIfNeeded (boolean existsOrderBy ) {
58
- Hint scrollHint = null ;
59
- for (Hint hint : select .getHints ()){
60
- if (hint .getType () == HintType .USE_SCROLL ){
61
- scrollHint = hint ;
62
- break ;
63
- }
64
- }
65
- if (scrollHint != null ) {
66
- int scrollSize = (Integer ) scrollHint .getParams ()[0 ];
67
- int timeoutInMilli = (Integer ) scrollHint .getParams ()[1 ];
68
- if (!existsOrderBy ) request . setSearchType ( SearchType . SCAN );
69
- request .setScroll ( new TimeValue ( timeoutInMilli ))
70
- .setSize (scrollSize );
71
- }
72
- return scrollHint !=null ;
73
- }
74
-
75
- /**
56
+ private boolean useScrollIfNeeded (boolean existsOrderBy ) {
57
+ Hint scrollHint = null ;
58
+ for (Hint hint : select .getHints ()) {
59
+ if (hint .getType () == HintType .USE_SCROLL ) {
60
+ scrollHint = hint ;
61
+ break ;
62
+ }
63
+ }
64
+ if (scrollHint != null ) {
65
+ int scrollSize = (Integer ) scrollHint .getParams ()[0 ];
66
+ int timeoutInMilli = (Integer ) scrollHint .getParams ()[1 ];
67
+ if (!existsOrderBy )
68
+ request .setSearchType ( SearchType . SCAN );
69
+ request . setScroll ( new TimeValue ( timeoutInMilli )) .setSize (scrollSize );
70
+ }
71
+ return scrollHint != null ;
72
+ }
73
+
74
+ /**
76
75
* Set indices and types to the search request.
77
76
*/
78
77
private void setIndicesAndTypes () {
79
78
request .setIndices (query .getIndexArr ());
80
79
81
80
String [] typeArr = query .getTypeArr ();
82
- if (typeArr != null ) {
81
+ if (typeArr != null ) {
83
82
request .setTypes (typeArr );
84
83
}
85
84
}
86
85
87
-
88
86
/**
89
87
* Set source filtering on a search request.
90
- * @param fields list of fields to source filter.
88
+ *
89
+ * @param fields
90
+ * list of fields to source filter.
91
91
*/
92
92
private void setFields (List <Field > fields ) throws SqlParseException {
93
93
if (select .getFields ().size () > 0 ) {
94
94
ArrayList <String > includeFields = new ArrayList <String >();
95
+ ArrayList <String > excludeFields = new ArrayList <String >();
95
96
96
97
for (Field field : fields ) {
97
- if (field instanceof MethodField ){
98
- handleMethodField ((MethodField ) field );
99
- }
100
- else if (field instanceof Field ) {
98
+ if (field instanceof MethodField ) {
99
+ MethodField method = (MethodField ) field ;
100
+ if (method .getName ().toLowerCase ().equals ("script" )) {
101
+ handleScriptField (method );
102
+ } else if (method .getName ().equalsIgnoreCase ("include" )) {
103
+ for (KVValue kvValue : method .getParams ()) {
104
+ includeFields .add (kvValue .value .toString ()) ;
105
+ }
106
+ } else if (method .getName ().equalsIgnoreCase ("exclude" )) {
107
+ for (KVValue kvValue : method .getParams ()) {
108
+ excludeFields .add (kvValue .value .toString ()) ;
109
+ }
110
+ }
111
+ } else if (field instanceof Field ) {
101
112
includeFields .add (field .getName ());
102
113
}
103
114
}
104
115
105
- request .setFetchSource (includeFields .toArray (new String [includeFields .size ()]), null );
116
+ request .setFetchSource (includeFields .toArray (new String [includeFields .size ()]), excludeFields . toArray ( new String [ excludeFields . size ()]) );
106
117
}
107
118
}
108
119
109
- private void handleMethodField (MethodField field ) throws SqlParseException {
110
- MethodField method = (MethodField ) field ;
111
- if (method .getName ().toLowerCase ().equals ("script" )){
112
- handleScriptField (method );
113
- }
114
- }
115
-
116
- private void handleScriptField (MethodField method ) throws SqlParseException {
117
- List <KVValue > params = method .getParams ();
118
- if (params .size () == 2 ){
119
- request .addScriptField (params .get (0 ).value .toString (),new Script (params .get (1 ).value .toString ()));
120
- }
121
- else if (params .size () == 3 ){
122
- request .addScriptField (params .get (0 ).value .toString (),new Script (params .get (1 ).value .toString (), ScriptService .ScriptType .INLINE ,params .get (2 ).value .toString (),null ));
123
- }
124
- else {
125
- throw new SqlParseException ("scripted_field only allows script(name,script) or script(name,lang,script)" );
126
- }
127
- }
128
-
129
-
130
- /**
131
- * Create filters or queries based on
132
- * the Where clause.
133
- * @param where the 'WHERE' part of the SQL query.
120
+ private void handleScriptField (MethodField method ) throws SqlParseException {
121
+ List <KVValue > params = method .getParams ();
122
+ if (params .size () == 2 ) {
123
+ request .addScriptField (params .get (0 ).value .toString (), new Script (params .get (1 ).value .toString ()));
124
+ } else if (params .size () == 3 ) {
125
+ request .addScriptField (params .get (0 ).value .toString (), new Script (params .get (1 ).value .toString (), ScriptService .ScriptType .INLINE , params .get (2 ).value .toString (), null ));
126
+ } else {
127
+ throw new SqlParseException ("scripted_field only allows script(name,script) or script(name,lang,script)" );
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Create filters or queries based on the Where clause.
133
+ *
134
+ * @param where
135
+ * the 'WHERE' part of the SQL query.
134
136
* @throws SqlParseException
135
137
*/
136
138
private void setWhere (Where where ) throws SqlParseException {
137
139
if (where != null ) {
138
- BoolQueryBuilder boolQuery = QueryMaker .explan (where );
139
- request .setQuery (boolQuery );
140
+ BoolQueryBuilder boolQuery = QueryMaker .explan (where );
141
+ request .setQuery (boolQuery );
140
142
}
141
143
}
142
144
143
-
144
145
/**
145
- * Add sorts to the elasticsearch query
146
- * based on the 'ORDER BY' clause.
147
- * @param orderBys list of Order object
146
+ * Add sorts to the elasticsearch query based on the 'ORDER BY' clause.
147
+ *
148
+ * @param orderBys
149
+ * list of Order object
148
150
*/
149
151
private void setSorts (List <Order > orderBys ) {
150
152
for (Order order : orderBys ) {
151
153
request .addSort (order .getName (), SortOrder .valueOf (order .getType ()));
152
154
}
153
155
}
154
156
155
-
156
157
/**
157
- * Add from and size to the ES query
158
- * based on the 'LIMIT' clause
159
- * @param from starts from document at position from
160
- * @param size number of documents to return.
158
+ * Add from and size to the ES query based on the 'LIMIT' clause
159
+ *
160
+ * @param from
161
+ * starts from document at position from
162
+ * @param size
163
+ * number of documents to return.
161
164
*/
162
165
private void setLimit (int from , int size ) {
163
166
request .setFrom (from );
@@ -167,7 +170,7 @@ private void setLimit(int from, int size) {
167
170
}
168
171
}
169
172
170
- public SearchRequestBuilder getRequestBuilder () {
171
- return request ;
172
- }
173
+ public SearchRequestBuilder getRequestBuilder () {
174
+ return request ;
175
+ }
173
176
}
0 commit comments