|
62 | 62 | import org.opensearch.index.query.QueryRewriteContext;
|
63 | 63 | import org.opensearch.index.query.QueryShardContext;
|
64 | 64 | import org.opensearch.search.DocValueFormat;
|
| 65 | +import org.opensearch.search.approximate.ApproximateIndexOrDocValuesQuery; |
| 66 | +import org.opensearch.search.approximate.ApproximatePointRangeQuery; |
65 | 67 | import org.opensearch.search.lookup.SearchLookup;
|
66 | 68 |
|
67 | 69 | import java.io.IOException;
|
|
81 | 83 | import java.util.function.Supplier;
|
82 | 84 |
|
83 | 85 | import static org.opensearch.common.time.DateUtils.toLong;
|
| 86 | +import static org.apache.lucene.document.LongPoint.pack; |
84 | 87 |
|
85 | 88 | /**
|
86 | 89 | * A {@link FieldMapper} for dates.
|
@@ -109,6 +112,21 @@ public static DateFormatter getDefaultDateTimeFormatter() {
|
109 | 112 | : LEGACY_DEFAULT_DATE_TIME_FORMATTER;
|
110 | 113 | }
|
111 | 114 |
|
| 115 | + public static Query getDefaultQuery(Query pointRangeQuery, Query dvQuery, String name, long l, long u) { |
| 116 | + return FeatureFlags.isEnabled(FeatureFlags.APPROXIMATE_POINT_RANGE_QUERY_SETTING) |
| 117 | + ? new ApproximateIndexOrDocValuesQuery( |
| 118 | + pointRangeQuery, |
| 119 | + new ApproximatePointRangeQuery(name, pack(new long[] { l }).bytes, pack(new long[] { u }).bytes, new long[] { l }.length) { |
| 120 | + @Override |
| 121 | + protected String toString(int dimension, byte[] value) { |
| 122 | + return Long.toString(LongPoint.decodeDimension(value, 0)); |
| 123 | + } |
| 124 | + }, |
| 125 | + dvQuery |
| 126 | + ) |
| 127 | + : new IndexOrDocValuesQuery(pointRangeQuery, dvQuery); |
| 128 | + } |
| 129 | + |
112 | 130 | /**
|
113 | 131 | * Resolution of the date time
|
114 | 132 | *
|
@@ -468,24 +486,22 @@ public Query rangeQuery(
|
468 | 486 | }
|
469 | 487 | DateMathParser parser = forcedDateParser == null ? dateMathParser : forcedDateParser;
|
470 | 488 | return dateRangeQuery(lowerTerm, upperTerm, includeLower, includeUpper, timeZone, parser, context, resolution, (l, u) -> {
|
| 489 | + Query pointRangeQuery = isSearchable() ? LongPoint.newRangeQuery(name(), l, u) : null; |
| 490 | + Query dvQuery = hasDocValues() ? SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u) : null; |
471 | 491 | if (isSearchable() && hasDocValues()) {
|
472 |
| - Query query = LongPoint.newRangeQuery(name(), l, u); |
473 |
| - Query dvQuery = SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u); |
474 |
| - query = new IndexOrDocValuesQuery(query, dvQuery); |
475 |
| - |
| 492 | + Query query = getDefaultQuery(pointRangeQuery, dvQuery, name(), l, u); |
476 | 493 | if (context.indexSortedOnField(name())) {
|
477 | 494 | query = new IndexSortSortedNumericDocValuesRangeQuery(name(), l, u, query);
|
478 | 495 | }
|
479 | 496 | return query;
|
480 | 497 | }
|
481 | 498 | if (hasDocValues()) {
|
482 |
| - Query query = SortedNumericDocValuesField.newSlowRangeQuery(name(), l, u); |
483 | 499 | if (context.indexSortedOnField(name())) {
|
484 |
| - query = new IndexSortSortedNumericDocValuesRangeQuery(name(), l, u, query); |
| 500 | + dvQuery = new IndexSortSortedNumericDocValuesRangeQuery(name(), l, u, dvQuery); |
485 | 501 | }
|
486 |
| - return query; |
| 502 | + return dvQuery; |
487 | 503 | }
|
488 |
| - return LongPoint.newRangeQuery(name(), l, u); |
| 504 | + return pointRangeQuery; |
489 | 505 | });
|
490 | 506 | }
|
491 | 507 |
|
|
0 commit comments