aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-05-23 20:53:46 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-05-24 16:01:48 +0200
commit47cef11f9f606e69977b080ab43af91ce4cba975 (patch)
tree5dbcf30033d1b92f6ba32d0f0dd00183f5b47660 /config-model
parentf63093f6519dbad54cf7293826100ce6b510880a (diff)
Produce ranking-expressions config.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/ImmutableSearch.java1
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java55
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/Search.java13
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java3
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java29
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java13
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java20
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankSetupValidator.java88
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java6
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java18
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java3
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/search/DocumentDatabase.java7
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java1
13 files changed, 180 insertions, 77 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/ImmutableSearch.java b/config-model/src/main/java/com/yahoo/searchdefinition/ImmutableSearch.java
index 6ac73ad45a9..efd9ed5e88f 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/ImmutableSearch.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/ImmutableSearch.java
@@ -28,6 +28,7 @@ public interface ImmutableSearch {
Reader getRankingExpression(String fileName);
ApplicationPackage applicationPackage();
RankingConstants rankingConstants();
+ RankExpressionFiles rankExpressionFiles();
OnnxModels onnxModels();
Stream<ImmutableSDField> allImportedFields();
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
index 74a9ef25615..61fd2e3fb41 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankProfile.java
@@ -78,6 +78,8 @@ public class RankProfile implements Cloneable {
/** The ranking expression to be used for second phase */
private RankingExpression secondPhaseRanking = null;
+ private Set<String> externalFileExpressions = new HashSet<>();
+
/** Number of hits to be reranked in second phase, -1 means use default */
private int rerankCount = -1;
@@ -163,6 +165,10 @@ public class RankProfile implements Cloneable {
return search != null ? search.rankingConstants() : model.rankingConstants();
}
+ public RankExpressionFiles rankExpressionFiles() {
+ return search != null ? search.rankExpressionFiles() : model.rankExpressionFiles();
+ }
+
public Map<String, OnnxModel> onnxModels() {
return search != null ? search.onnxModels().asMap() : Collections.emptyMap();
}
@@ -368,9 +374,41 @@ public class RankProfile implements Cloneable {
this.firstPhaseRanking = rankingExpression;
}
+ public String getFirstPhaseFile() {
+ String name = FIRST_PHASE;
+ if (externalFileExpressions.contains(name)) {
+ return rankExpressionFiles().get(name).getFileName();
+ }
+ if ((firstPhaseRanking == null) && (getInherited() != null)) {
+ return getInherited().getFirstPhaseFile();
+ }
+ return null;
+ }
+
+ public String getSecondPhaseFile() {
+ String name = SECOND_PHASE;
+ if (externalFileExpressions.contains(name)) {
+ return rankExpressionFiles().get(name).getFileName();
+ }
+ if ((secondPhaseRanking == null) && (getInherited() != null)) {
+ return getInherited().getSecondPhaseFile();
+ }
+ return null;
+ }
+
+ public String getExpressionFile(String name) {
+ if (externalFileExpressions.contains(name)) {
+ return rankExpressionFiles().get(name).getFileName();
+ }
+ if (getInherited() != null) {
+ return getInherited().getExpressionFile(name);
+ }
+ return null;
+ }
+
public void setFirstPhaseRanking(String expression) {
try {
- this.firstPhaseRanking = parseRankingExpression("firstphase", expression);
+ this.firstPhaseRanking = parseRankingExpression(FIRST_PHASE, expression);
}
catch (ParseException e) {
throw new IllegalArgumentException("Illegal first phase ranking function", e);
@@ -663,18 +701,25 @@ public class RankProfile implements Cloneable {
}
}
- private Reader openRankingExpressionReader(String expName, String expression) {
- if ( ! expression.startsWith("file:")) return new StringReader(expression);
-
+ private static String extractFileName(String expression) {
String fileName = expression.substring("file:".length()).trim();
if ( ! fileName.endsWith(ApplicationPackage.RANKEXPRESSION_NAME_SUFFIX))
fileName = fileName + ApplicationPackage.RANKEXPRESSION_NAME_SUFFIX;
+ return fileName;
+ }
+
+ private Reader openRankingExpressionReader(String expName, String expression) {
+ if ( ! expression.startsWith("file:")) return new StringReader(expression);
+
+ String fileName = extractFileName(expression);
File file = new File(fileName);
- if ( ! (file.isAbsolute()) && file.getPath().contains("/")) // See ticket 4102122
+ if ( ! file.isAbsolute() && file.getPath().contains("/")) // See ticket 4102122
throw new IllegalArgumentException("In " + getName() +", " + expName + ", ranking references file '" + file +
"' in subdirectory, which is not supported.");
+ rankExpressionFiles().add(new RankExpressionFile(expName, fileName));
+ externalFileExpressions.add(expName);
return search.getRankingExpression(fileName);
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java
index 9b7434dccab..a90cc7c9450 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/Search.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/Search.java
@@ -15,6 +15,7 @@ import com.yahoo.searchdefinition.document.TemporaryImportedFields;
import com.yahoo.searchdefinition.document.annotation.SDAnnotationType;
import com.yahoo.vespa.documentmodel.DocumentSummary;
import com.yahoo.vespa.documentmodel.SummaryField;
+import com.yahoo.vespa.model.AbstractService;
import java.io.Reader;
import java.util.ArrayList;
@@ -78,6 +79,9 @@ public class Search implements ImmutableSearch {
/** The explicitly defined summaries of this search definition. _Must_ preserve order. */
private final Map<String, DocumentSummary> summaries = new LinkedHashMap<>();
+ /** External rank expression files of this */
+ private final RankExpressionFiles rankExpressionFiles = new RankExpressionFiles();
+
/** Ranking constants of this */
private final RankingConstants rankingConstants = new RankingConstants();
@@ -172,11 +176,20 @@ public class Search implements ImmutableSearch {
}
@Override
+ public RankExpressionFiles rankExpressionFiles() { return rankExpressionFiles; }
+
+ @Override
public RankingConstants rankingConstants() { return rankingConstants; }
@Override
public OnnxModels onnxModels() { return onnxModels; }
+ public void sendTo(Collection<? extends AbstractService> services) {
+ rankingConstants.sendTo(services);
+ rankExpressionFiles.sendTo(services);
+ onnxModels.sendTo(services);
+ }
+
public Optional<TemporaryImportedFields> temporaryImportedFields() {
return temporaryImportedFields;
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java
index 4d6ce783947..52d99c523ea 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/DerivedConfiguration.java
@@ -85,7 +85,8 @@ public class DerivedConfiguration {
summaries = new Summaries(search, deployLogger);
summaryMap = new SummaryMap(search);
juniperrc = new Juniperrc(search);
- rankProfileList = new RankProfileList(search, search.rankingConstants(), attributeFields, rankProfileRegistry, queryProfiles, importedModels, deployProperties);
+ rankProfileList = new RankProfileList(search, search.rankingConstants(), search.rankExpressionFiles(), attributeFields,
+ rankProfileRegistry, queryProfiles, importedModels, deployProperties);
indexingScript = new IndexingScript(search);
indexInfo = new IndexInfo(search);
indexSchema = new IndexSchema(search);
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java
index 5337d58fb82..c0a4117de3e 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java
@@ -6,6 +6,8 @@ import com.yahoo.config.model.api.ModelContext;
import com.yahoo.search.query.profile.QueryProfileRegistry;
import com.yahoo.searchdefinition.OnnxModel;
import com.yahoo.searchdefinition.OnnxModels;
+import com.yahoo.searchdefinition.RankExpressionFile;
+import com.yahoo.searchdefinition.RankExpressionFiles;
import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.RankingConstant;
import com.yahoo.searchdefinition.RankingConstants;
@@ -14,6 +16,7 @@ import com.yahoo.searchdefinition.RankProfile;
import com.yahoo.searchdefinition.Search;
import com.yahoo.vespa.config.search.core.OnnxModelsConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
+import com.yahoo.vespa.config.search.core.RankingExpressionsConfig;
import com.yahoo.vespa.model.AbstractService;
import java.util.Collection;
@@ -25,21 +28,21 @@ import java.util.logging.Logger;
*
* @author bratseth
*/
-public class RankProfileList extends Derived implements RankProfilesConfig.Producer,
- RankingConstantsConfig.Producer,
- OnnxModelsConfig.Producer {
+public class RankProfileList extends Derived implements RankProfilesConfig.Producer {
private static final Logger log = Logger.getLogger(RankProfileList.class.getName());
private final Map<String, RawRankProfile> rankProfiles = new java.util.LinkedHashMap<>();
private final RankingConstants rankingConstants;
+ private final RankExpressionFiles rankExpressionFiles;
private final OnnxModels onnxModels;
public static RankProfileList empty = new RankProfileList();
private RankProfileList() {
- this.rankingConstants = new RankingConstants();
- this.onnxModels = new OnnxModels();
+ rankingConstants = new RankingConstants();
+ rankExpressionFiles = new RankExpressionFiles();
+ onnxModels = new OnnxModels();
}
/**
@@ -50,6 +53,7 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
*/
public RankProfileList(Search search,
RankingConstants rankingConstants,
+ RankExpressionFiles rankExpressionFiles,
AttributeFields attributeFields,
RankProfileRegistry rankProfileRegistry,
QueryProfileRegistry queryProfiles,
@@ -57,7 +61,8 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
ModelContext.Properties deployProperties) {
setName(search == null ? "default" : search.getName());
this.rankingConstants = rankingConstants;
- this.onnxModels = search == null ? new OnnxModels() : search.onnxModels(); // as ONNX models come from parsing rank expressions
+ this.rankExpressionFiles = rankExpressionFiles;
+ onnxModels = search == null ? new OnnxModels() : search.onnxModels(); // as ONNX models come from parsing rank expressions
deriveRankProfiles(rankProfileRegistry, queryProfiles, importedModels, search, attributeFields, deployProperties);
}
@@ -90,11 +95,9 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
return rankProfiles.get(name);
}
- public void sendConstantsTo(Collection<? extends AbstractService> services) {
+ public void sendTo(Collection<? extends AbstractService> services) {
rankingConstants.sendTo(services);
- }
-
- public void sendOnnxModelsTo(Collection<? extends AbstractService> services) {
+ rankExpressionFiles.sendTo(services);
onnxModels.sendTo(services);
}
@@ -108,7 +111,10 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
}
}
- @Override
+ public void getConfig(RankingExpressionsConfig.Builder builder) {
+ rankExpressionFiles.asMap().values().forEach((expr) -> builder.expression.add(new RankingExpressionsConfig.Expression.Builder().name(expr.getName()).fileref(expr.getFileReference())));
+ }
+
public void getConfig(RankingConstantsConfig.Builder builder) {
for (RankingConstant constant : rankingConstants.asMap().values()) {
if ("".equals(constant.getFileReference()))
@@ -121,7 +127,6 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
}
}
- @Override
public void getConfig(OnnxModelsConfig.Builder builder) {
for (OnnxModel model : onnxModels.asMap().values()) {
if ("".equals(model.getFileReference()))
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
index 4aa0a9daaca..a829989a281 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/derived/RawRankProfile.java
@@ -232,12 +232,11 @@ public class RawRankProfile implements RankProfilesConfig.Producer {
SerializationContext context = new SerializationContext(functionExpressions, null, functionProperties);
for (Map.Entry<String, RankProfile.RankingExpressionFunction> e : functions.entrySet()) {
String propertyName = RankingExpression.propertyName(e.getKey());
- if (context.serializedFunctions().containsKey(propertyName)) {
- continue;
- }
+ if (context.serializedFunctions().containsKey(propertyName)) continue;
+
String expressionString = e.getValue().function().getBody().getRoot().toString(new StringBuilder(), context, null, null).toString();
- context.addFunctionSerialization(RankingExpression.propertyName(e.getKey()), expressionString);
+ context.addFunctionSerialization(propertyName, expressionString);
for (Map.Entry<String, TensorType> argumentType : e.getValue().function().argumentTypes().entrySet())
context.addArgumentTypeSerialization(e.getKey(), argumentType.getKey(), argumentType.getValue());
if (e.getValue().function().returnType().isPresent())
@@ -353,8 +352,8 @@ public class RawRankProfile implements RankProfilesConfig.Producer {
properties.add(new Pair<>(property.getName(), property.getValue()));
}
}
- properties.addAll(deriveRankingPhaseRankProperties(firstPhaseRanking, "firstphase"));
- properties.addAll(deriveRankingPhaseRankProperties(secondPhaseRanking, "secondphase"));
+ properties.addAll(deriveRankingPhaseRankProperties(firstPhaseRanking, rankProfile.getFirstPhaseFile(), RankProfile.FIRST_PHASE));
+ properties.addAll(deriveRankingPhaseRankProperties(secondPhaseRanking, rankProfile.getSecondPhaseFile(), RankProfile.SECOND_PHASE));
for (FieldRankSettings settings : fieldRankSettings.values()) {
properties.addAll(settings.deriveRankProperties());
}
@@ -421,7 +420,7 @@ public class RawRankProfile implements RankProfilesConfig.Producer {
return properties;
}
- private List<Pair<String, String>> deriveRankingPhaseRankProperties(RankingExpression expression, String phase) {
+ private List<Pair<String, String>> deriveRankingPhaseRankProperties(RankingExpression expression, String fileName, String phase) {
List<Pair<String, String>> properties = new ArrayList<>();
if (expression == null) return properties;
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
index d78a69b4802..48e4bee0506 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
@@ -30,6 +30,7 @@ import com.yahoo.config.model.producer.UserConfigRepo;
import com.yahoo.config.provision.AllocatedHosts;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.container.QrConfig;
+import com.yahoo.searchdefinition.RankExpressionFiles;
import com.yahoo.searchdefinition.RankProfile;
import com.yahoo.searchdefinition.RankProfileRegistry;
import com.yahoo.searchdefinition.RankingConstants;
@@ -125,6 +126,9 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
/** The global ranking constants of this model */
private final RankingConstants rankingConstants = new RankingConstants();
+ /** External rank expression files of this */
+ private final RankExpressionFiles rankExpressionFiles = new RankExpressionFiles();
+
/** The validation overrides of this. This is never null. */
private final ValidationOverrides validationOverrides;
@@ -177,12 +181,14 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
createGlobalRankProfiles(deployState.getDeployLogger(), deployState.getImportedModels(),
deployState.rankProfileRegistry(), deployState.getQueryProfiles());
- this.rankProfileList = new RankProfileList(null, // null search -> global
- rankingConstants, AttributeFields.empty,
- deployState.rankProfileRegistry(),
- deployState.getQueryProfiles().getRegistry(),
- deployState.getImportedModels(),
- deployState.getProperties());
+ rankProfileList = new RankProfileList(null, // null search -> global
+ rankingConstants,
+ rankExpressionFiles,
+ AttributeFields.empty,
+ deployState.rankProfileRegistry(),
+ deployState.getQueryProfiles().getRegistry(),
+ deployState.getImportedModels(),
+ deployState.getProperties());
HostSystem hostSystem = root.hostSystem();
if (complete) { // create a a completed, frozen model
@@ -256,6 +262,8 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
/** Returns the global ranking constants of this */
public RankingConstants rankingConstants() { return rankingConstants; }
+ public RankExpressionFiles rankExpressionFiles() { return rankExpressionFiles; }
+
/** Creates a mutable model with no services instantiated */
public static VespaModel createIncomplete(DeployState deployState) throws IOException, SAXException {
return new VespaModel(new NullConfigModelRegistry(), deployState, false,
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankSetupValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankSetupValidator.java
index 7049213ddab..d87c6596fa4 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankSetupValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankSetupValidator.java
@@ -8,6 +8,8 @@ import com.yahoo.log.InvalidLogFormatException;
import com.yahoo.log.LogMessage;
import com.yahoo.path.Path;
import com.yahoo.searchdefinition.OnnxModel;
+import com.yahoo.searchdefinition.RankExpressionFile;
+import com.yahoo.vespa.config.search.core.RankingExpressionsConfig;
import com.yahoo.vespa.defaults.Defaults;
import com.yahoo.yolean.Exceptions;
import com.yahoo.system.ProcessExecuter;
@@ -38,7 +40,6 @@ import java.util.logging.Logger;
import java.util.logging.Level;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
/**
* Validate rank setup for all search clusters (rank-profiles, index-schema, attributes configs), validating done
@@ -116,50 +117,61 @@ public class RankSetupValidator extends Validator {
}
private void writeConfigs(String dir, AbstractConfigProducer<?> producer) throws IOException {
- RankProfilesConfig.Builder rpcb = new RankProfilesConfig.Builder();
- ((RankProfilesConfig.Producer) producer).getConfig(rpcb);
- RankProfilesConfig rpc = new RankProfilesConfig(rpcb);
- writeConfig(dir, RankProfilesConfig.getDefName() + ".cfg", rpc);
-
- IndexschemaConfig.Builder iscb = new IndexschemaConfig.Builder();
- ((IndexschemaConfig.Producer) producer).getConfig(iscb);
- IndexschemaConfig isc = new IndexschemaConfig(iscb);
- writeConfig(dir, IndexschemaConfig.getDefName() + ".cfg", isc);
-
- AttributesConfig.Builder acb = new AttributesConfig.Builder();
- ((AttributesConfig.Producer) producer).getConfig(acb);
- AttributesConfig ac = new AttributesConfig(acb);
- writeConfig(dir, AttributesConfig.getDefName() + ".cfg", ac);
-
- RankingConstantsConfig.Builder rccb = new RankingConstantsConfig.Builder();
- ((RankingConstantsConfig.Producer) producer).getConfig(rccb);
- RankingConstantsConfig rcc = new RankingConstantsConfig(rccb);
- writeConfig(dir, RankingConstantsConfig.getDefName() + ".cfg", rcc);
-
- OnnxModelsConfig.Builder omcb = new OnnxModelsConfig.Builder();
- ((OnnxModelsConfig.Producer) producer).getConfig(omcb);
- OnnxModelsConfig omc = new OnnxModelsConfig(omcb);
- writeConfig(dir, OnnxModelsConfig.getDefName() + ".cfg", omc);
-
- ImportedFieldsConfig.Builder ifcb = new ImportedFieldsConfig.Builder();
- ((ImportedFieldsConfig.Producer) producer).getConfig(ifcb);
- ImportedFieldsConfig ifc = new ImportedFieldsConfig(ifcb);
- writeConfig(dir, ImportedFieldsConfig.getDefName() + ".cfg", ifc);
+ RankProfilesConfig.Builder rpcb = new RankProfilesConfig.Builder();
+ ((RankProfilesConfig.Producer) producer).getConfig(rpcb);
+ RankProfilesConfig rpc = new RankProfilesConfig(rpcb);
+ writeConfig(dir, RankProfilesConfig.getDefName() + ".cfg", rpc);
+
+ IndexschemaConfig.Builder iscb = new IndexschemaConfig.Builder();
+ ((IndexschemaConfig.Producer) producer).getConfig(iscb);
+ IndexschemaConfig isc = new IndexschemaConfig(iscb);
+ writeConfig(dir, IndexschemaConfig.getDefName() + ".cfg", isc);
+
+ AttributesConfig.Builder acb = new AttributesConfig.Builder();
+ ((AttributesConfig.Producer) producer).getConfig(acb);
+ AttributesConfig ac = new AttributesConfig(acb);
+ writeConfig(dir, AttributesConfig.getDefName() + ".cfg", ac);
+
+ RankingConstantsConfig.Builder rccb = new RankingConstantsConfig.Builder();
+ ((RankingConstantsConfig.Producer) producer).getConfig(rccb);
+ RankingConstantsConfig rcc = new RankingConstantsConfig(rccb);
+ writeConfig(dir, RankingConstantsConfig.getDefName() + ".cfg", rcc);
+
+ RankingExpressionsConfig.Builder recb = new RankingExpressionsConfig.Builder();
+ ((RankingExpressionsConfig.Producer) producer).getConfig(recb);
+ RankingExpressionsConfig rec = new RankingExpressionsConfig(recb);
+ writeConfig(dir, RankingExpressionsConfig.getDefName() + ".cfg", rec);
+
+ OnnxModelsConfig.Builder omcb = new OnnxModelsConfig.Builder();
+ ((OnnxModelsConfig.Producer) producer).getConfig(omcb);
+ OnnxModelsConfig omc = new OnnxModelsConfig(omcb);
+ writeConfig(dir, OnnxModelsConfig.getDefName() + ".cfg", omc);
+
+ ImportedFieldsConfig.Builder ifcb = new ImportedFieldsConfig.Builder();
+ ((ImportedFieldsConfig.Producer) producer).getConfig(ifcb);
+ ImportedFieldsConfig ifc = new ImportedFieldsConfig(ifcb);
+ writeConfig(dir, ImportedFieldsConfig.getDefName() + ".cfg", ifc);
}
private void writeExtraVerifyRanksetupConfig(String dir, DocumentDatabase db) throws IOException {
String configName = "verify-ranksetup.cfg";
String configContent = "";
+ List<String> config = new ArrayList<>();
// Assist verify-ranksetup in finding the actual ONNX model files
- Map<String, OnnxModel> models = db.getDerivedConfiguration().getSearch().onnxModels().asMap();
- if (models.values().size() > 0) {
- List<String> config = new ArrayList<>(models.values().size() * 2);
- for (OnnxModel model : models.values()) {
- String modelPath = getFileRepositoryPath(model.getFilePath(), model.getFileReference());
- config.add(String.format("file[%d].ref \"%s\"", config.size() / 2, model.getFileReference()));
- config.add(String.format("file[%d].path \"%s\"", config.size() / 2, modelPath));
- }
+ for (OnnxModel model : db.getDerivedConfiguration().getSearch().onnxModels().asMap().values()) {
+ String modelPath = getFileRepositoryPath(model.getFilePath(), model.getFileReference());
+ config.add(String.format("file[%d].ref \"%s\"", config.size() / 2, model.getFileReference()));
+ config.add(String.format("file[%d].path \"%s\"", config.size() / 2, modelPath));
+ }
+
+ for (RankExpressionFile expr : db.getDerivedConfiguration().getSearch().rankExpressionFiles().asMap().values()) {
+ String modelPath = getFileRepositoryPath(expr.getFilePath(), expr.getFileReference());
+ config.add(String.format("file[%d].ref \"%s\"", config.size() / 2, expr.getFileReference()));
+ config.add(String.format("file[%d].path \"%s\"", config.size() / 2, modelPath));
+ }
+
+ if ( ! config.isEmpty() ) {
configContent = StringUtilities.implodeMultiline(config);
}
IOUtils.writeFile(dir + configName, configContent, false);
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
index 4e78f44d0fe..317ed0f66c7 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
@@ -25,6 +25,7 @@ import com.yahoo.search.config.QrStartConfig;
import com.yahoo.vespa.config.search.RankProfilesConfig;
import com.yahoo.vespa.config.search.core.OnnxModelsConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
+import com.yahoo.vespa.config.search.core.RankingExpressionsConfig;
import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainer;
import com.yahoo.vespa.model.container.component.BindingPattern;
import com.yahoo.vespa.model.container.component.Component;
@@ -58,6 +59,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
RankProfilesConfig.Producer,
RankingConstantsConfig.Producer,
OnnxModelsConfig.Producer,
+ RankingExpressionsConfig.Producer,
ServletPathsConfig.Producer,
ContainerMbusConfig.Producer,
MetricsProxyApiConfig.Producer,
@@ -233,6 +235,10 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
if (modelEvaluation != null) modelEvaluation.getConfig(builder);
}
+ public void getConfig(RankingExpressionsConfig.Builder builder) {
+ if (modelEvaluation != null) modelEvaluation.getConfig(builder);
+ }
+
@Override
public void getConfig(ContainerMbusConfig.Builder builder) {
if (mbusParams != null) {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java
index 510d2fe3d99..37bfb8821c3 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java
@@ -7,6 +7,7 @@ import com.yahoo.searchdefinition.derived.RankProfileList;
import com.yahoo.vespa.config.search.RankProfilesConfig;
import com.yahoo.vespa.config.search.core.OnnxModelsConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
+import com.yahoo.vespa.config.search.core.RankingExpressionsConfig;
import com.yahoo.vespa.model.container.component.Handler;
import com.yahoo.vespa.model.container.component.SystemBindingPattern;
@@ -18,10 +19,12 @@ import java.util.Objects;
*
* @author bratseth
*/
-public class ContainerModelEvaluation implements RankProfilesConfig.Producer,
- RankingConstantsConfig.Producer,
- OnnxModelsConfig.Producer
-{
+
+public class ContainerModelEvaluation implements
+ RankProfilesConfig.Producer,
+ RankingConstantsConfig.Producer,
+ OnnxModelsConfig.Producer,
+ RankingExpressionsConfig.Producer {
private final static String BUNDLE_NAME = "model-evaluation";
private final static String EVALUATOR_NAME = ModelsEvaluator.class.getName();
@@ -38,8 +41,7 @@ public class ContainerModelEvaluation implements RankProfilesConfig.Producer,
}
public void prepare(List<ApplicationContainer> containers) {
- rankProfileList.sendConstantsTo(containers);
- rankProfileList.sendOnnxModelsTo(containers);
+ rankProfileList.sendTo(containers);
}
@Override
@@ -57,6 +59,10 @@ public class ContainerModelEvaluation implements RankProfilesConfig.Producer,
rankProfileList.getConfig(builder);
}
+ public void getConfig(RankingExpressionsConfig.Builder builder) {
+ rankProfileList.getConfig(builder);
+ }
+
public static Handler<?> getHandler() {
Handler<?> handler = new Handler<>(new ComponentModel(REST_HANDLER_NAME, null, BUNDLE_NAME));
handler.addServerBindings(
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java
index 705c48d1c9b..3ca5b9e3a0a 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/AbstractSearchCluster.java
@@ -39,8 +39,7 @@ public abstract class AbstractSearchCluster extends AbstractConfigProducer<Abstr
public void prepareToDistributeFiles(List<SearchNode> backends) {
for (SchemaSpec sds : localSDS) {
- sds.getSearchDefinition().getSearch().rankingConstants().sendTo(backends);
- sds.getSearchDefinition().getSearch().onnxModels().sendTo(backends);
+ sds.getSearchDefinition().getSearch().sendTo(backends);
}
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/DocumentDatabase.java b/config-model/src/main/java/com/yahoo/vespa/model/search/DocumentDatabase.java
index 8d4c1675bbf..9f0ff7db9f8 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/search/DocumentDatabase.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/search/DocumentDatabase.java
@@ -12,6 +12,7 @@ import com.yahoo.vespa.config.search.SummaryConfig;
import com.yahoo.vespa.config.search.SummarymapConfig;
import com.yahoo.vespa.config.search.core.OnnxModelsConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
+import com.yahoo.vespa.config.search.core.RankingExpressionsConfig;
import com.yahoo.vespa.config.search.summary.JuniperrcConfig;
import com.yahoo.vespa.configdefinition.IlscriptsConfig;
@@ -26,6 +27,7 @@ public class DocumentDatabase extends AbstractConfigProducer<DocumentDatabase> i
AttributesConfig.Producer,
RankProfilesConfig.Producer,
RankingConstantsConfig.Producer,
+ RankingExpressionsConfig.Producer,
OnnxModelsConfig.Producer,
IndexschemaConfig.Producer,
JuniperrcConfig.Producer,
@@ -75,6 +77,11 @@ public class DocumentDatabase extends AbstractConfigProducer<DocumentDatabase> i
}
@Override
+ public void getConfig(RankingExpressionsConfig.Builder builder) {
+ derivedCfg.getRankProfileList().getConfig(builder);
+ }
+
+ @Override
public void getConfig(RankingConstantsConfig.Builder builder) {
derivedCfg.getRankProfileList().getConfig(builder);
}
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java b/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
index e32ad274325..9f18cfb4bd9 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
@@ -98,6 +98,7 @@ public class ModelEvaluationTest {
RankingConstantsConfig constantsConfig = new RankingConstantsConfig(cb);
RankingExpressionsConfig.Builder ce = new RankingExpressionsConfig.Builder();
+ cluster.getConfig(ce);
RankingExpressionsConfig expressionsConfig = ce.build();
OnnxModelsConfig.Builder ob = new OnnxModelsConfig.Builder();