summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java32
1 files changed, 25 insertions, 7 deletions
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 3bfaee658f9..5ac1f834031 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
@@ -283,13 +283,16 @@ public class SearchHandler extends LoggingRequestHandler {
private HttpSearchResponse handleBody(HttpRequest request){
- // Find query profile
- String queryProfileName = request.getProperty("queryProfile");
+
+ Map<String, String> requestMap = requestMapFromRequest(request);
+
+ // Get query profile
+ String queryProfileName = requestMap.getOrDefault("queryProfile", null);
CompiledQueryProfile queryProfile = queryProfileRegistry.findQueryProfile(queryProfileName);
- boolean benchmarkOutput = VespaHeaders.benchmarkOutput(request);
- Query query = queryFromRequest(request, queryProfile);
+ Query query = new Query(request, requestMap, queryProfile);
+ boolean benchmarkOutput = VespaHeaders.benchmarkOutput(request);
boolean benchmarkCoverage = VespaHeaders.benchmarkCoverage(benchmarkOutput, request.getJDiscRequest().headers());
// Find and execute search chain if we have a valid query
@@ -558,7 +561,8 @@ public class SearchHandler extends LoggingRequestHandler {
return searchChainRegistry;
}
- private Query queryFromRequest(HttpRequest request, CompiledQueryProfile queryProfile){
+ private Map<String, String> requestMapFromRequest(HttpRequest request) {
+
if (request.getMethod() == com.yahoo.jdisc.http.HttpRequest.Method.POST
&& JSON_CONTENT_TYPE.equals(request.getHeader(com.yahoo.jdisc.http.HttpHeaders.Names.CONTENT_TYPE))) {
Inspector inspector;
@@ -576,11 +580,21 @@ public class SearchHandler extends LoggingRequestHandler {
// Create request-mapping
Map<String, String> requestMap = new HashMap<>();
createRequestMapping(inspector, requestMap, "");
- return new Query(request, requestMap, queryProfile);
+ // 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");
+ }
+
+ // 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");
+ }
+
+ return requestMap;
} else {
- return new Query(request, queryProfile);
+ return request.propertyMap();
}
}
@@ -605,6 +619,10 @@ public class SearchHandler extends LoggingRequestHandler {
map.put(qualifiedKey, value.asString());
break;
case OBJECT:
+ if (qualifiedKey.equals("select.where") || qualifiedKey.equals("select.grouping")){
+ map.put(qualifiedKey, value.toString());
+ break;
+ }
createRequestMapping(value, map, qualifiedKey+".");
break;
}