@@ -252,6 +252,114 @@ public void testRestrictiveBucketSelector() throws Exception {
252252 verifyDestIndexHitsCount (indexName , "special_pivot_bucket_selector-10000" , 10000 , 41 );
253253 }
254254
255+ public void testEmptyKeyInTermsAgg () throws Exception {
256+ String indexName = REVIEWS_INDEX_NAME ;
257+
258+ {
259+ final Request request = new Request ("PUT" , indexName + "/_doc/strange-business-id-1" );
260+ request .addParameter ("refresh" , "true" );
261+ request .setJsonEntity ("""
262+ {
263+ "user_id": "user_0",
264+ "business_id": ""
265+ }""" );
266+ client ().performRequest (request );
267+ }
268+ {
269+ final Request request = new Request ("PUT" , indexName + "/_doc/strange-business-id-2" );
270+ request .addParameter ("refresh" , "true" );
271+ request .setJsonEntity ("""
272+ {
273+ "user_id": "user_0",
274+ "business_id": "business_x."
275+ }""" );
276+ client ().performRequest (request );
277+ }
278+ {
279+ final Request request = new Request ("PUT" , indexName + "/_doc/strange-business-id-3" );
280+ request .addParameter ("refresh" , "true" );
281+ request .setJsonEntity ("""
282+ {
283+ "user_id": "user_0",
284+ "business_id": ".business_y"
285+ }""" );
286+ client ().performRequest (request );
287+ }
288+ {
289+ final Request request = new Request ("PUT" , indexName + "/_doc/strange-business-id-4" );
290+ request .addParameter ("refresh" , "true" );
291+ request .setJsonEntity ("""
292+ {
293+ "user_id": "user_0",
294+ "business_id": "..."
295+ }""" );
296+ client ().performRequest (request );
297+ }
298+
299+ String transformIndex = "empty-terms-agg-key" ;
300+ String transformId = "empty-terms-agg-key" ;
301+ final Request createTransformRequest = new Request ("PUT" , getTransformEndpoint () + transformId );
302+ final String config = formatted ("""
303+ {
304+ "source": {
305+ "index": "%s"
306+ },
307+ "dest": {
308+ "index": "%s"
309+ },
310+ "pivot": {
311+ "group_by": {
312+ "reviewer": {
313+ "terms": {
314+ "field": "user_id"
315+ }
316+ }
317+ },
318+ "aggregations": {
319+ "businesses": {
320+ "terms": {
321+ "field": "business_id"
322+ }
323+ }
324+ }
325+ }
326+ }""" , indexName , transformIndex );
327+ createTransformRequest .setJsonEntity (config );
328+ Map <String , Object > createTransformResponse = entityAsMap (client ().performRequest (createTransformRequest ));
329+ assertThat (createTransformResponse .get ("acknowledged" ), equalTo (Boolean .TRUE ));
330+ startAndWaitForTransform (transformId , transformIndex );
331+ assertTrue (indexExists (transformIndex ));
332+ Map <String , Object > searchResult = getAsMap (transformIndex + "/_search?q=reviewer:user_0" );
333+ long count = (Integer ) XContentMapValues .extractValue ("hits.total.value" , searchResult );
334+ assertThat (count , is (equalTo (1L )));
335+ assertThat (XContentMapValues .extractValue ("hits.hits._source.reviewer" , searchResult ), is (equalTo (List .of ("user_0" ))));
336+ assertThat (
337+ XContentMapValues .extractValue ("hits.hits._source.businesses" , searchResult ),
338+ is (equalTo (List .of (Map .of ("business_0" , 278 , "" , 1 , "business_x." , 1 , ".business_y" , 1 , "..." , 1 ))))
339+ );
340+
341+ {
342+ final Request request = new Request ("DELETE" , indexName + "/_doc/strange-business-id-1" );
343+ request .addParameter ("refresh" , "true" );
344+ client ().performRequest (request );
345+ }
346+ {
347+ final Request request = new Request ("DELETE" , indexName + "/_doc/strange-business-id-2" );
348+ request .addParameter ("refresh" , "true" );
349+ client ().performRequest (request );
350+ }
351+ {
352+ final Request request = new Request ("DELETE" , indexName + "/_doc/strange-business-id-3" );
353+ request .addParameter ("refresh" , "true" );
354+ client ().performRequest (request );
355+ }
356+ {
357+ final Request request = new Request ("DELETE" , indexName + "/_doc/strange-business-id-4" );
358+ request .addParameter ("refresh" , "true" );
359+ client ().performRequest (request );
360+ }
361+ }
362+
255363 private void verifyDestIndexHitsCount (String sourceIndex , String transformId , int maxPageSearchSize , long expectedDestIndexCount )
256364 throws Exception {
257365 String transformIndex = transformId ;
0 commit comments