aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2022-05-11 13:12:15 +0200
committerJon Bratseth <bratseth@gmail.com>2022-05-11 13:12:15 +0200
commita754c48160b4f54f7788679b5f87237f214e6b98 (patch)
tree9d8cab2f0fa4270fc93f4ca776b86fe2535bfce0 /config-model/src/main/java/com/yahoo
parent57d93307b70651fa6fd74f1fabbf15dadc53841e (diff)
Test ranking constant config generation
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java54
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankingConstant.java6
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java10
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/derived/RankProfileList.java2
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedSchemas.java2
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java2
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSchema.java11
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankingConstantsValidator.java8
8 files changed, 62 insertions, 33 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java b/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java
index 1838f1e36b7..6351232b789 100644
--- a/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java
+++ b/config-model/src/main/java/com/yahoo/config/model/test/MockApplicationPackage.java
@@ -6,9 +6,6 @@ import com.yahoo.config.application.api.ComponentInfo;
import com.yahoo.config.application.api.UnparsedConfigDefinition;
import com.yahoo.config.application.api.ApplicationFile;
import com.yahoo.component.Version;
-import com.yahoo.config.model.application.provider.BaseDeployLogger;
-import com.yahoo.config.model.application.provider.MockFileRegistry;
-import com.yahoo.config.model.deploy.TestProperties;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
import com.yahoo.config.provision.InstanceName;
@@ -18,9 +15,6 @@ import com.yahoo.path.Path;
import com.yahoo.io.reader.NamedReader;
import com.yahoo.search.query.profile.QueryProfileRegistry;
import com.yahoo.search.query.profile.config.QueryProfileXMLReader;
-import com.yahoo.searchdefinition.RankProfileRegistry;
-import com.yahoo.searchdefinition.ApplicationBuilder;
-import com.yahoo.searchdefinition.parser.ParseException;
import com.yahoo.vespa.config.ConfigDefinitionKey;
import com.yahoo.config.application.api.ApplicationPackage;
@@ -37,7 +31,9 @@ import java.nio.file.Files;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -53,13 +49,14 @@ public class MockApplicationPackage implements ApplicationPackage {
public static final String DEPLOYED_BY_USER = "user";
public static final String APPLICATION_NAME = "application";
public static final long APPLICATION_GENERATION = 1L;
- public static final String MUSIC_SEARCHDEFINITION = createSearchDefinition("music", "foo");
- public static final String BOOK_SEARCHDEFINITION = createSearchDefinition("book", "bar");
+ public static final String MUSIC_SCHEMA = createSchema("music", "foo");
+ public static final String BOOK_SCHEMA = createSchema("book", "bar");
private final File root;
private final String hostsS;
private final String servicesS;
private final List<String> schemas;
+ private final Map<Path, MockApplicationFile> files;
private final String schemaDir;
private final Optional<String> deploymentSpec;
private final Optional<String> validationOverrides;
@@ -68,6 +65,7 @@ public class MockApplicationPackage implements ApplicationPackage {
private final ApplicationMetaData applicationMetaData;
protected MockApplicationPackage(File root, String hosts, String services, List<String> schemas,
+ Map<Path, MockApplicationFile> files,
String schemaDir,
String deploymentSpec, String validationOverrides, boolean failOnValidateXml,
String queryProfile, String queryProfileType) {
@@ -75,6 +73,7 @@ public class MockApplicationPackage implements ApplicationPackage {
this.hostsS = hosts;
this.servicesS = services;
this.schemas = schemas;
+ this.files = files;
this.schemaDir = schemaDir;
this.deploymentSpec = Optional.ofNullable(deploymentSpec);
this.validationOverrides = Optional.ofNullable(validationOverrides);
@@ -135,7 +134,7 @@ public class MockApplicationPackage implements ApplicationPackage {
throw new IllegalArgumentException("Expected the first line of a schema but got '" + sd + "'");
int end = s.indexOf(' ');
if (end < 0)
- end = s.indexOf('}');
+ end = s.indexOf('}');
return s.substring(0, end).trim();
}
@@ -165,6 +164,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public ApplicationFile getFile(Path file) {
+ if (files.containsKey(file)) return files.get(file);
return new MockApplicationFile(file, Path.fromString(root.toString()));
}
@@ -239,6 +239,7 @@ public class MockApplicationPackage implements ApplicationPackage {
private String hosts = null;
private String services = null;
private List<String> schemas = Collections.emptyList();
+ private Map<Path, MockApplicationFile> files = new LinkedHashMap<>();
private String schemaDir = null;
private String deploymentSpec = null;
private String validationOverrides = null;
@@ -282,6 +283,16 @@ public class MockApplicationPackage implements ApplicationPackage {
return this;
}
+ /** Additional (mock) files that will exist in this application package, with their content. */
+ public Builder withFiles(Map<Path, String> files) {
+ Map<Path, MockApplicationFile> mockFiles = new HashMap<>();
+ for (var file : files.entrySet())
+ mockFiles.put(file.getKey(), new MockApplicationFile(file.getKey(),
+ Path.fromString(root.toString()), file.getValue()));
+ this.files = mockFiles;
+ return this;
+ }
+
public Builder withSchemaDir(String schemaDir) {
this.schemaDir = schemaDir;
return this;
@@ -313,13 +324,13 @@ public class MockApplicationPackage implements ApplicationPackage {
}
public ApplicationPackage build() {
- return new MockApplicationPackage(root, hosts, services, schemas, schemaDir,
- deploymentSpec, validationOverrides, failOnValidateXml,
- queryProfile, queryProfileType);
+ return new MockApplicationPackage(root, hosts, services, schemas, files, schemaDir,
+ deploymentSpec, validationOverrides, failOnValidateXml,
+ queryProfile, queryProfileType);
}
}
- public static String createSearchDefinition(String name, String fieldName) {
+ public static String createSchema(String name, String fieldName) {
return "search " + name + " {" +
" document " + name + " {" +
" field " + fieldName + " type string {}" +
@@ -369,25 +380,36 @@ public class MockApplicationPackage implements ApplicationPackage {
/** The File pointing to the actual file represented by this */
private final File file;
+ /** The content of this file, or null to read it from the file system. */
+ private final String content;
+
public MockApplicationFile(Path filePath, Path applicationPackagePath) {
+ this(filePath, applicationPackagePath, null);
+ }
+
+ private MockApplicationFile(Path filePath, Path applicationPackagePath, String content) {
super(filePath);
this.root = applicationPackagePath;
file = applicationPackagePath.append(filePath).toFile();
+ this.content = content;
}
@Override
public boolean isDirectory() {
+ if (content != null) return false;
return file.isDirectory();
}
@Override
public boolean exists() {
+ if (content != null) return true;
return file.exists();
}
@Override
public Reader createReader() {
try {
+ if (content != null) return new StringReader(content);
if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist");
return IOUtils.createReader(file, "UTF-8");
}
@@ -399,6 +421,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public InputStream createInputStream() {
try {
+ if (content != null) throw new UnsupportedOperationException("Not implemented for mock file content");
if ( ! exists()) throw new FileNotFoundException("File '" + file + "' does not exist");
return new BufferedInputStream(new FileInputStream(file));
}
@@ -416,6 +439,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public ApplicationFile writeFile(Reader input) {
try {
+ if (content != null) throw new UnsupportedOperationException("Not implemented for mock file content");
IOUtils.writeFile(file, IOUtils.readAll(input), false);
return this;
}
@@ -427,6 +451,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public ApplicationFile appendFile(String value) {
try {
+ if (content != null) throw new UnsupportedOperationException("Not implemented for mock file content");
IOUtils.writeFile(file, value, true);
return this;
}
@@ -437,7 +462,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public List<ApplicationFile> listFiles(PathFilter filter) {
- if ( ! isDirectory()) return Collections.emptyList();
+ if ( ! isDirectory()) return List.of();
return Arrays.stream(file.listFiles()).filter(f -> filter.accept(Path.fromString(f.toString())))
.map(f -> new MockApplicationFile(asApplicationRelativePath(f), root))
.collect(Collectors.toList());
@@ -445,6 +470,7 @@ public class MockApplicationPackage implements ApplicationPackage {
@Override
public ApplicationFile delete() {
+ if (content != null) throw new UnsupportedOperationException("Not implemented for mock file content");
file.delete();
return this;
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstant.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstant.java
index 377e19eedf2..7a2765de852 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstant.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstant.java
@@ -12,6 +12,7 @@ import com.yahoo.tensor.TensorType;
* @author bratseth
*/
public class RankingConstant extends DistributableResource {
+
private TensorType tensorType = null;
public RankingConstant(String name) {
@@ -43,10 +44,9 @@ public class RankingConstant extends DistributableResource {
": Dense tensor dimensions must have a size");
}
+ @Override
public String toString() {
- StringBuilder b = new StringBuilder(super.toString())
- .append("' of type '").append(tensorType).append("'");
- return b.toString();
+ return super.toString() + "' of type '" + tensorType + "'";
}
}
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java
index 5020e9a061c..339840f66ce 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java
@@ -5,14 +5,14 @@ import com.yahoo.config.application.api.FileRegistry;
import java.util.Collections;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
/**
- * Constant values for ranking/model execution tied to a search definition, or globally to an application
- * package
+ * Constant values for ranking/model execution tied to a schema, or globally to an application package
*
* @author bratseth
*/
@@ -23,7 +23,7 @@ public class RankingConstants {
/** The schema this belongs to, or empty if it is global */
private final Optional<Schema> owner;
- private final Map<String, RankingConstant> constants = new ConcurrentHashMap<>();
+ private final Map<String, RankingConstant> constants = new LinkedHashMap<>();
public RankingConstants(FileRegistry fileRegistry, Optional<Schema> owner) {
this.fileRegistry = fileRegistry;
@@ -36,7 +36,7 @@ public class RankingConstants {
String name = constant.getName();
RankingConstant prev = constants.putIfAbsent(name, constant);
if ( prev != null )
- throw new IllegalArgumentException("Ranking constant '" + name + "' defined twice");
+ throw new IllegalArgumentException("Constant '" + name + "' defined twice");
}
public void putIfAbsent(RankingConstant constant) {
@@ -70,7 +70,7 @@ public class RankingConstants {
if (owner.isEmpty() || owner.get().inherited().isEmpty()) return Collections.unmodifiableMap(constants);
if (constants.isEmpty()) return owner.get().inherited().get().rankingConstants().asMap();
- var allConstants = new HashMap<>(owner.get().inherited().get().rankingConstants().asMap());
+ var allConstants = new LinkedHashMap<>(owner.get().inherited().get().rankingConstants().asMap());
allConstants.putAll(constants);
return Collections.unmodifiableMap(allConstants);
}
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 4c9e65f16c8..c36bd96d309 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
@@ -50,7 +50,7 @@ public class RankProfileList extends Derived implements RankProfilesConfig.Produ
}
/**
- * Creates a rank profile
+ * Creates a rank profile list
*
* @param schema the schema this is a rank profile from
* @param attributeFields the attribute fields to create a ranking for
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedSchemas.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedSchemas.java
index 9c2d29282ae..d3c24fa9924 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedSchemas.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertParsedSchemas.java
@@ -80,7 +80,7 @@ public class ConvertParsedSchemas {
this.typeConverter = new ConvertParsedTypes(orderedInput, docMan);
}
- private Map<String, SDDocumentType> convertedDocuments = new LinkedHashMap();
+ private final Map<String, SDDocumentType> convertedDocuments = new LinkedHashMap<>();
public List<Schema> convertToSchemas() {
typeConverter.convert(false);
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java
index 8f25a586aa6..e46a6882bc7 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ConvertSchemaCollection.java
@@ -118,7 +118,7 @@ public class ConvertSchemaCollection {
}
private void resolveStructInheritance() {
- List<ParsedStruct> all = new ArrayList();
+ List<ParsedStruct> all = new ArrayList<>();
for (var schema : orderedInput) {
var doc = schema.getDocument();
for (var struct : doc.getStructs()) {
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSchema.java b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSchema.java
index 599dd6e2a7a..e4f312e98e3 100644
--- a/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSchema.java
+++ b/config-model/src/main/java/com/yahoo/searchdefinition/parser/ParsedSchema.java
@@ -14,9 +14,12 @@ import java.util.Optional;
/**
* This class holds the extracted information after parsing
* one schema (.sd) file, using simple data structures
- * as far as possible. Do not put advanced logic here!
+ * as far as possible.
+ *
+ * Do not put advanced logic here!
+ *
* @author arnej27959
- **/
+ */
public class ParsedSchema extends ParsedBlock {
public static class ImportedField {
@@ -39,8 +42,8 @@ public class ParsedSchema extends ParsedBlock {
private final List<RankingConstant> rankingConstants = new ArrayList<>();
private final List<String> inherited = new ArrayList<>();
private final List<String> inheritedByDocument = new ArrayList<>();
- private final Map<String, ParsedSchema> resolvedInherits = new LinkedHashMap();
- private final Map<String, ParsedSchema> allResolvedInherits = new LinkedHashMap();
+ private final Map<String, ParsedSchema> resolvedInherits = new LinkedHashMap<>();
+ private final Map<String, ParsedSchema> allResolvedInherits = new LinkedHashMap<>();
private final Map<String, ParsedAnnotation> extraAnnotations = new LinkedHashMap<>();
private final Map<String, ParsedDocumentSummary> docSums = new LinkedHashMap<>();
private final Map<String, ParsedField> extraFields = new LinkedHashMap<>();
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankingConstantsValidator.java b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankingConstantsValidator.java
index 82c793af70a..c2f71c78ce3 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankingConstantsValidator.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/application/validation/RankingConstantsValidator.java
@@ -66,15 +66,15 @@ public class RankingConstantsValidator extends Validator {
// TODO: Handle validation of URI soon too.
if (rankingConstant.getPathType() == RankingConstant.PathType.FILE) {
String constantFile = rankingConstant.getFileName();
- if (application.getFileReference(Path.fromString("")).getAbsolutePath().endsWith(FilesApplicationPackage.preprocessed) &&
- constantFile.startsWith(FilesApplicationPackage.preprocessed)) {
+ if (application.getFileReference(Path.fromString("")).getAbsolutePath().endsWith(FilesApplicationPackage.preprocessed)
+ && constantFile.startsWith(FilesApplicationPackage.preprocessed)) {
constantFile = constantFile.substring(FilesApplicationPackage.preprocessed.length());
}
ApplicationFile tensorApplicationFile = application.getFile(Path.fromString(constantFile));
new ConstantTensorJsonValidator().validate(constantFile,
- rankingConstant.getTensorType(),
- tensorApplicationFile.createReader());
+ rankingConstant.getTensorType(),
+ tensorApplicationFile.createReader());
}
}