@@ -534,6 +534,151 @@ public void testDetect_GivenBooleanField_BooleanMappedAsString() {
534
534
assertThat (booleanField .value (hit ), arrayContaining ("false" , "true" , "false" ));
535
535
}
536
536
537
+ public void testDetect_GivenMultiFields () {
538
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
539
+ .addAggregatableField ("a_float" , "float" )
540
+ .addNonAggregatableField ("text_without_keyword" , "text" )
541
+ .addNonAggregatableField ("text_1" , "text" )
542
+ .addAggregatableField ("text_1.keyword" , "keyword" )
543
+ .addNonAggregatableField ("text_2" , "text" )
544
+ .addAggregatableField ("text_2.keyword" , "keyword" )
545
+ .addAggregatableField ("keyword_1" , "keyword" )
546
+ .addNonAggregatableField ("keyword_1.text" , "text" )
547
+ .build ();
548
+
549
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
550
+ SOURCE_INDEX , buildRegressionConfig ("a_float" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
551
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
552
+
553
+ assertThat (extractedFields .getAllFields ().size (), equalTo (5 ));
554
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
555
+ .collect (Collectors .toList ());
556
+ assertThat (extractedFieldNames , contains ("a_float" , "keyword_1" , "text_1.keyword" , "text_2.keyword" , "text_without_keyword" ));
557
+ }
558
+
559
+ public void testDetect_GivenMultiFieldAndParentIsRequired () {
560
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
561
+ .addAggregatableField ("field_1" , "keyword" )
562
+ .addAggregatableField ("field_1.keyword" , "keyword" )
563
+ .addAggregatableField ("field_2" , "float" )
564
+ .build ();
565
+
566
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
567
+ SOURCE_INDEX , buildClassificationConfig ("field_1" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
568
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
569
+
570
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
571
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
572
+ .collect (Collectors .toList ());
573
+ assertThat (extractedFieldNames , contains ("field_1" , "field_2" ));
574
+ }
575
+
576
+ public void testDetect_GivenMultiFieldAndMultiFieldIsRequired () {
577
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
578
+ .addAggregatableField ("field_1" , "keyword" )
579
+ .addAggregatableField ("field_1.keyword" , "keyword" )
580
+ .addAggregatableField ("field_2" , "float" )
581
+ .build ();
582
+
583
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
584
+ SOURCE_INDEX , buildClassificationConfig ("field_1.keyword" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
585
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
586
+
587
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
588
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
589
+ .collect (Collectors .toList ());
590
+ assertThat (extractedFieldNames , contains ("field_1.keyword" , "field_2" ));
591
+ }
592
+
593
+ public void testDetect_GivenSeveralMultiFields_ShouldPickFirstSorted () {
594
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
595
+ .addNonAggregatableField ("field_1" , "text" )
596
+ .addAggregatableField ("field_1.keyword_3" , "keyword" )
597
+ .addAggregatableField ("field_1.keyword_2" , "keyword" )
598
+ .addAggregatableField ("field_1.keyword_1" , "keyword" )
599
+ .addAggregatableField ("field_2" , "float" )
600
+ .build ();
601
+
602
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
603
+ SOURCE_INDEX , buildRegressionConfig ("field_2" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
604
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
605
+
606
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
607
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
608
+ .collect (Collectors .toList ());
609
+ assertThat (extractedFieldNames , contains ("field_1.keyword_1" , "field_2" ));
610
+ }
611
+
612
+ public void testDetect_GivenMultiFields_OverDocValueLimit () {
613
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
614
+ .addNonAggregatableField ("field_1" , "text" )
615
+ .addAggregatableField ("field_1.keyword_1" , "keyword" )
616
+ .addAggregatableField ("field_2" , "float" )
617
+ .build ();
618
+
619
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
620
+ SOURCE_INDEX , buildRegressionConfig ("field_2" ), RESULTS_FIELD , true , 0 , fieldCapabilities );
621
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
622
+
623
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
624
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
625
+ .collect (Collectors .toList ());
626
+ assertThat (extractedFieldNames , contains ("field_1" , "field_2" ));
627
+ }
628
+
629
+ public void testDetect_GivenParentAndMultiFieldBothAggregatable () {
630
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
631
+ .addAggregatableField ("field_1" , "keyword" )
632
+ .addAggregatableField ("field_1.keyword" , "keyword" )
633
+ .addAggregatableField ("field_2.keyword" , "float" )
634
+ .addAggregatableField ("field_2.double" , "double" )
635
+ .build ();
636
+
637
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
638
+ SOURCE_INDEX , buildRegressionConfig ("field_2.double" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
639
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
640
+
641
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
642
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
643
+ .collect (Collectors .toList ());
644
+ assertThat (extractedFieldNames , contains ("field_1" , "field_2.double" ));
645
+ }
646
+
647
+ public void testDetect_GivenParentAndMultiFieldNoneAggregatable () {
648
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
649
+ .addNonAggregatableField ("field_1" , "text" )
650
+ .addNonAggregatableField ("field_1.text" , "text" )
651
+ .addAggregatableField ("field_2" , "float" )
652
+ .build ();
653
+
654
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
655
+ SOURCE_INDEX , buildRegressionConfig ("field_2" ), RESULTS_FIELD , true , 100 , fieldCapabilities );
656
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
657
+
658
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
659
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
660
+ .collect (Collectors .toList ());
661
+ assertThat (extractedFieldNames , contains ("field_1" , "field_2" ));
662
+ }
663
+
664
+ public void testDetect_GivenMultiFields_AndExplicitlyIncludedFields () {
665
+ FieldCapabilitiesResponse fieldCapabilities = new MockFieldCapsResponseBuilder ()
666
+ .addNonAggregatableField ("field_1" , "text" )
667
+ .addAggregatableField ("field_1.keyword" , "keyword" )
668
+ .addAggregatableField ("field_2" , "float" )
669
+ .build ();
670
+ FetchSourceContext analyzedFields = new FetchSourceContext (true , new String [] { "field_1" , "field_2" }, new String [0 ]);
671
+
672
+ ExtractedFieldsDetector extractedFieldsDetector = new ExtractedFieldsDetector (
673
+ SOURCE_INDEX , buildRegressionConfig ("field_2" , analyzedFields ), RESULTS_FIELD , false , 100 , fieldCapabilities );
674
+ ExtractedFields extractedFields = extractedFieldsDetector .detect ();
675
+
676
+ assertThat (extractedFields .getAllFields ().size (), equalTo (2 ));
677
+ List <String > extractedFieldNames = extractedFields .getAllFields ().stream ().map (ExtractedField ::getName )
678
+ .collect (Collectors .toList ());
679
+ assertThat (extractedFieldNames , contains ("field_1" , "field_2" ));
680
+ }
681
+
537
682
private static DataFrameAnalyticsConfig buildOutlierDetectionConfig () {
538
683
return buildOutlierDetectionConfig (null );
539
684
}
@@ -576,9 +721,17 @@ private static class MockFieldCapsResponseBuilder {
576
721
private final Map <String , Map <String , FieldCapabilities >> fieldCaps = new HashMap <>();
577
722
578
723
private MockFieldCapsResponseBuilder addAggregatableField (String field , String ... types ) {
724
+ return addField (field , true , types );
725
+ }
726
+
727
+ private MockFieldCapsResponseBuilder addNonAggregatableField (String field , String ... types ) {
728
+ return addField (field , false , types );
729
+ }
730
+
731
+ private MockFieldCapsResponseBuilder addField (String field , boolean isAggregatable , String ... types ) {
579
732
Map <String , FieldCapabilities > caps = new HashMap <>();
580
733
for (String type : types ) {
581
- caps .put (type , new FieldCapabilities (field , type , true , true ));
734
+ caps .put (type , new FieldCapabilities (field , type , true , isAggregatable ));
582
735
}
583
736
fieldCaps .put (field , caps );
584
737
return this ;
0 commit comments