46
46
import org .apache .lucene .search .TermQuery ;
47
47
import org .apache .lucene .store .Directory ;
48
48
import org .apache .lucene .util .BytesRef ;
49
+ import org .elasticsearch .Version ;
50
+ import org .elasticsearch .cluster .metadata .IndexMetaData ;
49
51
import org .elasticsearch .common .CheckedConsumer ;
50
52
import org .elasticsearch .common .collect .Tuple ;
51
53
import org .elasticsearch .common .settings .Settings ;
52
54
import org .elasticsearch .index .IndexSettings ;
55
+ import org .elasticsearch .index .mapper .ContentPath ;
53
56
import org .elasticsearch .index .mapper .DateFieldMapper ;
54
57
import org .elasticsearch .index .mapper .KeywordFieldMapper ;
55
58
import org .elasticsearch .index .mapper .MappedFieldType ;
59
+ import org .elasticsearch .index .mapper .Mapper ;
56
60
import org .elasticsearch .index .mapper .MapperService ;
57
61
import org .elasticsearch .index .mapper .NumberFieldMapper ;
58
62
import org .elasticsearch .index .query .QueryShardContext ;
87
91
import org .elasticsearch .search .lookup .LeafDocLookup ;
88
92
89
93
import java .io .IOException ;
94
+ import java .time .Instant ;
90
95
import java .util .ArrayList ;
91
96
import java .util .Arrays ;
92
- import java .util .Collection ;
93
97
import java .util .Collections ;
94
98
import java .util .Comparator ;
95
99
import java .util .HashMap ;
96
100
import java .util .List ;
97
101
import java .util .Map ;
98
102
import java .util .function .BiFunction ;
99
103
import java .util .function .Consumer ;
100
- import java .util .function .DoubleConsumer ;
101
104
import java .util .function .Function ;
102
105
import java .util .function .Supplier ;
103
106
@@ -740,41 +743,56 @@ public void testShortcutIsApplicable() {
740
743
)
741
744
);
742
745
}
743
- assertNotNull (
746
+ for (DateFieldMapper .Resolution resolution : DateFieldMapper .Resolution .values ()) {
747
+ assertNull (
748
+ MinAggregator .getPointReaderOrNull (
749
+ mockSearchContext (new MatchAllDocsQuery ()),
750
+ mockAggregator (),
751
+ mockDateValuesSourceConfig ("number" , true , resolution )
752
+ )
753
+ );
754
+ assertNull (
755
+ MinAggregator .getPointReaderOrNull (
756
+ mockSearchContext (new TermQuery (new Term ("foo" , "bar" ))),
757
+ null ,
758
+ mockDateValuesSourceConfig ("number" , true , resolution )
759
+ )
760
+ );
761
+ assertNull (
762
+ MinAggregator .getPointReaderOrNull (
763
+ mockSearchContext (null ),
764
+ mockAggregator (),
765
+ mockDateValuesSourceConfig ("number" , true , resolution )
766
+ )
767
+ );
768
+ assertNull (
769
+ MinAggregator .getPointReaderOrNull (
770
+ mockSearchContext (null ),
771
+ null ,
772
+ mockDateValuesSourceConfig ("number" , false , resolution )
773
+ )
774
+ );
775
+ }
776
+ // Check that we decode a dates "just like" the doc values instance.
777
+ Instant expected = Instant .from (DateFieldMapper .DEFAULT_DATE_TIME_FORMATTER .parse ("2020-01-01T00:00:00Z" ));
778
+ byte [] scratch = new byte [8 ];
779
+ LongPoint .encodeDimension (DateFieldMapper .Resolution .MILLISECONDS .convert (expected ), scratch , 0 );
780
+ assertThat (
744
781
MinAggregator .getPointReaderOrNull (
745
782
mockSearchContext (new MatchAllDocsQuery ()),
746
783
null ,
747
- mockDateValuesSourceConfig ("number" , true )
748
- )
784
+ mockDateValuesSourceConfig ("number" , true , DateFieldMapper . Resolution . MILLISECONDS )
785
+ ). apply ( scratch ), equalTo ( expected . toEpochMilli ())
749
786
);
750
- assertNull (
787
+ LongPoint .encodeDimension (DateFieldMapper .Resolution .NANOSECONDS .convert (expected ), scratch , 0 );
788
+ assertThat (
751
789
MinAggregator .getPointReaderOrNull (
752
790
mockSearchContext (new MatchAllDocsQuery ()),
753
- mockAggregator (),
754
- mockDateValuesSourceConfig ("number" , true )
755
- )
756
- );
757
- assertNull (
758
- MinAggregator .getPointReaderOrNull (
759
- mockSearchContext (new TermQuery (new Term ("foo" , "bar" ))),
760
791
null ,
761
- mockDateValuesSourceConfig ("number" , true )
762
- )
763
- );
764
- assertNull (
765
- MinAggregator .getPointReaderOrNull (
766
- mockSearchContext (null ),
767
- mockAggregator (),
768
- mockDateValuesSourceConfig ("number" , true )
769
- )
770
- );
771
- assertNull (
772
- MinAggregator .getPointReaderOrNull (
773
- mockSearchContext (null ),
774
- null ,
775
- mockDateValuesSourceConfig ("number" , false )
776
- )
792
+ mockDateValuesSourceConfig ("number" , true , DateFieldMapper .Resolution .NANOSECONDS )
793
+ ).apply (scratch ), equalTo (expected .toEpochMilli ())
777
794
);
795
+
778
796
}
779
797
780
798
public void testMinShortcutRandom () throws Exception {
@@ -799,21 +817,6 @@ public void testMinShortcutRandom() throws Exception {
799
817
(v ) -> DoublePoint .decodeDimension (v , 0 ));
800
818
}
801
819
802
- private void testMinCase (IndexSearcher searcher ,
803
- AggregationBuilder aggregationBuilder ,
804
- MappedFieldType ft ,
805
- DoubleConsumer testResult ) throws IOException {
806
- Collection <Query > queries = Arrays .asList (new MatchAllDocsQuery (), new DocValuesFieldExistsQuery (ft .name ()));
807
- for (Query query : queries ) {
808
- MinAggregator aggregator = createAggregator (query , aggregationBuilder , searcher , createIndexSettings (), ft );
809
- aggregator .preCollection ();
810
- searcher .search (new MatchAllDocsQuery (), aggregator );
811
- aggregator .postCollection ();
812
- InternalMin result = (InternalMin ) aggregator .buildAggregation (0L );
813
- testResult .accept (result .getValue ());
814
- }
815
- }
816
-
817
820
private void testMinShortcutCase (Supplier <Number > randomNumber ,
818
821
Function <Number , Field > pointFieldFunc ,
819
822
Function <byte [], Number > pointConvertFunc ) throws IOException {
@@ -889,12 +892,17 @@ private ValuesSourceConfig<ValuesSource.Numeric> mockNumericValuesSourceConfig(S
889
892
return config ;
890
893
}
891
894
892
- private ValuesSourceConfig <ValuesSource .Numeric > mockDateValuesSourceConfig (String fieldName , boolean indexed ) {
895
+ private ValuesSourceConfig <ValuesSource .Numeric > mockDateValuesSourceConfig (String fieldName , boolean indexed ,
896
+ DateFieldMapper .Resolution resolution ) {
893
897
ValuesSourceConfig <ValuesSource .Numeric > config = mock (ValuesSourceConfig .class );
894
- MappedFieldType ft = new DateFieldMapper .Builder (fieldName ).fieldType ();
895
- ft .setName (fieldName );
896
- ft .setIndexOptions (indexed ? IndexOptions .DOCS : IndexOptions .NONE );
897
- ft .freeze ();
898
+ Mapper .BuilderContext builderContext = new Mapper .BuilderContext (
899
+ Settings .builder ().put (IndexMetaData .SETTING_VERSION_CREATED , Version .CURRENT ).build (),
900
+ new ContentPath ());
901
+ MappedFieldType ft = new DateFieldMapper .Builder (fieldName )
902
+ .index (indexed )
903
+ .withResolution (resolution )
904
+ .build (builderContext )
905
+ .fieldType ();
898
906
when (config .fieldContext ()).thenReturn (new FieldContext (fieldName , null , ft ));
899
907
return config ;
900
908
}
0 commit comments