summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo
diff options
context:
space:
mode:
Diffstat (limited to 'container-search/src/main/java/com/yahoo')
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/query/NearItem.java8
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcClient.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/SelectParser.java72
-rw-r--r--container-search/src/main/java/com/yahoo/search/query/profile/QueryProfileProperties.java2
4 files changed, 56 insertions, 29 deletions
diff --git a/container-search/src/main/java/com/yahoo/prelude/query/NearItem.java b/container-search/src/main/java/com/yahoo/prelude/query/NearItem.java
index 69131b6c690..56554e14d01 100644
--- a/container-search/src/main/java/com/yahoo/prelude/query/NearItem.java
+++ b/container-search/src/main/java/com/yahoo/prelude/query/NearItem.java
@@ -28,17 +28,15 @@ public class NearItem extends CompositeItem {
/**
* Creates a <i>near</i> item with a limit to the distance between the words.
*
- * @param distance the number of word position which may separate
- * the words for this near item to match
+ * @param distance the maximum position difference between the words which should be counted as a match
*/
public NearItem(int distance) {
setDistance(distance);
}
public void setDistance(int distance) {
- if (distance < 0) {
- throw new IllegalArgumentException("Can not use negative distance '" + distance + "'.");
- }
+ if (distance < 0)
+ throw new IllegalArgumentException("Can not use negative distance " + distance);
this.distance = distance;
}
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcClient.java b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcClient.java
index 05ce6d50493..a2821892358 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcClient.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/rpc/RpcClient.java
@@ -22,6 +22,7 @@ import java.util.List;
* @author bratseth
*/
class RpcClient implements Client {
+
private final Supervisor supervisor;
public RpcClient(int transportThreads) {
@@ -66,7 +67,7 @@ class RpcClient implements Client {
@Override
public void request(String rpcMethod, CompressionType compression, int uncompressedLength, byte[] compressedPayload,
- ResponseReceiver responseReceiver, double timeoutSeconds) {
+ ResponseReceiver responseReceiver, double timeoutSeconds) {
Request request = new Request(rpcMethod);
request.parameters().add(new Int8Value(compression.getCode()));
request.parameters().add(new Int32Value(uncompressedLength));
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 c654edda6f5..ae50756331c 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
@@ -45,6 +45,7 @@ import com.yahoo.search.yql.VespaGroupingStep;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Inspector;
import com.yahoo.slime.ObjectTraverser;
+import com.yahoo.slime.Type;
import com.yahoo.vespa.config.SlimeUtils;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -159,7 +160,7 @@ public class SelectParser implements Parser {
return new QueryTree(root);
}
- private Item walkJson(Inspector inspector){
+ private Item walkJson(Inspector inspector) {
Item[] item = {null};
inspector.traverse((ObjectTraverser) (key, value) -> {
String type = (FUNCTION_CALLS.contains(key)) ? CALL : key;
@@ -197,8 +198,8 @@ public class SelectParser implements Parser {
public List<VespaGroupingStep> getGroupingSteps(String grouping){
List<VespaGroupingStep> groupingSteps = new ArrayList<>();
- List<String> groupingOperations = getOperations(grouping);
- for (String groupingString : groupingOperations){
+ List<String> groupingOperations = toGroupingRequests(grouping);
+ for (String groupingString : groupingOperations) {
GroupingOperation groupingOperation = GroupingOperation.fromString(groupingString);
VespaGroupingStep groupingStep = new VespaGroupingStep(groupingOperation);
groupingSteps.add(groupingStep);
@@ -206,24 +207,51 @@ public class SelectParser implements Parser {
return groupingSteps;
}
- private List<String> getOperations(String grouping) {
- List<String> operations = new ArrayList<>();
- Inspector inspector = SlimeUtils.jsonToSlime(grouping.getBytes()).get();
- if (inspector.field("error_message").valid()){
+ /** Translates a list of grouping requests on JSON form to a list in the grouping language form */
+ private List<String> toGroupingRequests(String groupingJson) {
+ Inspector inspector = SlimeUtils.jsonToSlime(groupingJson.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);
- });
-
+ List<String> operations = new ArrayList<>();
+ inspector.traverse((ArrayTraverser) (__, item) -> operations.add(toGroupingRequest(item)));
return operations;
}
+ private String toGroupingRequest(Inspector groupingJson) {
+ StringBuilder b = new StringBuilder();
+ toGroupingRequest(groupingJson, b);
+ return b.toString();
+ }
+
+ private void toGroupingRequest(Inspector groupingJson, StringBuilder b) {
+ switch (groupingJson.type()) {
+ case ARRAY:
+ groupingJson.traverse((ArrayTraverser) (index, item) -> {
+ toGroupingRequest(item, b);
+ if (index + 1 < groupingJson.entries())
+ b.append(",");
+ });
+ break;
+ case OBJECT:
+ groupingJson.traverse((ObjectTraverser) (name, object) -> {
+ b.append(name);
+ b.append("(");
+ toGroupingRequest(object, b);
+ b.append(") ");
+ });
+ break;
+ case STRING:
+ b.append(groupingJson.asString());
+ break;
+ default:
+ b.append(groupingJson.toString());
+ break;
+ }
+ }
+
private Item buildFunctionCall(String key, Inspector value) {
switch (key) {
case WAND:
@@ -250,7 +278,7 @@ public class SelectParser implements Parser {
});
} else if (inspector.type() == OBJECT){
- if (inspector.field("children").valid()){
+ if (inspector.field("children").valid()) {
inspector.field("children").traverse((ArrayTraverser) (index, new_value) -> {
item.addItem(walkJson(new_value));
});
@@ -259,22 +287,22 @@ public class SelectParser implements Parser {
}
}
- private Inspector getChildren(Inspector inspector){
+ private Inspector getChildren(Inspector inspector) {
if (inspector.type() == ARRAY){
return inspector;
} else if (inspector.type() == OBJECT){
- if (inspector.field("children").valid()){
+ if (inspector.field("children").valid()) {
return inspector.field("children");
}
- if (inspector.field(1).valid()){
+ if (inspector.field(1).valid()) {
return inspector.field(1);
}
}
return null;
}
- private HashMap<Integer, Inspector> childMap(Inspector inspector){
+ private HashMap<Integer, Inspector> childMap(Inspector inspector) {
HashMap<Integer, Inspector> children = new HashMap<>();
if (inspector.type() == ARRAY){
inspector.traverse((ArrayTraverser) (index, new_value) -> {
@@ -291,14 +319,14 @@ public class SelectParser implements Parser {
return children;
}
- private Inspector getAnnotations(Inspector inspector){
+ private Inspector getAnnotations(Inspector inspector) {
if (inspector.type() == OBJECT && inspector.field("attributes").valid()){
return inspector.field("attributes");
}
return null;
}
- private HashMap<String, Inspector> getAnnotationMapFromAnnotationInspector(Inspector annotation){
+ private HashMap<String, Inspector> getAnnotationMapFromAnnotationInspector(Inspector annotation) {
HashMap<String, Inspector> attributes = new HashMap<>();
if (annotation.type() == OBJECT){
annotation.traverse((ObjectTraverser) (index, new_value) -> {
@@ -308,7 +336,7 @@ public class SelectParser implements Parser {
return attributes;
}
- private HashMap<String, Inspector> getAnnotationMap(Inspector inspector){
+ private HashMap<String, Inspector> getAnnotationMap(Inspector inspector) {
HashMap<String, Inspector> attributes = new HashMap<>();
if (inspector.type() == OBJECT && inspector.field("attributes").valid()){
inspector.field("attributes").traverse((ObjectTraverser) (index, new_value) -> {
diff --git a/container-search/src/main/java/com/yahoo/search/query/profile/QueryProfileProperties.java b/container-search/src/main/java/com/yahoo/search/query/profile/QueryProfileProperties.java
index ea79b10d779..b250560e2f3 100644
--- a/container-search/src/main/java/com/yahoo/search/query/profile/QueryProfileProperties.java
+++ b/container-search/src/main/java/com/yahoo/search/query/profile/QueryProfileProperties.java
@@ -128,7 +128,7 @@ public class QueryProfileProperties extends Properties {
}
}
catch (IllegalArgumentException e) {
- throw new IllegalArgumentException("Could not set '" + name + "' to '" + value + "': " + e.getMessage()); // TODO: Nest instead
+ throw new IllegalArgumentException("Could not set '" + name + "' to '" + value + "'", e);
}
}