summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
Diffstat (limited to 'core/src')
-rw-r--r--core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java4
-rw-r--r--core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java8
-rw-r--r--core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java23
-rw-r--r--core/src/main/java/org/elasticsearch/index/IndexService.java14
-rw-r--r--core/src/main/java/org/elasticsearch/index/fieldstats/FieldStatsProvider.java181
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java38
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java57
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java8
-rw-r--r--core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java11
-rw-r--r--core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java31
-rw-r--r--core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java17
-rw-r--r--core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java64
-rw-r--r--core/src/main/java/org/elasticsearch/search/SearchService.java2
-rw-r--r--core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java2
-rw-r--r--core/src/test/java/org/elasticsearch/index/fieldstats/FieldStatsProviderTests.java446
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/DateFieldTypeTests.java70
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/DoubleFieldTypeTests.java11
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/FloatFieldTypeTests.java11
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/IntegerFieldTypeTests.java11
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/KeywordFieldTypeTests.java15
-rw-r--r--core/src/test/java/org/elasticsearch/index/mapper/core/LongFieldTypeTests.java11
-rw-r--r--core/src/test/java/org/elasticsearch/index/percolator/PercolatorQueryCacheTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java3
-rw-r--r--core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java432
-rw-r--r--core/src/test/java/org/elasticsearch/index/query/RangeQueryRewriteTests.java81
-rw-r--r--core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheIT.java50
-rw-r--r--core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java2
-rw-r--r--core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java2
35 files changed, 491 insertions, 1160 deletions
diff --git a/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java b/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java
index 320f069660..7c8d52b6a6 100644
--- a/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java
+++ b/core/src/main/java/org/elasticsearch/action/admin/indices/validate/query/TransportValidateQueryAction.java
@@ -168,8 +168,6 @@ public class TransportValidateQueryAction extends TransportBroadcastAction<Valid
protected ShardValidateQueryResponse shardOperation(ShardValidateQueryRequest request) {
IndexService indexService = indicesService.indexServiceSafe(request.shardId().getIndex());
IndexShard indexShard = indexService.getShard(request.shardId().id());
- final QueryShardContext queryShardContext = indexService.newQueryShardContext();
- queryShardContext.setTypes(request.types());
boolean valid;
String explanation = null;
@@ -182,7 +180,7 @@ public class TransportValidateQueryAction extends TransportBroadcastAction<Valid
parseFieldMatcher, SearchService.NO_TIMEOUT, fetchPhase);
SearchContext.setCurrent(searchContext);
try {
- searchContext.parsedQuery(queryShardContext.toQuery(request.query()));
+ searchContext.parsedQuery(searchContext.getQueryShardContext().toQuery(request.query()));
searchContext.preProcess();
valid = true;
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
index c1094ce4d3..d6e6b5fc0a 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/FieldStatsShardResponse.java
@@ -32,17 +32,17 @@ import java.util.Map;
*/
public class FieldStatsShardResponse extends BroadcastShardResponse {
- private Map<String, FieldStats> fieldStats;
+ private Map<String, FieldStats<?>> fieldStats;
public FieldStatsShardResponse() {
}
- public FieldStatsShardResponse(ShardId shardId, Map<String, FieldStats> fieldStats) {
+ public FieldStatsShardResponse(ShardId shardId, Map<String, FieldStats<?>> fieldStats) {
super(shardId);
this.fieldStats = fieldStats;
}
- public Map<String, FieldStats> getFieldStats() {
+ public Map<String, FieldStats<?>> getFieldStats() {
return fieldStats;
}
@@ -63,7 +63,7 @@ public class FieldStatsShardResponse extends BroadcastShardResponse {
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeVInt(fieldStats.size());
- for (Map.Entry<String, FieldStats> entry : fieldStats.entrySet()) {
+ for (Map.Entry<String, FieldStats<?>> entry : fieldStats.entrySet()) {
out.writeString(entry.getKey());
entry.getValue().writeTo(out);
}
diff --git a/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java b/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
index de56a0f5c2..5981128126 100644
--- a/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
+++ b/core/src/main/java/org/elasticsearch/action/fieldstats/TransportFieldStatsTransportAction.java
@@ -19,9 +19,6 @@
package org.elasticsearch.action.fieldstats;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.MultiFields;
-import org.apache.lucene.index.Terms;
import org.elasticsearch.ExceptionsHelper;
import org.elasticsearch.action.ShardOperationFailedException;
import org.elasticsearch.action.support.ActionFilters;
@@ -102,9 +99,9 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
indicesMergedFieldStats.put(indexName, indexMergedFieldStats = new HashMap<>());
}
- Map<String, FieldStats> fieldStats = shardResponse.getFieldStats();
- for (Map.Entry<String, FieldStats> entry : fieldStats.entrySet()) {
- FieldStats existing = indexMergedFieldStats.get(entry.getKey());
+ Map<String, FieldStats<?>> fieldStats = shardResponse.getFieldStats();
+ for (Map.Entry<String, FieldStats<?>> entry : fieldStats.entrySet()) {
+ FieldStats<?> existing = indexMergedFieldStats.get(entry.getKey());
if (existing != null) {
if (existing.getType() != entry.getValue().getType()) {
throw new IllegalStateException(
@@ -156,22 +153,20 @@ public class TransportFieldStatsTransportAction extends TransportBroadcastAction
@Override
protected FieldStatsShardResponse shardOperation(FieldStatsShardRequest request) {
ShardId shardId = request.shardId();
- Map<String, FieldStats> fieldStats = new HashMap<>();
+ Map<String, FieldStats<?>> fieldStats = new HashMap<>();
IndexService indexServices = indicesService.indexServiceSafe(shardId.getIndex());
MapperService mapperService = indexServices.mapperService();
IndexShard shard = indexServices.getShard(shardId.id());
try (Engine.Searcher searcher = shard.acquireSearcher("fieldstats")) {
for (String field : request.getFields()) {
MappedFieldType fieldType = mapperService.fullName(field);
- if (fieldType != null) {
- IndexReader reader = searcher.reader();
- Terms terms = MultiFields.getTerms(reader, field);
- if (terms != null) {
- fieldStats.put(field, fieldType.stats(terms, reader.maxDoc()));
- }
- } else {
+ if (fieldType == null) {
throw new IllegalArgumentException("field [" + field + "] doesn't exist");
}
+ FieldStats<?> stats = fieldType.stats(searcher.reader());
+ if (stats != null) {
+ fieldStats.put(field, stats);
+ }
}
} catch (IOException e) {
throw ExceptionsHelper.convertToElastic(e);
diff --git a/core/src/main/java/org/elasticsearch/index/IndexService.java b/core/src/main/java/org/elasticsearch/index/IndexService.java
index 1f1037ea18..5a38a194b0 100644
--- a/core/src/main/java/org/elasticsearch/index/IndexService.java
+++ b/core/src/main/java/org/elasticsearch/index/IndexService.java
@@ -19,6 +19,7 @@
package org.elasticsearch.index;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
@@ -438,14 +439,23 @@ public final class IndexService extends AbstractIndexComponent implements IndexC
* Creates a new QueryShardContext. The context has not types set yet, if types are required set them via
* {@link QueryShardContext#setTypes(String...)}
*/
- public QueryShardContext newQueryShardContext() {
+ public QueryShardContext newQueryShardContext(IndexReader indexReader) {
return new QueryShardContext(
indexSettings, indexCache.bitsetFilterCache(), indexFieldData, mapperService(),
similarityService(), nodeServicesProvider.getScriptService(), nodeServicesProvider.getIndicesQueriesRegistry(),
- indexCache.getPercolatorQueryCache()
+ indexCache.getPercolatorQueryCache(), indexReader
);
}
+ /**
+ * Creates a new QueryShardContext. The context has not types set yet, if types are required set them via
+ * {@link QueryShardContext#setTypes(String...)}. This context may be used for query parsing but cannot be
+ * used for rewriting since it does not know about the current {@link IndexReader}.
+ */
+ public QueryShardContext newQueryShardContext() {
+ return newQueryShardContext(null);
+ }
+
public ThreadPool getThreadPool() {
return threadPool;
}
diff --git a/core/src/main/java/org/elasticsearch/index/fieldstats/FieldStatsProvider.java b/core/src/main/java/org/elasticsearch/index/fieldstats/FieldStatsProvider.java
deleted file mode 100644
index 066d1207e3..0000000000
--- a/core/src/main/java/org/elasticsearch/index/fieldstats/FieldStatsProvider.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.elasticsearch.index.fieldstats;
-
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.MultiFields;
-import org.apache.lucene.index.Terms;
-import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.action.fieldstats.FieldStats;
-import org.elasticsearch.action.fieldstats.IndexConstraint;
-import org.elasticsearch.action.fieldstats.IndexConstraint.Comparison;
-import org.elasticsearch.action.fieldstats.IndexConstraint.Property;
-import org.elasticsearch.common.joda.DateMathParser;
-import org.elasticsearch.index.engine.Engine.Searcher;
-import org.elasticsearch.index.mapper.MappedFieldType;
-import org.elasticsearch.index.mapper.MapperService;
-import org.elasticsearch.index.mapper.core.DateFieldMapper.DateFieldType;
-import org.elasticsearch.index.mapper.ip.IpFieldMapper.IpFieldType;
-import org.joda.time.DateTimeZone;
-
-import java.io.IOException;
-
-/**
- * Provides a service for gettings the {@link FieldStats} for a given field from
- * the index.
- */
-public class FieldStatsProvider {
-
- private final Searcher searcher;
- private final MapperService mapperService;
-
- /**
- * @param searcher
- * the {@link Searcher}to use when retrieving the
- * {@link FieldStats}
- * @param mapperService
- * the {@link MapperService}
- */
- public FieldStatsProvider(Searcher searcher, MapperService mapperService) {
- this.searcher = searcher;
- this.mapperService = mapperService;
- }
-
- /**
- * @param field
- * the name of the field to return {@link FieldStats} for.
- * @return a {@link FieldStats} object for the given field
- * @throws IOException
- * if the field statistics cannot be read
- */
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- MappedFieldType mappedFieldType = mapperService.fullName(field);
- if (mappedFieldType != null) {
- IndexReader reader = searcher.reader();
- Terms terms = MultiFields.getTerms(reader, field);
- if (terms != null) {
- return mappedFieldType.stats(terms, reader.maxDoc());
- }
- }
- return null;
- }
-
- /**
- * @param fieldName
- * the fieldName to check
- * @param from
- * the minimum value for the query
- * @param to
- * the maximum value for the query
- * @param includeLower
- * whether the from value is inclusive
- * @param includeUpper
- * whether the to value is inclusive
- * @param timeZone
- * the timeZone to use for date fields
- * @param dateMathParser
- * the {@link DateMathParser} to use for date fields
- * @return A {@link Relation} indicating the overlap of the range of terms
- * for the field with the query range. This method will return:
- * <ul>
- * <li>{@link Relation#WITHIN} if the range of terms for the field
- * in the shard is completely within the query range</li>
- * <li>{@link Relation#DISJOINT} if the range of terms for the field
- * in the shard is completely outside the query range</li>
- * <li>{@link Relation#INTERSECTS} if the range of terms for the
- * field in the shard intersects with the query range</li>
- * </ul>
- * @throws IOException
- * if the index cannot be read
- */
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- MappedFieldType mappedFieldType = mapperService.fullName(fieldName);
- FieldStats<?> fieldStats = get(fieldName);
- if (fieldStats == null) {
- // No fieldStats for the field so the field doesn't exist on
- // this shard, so relation is DISJOINT
- return Relation.DISJOINT;
- } else {
- // Convert the from and to values to Strings so they can be used
- // in the IndexConstraints. Since DateTime is represented as a
- // Long field in Lucene we need to use the millisecond value of
- // the DateTime in that case
- String fromString = null;
- if (from != null) {
- if (mappedFieldType instanceof DateFieldType) {
- long millis = ((DateFieldType) mappedFieldType).parseToMilliseconds(from, !includeLower, timeZone, dateMathParser);
- fromString = fieldStats.stringValueOf(millis, null);
- } else if (mappedFieldType instanceof IpFieldType) {
- if (from instanceof BytesRef) {
- from = ((BytesRef) from).utf8ToString();
- }
- long ipAsLong = ((IpFieldType) mappedFieldType).value(from);
- fromString = fieldStats.stringValueOf(ipAsLong, null);
- } else {
- fromString = fieldStats.stringValueOf(from, null);
- }
- }
- String toString = null;
- if (to != null) {
- if (mappedFieldType instanceof DateFieldType) {
- long millis = ((DateFieldType) mappedFieldType).parseToMilliseconds(to, includeUpper, timeZone, dateMathParser);
- toString = fieldStats.stringValueOf(millis, null);
- } else if (mappedFieldType instanceof IpFieldType) {
- if (to instanceof BytesRef) {
- to = ((BytesRef) to).utf8ToString();
- }
- long ipAsLong = ((IpFieldType) mappedFieldType).value(to);
- toString = fieldStats.stringValueOf(ipAsLong, null);
- } else {
- toString = fieldStats.stringValueOf(to, null);
- }
- }
- if ((from == null || fieldStats
- .match(new IndexConstraint(fieldName, Property.MIN, includeLower ? Comparison.GTE : Comparison.GT, fromString)))
- && (to == null || fieldStats.match(
- new IndexConstraint(fieldName, Property.MAX, includeUpper ? Comparison.LTE : Comparison.LT, toString)))) {
- // If the min and max terms for the field are both within
- // the query range then all documents will match so relation is
- // WITHIN
- return Relation.WITHIN;
- } else if ((to != null && fieldStats
- .match(new IndexConstraint(fieldName, Property.MIN, includeUpper ? Comparison.GT : Comparison.GTE, toString)))
- || (from != null && fieldStats.match(
- new IndexConstraint(fieldName, Property.MAX, includeLower ? Comparison.LT : Comparison.LTE, fromString)))) {
- // If the min and max terms are both outside the query range
- // then no document will match so relation is DISJOINT (N.B.
- // since from <= to we only need
- // to check one bould for each side of the query range)
- return Relation.DISJOINT;
- }
- }
- // Range of terms doesn't match any of the constraints so must INTERSECT
- return Relation.INTERSECTS;
- }
-
- /**
- * An enum used to describe the relation between the range of terms in a
- * shard when compared with a query range
- */
- public static enum Relation {
- WITHIN, INTERSECTS, DISJOINT;
- }
-}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java b/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
index 9eafa8ccd7..42f77bb6c2 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/MappedFieldType.java
@@ -21,6 +21,8 @@ package org.elasticsearch.index.mapper;
import org.apache.lucene.document.FieldType;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.Terms;
import org.apache.lucene.queries.TermsQuery;
@@ -37,6 +39,7 @@ import org.apache.lucene.util.BytesRef;
import org.elasticsearch.Version;
import org.elasticsearch.action.fieldstats.FieldStats;
import org.elasticsearch.common.Nullable;
+import org.elasticsearch.common.joda.DateMathParser;
import org.elasticsearch.common.lucene.BytesRefs;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.index.analysis.NamedAnalyzer;
@@ -44,6 +47,7 @@ import org.elasticsearch.index.fielddata.IndexFieldData;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.QueryShardException;
import org.elasticsearch.index.similarity.SimilarityProvider;
+import org.joda.time.DateTimeZone;
import java.io.IOException;
import java.util.List;
@@ -394,14 +398,43 @@ public abstract class MappedFieldType extends FieldType {
}
/**
- * @return a {@link FieldStats} instance that maps to the type of this field based on the provided {@link Terms} instance.
+ * @return a {@link FieldStats} instance that maps to the type of this
+ * field or {@code null} if the provided index has no stats about the
+ * current field
*/
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
return new FieldStats.Text(
maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), terms.getMin(), terms.getMax()
);
}
+ /**
+ * An enum used to describe the relation between the range of terms in a
+ * shard when compared with a query range
+ */
+ public static enum Relation {
+ WITHIN,
+ INTERSECTS,
+ DISJOINT;
+ }
+
+ /** Return whether all values of the given {@link IndexReader} are within the range,
+ * outside the range or cross the range. The default implementation returns
+ * {@link Relation#INTERSECTS}, which is always fine to return when there is
+ * no way to check whether values are actually within bounds. */
+ public Relation isFieldWithinQuery(
+ IndexReader reader,
+ Object from, Object to,
+ boolean includeLower, boolean includeUpper,
+ DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
+ return Relation.INTERSECTS;
+ }
+
/** A term query to use when parsing a query string. Can return <tt>null</tt>. */
@Nullable
public Query queryStringTermQuery(Term term) {
@@ -424,4 +457,5 @@ public abstract class MappedFieldType extends FieldType {
checkIfFrozen();
this.eagerGlobalOrdinals = eagerGlobalOrdinals;
}
+
}
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java
index c42f0b7cd4..758095b714 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/ByteFieldMapper.java
@@ -22,6 +22,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -181,7 +182,12 @@ public class ByteFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
return new FieldStats.Long(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
index 5d66fb62c7..17c8671c66 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/DateFieldMapper.java
@@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper.core;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MultiFields;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -398,7 +399,12 @@ public class DateFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinLong(terms);
long maxValue = LegacyNumericUtils.getMaxLong(terms);
return new FieldStats.Date(
@@ -417,6 +423,55 @@ public class DateFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override
+ public Relation isFieldWithinQuery(IndexReader reader,
+ Object from, Object to,
+ boolean includeLower, boolean includeUpper,
+ DateTimeZone timeZone, DateMathParser dateParser) throws IOException {
+ if (dateParser == null) {
+ dateParser = this.dateMathParser;
+ }
+
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ // no terms, so nothing matches
+ return Relation.DISJOINT;
+ }
+
+ long minValue = LegacyNumericUtils.getMinLong(terms);
+ long maxValue = LegacyNumericUtils.getMaxLong(terms);
+
+ long fromInclusive = Long.MIN_VALUE;
+ if (from != null) {
+ fromInclusive = parseToMilliseconds(from, !includeLower, timeZone, dateParser);
+ if (includeLower == false) {
+ if (fromInclusive == Long.MAX_VALUE) {
+ return Relation.DISJOINT;
+ }
+ ++fromInclusive;
+ }
+ }
+
+ long toInclusive = Long.MAX_VALUE;
+ if (to != null) {
+ toInclusive = parseToMilliseconds(to, includeUpper, timeZone, dateParser);
+ if (includeUpper == false) {
+ if (toInclusive == Long.MIN_VALUE) {
+ return Relation.DISJOINT;
+ }
+ --toInclusive;
+ }
+ }
+
+ if (minValue >= fromInclusive && maxValue <= toInclusive) {
+ return Relation.WITHIN;
+ } else if (maxValue < fromInclusive || minValue > toInclusive) {
+ return Relation.DISJOINT;
+ } else {
+ return Relation.INTERSECTS;
+ }
+ }
+
public long parseToMilliseconds(Object value, boolean inclusive, @Nullable DateTimeZone zone, @Nullable DateMathParser forcedDateParser) {
if (value instanceof Long) {
return ((Long) value).longValue();
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java
index 69d56439b3..bfebadb70c 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/DoubleFieldMapper.java
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -184,7 +185,12 @@ public class DoubleFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
double minValue = NumericUtils.sortableLongToDouble(LegacyNumericUtils.getMinLong(terms));
double maxValue = NumericUtils.sortableLongToDouble(LegacyNumericUtils.getMaxLong(terms));
return new FieldStats.Double(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java
index 48b9ca9587..c63252ec9c 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/FloatFieldMapper.java
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -185,7 +186,12 @@ public class FloatFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
float minValue = NumericUtils.sortableIntToFloat(LegacyNumericUtils.getMinInt(terms));
float maxValue = NumericUtils.sortableIntToFloat(LegacyNumericUtils.getMaxInt(terms));
return new FieldStats.Float(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java
index 860377d087..d467b95930 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/IntegerFieldMapper.java
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -190,7 +191,12 @@ public class IntegerFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
return new FieldStats.Long(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java
index b261df7a22..a3d9e0eb5d 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/LongFieldMapper.java
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -188,7 +189,12 @@ public class LongFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinLong(terms);
long maxValue = LegacyNumericUtils.getMaxLong(terms);
return new FieldStats.Long(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java
index eb00e0744c..6ba40ea98e 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/core/ShortFieldMapper.java
@@ -23,6 +23,7 @@ import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -186,7 +187,12 @@ public class ShortFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinInt(terms);
long maxValue = LegacyNumericUtils.getMaxInt(terms);
return new FieldStats.Long(
diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java
index b754c16366..b2b8252955 100644
--- a/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java
+++ b/core/src/main/java/org/elasticsearch/index/mapper/ip/IpFieldMapper.java
@@ -22,6 +22,7 @@ package org.elasticsearch.index.mapper.ip;
import org.apache.lucene.analysis.LegacyNumericTokenStream;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexOptions;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Terms;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
@@ -267,10 +268,16 @@ public class IpFieldMapper extends NumberFieldMapper {
}
@Override
- public FieldStats stats(Terms terms, int maxDoc) throws IOException {
+ public FieldStats stats(IndexReader reader) throws IOException {
+ int maxDoc = reader.maxDoc();
+ Terms terms = org.apache.lucene.index.MultiFields.getTerms(reader, name());
+ if (terms == null) {
+ return null;
+ }
long minValue = LegacyNumericUtils.getMinLong(terms);
long maxValue = LegacyNumericUtils.getMaxLong(terms);
- return new FieldStats.Ip(maxDoc, terms.getDocCount(), terms.getSumDocFreq(), terms.getSumTotalTermFreq(), minValue, maxValue);
+ return new FieldStats.Ip(maxDoc, terms.getDocCount(), terms.getSumDocFreq(),
+ terms.getSumTotalTermFreq(), minValue, maxValue);
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java
index 11164659b3..70de640539 100644
--- a/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java
+++ b/core/src/main/java/org/elasticsearch/index/query/QueryRewriteContext.java
@@ -18,9 +18,10 @@
*/
package org.elasticsearch.index.query;
+import org.apache.lucene.index.IndexReader;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.IndexSettings;
-import org.elasticsearch.index.fieldstats.FieldStatsProvider;
+import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.indices.query.IndicesQueriesRegistry;
import org.elasticsearch.script.ScriptService;
@@ -28,25 +29,21 @@ import org.elasticsearch.script.ScriptService;
* Context object used to rewrite {@link QueryBuilder} instances into simplified version.
*/
public class QueryRewriteContext {
+ protected final MapperService mapperService;
protected final ScriptService scriptService;
protected final IndexSettings indexSettings;
protected final IndicesQueriesRegistry indicesQueriesRegistry;
protected final QueryParseContext parseContext;
- protected FieldStatsProvider fieldStatsProvider;
+ protected final IndexReader reader;
- public QueryRewriteContext(IndexSettings indexSettings, ScriptService scriptService, IndicesQueriesRegistry indicesQueriesRegistry) {
+ public QueryRewriteContext(IndexSettings indexSettings, MapperService mapperService, ScriptService scriptService,
+ IndicesQueriesRegistry indicesQueriesRegistry, IndexReader reader) {
+ this.mapperService = mapperService;
this.scriptService = scriptService;
this.indexSettings = indexSettings;
this.indicesQueriesRegistry = indicesQueriesRegistry;
this.parseContext = new QueryParseContext(indicesQueriesRegistry);
- }
-
- public void setFieldStatsProvider(FieldStatsProvider fieldStatsProvider) {
- this.fieldStatsProvider = fieldStatsProvider;
- }
-
- public FieldStatsProvider getFieldStatsProvider() {
- return fieldStatsProvider;
+ this.reader = reader;
}
/**
@@ -72,6 +69,18 @@ public class QueryRewriteContext {
}
/**
+ * Return the MapperService.
+ */
+ public final MapperService getMapperService() {
+ return mapperService;
+ }
+
+ /** Return the current {@link IndexReader}, or {@code null} if we are on the coordinating node. */
+ public IndexReader getIndexReader() {
+ return reader;
+ }
+
+ /**
* Returns a new {@link QueryParseContext} to parse template or wrapped queries.
*/
public QueryParseContext newParseContext() {
diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java
index 77aa1dc0c3..b516e44ea2 100644
--- a/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java
+++ b/core/src/main/java/org/elasticsearch/index/query/QueryShardContext.java
@@ -20,6 +20,7 @@
package org.elasticsearch.index.query;
import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.MapperQueryParser;
import org.apache.lucene.queryparser.classic.QueryParserSettings;
import org.apache.lucene.search.Query;
@@ -95,8 +96,8 @@ public class QueryShardContext extends QueryRewriteContext {
boolean isFilter; // pkg private for testing
public QueryShardContext(IndexSettings indexSettings, BitsetFilterCache bitsetFilterCache, IndexFieldDataService indexFieldDataService, MapperService mapperService, SimilarityService similarityService, ScriptService scriptService,
- final IndicesQueriesRegistry indicesQueriesRegistry, PercolatorQueryCache percolatorQueryCache) {
- super(indexSettings, scriptService, indicesQueriesRegistry);
+ final IndicesQueriesRegistry indicesQueriesRegistry, PercolatorQueryCache percolatorQueryCache, IndexReader reader) {
+ super(indexSettings, mapperService, scriptService, indicesQueriesRegistry, reader);
this.indexSettings = indexSettings;
this.similarityService = similarityService;
this.mapperService = mapperService;
@@ -109,16 +110,10 @@ public class QueryShardContext extends QueryRewriteContext {
}
public QueryShardContext(QueryShardContext source) {
- this(source.indexSettings, source.bitsetFilterCache, source.indexFieldDataService, source.mapperService, source.similarityService, source.scriptService, source.indicesQueriesRegistry, source.percolatorQueryCache);
+ this(source.indexSettings, source.bitsetFilterCache, source.indexFieldDataService, source.mapperService, source.similarityService, source.scriptService, source.indicesQueriesRegistry, source.percolatorQueryCache, source.reader);
this.types = source.getTypes();
}
-
- @Override
- public QueryShardContext clone() {
- return new QueryShardContext(indexSettings, bitsetFilterCache, indexFieldDataService, mapperService, similarityService, scriptService, indicesQueriesRegistry, percolatorQueryCache);
- }
-
public void parseFieldMatcher(ParseFieldMatcher parseFieldMatcher) {
this.parseContext.parseFieldMatcher(parseFieldMatcher);
}
@@ -145,10 +140,6 @@ public class QueryShardContext extends QueryRewriteContext {
return mapperService.analysisService();
}
- public MapperService getMapperService() {
- return mapperService;
- }
-
public PercolatorQueryCache getPercolatorQueryCache() {
return percolatorQueryCache;
}
diff --git a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java
index b1132c42ea..28f13dc8cf 100644
--- a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java
+++ b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java
@@ -19,6 +19,7 @@
package org.elasticsearch.index.query;
+import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
import org.apache.lucene.util.BytesRef;
@@ -30,8 +31,8 @@ import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.joda.Joda;
import org.elasticsearch.common.lucene.BytesRefs;
import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.index.fieldstats.FieldStatsProvider;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.index.mapper.core.DateFieldMapper;
import org.joda.time.DateTimeZone;
@@ -254,34 +255,47 @@ public class RangeQueryBuilder extends AbstractQueryBuilder<RangeQueryBuilder> i
return NAME;
}
+ // Overridable for testing only
+ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
+ IndexReader reader = queryRewriteContext.getIndexReader();
+ // If the reader is null we are not on the shard and cannot
+ // rewrite so just pretend there is an intersection so that the rewrite is a noop
+ if (reader == null) {
+ return MappedFieldType.Relation.INTERSECTS;
+ }
+ final MapperService mapperService = queryRewriteContext.getMapperService();
+ final MappedFieldType fieldType = mapperService.fullName(fieldName);
+ if (fieldType == null) {
+ // no field means we have no values
+ return MappedFieldType.Relation.DISJOINT;
+ } else {
+ DateMathParser dateMathParser = format == null ? null : new DateMathParser(format);
+ return fieldType.isFieldWithinQuery(queryRewriteContext.getIndexReader(), from, to, includeLower, includeUpper, timeZone, dateMathParser);
+ }
+ }
+
@Override
protected QueryBuilder<?> doRewrite(QueryRewriteContext queryRewriteContext) throws IOException {
- FieldStatsProvider fieldStatsProvider = queryRewriteContext.getFieldStatsProvider();
- // If the fieldStatsProvider is null we are not on the shard and cannot
- // rewrite so just return without rewriting
- if (fieldStatsProvider != null) {
- DateMathParser dateMathParser = format == null ? null : new DateMathParser(format);
- FieldStatsProvider.Relation relation = fieldStatsProvider.isFieldWithinQuery(fieldName, from, to, includeLower, includeUpper,
- timeZone, dateMathParser);
- switch (relation) {
- case DISJOINT:
- return new MatchNoneQueryBuilder();
- case WITHIN:
- if (from != null || to != null) {
- RangeQueryBuilder newRangeQuery = new RangeQueryBuilder(fieldName);
- newRangeQuery.from(null);
- newRangeQuery.to(null);
- newRangeQuery.format = format;
- newRangeQuery.timeZone = timeZone;
- return newRangeQuery;
- } else {
- return this;
- }
- case INTERSECTS:
- break;
+ final MappedFieldType.Relation relation = getRelation(queryRewriteContext);
+ switch (relation) {
+ case DISJOINT:
+ return new MatchNoneQueryBuilder();
+ case WITHIN:
+ if (from != null || to != null) {
+ RangeQueryBuilder newRangeQuery = new RangeQueryBuilder(fieldName);
+ newRangeQuery.from(null);
+ newRangeQuery.to(null);
+ newRangeQuery.format = format;
+ newRangeQuery.timeZone = timeZone;
+ return newRangeQuery;
+ } else {
+ return this;
}
+ case INTERSECTS:
+ return this;
+ default:
+ throw new AssertionError();
}
- return this;
}
@Override
diff --git a/core/src/main/java/org/elasticsearch/search/SearchService.java b/core/src/main/java/org/elasticsearch/search/SearchService.java
index 4aaa96378a..995bf19e8a 100644
--- a/core/src/main/java/org/elasticsearch/search/SearchService.java
+++ b/core/src/main/java/org/elasticsearch/search/SearchService.java
@@ -48,7 +48,6 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.Index;
import org.elasticsearch.index.IndexService;
import org.elasticsearch.index.engine.Engine;
-import org.elasticsearch.index.fieldstats.FieldStatsProvider;
import org.elasticsearch.index.query.QueryParseContext;
import org.elasticsearch.index.query.QueryShardContext;
import org.elasticsearch.index.query.support.InnerHitBuilder;
@@ -552,7 +551,6 @@ public class SearchService extends AbstractLifecycleComponent<SearchService> imp
indexService,
indexShard, scriptService, pageCacheRecycler, bigArrays, threadPool.estimatedTimeInMillisCounter(), parseFieldMatcher,
defaultSearchTimeout, fetchPhase);
- context.getQueryShardContext().setFieldStatsProvider(new FieldStatsProvider(engineSearcher, indexService.mapperService()));
SearchContext.setCurrent(context);
request.rewrite(context.getQueryShardContext());
// reset that we have used nowInMillis from the context since it may
diff --git a/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java b/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java
index f3fe48f668..cdaf080de9 100644
--- a/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java
+++ b/core/src/main/java/org/elasticsearch/search/internal/DefaultSearchContext.java
@@ -176,7 +176,7 @@ public class DefaultSearchContext extends SearchContext {
this.searcher = new ContextIndexSearcher(engineSearcher, indexService.cache().query(), indexShard.getQueryCachingPolicy());
this.timeEstimateCounter = timeEstimateCounter;
this.timeoutInMillis = timeout.millis();
- queryShardContext = indexService.newQueryShardContext();
+ queryShardContext = indexService.newQueryShardContext(searcher.getIndexReader());
queryShardContext.setTypes(request.types());
}
diff --git a/core/src/test/java/org/elasticsearch/index/fieldstats/FieldStatsProviderTests.java b/core/src/test/java/org/elasticsearch/index/fieldstats/FieldStatsProviderTests.java
deleted file mode 100644
index 9cad8d3fc8..0000000000
--- a/core/src/test/java/org/elasticsearch/index/fieldstats/FieldStatsProviderTests.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Licensed to Elasticsearch under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.elasticsearch.index.fieldstats;
-
-import org.apache.lucene.index.DirectoryReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.store.BaseDirectoryWrapper;
-import org.apache.lucene.util.BytesRef;
-import org.elasticsearch.common.compress.CompressedXContent;
-import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
-import org.elasticsearch.common.settings.Settings;
-import org.elasticsearch.common.xcontent.XContentBuilder;
-import org.elasticsearch.common.xcontent.json.JsonXContent;
-import org.elasticsearch.env.Environment;
-import org.elasticsearch.index.IndexSettings;
-import org.elasticsearch.index.analysis.AnalysisRegistry;
-import org.elasticsearch.index.analysis.AnalysisService;
-import org.elasticsearch.index.engine.Engine;
-import org.elasticsearch.index.engine.Engine.Searcher;
-import org.elasticsearch.index.fieldstats.FieldStatsProvider.Relation;
-import org.elasticsearch.index.mapper.DocumentMapper;
-import org.elasticsearch.index.mapper.MapperService;
-import org.elasticsearch.index.mapper.MapperService.MergeReason;
-import org.elasticsearch.index.mapper.ParsedDocument;
-import org.elasticsearch.index.shard.ShardId;
-import org.elasticsearch.index.similarity.SimilarityService;
-import org.elasticsearch.indices.IndicesModule;
-import org.elasticsearch.indices.mapper.MapperRegistry;
-import org.elasticsearch.test.ESTestCase;
-import org.elasticsearch.test.IndexSettingsModule;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.joda.time.chrono.ISOChronology;
-import org.junit.After;
-import org.junit.Before;
-
-import java.io.IOException;
-import java.util.Collections;
-
-import static org.elasticsearch.common.settings.Settings.settingsBuilder;
-import static org.hamcrest.Matchers.equalTo;
-
-public class FieldStatsProviderTests extends ESTestCase {
-
- private DirectoryReader directoryReader;
- private Searcher searcher;
- private FieldStatsProvider fieldStatsProvider;
- private BaseDirectoryWrapper dir;
- private AnalysisRegistry analysisRegistry;
-
- @Before
- public void setup() throws IOException {
- Settings nodeSettings = settingsBuilder().put(Environment.PATH_HOME_SETTING.getKey(), createTempDir()).build();
- IndexSettings settings = IndexSettingsModule.newIndexSettings("_na", nodeSettings);
- SimilarityService similarityService = new SimilarityService(settings, Collections.emptyMap());
- analysisRegistry = new AnalysisRegistry(null, new Environment(nodeSettings));
- AnalysisService analysisService = analysisRegistry.build(settings);
- IndicesModule indicesModule = new IndicesModule();
- MapperRegistry mapperRegistry = indicesModule.getMapperRegistry();
- MapperService service = new MapperService(settings, analysisService, similarityService, mapperRegistry, () -> null);
- putMapping(service);
- dir = newDirectory();
- IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
- indexDocument(service, w, "1", 50L, 50.2f, 50.2, "cherry", new DateTime(2014, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.10");
- indexDocument(service, w, "2", 60L, 60.1f, 60.1, "damson", new DateTime(2014, 2, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.20");
- indexDocument(service, w, "3", 70L, 70.6f, 70.6, "grape", new DateTime(2014, 3, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.30");
- indexDocument(service, w, "4", 80L, 80.2f, 80.2, "kiwi", new DateTime(2014, 4, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.40");
- indexDocument(service, w, "5", 90L, 90.4f, 90.4, "lemon", new DateTime(2014, 5, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.50");
- indexDocument(service, w, "6", 100L, 100.3f, 100.3, "orange", new DateTime(2014, 6, 1, 0, 0, 0, ISOChronology.getInstanceUTC()),
- "10.10.0.60");
- directoryReader = DirectoryReader.open(w, true, true);
- w.close();
- ShardId shard = new ShardId("index", "_na_", 0);
- directoryReader = ElasticsearchDirectoryReader.wrap(directoryReader, shard);
- IndexSearcher s = new IndexSearcher(directoryReader);
- searcher = new Engine.Searcher("test", s);
- fieldStatsProvider = new FieldStatsProvider(searcher, service);
- }
-
- @After
- public void teardown() throws IOException {
- searcher.close();
- directoryReader.close();
- dir.close();
- analysisRegistry.close();
- }
-
- public void testiIsFieldWithinQueryLong() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 10L, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 10L, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", null, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 10L, 100L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 50L, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 30L, 80L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 80L, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 60L, 80L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 10L, 100L, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 50L, 200L, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 100L, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 1L, 50L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 150L, 200L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 1L, 8L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", null, 8L, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 150L, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 100L, 200L, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 1L, 50L, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryFloat() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 10.8f, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 10.8f, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", null, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 10.8f, 100.3f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 50.2f, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 30.5f, 80.1f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 80.1f, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 10.8f, 100.3f, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 50.2f, 200.5f, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 100.3f, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 1.9f, 50.2f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 60.9f, 80.1f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 150.4f, 200.5f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 1.9f, 8.1f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", null, 8.1f, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 150.4f, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 100.3f, 200.5f, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("float_field", 1.9f, 50.2f, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryDouble() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 10.8, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 10.8, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", null, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 10.8, 100.3, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 50.2, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 30.5, 80.1, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 80.1, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 60.9, 80.1, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 10.8, 100.3, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 50.2, 200.5, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 100.3, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 1.9, 50.2, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 150.4, 200.5, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 1.9, 8.1, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", null, 8.1, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("double_field", 150.4, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 100.3, 200.5, false, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("long_field", 1.9, 50.2, true, false, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryText() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("banana"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("banana"), null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", null, new BytesRef("zebra"), true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("banana"), new BytesRef("orange"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("cherry"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("banana"), new BytesRef("grape"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("grape"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("lime"), new BytesRef("mango"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("banana"), new BytesRef("orange"), true, false,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("cherry"), new BytesRef("zebra"), false, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("orange"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("apple"), new BytesRef("cherry"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("peach"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("apple"), new BytesRef("banana"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", null, new BytesRef("banana"), true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("peach"), null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("orange"), new BytesRef("zebra"), false, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("text_field", new BytesRef("apple"), new BytesRef("cherry"), true, false,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryKeyword() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("banana"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("banana"), null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", null, new BytesRef("zebra"), true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("banana"), new BytesRef("orange"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("cherry"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("banana"), new BytesRef("grape"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("grape"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("lime"), new BytesRef("mango"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("banana"), new BytesRef("orange"), true, false,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("cherry"), new BytesRef("zebra"), false, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("orange"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("apple"), new BytesRef("cherry"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("peach"), new BytesRef("zebra"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("apple"), new BytesRef("banana"), true, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", null, new BytesRef("banana"), true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("peach"), null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("orange"), new BytesRef("zebra"), false, true,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("keyword_field", new BytesRef("apple"), new BytesRef("cherry"), true, false,
- DateTimeZone.UTC, null), equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryDate() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", null, "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2014-06-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-01-01", "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2014-03-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-03-01", "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-03-01", "2014-05-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2014-06-01", true, false, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-01-01", "now", false, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-06-01", "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2014-01-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2015-01-01", "now", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2013-09-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", null, "2013-09-01", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2015-01-01", null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2014-06-01", "now", false, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("date_field", "2013-01-01", "2014-01-01", true, false, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- }
-
- public void testiIsFieldWithinQueryIp() throws IOException {
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.1", "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.1", null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", null, "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", null, null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.1", "10.10.0.60", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.10", "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.WITHIN));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.1", "10.10.0.40", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.40", "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.30", "10.10.0.40", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.1", "10.10.0.60", true, false, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.10", "10.20.0.1", false, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.60", "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.0.0.1", "10.10.0.10", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.INTERSECTS));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.20.0.10", "10.20.0.1", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.0.0.1", "10.0.0.100", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", null, "10.0.0.100", true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.20.0.10", null, true, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.10.0.60", "10.20.0.1", false, true, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- assertThat(fieldStatsProvider.isFieldWithinQuery("ip_field", "10.0.0.1", "10.10.0.10", true, false, DateTimeZone.UTC, null),
- equalTo(Relation.DISJOINT));
- }
-
- private void putMapping(MapperService service) throws IOException {
- XContentBuilder mappingbuilder = JsonXContent.contentBuilder();
- mappingbuilder.startObject();
- mappingbuilder.startObject("type");
- mappingbuilder.startObject("properties");
- mappingbuilder.startObject("long_field");
- mappingbuilder.field("type", "long");
- mappingbuilder.endObject();
- mappingbuilder.startObject("float_field");
- mappingbuilder.field("type", "float");
- mappingbuilder.endObject();
- mappingbuilder.startObject("double_field");
- mappingbuilder.field("type", "double");
- mappingbuilder.endObject();
- mappingbuilder.startObject("text_field");
- mappingbuilder.field("type", "text");
- mappingbuilder.endObject();
- mappingbuilder.startObject("keyword_field");
- mappingbuilder.field("type", "keyword");
- mappingbuilder.endObject();
- mappingbuilder.startObject("date_field");
- mappingbuilder.field("type", "date");
- mappingbuilder.endObject();
- mappingbuilder.startObject("ip_field");
- mappingbuilder.field("type", "ip");
- mappingbuilder.endObject();
- mappingbuilder.endObject();
- mappingbuilder.endObject();
- mappingbuilder.endObject();
- service.merge("type", new CompressedXContent(mappingbuilder.bytes()), MergeReason.MAPPING_UPDATE, true);
- }
-
- private void indexDocument(MapperService service, IndexWriter writer, String id, long longValue, float floatValue, double doubleValue,
- String stringValue, DateTime dateValue, String ipValue) throws IOException {
- XContentBuilder docBuilder = JsonXContent.contentBuilder();
- docBuilder.startObject();
- docBuilder.field("long_field", longValue);
- docBuilder.field("float_field", floatValue);
- docBuilder.field("double_field", doubleValue);
- docBuilder.field("text_field", stringValue);
- docBuilder.field("keyword_field", stringValue);
- docBuilder.field("date_field", dateValue);
- docBuilder.field("ip_field", ipValue);
- docBuilder.endObject();
- DocumentMapper documentMapper = service.documentMapper("type");
- ParsedDocument doc = documentMapper.parse("index", "type", id, docBuilder.bytes());
- writer.addDocument(doc.rootDoc());
- }
-}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/DateFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/DateFieldTypeTests.java
index 0e009891cf..089533023d 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/DateFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/DateFieldTypeTests.java
@@ -18,11 +18,27 @@
*/
package org.elasticsearch.index.mapper.core;
+import org.apache.lucene.document.Field.Store;
+import org.apache.lucene.document.LegacyLongField;
+import org.apache.lucene.index.DirectoryReader;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.IndexWriterConfig;
+import org.apache.lucene.index.MultiReader;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.IOUtils;
+import org.elasticsearch.common.joda.DateMathParser;
+import org.elasticsearch.common.joda.FormatDateTimeFormatter;
import org.elasticsearch.common.joda.Joda;
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.ParseContext.Document;
+import org.elasticsearch.index.mapper.core.DateFieldMapper.DateFieldType;
+import org.joda.time.DateTimeZone;
import org.junit.Before;
+import java.io.IOException;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
@@ -54,4 +70,58 @@ public class DateFieldTypeTests extends FieldTypeTestCase {
}
});
}
+
+ public void testIsFieldWithinQueryEmptyReader() throws IOException {
+ IndexReader reader = new MultiReader();
+ DateFieldType ft = new DateFieldType();
+ ft.setName("my_date");
+ assertEquals(Relation.DISJOINT, ft.isFieldWithinQuery(reader, "2015-10-12", "2016-04-03",
+ randomBoolean(), randomBoolean(), null, null));
+ }
+
+ private void doTestIsFieldWithinQuery(DateFieldType ft, DirectoryReader reader,
+ DateTimeZone zone, DateMathParser alternateFormat) throws IOException {
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2015-10-09", "2016-01-02",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2016-01-02", "2016-06-20",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2016-01-02", "2016-02-12",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.DISJOINT, ft.isFieldWithinQuery(reader, "2014-01-02", "2015-02-12",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.DISJOINT, ft.isFieldWithinQuery(reader, "2016-05-11", "2016-08-30",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.WITHIN, ft.isFieldWithinQuery(reader, "2015-09-25", "2016-05-29",
+ randomBoolean(), randomBoolean(), null, null));
+ assertEquals(Relation.WITHIN, ft.isFieldWithinQuery(reader, "2015-10-12", "2016-04-03",
+ true, true, null, null));
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2015-10-12", "2016-04-03",
+ false, false, null, null));
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2015-10-12", "2016-04-03",
+ false, true, null, null));
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(reader, "2015-10-12", "2016-04-03",
+ true, false, null, null));
+ }
+
+ public void testIsFieldWithinQuery() throws IOException {
+ Directory dir = newDirectory();
+ IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(null));
+ long instant1 = DateFieldMapper.Defaults.DATE_TIME_FORMATTER.parser().parseDateTime("2015-10-12").getMillis();
+ long instant2 = DateFieldMapper.Defaults.DATE_TIME_FORMATTER.parser().parseDateTime("2016-04-03").getMillis();
+ Document doc = new Document();
+ LegacyLongField field = new LegacyLongField("my_date", instant1, Store.NO);
+ doc.add(field);
+ w.addDocument(doc);
+ field.setLongValue(instant2);
+ w.addDocument(doc);
+ DirectoryReader reader = DirectoryReader.open(w);
+ DateFieldType ft = new DateFieldType();
+ ft.setName("my_date");
+ DateMathParser alternateFormat = new DateMathParser(DateFieldMapper.Defaults.DATE_TIME_FORMATTER);
+ doTestIsFieldWithinQuery(ft, reader, null, null);
+ doTestIsFieldWithinQuery(ft, reader, null, alternateFormat);
+ doTestIsFieldWithinQuery(ft, reader, DateTimeZone.UTC, null);
+ doTestIsFieldWithinQuery(ft, reader, DateTimeZone.UTC, alternateFormat);
+ IOUtils.close(reader, w, dir);
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/DoubleFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/DoubleFieldTypeTests.java
index 5f34e746ec..1c8cd4fda3 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/DoubleFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/DoubleFieldTypeTests.java
@@ -20,8 +20,12 @@ package org.elasticsearch.index.mapper.core;
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.core.DoubleFieldMapper.DoubleFieldType;
import org.junit.Before;
+import java.io.IOException;
+
public class DoubleFieldTypeTests extends FieldTypeTestCase {
@Override
protected MappedFieldType createDefaultFieldType() {
@@ -32,4 +36,11 @@ public class DoubleFieldTypeTests extends FieldTypeTestCase {
public void setupProperties() {
setDummyNullValue(10.0D);
}
+
+ public void testIsFieldWithinQuery() throws IOException {
+ DoubleFieldType ft = new DoubleFieldType();
+ // current impl ignores args and shourd always return INTERSECTS
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(null, randomDouble(), randomDouble(),
+ randomBoolean(), randomBoolean(), null, null));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/FloatFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/FloatFieldTypeTests.java
index 73d593ac2f..b9c222bc40 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/FloatFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/FloatFieldTypeTests.java
@@ -20,8 +20,12 @@ package org.elasticsearch.index.mapper.core;
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.core.FloatFieldMapper.FloatFieldType;
import org.junit.Before;
+import java.io.IOException;
+
public class FloatFieldTypeTests extends FieldTypeTestCase {
@Override
protected MappedFieldType createDefaultFieldType() {
@@ -32,4 +36,11 @@ public class FloatFieldTypeTests extends FieldTypeTestCase {
public void setupProperties() {
setDummyNullValue(10.0);
}
+
+ public void testIsFieldWithinQuery() throws IOException {
+ FloatFieldType ft = new FloatFieldType();
+ // current impl ignores args and shourd always return INTERSECTS
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(null, randomFloat(), randomFloat(),
+ randomBoolean(), randomBoolean(), null, null));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/IntegerFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/IntegerFieldTypeTests.java
index b8c40af72c..47f8344513 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/IntegerFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/IntegerFieldTypeTests.java
@@ -20,8 +20,12 @@ package org.elasticsearch.index.mapper.core;
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.core.IntegerFieldMapper.IntegerFieldType;
import org.junit.Before;
+import java.io.IOException;
+
public class IntegerFieldTypeTests extends FieldTypeTestCase {
@Override
protected MappedFieldType createDefaultFieldType() {
@@ -32,4 +36,11 @@ public class IntegerFieldTypeTests extends FieldTypeTestCase {
public void setupProperties() {
setDummyNullValue(10);
}
+
+ public void testIsFieldWithinQuery() throws IOException {
+ IntegerFieldType ft = new IntegerFieldType();
+ // current impl ignores args and shourd always return INTERSECTS
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(null, randomInt(), randomInt(),
+ randomBoolean(), randomBoolean(), null, null));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/KeywordFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/KeywordFieldTypeTests.java
index 699717b589..0d8ab6b804 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/KeywordFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/KeywordFieldTypeTests.java
@@ -18,12 +18,27 @@
*/
package org.elasticsearch.index.mapper.core;
+import com.carrotsearch.randomizedtesting.generators.RandomStrings;
+
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.core.KeywordFieldMapper.KeywordFieldType;
+
+import java.io.IOException;
public class KeywordFieldTypeTests extends FieldTypeTestCase {
@Override
protected MappedFieldType createDefaultFieldType() {
return new KeywordFieldMapper.KeywordFieldType();
}
+
+ public void testIsFieldWithinQuery() throws IOException {
+ KeywordFieldType ft = new KeywordFieldType();
+ // current impl ignores args and shourd always return INTERSECTS
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(null,
+ RandomStrings.randomAsciiOfLengthBetween(random(), 0, 5),
+ RandomStrings.randomAsciiOfLengthBetween(random(), 0, 5),
+ randomBoolean(), randomBoolean(), null, null));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/mapper/core/LongFieldTypeTests.java b/core/src/test/java/org/elasticsearch/index/mapper/core/LongFieldTypeTests.java
index e7b41bf21d..0b4b374a48 100644
--- a/core/src/test/java/org/elasticsearch/index/mapper/core/LongFieldTypeTests.java
+++ b/core/src/test/java/org/elasticsearch/index/mapper/core/LongFieldTypeTests.java
@@ -20,8 +20,12 @@ package org.elasticsearch.index.mapper.core;
import org.elasticsearch.index.mapper.FieldTypeTestCase;
import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.core.LongFieldMapper.LongFieldType;
import org.junit.Before;
+import java.io.IOException;
+
public class LongFieldTypeTests extends FieldTypeTestCase {
@Override
protected MappedFieldType createDefaultFieldType() {
@@ -32,4 +36,11 @@ public class LongFieldTypeTests extends FieldTypeTestCase {
public void setupProperties() {
setDummyNullValue((long)10);
}
+
+ public void testIsFieldWithinQuery() throws IOException {
+ LongFieldType ft = new LongFieldType();
+ // current impl ignores args and shourd always return INTERSECTS
+ assertEquals(Relation.INTERSECTS, ft.isFieldWithinQuery(null, randomLong(), randomLong(),
+ randomBoolean(), randomBoolean(), null, null));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/percolator/PercolatorQueryCacheTests.java b/core/src/test/java/org/elasticsearch/index/percolator/PercolatorQueryCacheTests.java
index e10a63bca2..31c8a4c57d 100644
--- a/core/src/test/java/org/elasticsearch/index/percolator/PercolatorQueryCacheTests.java
+++ b/core/src/test/java/org/elasticsearch/index/percolator/PercolatorQueryCacheTests.java
@@ -117,7 +117,7 @@ public class PercolatorQueryCacheTests extends ESTestCase {
MapperService.MergeReason.MAPPING_UPDATE, false);
cache = new PercolatorQueryCache(idxSettings, () -> queryShardContext);
queryShardContext = new QueryShardContext(idxSettings, null, null, mapperService, similarityService, null,
- indicesQueriesRegistry, cache);
+ indicesQueriesRegistry, cache, null);
}
public void testLoadQueries() throws Exception {
diff --git a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java
index e404870d72..2eec53f008 100644
--- a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java
+++ b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java
@@ -287,7 +287,7 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
});
PercolatorQueryCache percolatorQueryCache = new PercolatorQueryCache(idxSettings, () -> queryShardContext);
indicesQueriesRegistry = injector.getInstance(IndicesQueriesRegistry.class);
- queryShardContext = new QueryShardContext(idxSettings, bitsetFilterCache, indexFieldDataService, mapperService, similarityService, scriptService, indicesQueriesRegistry, percolatorQueryCache);
+ queryShardContext = new QueryShardContext(idxSettings, bitsetFilterCache, indexFieldDataService, mapperService, similarityService, scriptService, indicesQueriesRegistry, percolatorQueryCache, null);
//create some random type with some default field, those types will stick around for all of the subclasses
currentTypes = new String[randomIntBetween(0, 5)];
for (int i = 0; i < currentTypes.length; i++) {
@@ -341,7 +341,6 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>>
@After
public void afterTest() {
- queryShardContext.setFieldStatsProvider(null);
clientInvocationHandler.delegate = null;
SearchContext.removeCurrent();
}
diff --git a/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java b/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java
index f705db3a53..68332d755b 100644
--- a/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java
+++ b/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java
@@ -47,7 +47,7 @@ public class QueryShardContextTests extends ESTestCase {
MapperService mapperService = mock(MapperService.class);
when(mapperService.getIndexSettings()).thenReturn(indexSettings);
QueryShardContext context = new QueryShardContext(
- indexSettings, null, null, mapperService, null, null, null, null
+ indexSettings, null, null, mapperService, null, null, null, null, null
);
context.setAllowUnmappedFields(false);
diff --git a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java
index eb37353999..c2102ebb44 100644
--- a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java
@@ -22,13 +22,11 @@ package org.elasticsearch.index.query;
import org.apache.lucene.search.LegacyNumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermRangeQuery;
-import org.apache.lucene.util.BytesRef;
import org.elasticsearch.ElasticsearchParseException;
-import org.elasticsearch.action.fieldstats.FieldStats;
import org.elasticsearch.common.ParseFieldMatcher;
-import org.elasticsearch.common.joda.DateMathParser;
import org.elasticsearch.common.lucene.BytesRefs;
-import org.elasticsearch.index.fieldstats.FieldStatsProvider;
+import org.elasticsearch.index.mapper.MappedFieldType;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.chrono.ISOChronology;
@@ -399,317 +397,13 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase<RangeQueryBuil
}
}
- public void testRewriteLongToMatchAll() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- int queryFromValue = randomIntBetween(-1000000, 1000000);
- int queryToValue = randomIntBetween(queryFromValue, 2000000);
- long shardMinValue = randomIntBetween(queryFromValue, queryToValue);
- long shardMaxValue = randomIntBetween((int) shardMinValue, queryToValue);
- query.from((long) queryFromValue);
- query.to((long) queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.WITHIN;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Long(randomLong(), randomLong(), randomLong(), randomLong(), shardMinValue,
- shardMaxValue);
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
- RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
- assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
- assertThat(rewrittenRange.from(), equalTo(null));
- assertThat(rewrittenRange.to(), equalTo(null));
- }
-
- public void testRewriteLongToMatchNone() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- int queryFromValue = randomIntBetween(-1000000, 1000000);
- int queryToValue = randomIntBetween(queryFromValue, 2000000);
- query.from((long) queryFromValue);
- query.to((long) queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
- }
-
- public void testRewriteLongToSame() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- int queryFromValue = randomIntBetween(-1000000, 1000000);
- int queryToValue = randomIntBetween(queryFromValue, 2000000);
- query.from((long) queryFromValue);
- query.to((long) queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.INTERSECTS;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, sameInstance(query));
- }
-
- public void testRewriteDoubleToMatchAll() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- double queryFromValue = randomDoubleBetween(-1000000.0, 1000000.0, true);
- double queryToValue = randomDoubleBetween(queryFromValue, 2000000, true);
- double shardMinValue = randomDoubleBetween(queryFromValue, queryToValue, true);
- double shardMaxValue = randomDoubleBetween(shardMinValue, queryToValue, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.WITHIN;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Double(randomLong(), randomLong(), randomLong(), randomLong(), shardMinValue,
- shardMaxValue);
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
- RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
- assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
- assertThat(rewrittenRange.from(), equalTo(null));
- assertThat(rewrittenRange.to(), equalTo(null));
- }
-
- public void testRewriteDoubleToMatchNone() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- double queryFromValue = randomDoubleBetween(-1000000, 1000000, true);
- double queryToValue = randomDoubleBetween(queryFromValue, 2000000, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
- }
-
- public void testRewriteDoubleToSame() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- double queryFromValue = randomDoubleBetween(-1000000, 1000000, true);
- double queryToValue = randomDoubleBetween(queryFromValue, 2000000, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.INTERSECTS;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, sameInstance(query));
- }
-
- public void testRewriteFloatToMatchAll() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- float queryFromValue = (float) randomDoubleBetween(-1000000.0, 1000000.0, true);
- float queryToValue = (float) randomDoubleBetween(queryFromValue, 2000000, true);
- float shardMinValue = (float) randomDoubleBetween(queryFromValue, queryToValue, true);
- float shardMaxValue = (float) randomDoubleBetween(shardMinValue, queryToValue, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.WITHIN;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Float(randomLong(), randomLong(), randomLong(), randomLong(), shardMinValue,
- shardMaxValue);
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
- RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
- assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
- assertThat(rewrittenRange.from(), equalTo(null));
- assertThat(rewrittenRange.to(), equalTo(null));
- }
-
- public void testRewriteFloatToMatchNone() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- float queryFromValue = (float) randomDoubleBetween(-1000000, 1000000, true);
- float queryToValue = (float) randomDoubleBetween(queryFromValue, 2000000, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
- }
-
- public void testRewriteFloatToSame() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- float queryFromValue = (float) randomDoubleBetween(-1000000, 1000000, true);
- float queryToValue = (float) randomDoubleBetween(queryFromValue, 2000000, true);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.INTERSECTS;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, sameInstance(query));
- }
-
- public void testRewriteTextToMatchAll() throws IOException {
+ public void testRewriteDateToMatchAll() throws IOException {
String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "damson";
- String queryToValue = "plum";
- String shardMinValue = "grape";
- String shardMaxValue = "orange";
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
+ RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
+ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
return Relation.WITHIN;
}
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Text(randomLong(), randomLong(), randomLong(), randomLong(),
- new BytesRef(shardMinValue), new BytesRef(shardMaxValue));
- }
};
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
- RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
- assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
- assertThat(rewrittenRange.from(), equalTo(null));
- assertThat(rewrittenRange.to(), equalTo(null));
- }
-
- public void testRewriteTextToMatchNone() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "damson";
- String queryToValue = "plum";
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
- }
-
- public void testRewriteTextToSame() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "damson";
- String queryToValue = "plum";
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.INTERSECTS;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, sameInstance(query));
- }
-
- public void testRewriteDateToMatchAll() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
DateTime shardMinValue = new DateTime(2015, 3, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
@@ -717,23 +411,6 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase<RangeQueryBuil
query.from(queryFromValue);
query.to(queryToValue);
QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.WITHIN;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Date(randomLong(), randomLong(), randomLong(), randomLong(),
- shardMinValue.getMillis(), shardMaxValue.getMillis(), null);
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
@@ -742,121 +419,46 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase<RangeQueryBuil
assertThat(rewrittenRange.to(), equalTo(null));
}
- public void testRewriteDateWithNowToMatchAll() throws IOException {
+ public void testRewriteDateToMatchNone() throws IOException {
String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "now-2d";
- String queryToValue = "now";
- DateTime shardMinValue = new DateTime().minusHours(12);
- DateTime shardMaxValue = new DateTime().minusHours(24);
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.WITHIN;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public <T extends Comparable<T>> FieldStats<T> get(String field) throws IOException {
- assertThat(field, equalTo(fieldName));
- return (FieldStats<T>) new FieldStats.Date(randomLong(), randomLong(), randomLong(), randomLong(),
- shardMinValue.getMillis(), shardMaxValue.getMillis(), null);
+ RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
+ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
+ return Relation.DISJOINT;
}
};
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(RangeQueryBuilder.class));
- RangeQueryBuilder rewrittenRange = (RangeQueryBuilder) rewritten;
- assertThat(rewrittenRange.fieldName(), equalTo(fieldName));
- assertThat(rewrittenRange.from(), equalTo(null));
- assertThat(rewrittenRange.to(), equalTo(null));
- }
-
- public void testRewriteDateToMatchNone() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
query.from(queryFromValue);
query.to(queryToValue);
QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
}
- public void testRewriteDateWithNowToMatchNone() throws IOException {
+ public void testRewriteDateToSame() throws IOException {
String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "now-2d";
- String queryToValue = "now";
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.DISJOINT;
+ RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
+ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
+ return Relation.INTERSECTS;
}
};
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
- QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
- assertThat(rewritten, instanceOf(MatchNoneQueryBuilder.class));
- }
-
- public void testRewriteDateToSame() throws IOException {
- String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
DateTime queryFromValue = new DateTime(2015, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
DateTime queryToValue = new DateTime(2016, 1, 1, 0, 0, 0, ISOChronology.getInstanceUTC());
query.from(queryFromValue);
query.to(queryToValue);
QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
- return Relation.INTERSECTS;
- }
- };
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
assertThat(rewritten, sameInstance(query));
}
- public void testRewriteDateWithNowToSame() throws IOException {
+ public void testRewriteOpenBoundsToSame() throws IOException {
String fieldName = randomAsciiOfLengthBetween(1, 20);
- RangeQueryBuilder query = new RangeQueryBuilder(fieldName);
- String queryFromValue = "now-2d";
- String queryToValue = "now";
- query.from(queryFromValue);
- query.to(queryToValue);
- QueryShardContext queryShardContext = queryShardContext();
- FieldStatsProvider fieldStatsProvider = new FieldStatsProvider(null, null) {
-
- @Override
- public Relation isFieldWithinQuery(String fieldName, Object from, Object to, boolean includeLower, boolean includeUpper,
- DateTimeZone timeZone, DateMathParser dateMathParser) throws IOException {
+ RangeQueryBuilder query = new RangeQueryBuilder(fieldName) {
+ protected MappedFieldType.Relation getRelation(QueryRewriteContext queryRewriteContext) throws IOException {
return Relation.INTERSECTS;
}
};
- queryShardContext.setFieldStatsProvider(fieldStatsProvider);
+ QueryShardContext queryShardContext = queryShardContext();
QueryBuilder<?> rewritten = query.rewrite(queryShardContext);
assertThat(rewritten, sameInstance(query));
}
diff --git a/core/src/test/java/org/elasticsearch/index/query/RangeQueryRewriteTests.java b/core/src/test/java/org/elasticsearch/index/query/RangeQueryRewriteTests.java
new file mode 100644
index 0000000000..71d70e2861
--- /dev/null
+++ b/core/src/test/java/org/elasticsearch/index/query/RangeQueryRewriteTests.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.elasticsearch.index.query;
+
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.MultiReader;
+import org.elasticsearch.common.compress.CompressedXContent;
+import org.elasticsearch.common.xcontent.XContentFactory;
+import org.elasticsearch.index.IndexService;
+import org.elasticsearch.index.mapper.MappedFieldType.Relation;
+import org.elasticsearch.index.mapper.MapperService.MergeReason;
+import org.elasticsearch.test.ESSingleNodeTestCase;
+
+// The purpose of this test case is to test RangeQueryBuilder.getRelation()
+// Whether it should return INTERSECT/DISJOINT/WITHIN is already tested in
+// RangeQueryBuilderTests
+public class RangeQueryRewriteTests extends ESSingleNodeTestCase {
+
+ public void testRewriteMissingField() throws Exception {
+ IndexService indexService = createIndex("test");
+ IndexReader reader = new MultiReader();
+ QueryRewriteContext context = new QueryRewriteContext(indexService.getIndexSettings(),
+ indexService.mapperService(), null, null, reader);
+ RangeQueryBuilder range = new RangeQueryBuilder("foo");
+ assertEquals(Relation.DISJOINT, range.getRelation(context));
+ }
+
+ public void testRewriteMissingReader() throws Exception {
+ IndexService indexService = createIndex("test");
+ String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
+ .startObject("properties")
+ .startObject("foo")
+ .field("type", "date")
+ .endObject()
+ .endObject()
+ .endObject().endObject().string();
+ indexService.mapperService().merge("type",
+ new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE, false);
+ QueryRewriteContext context = new QueryRewriteContext(indexService.getIndexSettings(),
+ indexService.mapperService(), null, null, null);
+ RangeQueryBuilder range = new RangeQueryBuilder("foo");
+ // can't make assumptions on a missing reader, so it must return INTERSECT
+ assertEquals(Relation.INTERSECTS, range.getRelation(context));
+ }
+
+ public void testRewriteEmptyReader() throws Exception {
+ IndexService indexService = createIndex("test");
+ String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")
+ .startObject("properties")
+ .startObject("foo")
+ .field("type", "date")
+ .endObject()
+ .endObject()
+ .endObject().endObject().string();
+ indexService.mapperService().merge("type",
+ new CompressedXContent(mapping), MergeReason.MAPPING_UPDATE, false);
+ IndexReader reader = new MultiReader();
+ QueryRewriteContext context = new QueryRewriteContext(indexService.getIndexSettings(),
+ indexService.mapperService(), null, null, reader);
+ RangeQueryBuilder range = new RangeQueryBuilder("foo");
+ // no values -> DISJOINT
+ assertEquals(Relation.DISJOINT, range.getRelation(context));
+ }
+}
diff --git a/core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheIT.java b/core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheIT.java
index fec50cf0a2..fdd7e4c2d6 100644
--- a/core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheIT.java
+++ b/core/src/test/java/org/elasticsearch/indices/IndicesRequestCacheIT.java
@@ -85,20 +85,20 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
}
public void testQueryRewrite() throws Exception {
- assertAcked(client().admin().indices().prepareCreate("index").addMapping("type", "s", "type=text")
+ assertAcked(client().admin().indices().prepareCreate("index").addMapping("type", "s", "type=date")
.setSettings(IndicesRequestCache.INDEX_CACHE_REQUEST_ENABLED_SETTING.getKey(), true,
IndexMetaData.SETTING_NUMBER_OF_SHARDS, 5,
IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
.get());
- indexRandom(true, client().prepareIndex("index", "type", "1").setRouting("1").setSource("s", "a"),
- client().prepareIndex("index", "type", "2").setRouting("1").setSource("s", "b"),
- client().prepareIndex("index", "type", "3").setRouting("1").setSource("s", "c"),
- client().prepareIndex("index", "type", "4").setRouting("2").setSource("s", "d"),
- client().prepareIndex("index", "type", "5").setRouting("2").setSource("s", "e"),
- client().prepareIndex("index", "type", "6").setRouting("2").setSource("s", "f"),
- client().prepareIndex("index", "type", "7").setRouting("3").setSource("s", "g"),
- client().prepareIndex("index", "type", "8").setRouting("3").setSource("s", "h"),
- client().prepareIndex("index", "type", "9").setRouting("3").setSource("s", "i"));
+ indexRandom(true, client().prepareIndex("index", "type", "1").setRouting("1").setSource("s", "2016-03-19"),
+ client().prepareIndex("index", "type", "2").setRouting("1").setSource("s", "2016-03-20"),
+ client().prepareIndex("index", "type", "3").setRouting("1").setSource("s", "2016-03-21"),
+ client().prepareIndex("index", "type", "4").setRouting("2").setSource("s", "2016-03-22"),
+ client().prepareIndex("index", "type", "5").setRouting("2").setSource("s", "2016-03-23"),
+ client().prepareIndex("index", "type", "6").setRouting("2").setSource("s", "2016-03-24"),
+ client().prepareIndex("index", "type", "7").setRouting("3").setSource("s", "2016-03-25"),
+ client().prepareIndex("index", "type", "8").setRouting("3").setSource("s", "2016-03-26"),
+ client().prepareIndex("index", "type", "9").setRouting("3").setSource("s", "2016-03-27"));
ensureSearchable("index");
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -107,7 +107,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(0L));
final SearchResponse r1 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("g")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-19").lte("2016-03-25")).get();
assertSearchResponse(r1);
assertThat(r1.getHits().getTotalHits(), equalTo(7L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -116,7 +116,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(5L));
final SearchResponse r2 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("b").lte("h")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-20").lte("2016-03-26")).get();
assertSearchResponse(r2);
assertThat(r2.getHits().getTotalHits(), equalTo(7L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -125,7 +125,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(7L));
final SearchResponse r3 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("c").lte("i")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-21").lte("2016-03-27")).get();
assertSearchResponse(r3);
assertThat(r3.getHits().getTotalHits(), equalTo(7L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -135,19 +135,19 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
}
public void testQueryRewriteMissingValues() throws Exception {
- assertAcked(client().admin().indices().prepareCreate("index").addMapping("type", "s", "type=text")
+ assertAcked(client().admin().indices().prepareCreate("index").addMapping("type", "s", "type=date")
.setSettings(IndicesRequestCache.INDEX_CACHE_REQUEST_ENABLED_SETTING.getKey(), true, IndexMetaData.SETTING_NUMBER_OF_SHARDS,
1, IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0)
.get());
- indexRandom(true, client().prepareIndex("index", "type", "1").setSource("s", "a"),
- client().prepareIndex("index", "type", "2").setSource("s", "b"),
- client().prepareIndex("index", "type", "3").setSource("s", "c"),
- client().prepareIndex("index", "type", "4").setSource("s", "d"),
- client().prepareIndex("index", "type", "5").setSource("s", "e"),
- client().prepareIndex("index", "type", "6").setSource("s", "f"),
+ indexRandom(true, client().prepareIndex("index", "type", "1").setSource("s", "2016-03-19"),
+ client().prepareIndex("index", "type", "2").setSource("s", "2016-03-20"),
+ client().prepareIndex("index", "type", "3").setSource("s", "2016-03-21"),
+ client().prepareIndex("index", "type", "4").setSource("s", "2016-03-22"),
+ client().prepareIndex("index", "type", "5").setSource("s", "2016-03-23"),
+ client().prepareIndex("index", "type", "6").setSource("s", "2016-03-24"),
client().prepareIndex("index", "type", "7").setSource("other", "value"),
- client().prepareIndex("index", "type", "8").setSource("s", "h"),
- client().prepareIndex("index", "type", "9").setSource("s", "i"));
+ client().prepareIndex("index", "type", "8").setSource("s", "2016-03-26"),
+ client().prepareIndex("index", "type", "9").setSource("s", "2016-03-27"));
ensureSearchable("index");
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -156,7 +156,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(0L));
final SearchResponse r1 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("j")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-19").lte("2016-03-28")).get();
assertSearchResponse(r1);
assertThat(r1.getHits().getTotalHits(), equalTo(8L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -165,7 +165,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(1L));
final SearchResponse r2 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("j")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-19").lte("2016-03-28")).get();
assertSearchResponse(r2);
assertThat(r2.getHits().getTotalHits(), equalTo(8L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
@@ -174,7 +174,7 @@ public class IndicesRequestCacheIT extends ESIntegTestCase {
equalTo(1L));
final SearchResponse r3 = client().prepareSearch("index").setSearchType(SearchType.QUERY_THEN_FETCH).setSize(0)
- .setQuery(QueryBuilders.rangeQuery("s").gte("a").lte("j")).get();
+ .setQuery(QueryBuilders.rangeQuery("s").gte("2016-03-19").lte("2016-03-28")).get();
assertSearchResponse(r3);
assertThat(r3.getHits().getTotalHits(), equalTo(8L));
assertThat(client().admin().indices().prepareStats("index").setRequestCache(true).get().getTotal().getRequestCache().getHitCount(),
diff --git a/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java b/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java
index d885619cf1..1ea4212511 100644
--- a/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java
@@ -291,7 +291,7 @@ public class HighlightBuilderTests extends ESTestCase {
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings(index, indexSettings);
// shard context will only need indicesQueriesRegistry for building Query objects nested in highlighter
QueryShardContext mockShardContext = new QueryShardContext(idxSettings, null, null, null, null, null, indicesQueriesRegistry,
- null) {
+ null, null) {
@Override
public MappedFieldType fieldMapper(String name) {
TextFieldMapper.Builder builder = new TextFieldMapper.Builder(name);
diff --git a/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java b/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java
index 7e4ff9449b..4418fe848a 100644
--- a/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java
+++ b/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java
@@ -163,7 +163,7 @@ public class QueryRescoreBuilderTests extends ESTestCase {
IndexSettings idxSettings = IndexSettingsModule.newIndexSettings(randomAsciiOfLengthBetween(1, 10), indexSettings);
// shard context will only need indicesQueriesRegistry for building Query objects nested in query rescorer
QueryShardContext mockShardContext = new QueryShardContext(idxSettings, null, null, null, null, null, indicesQueriesRegistry,
- null) {
+ null, null) {
@Override
public MappedFieldType fieldMapper(String name) {
TextFieldMapper.Builder builder = new TextFieldMapper.Builder(name);
diff --git a/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java b/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java
index 0112e252ac..b84ec9b436 100644
--- a/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java
+++ b/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java
@@ -225,7 +225,7 @@ public abstract class AbstractSortTestCase<T extends SortBuilder<T>> extends EST
}
});
return new QueryShardContext(idxSettings, bitsetFilterCache, ifds, null, null, scriptService,
- indicesQueriesRegistry, null) {
+ indicesQueriesRegistry, null, null) {
@Override
public MappedFieldType fieldMapper(String name) {
return provideMappedFieldType(name);