diff options
author | Jon Bratseth <bratseth@vespa.ai> | 2023-06-12 15:14:11 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@vespa.ai> | 2023-06-12 15:14:11 +0200 |
commit | 2092f374fc4f3de42da75f4660849af0f00f7a81 (patch) | |
tree | 1047036d19f30481925ab38b0601a85000121ad3 /container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java | |
parent | 537d80f3aad6351322ded0f3e300722cbcdba5d7 (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.java | 41 |
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; |