Search in sources :

Example 1 with FieldMapper

use of org.opensearch.index.mapper.FieldMapper in project OpenSearch by opensearch-project.

the class AggregatorTestCase method testSupportedFieldTypes.

/**
 * This test will validate that an aggregator succeeds or fails to run against all the field types
 * that are registered in {@link IndicesModule} (e.g. all the core field types).  An aggregator
 * is provided by the implementor class, and it is executed against each field type in turn.  If
 * an exception is thrown when the field is supported, that will fail the test.  Similarly, if
 * an exception _is not_ thrown when a field is unsupported, that will also fail the test.
 *
 * Exception types/messages are not currently checked, just presence/absence of an exception.
 */
public void testSupportedFieldTypes() throws IOException {
    MapperRegistry mapperRegistry = new IndicesModule(Collections.emptyList()).getMapperRegistry();
    Settings settings = Settings.builder().put("index.version.created", Version.CURRENT.id).build();
    String fieldName = "typeTestFieldName";
    List<ValuesSourceType> supportedVSTypes = getSupportedValuesSourceTypes();
    List<String> unsupportedMappedFieldTypes = unsupportedMappedFieldTypes();
    if (supportedVSTypes.isEmpty()) {
        // If the test says it doesn't support any VStypes, it has not been converted yet so skip
        return;
    }
    for (Map.Entry<String, Mapper.TypeParser> mappedType : mapperRegistry.getMapperParsers().entrySet()) {
        // Some field types should not be tested, or require more work and are not ready yet
        if (TYPE_TEST_DENYLIST.contains(mappedType.getKey())) {
            continue;
        }
        Map<String, Object> source = new HashMap<>();
        source.put("type", mappedType.getKey());
        // Text is the only field that doesn't support DVs, instead FD
        if (mappedType.getKey().equals(TextFieldMapper.CONTENT_TYPE) == false) {
            source.put("doc_values", "true");
        }
        Mapper.Builder builder = mappedType.getValue().parse(fieldName, source, new MockParserContext());
        FieldMapper mapper = (FieldMapper) builder.build(new BuilderContext(settings, new ContentPath()));
        MappedFieldType fieldType = mapper.fieldType();
        // Non-aggregatable fields are not testable (they will throw an error on all aggs anyway), so skip
        if (fieldType.isAggregatable() == false) {
            continue;
        }
        try (Directory directory = newDirectory()) {
            RandomIndexWriter indexWriter = new RandomIndexWriter(random(), directory);
            writeTestDoc(fieldType, fieldName, indexWriter);
            indexWriter.close();
            try (IndexReader indexReader = DirectoryReader.open(directory)) {
                IndexSearcher indexSearcher = newIndexSearcher(indexReader);
                AggregationBuilder aggregationBuilder = createAggBuilderForTypeTest(fieldType, fieldName);
                ValuesSourceType vst = fieldToVST(fieldType);
                // TODO in the future we can make this more explicit with expectThrows(), when the exceptions are standardized
                AssertionError failure = null;
                try {
                    searchAndReduce(indexSearcher, new MatchAllDocsQuery(), aggregationBuilder, fieldType);
                    if (supportedVSTypes.contains(vst) == false || unsupportedMappedFieldTypes.contains(fieldType.typeName())) {
                        failure = new AssertionError("Aggregator [" + aggregationBuilder.getType() + "] should not support field type [" + fieldType.typeName() + "] but executing against the field did not throw an exception");
                    }
                } catch (Exception | AssertionError e) {
                    if (supportedVSTypes.contains(vst) && unsupportedMappedFieldTypes.contains(fieldType.typeName()) == false) {
                        failure = new AssertionError("Aggregator [" + aggregationBuilder.getType() + "] supports field type [" + fieldType.typeName() + "] but executing against the field threw an exception: [" + e.getMessage() + "]", e);
                    }
                }
                if (failure != null) {
                    throw failure;
                }
            }
        }
    }
}
Also used : AssertingIndexSearcher(org.apache.lucene.search.AssertingIndexSearcher) ContextIndexSearcher(org.opensearch.search.internal.ContextIndexSearcher) IndexSearcher(org.apache.lucene.search.IndexSearcher) IndicesModule(org.opensearch.indices.IndicesModule) NestedAggregationBuilder(org.opensearch.search.aggregations.bucket.nested.NestedAggregationBuilder) HashMap(java.util.HashMap) Mockito.anyString(org.mockito.Mockito.anyString) KeywordFieldMapper(org.opensearch.index.mapper.KeywordFieldMapper) FieldAliasMapper(org.opensearch.index.mapper.FieldAliasMapper) GeoPointFieldMapper(org.opensearch.index.mapper.GeoPointFieldMapper) RangeFieldMapper(org.opensearch.index.mapper.RangeFieldMapper) GeoShapeFieldMapper(org.opensearch.index.mapper.GeoShapeFieldMapper) TextFieldMapper(org.opensearch.index.mapper.TextFieldMapper) CompletionFieldMapper(org.opensearch.index.mapper.CompletionFieldMapper) ObjectMapper(org.opensearch.index.mapper.ObjectMapper) BinaryFieldMapper(org.opensearch.index.mapper.BinaryFieldMapper) NumberFieldMapper(org.opensearch.index.mapper.NumberFieldMapper) FieldMapper(org.opensearch.index.mapper.FieldMapper) Mapper(org.opensearch.index.mapper.Mapper) DateFieldMapper(org.opensearch.index.mapper.DateFieldMapper) MappedFieldType(org.opensearch.index.mapper.MappedFieldType) Settings(org.opensearch.common.settings.Settings) IndexSettings(org.opensearch.index.IndexSettings) Directory(org.apache.lucene.store.Directory) CoreValuesSourceType(org.opensearch.search.aggregations.support.CoreValuesSourceType) ValuesSourceType(org.opensearch.search.aggregations.support.ValuesSourceType) ContentPath(org.opensearch.index.mapper.ContentPath) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) IOException(java.io.IOException) MapperRegistry(org.opensearch.indices.mapper.MapperRegistry) IndexReader(org.apache.lucene.index.IndexReader) BuilderContext(org.opensearch.index.mapper.Mapper.BuilderContext) Map(java.util.Map) HashMap(java.util.HashMap) Collections.singletonMap(java.util.Collections.singletonMap) Collections.emptyMap(java.util.Collections.emptyMap) KeywordFieldMapper(org.opensearch.index.mapper.KeywordFieldMapper) GeoPointFieldMapper(org.opensearch.index.mapper.GeoPointFieldMapper) RangeFieldMapper(org.opensearch.index.mapper.RangeFieldMapper) GeoShapeFieldMapper(org.opensearch.index.mapper.GeoShapeFieldMapper) TextFieldMapper(org.opensearch.index.mapper.TextFieldMapper) CompletionFieldMapper(org.opensearch.index.mapper.CompletionFieldMapper) BinaryFieldMapper(org.opensearch.index.mapper.BinaryFieldMapper) NumberFieldMapper(org.opensearch.index.mapper.NumberFieldMapper) FieldMapper(org.opensearch.index.mapper.FieldMapper) DateFieldMapper(org.opensearch.index.mapper.DateFieldMapper) RandomIndexWriter(org.apache.lucene.index.RandomIndexWriter)

