aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
Publish
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java85
1 files changed, 85 insertions, 0 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java b/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
new file mode 100644
index 00000000000..1366fe1201b
--- /dev/null
+++ b/container-search/src/main/java/com/yahoo/search/grouping/GroupingValidator.java
@@ -0,0 +1,85 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.search.grouping;
+
+import com.google.inject.Inject;
+import com.yahoo.component.chain.dependencies.After;
+import com.yahoo.component.chain.dependencies.Before;
+import com.yahoo.component.chain.dependencies.Provides;
+import com.yahoo.vespa.config.search.AttributesConfig;
+import com.yahoo.container.QrSearchersConfig;
+import com.yahoo.processing.request.CompoundName;
+import com.yahoo.search.Query;
+import com.yahoo.search.Result;
+import com.yahoo.search.Searcher;
+import com.yahoo.search.config.ClusterConfig;
+import com.yahoo.search.grouping.request.AttributeValue;
+import com.yahoo.search.grouping.request.ExpressionVisitor;
+import com.yahoo.search.grouping.request.GroupingExpression;
+import com.yahoo.search.searchchain.Execution;
+import com.yahoo.search.searchchain.PhaseNames;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static com.yahoo.search.grouping.GroupingQueryParser.SELECT_PARAMETER_PARSING;
+
+/**
+ * This searcher ensure that all {@link GroupingRequest} objects attached to a {@link Query} makes sense to the search
+ * cluster for which this searcher has been deployed. This searcher uses exceptions to signal invalid grouping
+ * requests.
+ *
+ * @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ */
+@Before(PhaseNames.BACKEND)
+@After(SELECT_PARAMETER_PARSING)
+@Provides(GroupingValidator.GROUPING_VALIDATED)
+public class GroupingValidator extends Searcher {
+
+ public static final String GROUPING_VALIDATED = "GroupingValidated";
+ public static final CompoundName PARAM_ENABLED = new CompoundName("validate_" + GroupingQueryParser.PARAM_REQUEST);
+ private final Set<String> attributeNames = new HashSet<>();
+ private final String clusterName;
+ private final boolean enabled;
+
+ /**
+ * Constructs a new instance of this searcher with the given component id and config.
+ *
+ * @param qrsConfig The shared config for all searchers.
+ * @param clusterConfig The config for the cluster that this searcher is deployed for.
+ */
+ @Inject
+ public GroupingValidator(QrSearchersConfig qrsConfig, ClusterConfig clusterConfig,
+ AttributesConfig attributesConfig) {
+ int clusterId = clusterConfig.clusterId();
+ QrSearchersConfig.Searchcluster.Indexingmode.Enum indexingMode = qrsConfig.searchcluster(clusterId).indexingmode();
+ enabled = (indexingMode != QrSearchersConfig.Searchcluster.Indexingmode.STREAMING);
+ clusterName = enabled ? qrsConfig.searchcluster(clusterId).name() : null;
+ for (AttributesConfig.Attribute attr : attributesConfig.attribute()) {
+ attributeNames.add(attr.name());
+ }
+ }
+
+ @Override
+ public Result search(Query query, Execution execution) {
+ if (enabled && query.properties().getBoolean(PARAM_ENABLED, true)) {
+ ExpressionVisitor visitor = new MyVisitor();
+ for (GroupingRequest req : GroupingRequest.getRequests(query)) {
+ req.getRootOperation().visitExpressions(visitor);
+ }
+ }
+ return execution.search(query);
+ }
+
+ private class MyVisitor implements ExpressionVisitor {
+
+ @Override
+ public void visitExpression(GroupingExpression exp) {
+ if (exp instanceof AttributeValue) {
+ String name = ((AttributeValue)exp).getAttributeName();
+ if (!attributeNames.contains(name)) {
+ throw new UnavailableAttributeException(clusterName, name);
+ }
+ }
+ }
+ }
+}