diff options
Diffstat (limited to 'config-model/src/main/java/com/yahoo/schema/processing/Processing.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/schema/processing/Processing.java | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/config-model/src/main/java/com/yahoo/schema/processing/Processing.java b/config-model/src/main/java/com/yahoo/schema/processing/Processing.java new file mode 100644 index 00000000000..63eca2121c1 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/schema/processing/Processing.java @@ -0,0 +1,152 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.schema.processing; + +import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.schema.RankProfileRegistry; +import com.yahoo.schema.Schema; +import com.yahoo.schema.processing.multifieldresolver.RankProfileTypeSettingsProcessor; +import com.yahoo.vespa.model.container.search.QueryProfiles; +import com.yahoo.config.model.api.ModelContext; +import com.yahoo.config.model.deploy.TestProperties; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Set; + +/** + * Executor of processors. This defines the right order of processor execution. + * + * @author bratseth + * @author bjorncs + */ +public class Processing { + + private final ModelContext.Properties properties; + + public Processing() { this.properties = new TestProperties(); } + + public Processing(ModelContext.Properties properties) { this.properties = properties; } + + private Collection<ProcessorFactory> processors() { + return Arrays.asList( + SearchMustHaveDocument::new, + UrlFieldValidator::new, + BuiltInFieldSets::new, + ReservedDocumentNames::new, + IndexFieldNames::new, + IntegerIndex2Attribute::new, + MakeAliases::new, + UriHack::new, + LiteralBoost::new, + TagType::new, + ValidateFieldTypesDocumentsOnly::new, + IndexingInputs::new, + OptimizeIlscript::new, + ValidateFieldWithIndexSettingsCreatesIndex::new, + AttributesImplicitWord::new, + MutableAttributes::new, + CreatePositionZCurve::new, + DictionaryProcessor::new, + WordMatch::new, + ImportedFieldsResolver::new, + ImplicitSummaries::new, + ImplicitSummaryFields::new, + AdjustPositionSummaryFields::new, + SummaryConsistency::new, + SummaryNamesFieldCollisions::new, + SummaryFieldsMustHaveValidSource::new, + MatchedElementsOnlyResolver::new, + AddAttributeTransformToSummaryOfImportedFields::new, + MakeDefaultSummaryTheSuperSet::new, + Bolding::new, + AttributeProperties::new, + SetRankTypeEmptyOnFilters::new, + SummaryDynamicStructsArrays::new, + StringSettingsOnNonStringFields::new, + IndexingOutputs::new, + ExactMatch::new, + NGramMatch::new, + TextMatch::new, + MultifieldIndexHarmonizer::new, + FilterFieldNames::new, + MatchConsistency::new, + ValidateStructTypeInheritance::new, + ValidateFieldTypes::new, + SummaryDiskAccessValidator::new, + DisallowComplexMapAndWsetKeyTypes::new, + SortingSettings::new, + FieldSetSettings::new, + AddExtraFieldsToDocument::new, + PredicateProcessor::new, + MatchPhaseSettingsValidator::new, + DiversitySettingsValidator::new, + TensorFieldProcessor::new, + RankProfileTypeSettingsProcessor::new, + ReferenceFieldsProcessor::new, + FastAccessValidator::new, + ReservedFunctionNames::new, + OnnxModelConfigGenerator::new, + OnnxModelTypeResolver::new, + RankingExpressionTypeResolver::new, + BoolAttributeValidator::new, + PagedAttributeValidator::new, + // These should be last: + IndexingValidation::new, + IndexingValues::new); + } + + /** Processors of rank profiles only (those who tolerate and do something useful when the search field is null) */ + private Collection<ProcessorFactory> rankProfileProcessors() { + return Arrays.asList( + RankProfileTypeSettingsProcessor::new, + ReservedFunctionNames::new, + RankingExpressionTypeResolver::new); + } + + private void runProcessor(Processor processor, boolean validate, boolean documentsOnly) { + processor.process(validate, documentsOnly, properties); + } + + /** + * Runs all search processors on the given {@link Schema} object. These will modify the search object, <b>possibly + * exchanging it with another</b>, as well as its document types. + * + * @param schema the search to process + * @param deployLogger the log to log messages and warnings for application deployment to + * @param rankProfileRegistry a {@link com.yahoo.schema.RankProfileRegistry} + * @param queryProfiles the query profiles contained in the application this search is part of + * @param processorsToSkip a set of processor classes we should not invoke in this. Useful for testing. + */ + public void process(Schema schema, DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, + QueryProfiles queryProfiles, boolean validate, boolean documentsOnly, + Set<Class<? extends Processor>> processorsToSkip) + { + Collection<ProcessorFactory> factories = processors(); + factories.stream() + .map(factory -> factory.create(schema, deployLogger, rankProfileRegistry, queryProfiles)) + .filter(processor -> ! processorsToSkip.contains(processor.getClass())) + .forEach(processor -> runProcessor(processor, validate, documentsOnly)); + } + + /** + * Runs rank profiles processors only. + * + * @param deployLogger the log to log messages and warnings for application deployment to + * @param rankProfileRegistry a {@link com.yahoo.schema.RankProfileRegistry} + * @param queryProfiles the query profiles contained in the application this search is part of + */ + public void processRankProfiles(DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, + QueryProfiles queryProfiles, boolean validate, boolean documentsOnly) { + Collection<ProcessorFactory> factories = rankProfileProcessors(); + factories.stream() + .map(factory -> factory.create(null, deployLogger, rankProfileRegistry, queryProfiles)) + .forEach(processor -> runProcessor(processor, validate, documentsOnly)); + } + + @FunctionalInterface + public interface ProcessorFactory { + Processor create(Schema schema, DeployLogger deployLogger, RankProfileRegistry rankProfileRegistry, + QueryProfiles queryProfiles); + } + +} |