diff options
author | Jon Bratseth <bratseth@vespa.ai> | 2023-06-05 13:10:06 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@vespa.ai> | 2023-06-05 13:10:06 +0200 |
commit | 3ecff4fb067f090789f2e85e0e195c1fd69e3c3e (patch) | |
tree | e0b68ac002cb604d3725afd356fbebb0cfcfa861 /container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java | |
parent | 4864d94e48919a8cb734191ab90b80738e843d08 (diff) |
Validate prefix matching
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 | 48 |
1 files changed, 38 insertions, 10 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 a2e3d038053..341ab342468 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 @@ -5,9 +5,9 @@ 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.CompositeItem; import com.yahoo.prelude.query.HasIndexItem; import com.yahoo.prelude.query.Item; +import com.yahoo.prelude.query.PrefixItem; import com.yahoo.prelude.query.ToolBox; import com.yahoo.search.Query; import com.yahoo.search.Result; @@ -29,30 +29,58 @@ public class QueryValidator extends Searcher { @Override public Result search(Query query, Execution execution) { IndexFacts.Session session = execution.context().getIndexFacts().newSession(query); - ToolBox.visit(new ItemValidator(session), query.getModel().getQueryTree().getRoot()); + ToolBox.visit(new TermSearchValidator(session), query.getModel().getQueryTree().getRoot()); + ToolBox.visit(new PrefixSearchValidator(session), query.getModel().getQueryTree().getRoot()); return execution.search(query); } - private static class ItemValidator extends ToolBox.QueryVisitor { + private abstract static class TermValidator extends ToolBox.QueryVisitor { - IndexFacts.Session session; + final IndexFacts.Session session; - public ItemValidator(IndexFacts.Session session) { + public TermValidator(IndexFacts.Session session) { this.session = session; } @Override + public void onExit() { } + + } + + private static class TermSearchValidator extends TermValidator { + + public TermSearchValidator(IndexFacts.Session session) { + super(session); + } + + @Override public boolean visit(Item item) { - if (item instanceof HasIndexItem) { - String indexName = ((HasIndexItem)item).getIndexName(); - if (session.getIndex(indexName).isTensor()) - throw new IllegalArgumentException("Cannot search '" + indexName + "': It is a tensor field"); + 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"); } return true; } + } + + private static class PrefixSearchValidator extends TermValidator { + + public PrefixSearchValidator(IndexFacts.Session session) { + super(session); + } + @Override - public void onExit() { } + public boolean visit(Item item) { + if (item instanceof PrefixItem prefixItem) { + Index index = session.getIndex(prefixItem.getIndexName()); + if ( ! index.isAttribute()) + throw new IllegalArgumentException("'" + prefixItem.getIndexName() + "' is not an attribute field: Prefix matching is not supported"); + if (index.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; + } } |