19
19
import org .elasticsearch .common .xcontent .XContentParser ;
20
20
import org .elasticsearch .index .query .AbstractQueryBuilder ;
21
21
import org .elasticsearch .index .query .QueryBuilder ;
22
+ import org .elasticsearch .search .searchafter .SearchAfterBuilder ;
22
23
23
24
import java .io .IOException ;
24
25
import java .util .Arrays ;
25
- import java .util .Collections ;
26
- import java .util .List ;
27
26
import java .util .Objects ;
28
27
import java .util .function .Supplier ;
29
28
@@ -40,7 +39,7 @@ public class EqlSearchRequest extends ActionRequest implements IndicesRequest.Re
40
39
private String eventTypeField = "event.category" ;
41
40
private String implicitJoinKeyField = "agent.id" ;
42
41
private int fetchSize = 50 ;
43
- private List < String > searchAfter = Collections . emptyList () ;
42
+ private SearchAfterBuilder searchAfterBuilder ;
44
43
private String rule ;
45
44
46
45
static final String KEY_QUERY = "query" ;
@@ -74,23 +73,10 @@ public EqlSearchRequest(StreamInput in) throws IOException {
74
73
eventTypeField = in .readString ();
75
74
implicitJoinKeyField = in .readString ();
76
75
fetchSize = in .readVInt ();
77
- searchAfter = in .readList ( StreamInput :: readString );
76
+ searchAfterBuilder = in .readOptionalWriteable ( SearchAfterBuilder :: new );
78
77
rule = in .readString ();
79
78
}
80
79
81
- public EqlSearchRequest (String [] indices , QueryBuilder query ,
82
- String timestampField , String eventTypeField , String implicitJoinKeyField ,
83
- int fetchSize , List <String > searchAfter , String rule ) {
84
- this .indices = indices ;
85
- this .query = query ;
86
- this .timestampField = timestampField ;
87
- this .eventTypeField = eventTypeField ;
88
- this .implicitJoinKeyField = implicitJoinKeyField ;
89
- this .fetchSize = fetchSize ;
90
- this .searchAfter = searchAfter ;
91
- this .rule = rule ;
92
- }
93
-
94
80
@ Override
95
81
public ActionRequestValidationException validate () {
96
82
ActionRequestValidationException validationException = null ;
@@ -122,10 +108,6 @@ public ActionRequestValidationException validate() {
122
108
validationException = addValidationError ("size must be more than 0." , validationException );
123
109
}
124
110
125
- if (searchAfter == null ) {
126
- validationException = addValidationError ("search after is null" , validationException );
127
- }
128
-
129
111
return validationException ;
130
112
}
131
113
@@ -141,13 +123,10 @@ public XContentBuilder toXContent(XContentBuilder builder, Params params) throws
141
123
}
142
124
builder .field (KEY_SIZE , fetchSize ());
143
125
144
- if (this .searchAfter != null && !this .searchAfter .isEmpty ()) {
145
- builder .startArray (KEY_SEARCH_AFTER );
146
- for (String val : this .searchAfter ) {
147
- builder .value (val );
148
- }
149
- builder .endArray ();
126
+ if (searchAfterBuilder != null ) {
127
+ builder .array (SEARCH_AFTER .getPreferredName (), searchAfterBuilder .getSortValues ());
150
128
}
129
+
151
130
builder .field (KEY_RULE , rule );
152
131
153
132
return builder ;
@@ -165,11 +144,13 @@ protected static <R extends EqlSearchRequest> ObjectParser<R, Void> objectParser
165
144
parser .declareString (EqlSearchRequest ::eventTypeField , EVENT_TYPE_FIELD );
166
145
parser .declareString (EqlSearchRequest ::implicitJoinKeyField , IMPLICIT_JOIN_KEY_FIELD );
167
146
parser .declareInt (EqlSearchRequest ::fetchSize , SIZE );
168
- parser .declareStringArray (EqlSearchRequest ::searchAfter , SEARCH_AFTER );
147
+ parser .declareField (EqlSearchRequest ::setSearchAfter , SearchAfterBuilder ::fromXContent , SEARCH_AFTER ,
148
+ ObjectParser .ValueType .OBJECT_ARRAY );
169
149
parser .declareString (EqlSearchRequest ::rule , RULE );
170
150
return parser ;
171
151
}
172
152
153
+ @ Override
173
154
public EqlSearchRequest indices (String ... indices ) {
174
155
this .indices = indices ;
175
156
return this ;
@@ -219,22 +200,26 @@ public EqlSearchRequest fetchSize(int size) {
219
200
return this ;
220
201
}
221
202
222
- public List <String > searchAfter () {
223
- return searchAfter ;
203
+ public Object [] searchAfter () {
204
+ if (searchAfterBuilder == null ) {
205
+ return null ;
206
+ }
207
+ return searchAfterBuilder .getSortValues ();
224
208
}
225
209
226
- public EqlSearchRequest searchAfter (List <String > searchAfter ) {
227
- if (searchAfter != null && !searchAfter .isEmpty ()) {
228
- this .searchAfter = searchAfter ;
229
- }
210
+ public EqlSearchRequest searchAfter (Object [] values ) {
211
+ this .searchAfterBuilder = new SearchAfterBuilder ().setSortValues (values );
230
212
return this ;
231
213
}
232
214
215
+ private EqlSearchRequest setSearchAfter (SearchAfterBuilder builder ) {
216
+ this .searchAfterBuilder = builder ;
217
+ return this ;
218
+ }
233
219
234
220
public String rule () { return this .rule ; }
235
221
236
222
public EqlSearchRequest rule (String rule ) {
237
- // TODO: possibly attempt to parse the rule here
238
223
this .rule = rule ;
239
224
return this ;
240
225
}
@@ -249,7 +234,7 @@ public void writeTo(StreamOutput out) throws IOException {
249
234
out .writeString (eventTypeField );
250
235
out .writeString (implicitJoinKeyField );
251
236
out .writeVInt (fetchSize );
252
- out .writeStringCollection ( searchAfter );
237
+ out .writeOptionalWriteable ( searchAfterBuilder );
253
238
out .writeString (rule );
254
239
}
255
240
@@ -270,7 +255,7 @@ public boolean equals(Object o) {
270
255
Objects .equals (timestampField , that .timestampField ) &&
271
256
Objects .equals (eventTypeField , that .eventTypeField ) &&
272
257
Objects .equals (implicitJoinKeyField , that .implicitJoinKeyField ) &&
273
- Objects .equals (searchAfter , that .searchAfter ) &&
258
+ Objects .equals (searchAfterBuilder , that .searchAfterBuilder ) &&
274
259
Objects .equals (rule , that .rule );
275
260
}
276
261
@@ -284,7 +269,7 @@ public int hashCode() {
284
269
timestampField ,
285
270
eventTypeField ,
286
271
implicitJoinKeyField ,
287
- searchAfter ,
272
+ searchAfterBuilder ,
288
273
rule );
289
274
}
290
275
0 commit comments