4646import org .apache .lucene .search .TermQuery ;
4747import org .apache .lucene .store .Directory ;
4848import org .apache .lucene .util .BytesRef ;
49+ import org .elasticsearch .Version ;
50+ import org .elasticsearch .cluster .metadata .IndexMetaData ;
4951import org .elasticsearch .common .CheckedConsumer ;
5052import org .elasticsearch .common .collect .Tuple ;
5153import org .elasticsearch .common .settings .Settings ;
5254import org .elasticsearch .index .IndexSettings ;
55+ import org .elasticsearch .index .mapper .ContentPath ;
5356import org .elasticsearch .index .mapper .DateFieldMapper ;
5457import org .elasticsearch .index .mapper .KeywordFieldMapper ;
5558import org .elasticsearch .index .mapper .MappedFieldType ;
59+ import org .elasticsearch .index .mapper .Mapper ;
5660import org .elasticsearch .index .mapper .MapperService ;
5761import org .elasticsearch .index .mapper .NumberFieldMapper ;
5862import org .elasticsearch .index .query .QueryShardContext ;
8791import org .elasticsearch .search .lookup .LeafDocLookup ;
8892
8993import java .io .IOException ;
94+ import java .time .Instant ;
9095import java .util .ArrayList ;
9196import java .util .Arrays ;
92- import java .util .Collection ;
9397import java .util .Collections ;
9498import java .util .Comparator ;
9599import java .util .HashMap ;
96100import java .util .List ;
97101import java .util .Map ;
98102import java .util .function .BiFunction ;
99103import java .util .function .Consumer ;
100- import java .util .function .DoubleConsumer ;
101104import java .util .function .Function ;
102105import java .util .function .Supplier ;
103106
@@ -740,41 +743,56 @@ public void testShortcutIsApplicable() {
740743 )
741744 );
742745 }
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 (
744781 MinAggregator .getPointReaderOrNull (
745782 mockSearchContext (new MatchAllDocsQuery ()),
746783 null ,
747- mockDateValuesSourceConfig ("number" , true )
748- )
784+ mockDateValuesSourceConfig ("number" , true , DateFieldMapper . Resolution . MILLISECONDS )
785+ ). apply ( scratch ), equalTo ( expected . toEpochMilli ())
749786 );
750- assertNull (
787+ LongPoint .encodeDimension (DateFieldMapper .Resolution .NANOSECONDS .convert (expected ), scratch , 0 );
788+ assertThat (
751789 MinAggregator .getPointReaderOrNull (
752790 mockSearchContext (new MatchAllDocsQuery ()),
753- mockAggregator (),
754- mockDateValuesSourceConfig ("number" , true )
755- )
756- );
757- assertNull (
758- MinAggregator .getPointReaderOrNull (
759- mockSearchContext (new TermQuery (new Term ("foo" , "bar" ))),
760791 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 ())
777794 );
795+
778796 }
779797
780798 public void testMinShortcutRandom () throws Exception {
@@ -799,21 +817,6 @@ public void testMinShortcutRandom() throws Exception {
799817 (v ) -> DoublePoint .decodeDimension (v , 0 ));
800818 }
801819
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-
817820 private void testMinShortcutCase (Supplier <Number > randomNumber ,
818821 Function <Number , Field > pointFieldFunc ,
819822 Function <byte [], Number > pointConvertFunc ) throws IOException {
@@ -889,12 +892,17 @@ private ValuesSourceConfig<ValuesSource.Numeric> mockNumericValuesSourceConfig(S
889892 return config ;
890893 }
891894
892- private ValuesSourceConfig <ValuesSource .Numeric > mockDateValuesSourceConfig (String fieldName , boolean indexed ) {
895+ private ValuesSourceConfig <ValuesSource .Numeric > mockDateValuesSourceConfig (String fieldName , boolean indexed ,
896+ DateFieldMapper .Resolution resolution ) {
893897 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 ();
898906 when (config .fieldContext ()).thenReturn (new FieldContext (fieldName , null , ft ));
899907 return config ;
900908 }
0 commit comments