summaryrefslogtreecommitdiffstats
path: root/container-search/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main')
-rw-r--r--container-search/src/main/java/com/yahoo/fs4/QueryPacket.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/Highlight.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/Query.java9
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java63
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/SelectParser.java20
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));
}