diff options
Diffstat (limited to 'container-search/src/main')
5 files changed, 45 insertions, 51 deletions
diff --git a/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java b/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java index 77fb740043e..028b0176c85 100644 --- a/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java +++ b/container-search/src/main/java/com/yahoo/fs4/QueryPacket.java @@ -237,7 +237,7 @@ public class QueryPacket extends Packet { * such a way the comparing SORTDATA for two different hits * will reproduce the order in which the data were returned when * using sortspec. For now we simply drop these. If they - * become necessar, QueryResultPacket must be + * become necessary, QueryResultPacket must be * updated to be able to read the sort data. */ flags |= QFLAG_DROP_SORTDATA; diff --git a/container-search/src/main/java/com/yahoo/prelude/query/Highlight.java b/container-search/src/main/java/com/yahoo/prelude/query/Highlight.java index 4910f63423e..81c68ccc2b9 100644 --- a/container-search/src/main/java/com/yahoo/prelude/query/Highlight.java +++ b/container-search/src/main/java/com/yahoo/prelude/query/Highlight.java @@ -8,7 +8,7 @@ import static com.yahoo.language.LinguisticsCase.toLowerCase; /** * Class encapsulating information on extra highlight-terms for a query * - * @author <a href="mailto:mathiasm@yahoo-inc.com">Mathias Lidal</a> + * @author Mathias Lidal */ public class Highlight implements Cloneable { diff --git a/container-search/src/main/java/com/yahoo/search/Query.java b/container-search/src/main/java/com/yahoo/search/Query.java index 36a04bb86e8..7c01f2d994b 100644 --- a/container-search/src/main/java/com/yahoo/search/Query.java +++ b/container-search/src/main/java/com/yahoo/search/Query.java @@ -424,7 +424,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { /** Calls properties.set on all entries in requestMap */ private void setPropertiesFromRequestMap(Map<String, String> requestMap, Properties properties) { - for (Map.Entry<String, String> entry : requestMap.entrySet()) { + for (var entry : requestMap.entrySet()) { try { properties.set(entry.getKey(), entry.getValue(), requestMap); } @@ -771,7 +771,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { /** * Serialize this query as YQL+. This method will never throw exceptions, - * but instead return a human readable error message if a problem occured + * but instead return a human readable error message if a problem occurred while * serializing the query. Hits and offset information will be included if * different from default, while linguistics metadata are not added. * @@ -783,9 +783,10 @@ public class Query extends com.yahoo.processing.Request implements Cloneable { return yqlRepresentation(true); } catch (NullItemException e) { return "Query currently a placeholder, NullItem encountered."; + } catch (IllegalArgumentException e) { + return "Invalid query: " + Exceptions.toMessageString(e); } catch (RuntimeException e) { - return "Failed serializing query as YQL+, please file a ticket including the query causing this: " - + Exceptions.toMessageString(e); + return "Unepected error parsing or serializing query: " + Exceptions.toMessageString(e); } } diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java index d2490ec9532..14a15e71bf7 100644 --- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java +++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java @@ -517,47 +517,36 @@ public class SearchHandler extends LoggingRequestHandler { return com.yahoo.text.Lowercase.toLowerCase(header.trim()); } + /** Add properties POSTed as a JSON payload, if any, to the request map */ private Map<String, String> requestMapFromRequest(HttpRequest request) { + if (request.getMethod() != com.yahoo.jdisc.http.HttpRequest.Method.POST + || ! JSON_CONTENT_TYPE.equals(getMediaType(request))) + return request.propertyMap(); - if (request.getMethod() == com.yahoo.jdisc.http.HttpRequest.Method.POST - && JSON_CONTENT_TYPE.equals(getMediaType(request))) - { - Inspector inspector; - try { - byte[] byteArray = IOUtils.readBytes(request.getData(), 1 << 20); - inspector = SlimeUtils.jsonToSlime(byteArray).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)); - } - - } catch (IOException e) { - throw new RuntimeException("Problem with reading from input-stream", e); - } - - // Create request-mapping - Map<String, String> requestMap = new HashMap<>(); - - createRequestMapping(inspector, requestMap, ""); - - requestMap.putAll(request.propertyMap()); - - // Throws QueryException if query contains both yql- and select-parameter - if (requestMap.containsKey("yql") && (requestMap.containsKey("select.where") || requestMap.containsKey("select.grouping")) ) { - throw new QueryException("Illegal query: Query contains both yql- and select-parameter"); + Inspector inspector; + try { + byte[] byteArray = IOUtils.readBytes(request.getData(), 1 << 20); + inspector = SlimeUtils.jsonToSlime(byteArray).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) + "'"); } - // Throws QueryException if query contains both query- and select-parameter - if (requestMap.containsKey("query") && (requestMap.containsKey("select.where") || requestMap.containsKey("select.grouping")) ) { - throw new QueryException("Illegal query: Query contains both query- and select-parameter"); - } + } catch (IOException e) { + throw new RuntimeException("Problem reading POSTed data", e); + } - return requestMap; + // Add fields from JSON to the request map + Map<String, String> requestMap = new HashMap<>(); + createRequestMapping(inspector, requestMap, ""); + requestMap.putAll(request.propertyMap()); - } else { - return request.propertyMap(); + if (requestMap.containsKey("yql") && (requestMap.containsKey("select.where") || requestMap.containsKey("select.grouping")) ) + throw new QueryException("Illegal query: Query contains both yql and select parameter"); + if (requestMap.containsKey("query") && (requestMap.containsKey("select.where") || requestMap.containsKey("select.grouping")) ) + throw new QueryException("Illegal query: Query contains both query and select parameter"); - } + return requestMap; } public void createRequestMapping(Inspector inspector, Map<String, String> map, String parent) { @@ -577,14 +566,14 @@ public class SearchHandler extends LoggingRequestHandler { map.put(qualifiedKey , value.asString()); break; case ARRAY: - map.put(qualifiedKey, value.asString()); + map.put(qualifiedKey, value.toString()); // XXX: Causes parsing the JSON twice (Query.setPropertiesFromRequestMap) break; case OBJECT: if (qualifiedKey.equals("select.where") || qualifiedKey.equals("select.grouping")) { - map.put(qualifiedKey, value.toString()); + map.put(qualifiedKey, value.toString()); // XXX: Causes parsing the JSON twice (Query.setPropertiesFromRequestMap) break; } - createRequestMapping(value, map, qualifiedKey+"."); + createRequestMapping(value, map, qualifiedKey + "."); break; } 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)); } |