diff options
author | Jon Bratseth <bratseth@gmail.com> | 2020-11-29 18:46:58 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@gmail.com> | 2020-11-29 18:46:58 +0100 |
commit | 4f92f1591f6fe49b90a37f67dbbdd20a2034bb38 (patch) | |
tree | 04491eec9720ac942daf7fd13c9f231f8f1c0fe1 /container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java | |
parent | a7cc1248bade10175a73a4602f8452ccda6a102a (diff) |
Reject queries searching tensor fields
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 | 60 |
1 files changed, 60 insertions, 0 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 new file mode 100644 index 00000000000..26b5c2bc665 --- /dev/null +++ b/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java @@ -0,0 +1,60 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +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.CompositeItem; +import com.yahoo.prelude.query.HasIndexItem; +import com.yahoo.prelude.query.Item; +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.searchchain.Execution; +import com.yahoo.search.searchchain.PhaseNames; + +import static com.yahoo.search.grouping.GroupingQueryParser.SELECT_PARAMETER_PARSING; + +/** + * Validation of query operators against the schema which is searched + * + * @author bratseth + */ +@After(SELECT_PARAMETER_PARSING) +@Before(PhaseNames.BACKEND) +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()); + return execution.search(query); + } + + private static class ItemValidator extends ToolBox.QueryVisitor { + + IndexFacts.Session session; + + public ItemValidator(IndexFacts.Session session) { + this.session = session; + } + + @Override + public boolean visit(Item item) { + if (item instanceof HasIndexItem) { + String indexName = ((HasIndexItem)item).getIndexName(); + Index index = session.getIndex(indexName); + if (index != null && index.isTensor()) + throw new IllegalArgumentException("Cannot search '" + indexName + "': It is a tensor field"); + } + return true; + } + + @Override + public void onExit() { } + + } + +} |