Skip to content

Commit 9e22e09

Browse files
Comprehensively test supported/unsupported field type:agg combinations (elastic#52493)
This adds a test to AggregatorTestCase that allows us to programmatically verify that an aggregator supports or does not support a particular field type. It fetches the list of registered field type parsers, creates a MappedFieldType from the parser and then attempts to run a basic agg against the field. A supplied list of supported VSTypes are then compared against the output (success or exception) and suceeds or fails the test accordingly. Co-Authored-By: Mark Tozzi <[email protected]> * Skip fields that are not aggregatable
1 parent ed1edb4 commit 9e22e09

File tree

28 files changed

+434
-57
lines changed

28 files changed

+434
-57
lines changed

modules/mapper-extras/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@
6262
import org.elasticsearch.search.MultiValueMode;
6363
import org.elasticsearch.search.sort.BucketedSort;
6464
import org.elasticsearch.search.sort.SortOrder;
65+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
66+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
6567

6668
import java.io.IOException;
6769
import java.math.BigDecimal;
@@ -295,6 +297,11 @@ public IndexFieldData<?> build(IndexSettings indexSettings, MappedFieldType fiel
295297
};
296298
}
297299

300+
@Override
301+
public ValuesSourceType getValuesSourceType() {
302+
return CoreValuesSourceType.NUMERIC;
303+
}
304+
298305
@Override
299306
public Object valueForDisplay(Object value) {
300307
if (value == null) {

modules/parent-join/src/main/java/org/elasticsearch/join/mapper/MetaJoinFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.elasticsearch.index.mapper.ParseContext;
3232
import org.elasticsearch.index.mapper.StringFieldType;
3333
import org.elasticsearch.index.query.QueryShardContext;
34+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
35+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
3436

3537
import java.io.IOException;
3638
import java.util.List;
@@ -95,6 +97,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
9597
return new DocValuesIndexFieldData.Builder();
9698
}
9799

100+
@Override
101+
public ValuesSourceType getValuesSourceType() {
102+
return CoreValuesSourceType.BYTES;
103+
}
104+
98105
@Override
99106
public Object valueForDisplay(Object value) {
100107
if (value == null) {

modules/parent-join/src/main/java/org/elasticsearch/join/mapper/ParentIdFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.elasticsearch.index.mapper.ParseContext;
4242
import org.elasticsearch.index.mapper.StringFieldType;
4343
import org.elasticsearch.index.query.QueryShardContext;
44+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
45+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4446

4547
import java.io.IOException;
4648
import java.util.Collection;
@@ -118,6 +120,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
118120
return new DocValuesIndexFieldData.Builder();
119121
}
120122

123+
@Override
124+
public ValuesSourceType getValuesSourceType() {
125+
return CoreValuesSourceType.BYTES;
126+
}
127+
121128
@Override
122129
public Object valueForDisplay(Object value) {
123130
if (value == null) {

modules/parent-join/src/main/java/org/elasticsearch/join/mapper/ParentJoinFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
import org.elasticsearch.index.mapper.ParseContext;
4444
import org.elasticsearch.index.mapper.StringFieldType;
4545
import org.elasticsearch.index.query.QueryShardContext;
46+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
47+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4648

4749
import java.io.IOException;
4850
import java.util.ArrayList;
@@ -227,6 +229,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
227229
return new DocValuesIndexFieldData.Builder();
228230
}
229231

232+
@Override
233+
public ValuesSourceType getValuesSourceType() {
234+
return CoreValuesSourceType.BYTES;
235+
}
236+
230237
@Override
231238
public Object valueForDisplay(Object value) {
232239
if (value == null) {

plugins/analysis-icu/src/main/java/org/elasticsearch/index/mapper/ICUCollationKeywordFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
import org.elasticsearch.index.fielddata.plain.DocValuesIndexFieldData;
4747
import org.elasticsearch.index.query.QueryShardContext;
4848
import org.elasticsearch.search.DocValueFormat;
49+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
50+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4951

5052
import java.io.IOException;
5153
import java.time.ZoneId;
@@ -139,6 +141,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
139141
return new DocValuesIndexFieldData.Builder();
140142
}
141143

144+
@Override
145+
public ValuesSourceType getValuesSourceType() {
146+
return CoreValuesSourceType.BYTES;
147+
}
148+
142149
@Override
143150
protected BytesRef indexedValueForSearch(Object value) {
144151
if (value == null) {

plugins/mapper-murmur3/src/main/java/org/elasticsearch/index/mapper/murmur3/Murmur3FieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.elasticsearch.index.mapper.TypeParsers;
4040
import org.elasticsearch.index.query.QueryShardContext;
4141
import org.elasticsearch.index.query.QueryShardException;
42+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
43+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4244

4345
import java.io.IOException;
4446
import java.util.List;
@@ -124,6 +126,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
124126
return new DocValuesIndexFieldData.Builder().numericType(NumericType.LONG);
125127
}
126128

129+
@Override
130+
public ValuesSourceType getValuesSourceType() {
131+
return CoreValuesSourceType.NUMERIC;
132+
}
133+
127134
@Override
128135
public Query existsQuery(QueryShardContext context) {
129136
return new DocValuesFieldExistsQuery(name());

server/src/main/java/org/elasticsearch/index/mapper/BinaryFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import org.elasticsearch.index.query.QueryShardContext;
4141
import org.elasticsearch.index.query.QueryShardException;
4242
import org.elasticsearch.search.DocValueFormat;
43+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
44+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4345

4446
import java.io.IOException;
4547
import java.time.ZoneId;
@@ -136,6 +138,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
136138
return new BytesBinaryDVIndexFieldData.Builder();
137139
}
138140

141+
@Override
142+
public ValuesSourceType getValuesSourceType() {
143+
return CoreValuesSourceType.BYTES;
144+
}
145+
139146
@Override
140147
public Query existsQuery(QueryShardContext context) {
141148
if (hasDocValues()) {

server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import org.elasticsearch.index.fielddata.plain.DocValuesIndexFieldData;
4141
import org.elasticsearch.index.query.QueryShardContext;
4242
import org.elasticsearch.search.DocValueFormat;
43+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
44+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4345

4446
import java.io.IOException;
4547
import java.time.ZoneId;
@@ -189,6 +191,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
189191
return new DocValuesIndexFieldData.Builder().numericType(NumericType.BOOLEAN);
190192
}
191193

194+
@Override
195+
public ValuesSourceType getValuesSourceType() {
196+
return CoreValuesSourceType.NUMERIC;
197+
}
198+
192199
@Override
193200
public DocValueFormat docValueFormat(@Nullable String format, ZoneId timeZone) {
194201
if (format != null) {

server/src/main/java/org/elasticsearch/index/mapper/DateFieldMapper.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
import org.elasticsearch.index.query.QueryRewriteContext;
5555
import org.elasticsearch.index.query.QueryShardContext;
5656
import org.elasticsearch.search.DocValueFormat;
57+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
58+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
5759

5860
import java.io.IOException;
5961
import java.time.DateTimeException;
@@ -73,6 +75,7 @@
7375
public final class DateFieldMapper extends FieldMapper {
7476

7577
public static final String CONTENT_TYPE = "date";
78+
public static final String DATE_NANOS_CONTENT_TYPE = "date_nanos";
7679
public static final DateFormatter DEFAULT_DATE_TIME_FORMATTER = DateFormatter.forPattern("strict_date_optional_time||epoch_millis");
7780

7881
public static class Defaults {
@@ -101,7 +104,7 @@ public long parsePointAsMillis(byte[] value) {
101104
return LongPoint.decodeDimension(value, 0);
102105
}
103106
},
104-
NANOSECONDS("date_nanos", NumericType.DATE_NANOSECONDS) {
107+
NANOSECONDS(DATE_NANOS_CONTENT_TYPE, NumericType.DATE_NANOSECONDS) {
105108
@Override
106109
public long convert(Instant instant) {
107110
return toLong(instant);
@@ -540,6 +543,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
540543
return new DocValuesIndexFieldData.Builder().numericType(resolution.numericType());
541544
}
542545

546+
@Override
547+
public ValuesSourceType getValuesSourceType() {
548+
return CoreValuesSourceType.NUMERIC;
549+
}
550+
543551
@Override
544552
public Object valueForDisplay(Object value) {
545553
Long val = (Long) value;

server/src/main/java/org/elasticsearch/index/mapper/GeoPointFieldMapper.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.elasticsearch.index.query.QueryShardContext;
4242
import org.elasticsearch.index.query.QueryShardException;
4343
import org.elasticsearch.index.query.VectorGeoPointShapeQueryProcessor;
44+
import org.elasticsearch.search.aggregations.support.CoreValuesSourceType;
45+
import org.elasticsearch.search.aggregations.support.ValuesSourceType;
4446

4547
import java.io.IOException;
4648
import java.util.ArrayList;
@@ -243,6 +245,11 @@ public IndexFieldData.Builder fielddataBuilder(String fullyQualifiedIndexName) {
243245
return new AbstractLatLonPointDVIndexFieldData.Builder();
244246
}
245247

248+
@Override
249+
public ValuesSourceType getValuesSourceType() {
250+
return CoreValuesSourceType.GEOPOINT;
251+
}
252+
246253
@Override
247254
public Query existsQuery(QueryShardContext context) {
248255
if (hasDocValues()) {
@@ -254,8 +261,7 @@ public Query existsQuery(QueryShardContext context) {
254261

255262
@Override
256263
public Query termQuery(Object value, QueryShardContext context) {
257-
throw new QueryShardException(context,
258-
"Geo fields do not support exact searching, use dedicated geo queries instead: ["
264+
throw new QueryShardException(context, "Geo fields do not support exact searching, use dedicated geo queries instead: ["
259265
+ name() + "]");
260266
}
261267
}

0 commit comments

Comments
 (0)