@@ -636,6 +636,77 @@ public void testFiltered() throws IOException {
636
636
}
637
637
}
638
638
639
+ public void testFilteredAsSubAgg () throws IOException {
640
+ TTestType tTestType = randomFrom (TTestType .values ());
641
+ MappedFieldType fieldType1 = new NumberFieldMapper .NumberFieldType ("h" , NumberFieldMapper .NumberType .INTEGER );
642
+ MappedFieldType fieldType2 = new NumberFieldMapper .NumberFieldType ("a" , NumberFieldMapper .NumberType .INTEGER );
643
+ MappedFieldType fieldType3 = new NumberFieldMapper .NumberFieldType ("b" , NumberFieldMapper .NumberType .INTEGER );
644
+ TTestAggregationBuilder ttestAggregationBuilder = new TTestAggregationBuilder ("t_test" ).a (
645
+ new MultiValuesSourceFieldConfig .Builder ().setFieldName ("a" ).setFilter (QueryBuilders .termQuery ("b" , 1 )).build ()
646
+ )
647
+ .b (new MultiValuesSourceFieldConfig .Builder ().setFieldName ("a" ).setFilter (QueryBuilders .termQuery ("b" , 2 )).build ())
648
+ .testType (tTestType );
649
+ int tails = randomIntBetween (1 , 2 );
650
+ if (tails == 1 || randomBoolean ()) {
651
+ ttestAggregationBuilder .tails (tails );
652
+ }
653
+ HistogramAggregationBuilder aggregationBuilder = new HistogramAggregationBuilder ("h" ).field ("h" )
654
+ .interval (1 )
655
+ .subAggregation (ttestAggregationBuilder );
656
+ int buckets = randomInt (100 );
657
+ CheckedConsumer <RandomIndexWriter , IOException > buildIndex = iw -> {
658
+ for (int i = 0 ; i < buckets ; i ++) {
659
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 102 ), new IntPoint ("b" , 1 )));
660
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 99 ), new IntPoint ("b" , 1 )));
661
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 111 ), new IntPoint ("b" , 1 )));
662
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 97 ), new IntPoint ("b" , 1 )));
663
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 101 ), new IntPoint ("b" , 1 )));
664
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 99 ), new IntPoint ("b" , 1 )));
665
+
666
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 89 ), new IntPoint ("b" , 2 )));
667
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 93 ), new IntPoint ("b" , 2 )));
668
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 72 ), new IntPoint ("b" , 2 )));
669
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 98 ), new IntPoint ("b" , 2 )));
670
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 102 ), new IntPoint ("b" , 2 )));
671
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 98 ), new IntPoint ("b" , 2 )));
672
+
673
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 189 ), new IntPoint ("b" , 3 )));
674
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 193 ), new IntPoint ("b" , 3 )));
675
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 172 ), new IntPoint ("b" , 3 )));
676
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 198 ), new IntPoint ("b" , 3 )));
677
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 1102 ), new IntPoint ("b" , 3 )));
678
+ iw .addDocument (asList (new NumericDocValuesField ("h" , i ), new NumericDocValuesField ("a" , 198 ), new IntPoint ("b" , 3 )));
679
+ }
680
+ };
681
+ if (tTestType == TTestType .PAIRED ) {
682
+ IllegalArgumentException ex = expectThrows (
683
+ IllegalArgumentException .class ,
684
+ () -> testCase (
685
+ buildIndex ,
686
+ tTest -> fail ("Should have thrown exception" ),
687
+ new AggTestConfig (aggregationBuilder , fieldType1 , fieldType2 , fieldType3 )
688
+ )
689
+ );
690
+ assertEquals ("Paired t-test doesn't support filters" , ex .getMessage ());
691
+ } else {
692
+ testCase (buildIndex , (Consumer <InternalHistogram >) histogram -> {
693
+ if (tTestType == TTestType .HOMOSCEDASTIC ) {
694
+ assertEquals (buckets , histogram .getBuckets ().size ());
695
+ for (int i = 0 ; i < buckets ; i ++) {
696
+ InternalTTest ttest = histogram .getBuckets ().get (i ).getAggregations ().get ("t_test" );
697
+ assertEquals (0.03928288693 * tails , ttest .getValue (), 0.00001 );
698
+ }
699
+ } else {
700
+ assertEquals (buckets , histogram .getBuckets ().size ());
701
+ for (int i = 0 ; i < buckets ; i ++) {
702
+ InternalTTest ttest = histogram .getBuckets ().get (i ).getAggregations ().get ("t_test" );
703
+ assertEquals (0.04538666214 * tails , ttest .getValue (), 0.00001 );
704
+ }
705
+ }
706
+ }, new AggTestConfig (aggregationBuilder , fieldType1 , fieldType2 , fieldType3 ));
707
+ }
708
+ }
709
+
639
710
public void testFilterByFilterOrScript () throws IOException {
640
711
boolean fieldInA = randomBoolean ();
641
712
TTestType tTestType = randomFrom (TTestType .HOMOSCEDASTIC , TTestType .HETEROSCEDASTIC );
0 commit comments