aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2020-11-29 18:46:58 +0100
committerJon Bratseth <bratseth@gmail.com>2020-11-29 18:46:58 +0100
commit4f92f1591f6fe49b90a37f67dbbdd20a2034bb38 (patch)
tree04491eec9720ac942daf7fd13c9f231f8f1c0fe1 /container-search/src/main/java/com/yahoo/search/searchers/QueryValidator.java
parenta7cc1248bade10175a73a4602f8452ccda6a102a (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.java60
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() { }
+
+ }
+
+}