summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenrik <henrik.hoiness@online.no>2018-08-06 11:16:02 +0200
committerHenrik <henrik.hoiness@online.no>2018-08-06 11:16:02 +0200
commitc31c1eee87a00774f34e985b70568af0eea0c82b (patch)
tree88517126f3623b1d21042faa2f554008830bb082
parent3503a3b669633cb2c3bfa9337009d4be0bdd91df (diff)
Added parsing of multiple pipes
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/SelectParser.java28
-rw-r--r--container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java10
2 files changed, 32 insertions, 6 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
index 0a48de37a1e..a8406413856 100644
--- a/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
+++ b/container-search/src/main/java/com/yahoo/search/query/SelectParser.java
@@ -218,15 +218,31 @@ public class SelectParser implements Parser {
public List<VespaGroupingStep> getGroupingSteps(String grouping){
List<VespaGroupingStep> groupingSteps = new ArrayList<>();
- GroupingOperation groupingOperation = GroupingOperation.fromString(transformGrouping(grouping));
- VespaGroupingStep groupingStep = new VespaGroupingStep(groupingOperation);
- groupingSteps.add(groupingStep);
+ List<String> groupingOperations = getOperations(grouping);
+ for (String groupingString : groupingOperations){
+ GroupingOperation groupingOperation = GroupingOperation.fromString(groupingString);
+ VespaGroupingStep groupingStep = new VespaGroupingStep(groupingOperation);
+ groupingSteps.add(groupingStep);
+ }
return groupingSteps;
}
- private String transformGrouping(String grouping){
- String groupingString = grouping.replace(" ", "").replace("\"", "").replace("\'", "").replace(":{", "(").replace(":", "(").replace("}", ")").replace(",", ")");
- return groupingString.substring(2, groupingString.length()-1);
+ private List<String> getOperations(String grouping) {
+ List<String> operations = new ArrayList<>();
+ Inspector inspector = SlimeUtils.jsonToSlime(grouping.getBytes()).get();
+ if (inspector.field("error_message").valid()){
+ throw new QueryException("Illegal query: "+inspector.field("error_message").asString() + ", at: "+ new String(inspector.field("offending_input").asData(), StandardCharsets.UTF_8));
+ }
+
+ inspector.traverse( (ArrayTraverser) (key, value) -> {
+ String groupingString = value.toString();
+ groupingString = groupingString.replace(" ", "").replace("\"", "").replace("\'", "").replace(":{", "(").replace(":", "(").replace("}", ")").replace(",", ")");
+ groupingString = groupingString.substring(1, groupingString.length());
+ operations.add(groupingString);
+ });
+
+ return operations;
+
}
diff --git a/container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java b/container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java
index 46a66c904bf..31809f5f7d9 100644
--- a/container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java
+++ b/container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java
@@ -14,12 +14,14 @@ import com.yahoo.prelude.query.SuffixItem;
import com.yahoo.prelude.query.WeakAndItem;
import com.yahoo.prelude.query.WordAlternativesItem;
import com.yahoo.prelude.query.WordItem;
+import com.yahoo.search.Query;
import com.yahoo.search.query.QueryTree;
import com.yahoo.search.query.Select;
import com.yahoo.search.query.SelectParser;
import com.yahoo.search.query.parser.Parsable;
import com.yahoo.search.query.parser.ParserEnvironment;
import com.yahoo.search.yql.VespaGroupingStep;
+import org.apache.http.client.utils.URIBuilder;
import org.json.JSONException;
import org.json.JSONObject;
import org.junit.Test;
@@ -647,6 +649,14 @@ public class SelectParserTestCase {
}
+ @Test
+ public void testMultipleGroupings() {
+ String grouping = "[ { \"all\" : { \"group\" : \"a\", \"each\" : { \"output\" : \"count()\"}}}, { \"all\" : { \"group\" : \"b\", \"each\" : { \"output\" : \"count()\"}}} ]";
+ String expected = "[[]all(group(a) each(output(count()))), []all(group(b) each(output(count())))]";
+
+ assertGrouping(expected, parseGrouping(grouping));
+ }
+