Aggregations

IOException (java.io.IOException)1 Collections.emptyMap (java.util.Collections.emptyMap)1 Collections.singletonMap (java.util.Collections.singletonMap)1 HashMap (java.util.HashMap)1 Map (java.util.Map)1 IndexReader (org.apache.lucene.index.IndexReader)1 RandomIndexWriter (org.apache.lucene.index.RandomIndexWriter)1 AssertingIndexSearcher (org.apache.lucene.search.AssertingIndexSearcher)1 IndexSearcher (org.apache.lucene.search.IndexSearcher)1 MatchAllDocsQuery (org.apache.lucene.search.MatchAllDocsQuery)1 Directory (org.apache.lucene.store.Directory)1 Mockito.anyString (org.mockito.Mockito.anyString)1 Settings (org.opensearch.common.settings.Settings)1 IndexSettings (org.opensearch.index.IndexSettings)1 BinaryFieldMapper (org.opensearch.index.mapper.BinaryFieldMapper)1 CompletionFieldMapper (org.opensearch.index.mapper.CompletionFieldMapper)1 ContentPath (org.opensearch.index.mapper.ContentPath)1 DateFieldMapper (org.opensearch.index.mapper.DateFieldMapper)1 FieldAliasMapper (org.opensearch.index.mapper.FieldAliasMapper)1 FieldMapper (org.opensearch.index.mapper.FieldMapper)1