diff options
author | Henrik <henrik.hoiness@online.no> | 2018-08-06 11:16:02 +0200 |
---|---|---|
committer | Henrik <henrik.hoiness@online.no> | 2018-08-06 11:16:02 +0200 |
commit | c31c1eee87a00774f34e985b70568af0eea0c82b (patch) | |
tree | 88517126f3623b1d21042faa2f554008830bb082 /container-search | |
parent | 3503a3b669633cb2c3bfa9337009d4be0bdd91df (diff) |
Added parsing of multiple pipes
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/query/SelectParser.java | 28 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/select/SelectParserTestCase.java | 10 |
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)); + } + |