aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@vespa.ai>2023-06-12 15:14:11 +0200
committerJon Bratseth <bratseth@vespa.ai>2023-06-12 15:14:11 +0200
commit2092f374fc4f3de42da75f4660849af0f00f7a81 (patch)
tree1047036d19f30481925ab38b0601a85000121ad3 /container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
parent537d80f3aad6351322ded0f3e300722cbcdba5d7 (diff)
Move to SchemaInfo
Add the missing constructs to SchemaInfo to be able to use it in place of IndexFacts for validation, and rewrite QueryValidator to use it. The new validation (for prefix search on indexes) is disabled until this is verified, so this should be a no-op.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java41
1 files changed, 22 insertions, 19 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java b/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
index 341ab342468..0b435c2e32d 100644
--- a/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
@@ -3,8 +3,6 @@ package com.yahoo.search.searchers;
import com.yahoo.component.chain.dependencies.After;
import com.yahoo.component.chain.dependencies.Before;
-import com.yahoo.prelude.Index;
-import com.yahoo.prelude.IndexFacts;
import com.yahoo.prelude.query.HasIndexItem;
import com.yahoo.prelude.query.Item;
import com.yahoo.prelude.query.PrefixItem;
@@ -12,6 +10,9 @@ import com.yahoo.prelude.query.ToolBox;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.Searcher;
+import com.yahoo.search.schema.Field;
+import com.yahoo.search.schema.FieldInfo;
+import com.yahoo.search.schema.SchemaInfo;
import com.yahoo.search.searchchain.Execution;
import com.yahoo.search.searchchain.PhaseNames;
@@ -28,36 +29,36 @@ public class QueryValidator extends Searcher {
@Override
public Result search(Query query, Execution execution) {
- IndexFacts.Session session = execution.context().getIndexFacts().newSession(query);
+ var session = execution.context().schemaInfo().newSession(query);
ToolBox.visit(new TermSearchValidator(session), query.getModel().getQueryTree().getRoot());
- ToolBox.visit(new PrefixSearchValidator(session), query.getModel().getQueryTree().getRoot());
+ // ToolBox.visit(new PrefixSearchValidator(session), query.getModel().getQueryTree().getRoot()); TODO: Enable check and QueryValidatorPrefixTest
return execution.search(query);
}
private abstract static class TermValidator extends ToolBox.QueryVisitor {
- final IndexFacts.Session session;
+ final SchemaInfo.Session schema;
- public TermValidator(IndexFacts.Session session) {
- this.session = session;
+ public TermValidator(SchemaInfo.Session schema) {
+ this.schema = schema;
}
- @Override
- public void onExit() { }
-
}
private static class TermSearchValidator extends TermValidator {
- public TermSearchValidator(IndexFacts.Session session) {
- super(session);
+ public TermSearchValidator(SchemaInfo.Session schema) {
+ super(schema);
}
@Override
public boolean visit(Item item) {
if (item instanceof HasIndexItem indexItem) {
- if (session.getIndex(indexItem.getIndexName()).isTensor())
- throw new IllegalArgumentException("Cannot search for terms in '" + indexItem.getIndexName() + "': It is a tensor field");
+ var field = schema.fieldInfo(indexItem.getIndexName());
+ if (! field.isPresent()) return true;
+ if (field.get().type().kind() == Field.Type.Kind.TENSOR)
+ throw new IllegalArgumentException("Cannot search for terms in '" + indexItem.getIndexName() +
+ "': It is a tensor field");
}
return true;
}
@@ -66,17 +67,19 @@ public class QueryValidator extends Searcher {
private static class PrefixSearchValidator extends TermValidator {
- public PrefixSearchValidator(IndexFacts.Session session) {
- super(session);
+ public PrefixSearchValidator(SchemaInfo.Session schema) {
+ super(schema);
}
@Override
public boolean visit(Item item) {
+ if (schema.isStreaming()) return true; // prefix is always supported
if (item instanceof PrefixItem prefixItem) {
- Index index = session.getIndex(prefixItem.getIndexName());
- if ( ! index.isAttribute())
+ var field = schema.fieldInfo(prefixItem.getIndexName());
+ if (! field.isPresent()) return true;
+ if ( ! field.get().isAttribute())
throw new IllegalArgumentException("'" + prefixItem.getIndexName() + "' is not an attribute field: Prefix matching is not supported");
- if (index.isIndex()) // index overrides attribute
+ if (field.get().isIndex()) // index overrides attribute
throw new IllegalArgumentException("'" + prefixItem.getIndexName() + "' is an index field: Prefix matching is not supported even when it is also an attribute");
}
return true;