@@ -151,13 +151,16 @@ public void testUnmappedFieldWithTerms() throws Exception {
151
151
createDocument ("keyword" , "c" )
152
152
)
153
153
);
154
+
155
+ // Only aggregate on unmapped field, no missing bucket => no results
154
156
testSearchCase (
155
157
Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
156
158
dataset ,
157
159
() -> new CompositeAggregationBuilder ("name" , Arrays .asList (new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" ))),
158
160
(result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
159
161
);
160
162
163
+ // Only aggregate on unmapped field, missing bucket => one null bucket with all values
161
164
testSearchCase (
162
165
Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
163
166
dataset ,
@@ -173,6 +176,7 @@ public void testUnmappedFieldWithTerms() throws Exception {
173
176
}
174
177
);
175
178
179
+ // Only aggregate on the unmapped field, after key for that field is set as `null` => no results
176
180
testSearchCase (
177
181
Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
178
182
dataset ,
@@ -183,6 +187,7 @@ public void testUnmappedFieldWithTerms() throws Exception {
183
187
(result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
184
188
);
185
189
190
+ // Mapped field first, then unmapped, no missing bucket => no results
186
191
testSearchCase (
187
192
Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
188
193
dataset ,
@@ -196,6 +201,7 @@ public void testUnmappedFieldWithTerms() throws Exception {
196
201
(result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
197
202
);
198
203
204
+ // Mapped + unmapped, include missing => 3 buckets
199
205
testSearchCase (
200
206
Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
201
207
dataset ,
@@ -217,6 +223,91 @@ public void testUnmappedFieldWithTerms() throws Exception {
217
223
assertEquals (1L , result .getBuckets ().get (2 ).getDocCount ());
218
224
}
219
225
);
226
+
227
+ // Unmapped field, keyword after key, unmapped sorts after, include unmapped => 1 bucket
228
+ testSearchCase (
229
+ Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
230
+ dataset ,
231
+ () -> new CompositeAggregationBuilder (
232
+ "name" ,
233
+ Arrays .asList (
234
+ new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" ).missingBucket (true ).missingOrder (MissingOrder .LAST )
235
+ )
236
+ ).aggregateAfter (Collections .singletonMap ("unmapped" , "cat" )),
237
+ (InternalComposite result ) -> {
238
+ assertEquals (1 , result .getBuckets ().size ());
239
+ assertEquals ("{unmapped=null}" , result .afterKey ().toString ());
240
+ assertEquals ("{unmapped=null}" , result .getBuckets ().get (0 ).getKeyAsString ());
241
+ assertEquals (5L , result .getBuckets ().get (0 ).getDocCount ());
242
+ }
243
+ );
244
+
245
+ // Unmapped field, keyword after key, unmapped sorts before, include unmapped => 0 buckets
246
+ testSearchCase (
247
+ Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
248
+ dataset ,
249
+ () -> new CompositeAggregationBuilder (
250
+ "name" ,
251
+ Arrays .asList (
252
+ new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" ).missingBucket (true ).missingOrder (MissingOrder .FIRST )
253
+ )
254
+ ).aggregateAfter (Collections .singletonMap ("unmapped" , "cat" )),
255
+ (InternalComposite result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
256
+ );
257
+
258
+ // Unmapped field, number after key, unmapped sorts after, include unmapped => 1 bucket
259
+ testSearchCase (
260
+ Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
261
+ dataset ,
262
+ () -> new CompositeAggregationBuilder (
263
+ "name" ,
264
+ Arrays .asList (
265
+ new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" ).missingBucket (true ).missingOrder (MissingOrder .LAST )
266
+ )
267
+ ).aggregateAfter (Collections .singletonMap ("unmapped" , 42 )),
268
+ (InternalComposite result ) -> {
269
+ assertEquals (1 , result .getBuckets ().size ());
270
+ assertEquals ("{unmapped=null}" , result .afterKey ().toString ());
271
+ assertEquals ("{unmapped=null}" , result .getBuckets ().get (0 ).getKeyAsString ());
272
+ assertEquals (5L , result .getBuckets ().get (0 ).getDocCount ());
273
+ }
274
+ );
275
+
276
+ // Unmapped field, number after key, unmapped sorts before, include unmapped => 0 buckets
277
+ testSearchCase (
278
+ Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
279
+ dataset ,
280
+ () -> new CompositeAggregationBuilder (
281
+ "name" ,
282
+ Arrays .asList (
283
+ new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" ).missingBucket (true ).missingOrder (MissingOrder .FIRST )
284
+ )
285
+ ).aggregateAfter (Collections .singletonMap ("unmapped" , 42 )),
286
+ (InternalComposite result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
287
+ );
288
+
289
+ }
290
+
291
+ public void testUnmappedTermsLongAfter () throws Exception {
292
+ final List <Map <String , List <Object >>> dataset = new ArrayList <>();
293
+ dataset .addAll (
294
+ Arrays .asList (
295
+ createDocument ("keyword" , "a" ),
296
+ createDocument ("keyword" , "c" ),
297
+ createDocument ("keyword" , "a" ),
298
+ createDocument ("keyword" , "d" ),
299
+ createDocument ("keyword" , "c" )
300
+ )
301
+ );
302
+
303
+ // Unmapped field, number after key, no missing bucket => 0 buckets
304
+ testSearchCase (
305
+ Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery ("keyword" )),
306
+ dataset ,
307
+ () -> new CompositeAggregationBuilder ("name" , Arrays .asList (new TermsValuesSourceBuilder ("unmapped" ).field ("unmapped" )))
308
+ .aggregateAfter (Collections .singletonMap ("unmapped" , 42 )),
309
+ (InternalComposite result ) -> { assertEquals (0 , result .getBuckets ().size ()); }
310
+ );
220
311
}
221
312
222
313
public void testUnmappedFieldWithGeopoint () throws Exception {
0 commit comments