diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-03-07 14:30:55 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-03-07 14:30:55 +0100 |
commit | 9507be19fd111c9331a8f500236c1b01b99f6388 (patch) | |
tree | 06597cd1928667f034a9bf68258b0b8c2ec17236 /container-search/src/main/java/com/yahoo/search/query/SelectParser.java | |
parent | 78a9d7de1f7d67be6cef8967d2dd7fbc884b4299 (diff) |
Fix parsing of array query properties in JSON payload
These were translated to request properties by calling
asString on the payload, which returns an empty value for arrays.
toString returns the correct value.
This also improves error messages for Slime JSON parsing
of queries, and in general.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/query/SelectParser.java')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/query/SelectParser.java | 20 |
1 files changed, 12 insertions, 8 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 e4e44985b53..46c8a8af41f 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 @@ -150,15 +150,14 @@ public class SelectParser implements Parser { private QueryTree buildTree() { Inspector inspector = SlimeUtils.jsonToSlime(this.query.getSelect().getWhereString().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)); + 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) + "'"); } Item root = walkJson(inspector); connectItems(); - QueryTree newTree = new QueryTree(root); - - return newTree; + return new QueryTree(root); } private Item walkJson(Inspector inspector){ @@ -213,7 +212,8 @@ public class SelectParser implements Parser { 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)); + 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) -> { @@ -786,7 +786,7 @@ public class SelectParser implements Parser { String possibleLeafFunctionName = (possibleLeafFunction.size() > 1) ? getInspectorKey(possibleLeafFunction.get(1)) : ""; if (FUNCTION_CALLS.contains(key)) { return instantiateCompositeLeaf(field, key, value); - } else if(!possibleLeafFunctionName.equals("")){ + } else if ( ! possibleLeafFunctionName.equals("")){ return instantiateCompositeLeaf(field, possibleLeafFunctionName, valueListFromInspector(value).get(1).field(possibleLeafFunctionName)); } else { return instantiateWordItem(field, key, value); @@ -815,7 +815,11 @@ public class SelectParser implements Parser { @NonNull private Item instantiateWordItem(String field, String key, Inspector value) { - String wordData = getChildrenMap(value).get(1).asString(); + var children = getChildrenMap(value); + if (children.size() < 2) + throw new IllegalArgumentException("Expected at least 2 children of '" + key + "', but got " + children.size()); + + String wordData = children.get(1).asString(); return instantiateWordItem(field, wordData, key, value, false, decideParsingLanguage(value, wordData)); } |