summaryrefslogtreecommitdiffstats
path: root/container-search
diff options
context:
space:
mode:
authorOlli Virtanen <olli.virtanen@oath.com>2019-06-05 11:53:26 +0200
committerOlli Virtanen <olli.virtanen@oath.com>2019-06-05 11:53:26 +0200
commit925d605450b02e8ee6550cbdde0c7d38778bf6ae (patch)
treedce6e8023bb8b453b305030a256b9385c47762ad /container-search
parent3126938c9df79485f470c0ccc50d24beb6d75a0c (diff)
Fix processing of timeout embedded in YQL query
Diffstat (limited to 'container-search')
-rw-r--r--container-search/src/main/java/com/yahoo/search/Query.java22
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java5
-rw-r--r--container-search/src/main/java/com/yahoo/search/yql/YqlParser.java2
-rw-r--r--container-search/src/test/java/com/yahoo/search/yql/MinimalQueryInserterTestCase.java41
4 files changed, 48 insertions, 22 deletions
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 9d7d3952a01..766af8f05fd 100644
--- a/container-search/src/main/java/com/yahoo/search/Query.java
+++ b/container-search/src/main/java/com/yahoo/search/Query.java
@@ -858,23 +858,29 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
commaSeparated(yql, sources);
}
yql.append(" where ");
- yql.append(VespaSerializer.serialize(this));
+ String insert = serializeSortingAndLimits(includeHitsAndOffset);
+ yql.append(VespaSerializer.serialize(this, insert));
+ yql.append(';');
+ return yql.toString();
+ }
+
+ private String serializeSortingAndLimits(boolean includeHitsAndOffset) {
+ StringBuilder insert = new StringBuilder();
if (getRanking().getSorting() != null && getRanking().getSorting().fieldOrders().size() > 0) {
- serializeSorting(yql);
+ serializeSorting(insert);
}
if (includeHitsAndOffset) {
if (getOffset() != 0) {
- yql.append(" limit ").append(getHits() + getOffset())
- .append(" offset ").append(getOffset());
+ insert.append(" limit ").append(getHits() + getOffset())
+ .append(" offset ").append(getOffset());
} else if (getHits() != 10) {
- yql.append(" limit ").append(getHits());
+ insert.append(" limit ").append(getHits());
}
}
if (getTimeout() != defaultTimeout) {
- yql.append(" timeout ").append(getTimeout());
+ insert.append(" timeout ").append(getTimeout());
}
- yql.append(';');
- return yql.toString();
+ return insert.toString();
}
private void serializeSorting(StringBuilder yql) {
diff --git a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
index 896d1cf5c9c..f706310221c 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/VespaSerializer.java
@@ -1227,8 +1227,13 @@ public class VespaSerializer {
}
public static String serialize(Query query) {
+ return serialize(query, "");
+ }
+
+ public static String serialize(Query query, String insertBeforeGrouping) {
StringBuilder out = new StringBuilder();
serialize(query.getModel().getQueryTree().getRoot(), out);
+ out.append(insertBeforeGrouping);
for (GroupingRequest request : query.getSelect().getGrouping()) {
out.append(" | ");
serialize(request, out);
diff --git a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
index 097ed86bd9e..9850deabcb9 100644
--- a/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
+++ b/container-search/src/main/java/com/yahoo/search/yql/YqlParser.java
@@ -738,8 +738,8 @@ public class YqlParser implements Parser {
assertHasOperator(ast, StatementOperator.EXECUTE);
ast = ast.getArgument(0);
- ast = fetchTimeout(ast);
ast = fetchPipe(ast);
+ ast = fetchTimeout(ast);
ast = fetchSummaryFields(ast);
ast = fetchOffsetAndHits(ast);
ast = fetchSorting(ast);
diff --git a/container-search/src/test/java/com/yahoo/search/yql/MinimalQueryInserterTestCase.java b/container-search/src/test/java/com/yahoo/search/yql/MinimalQueryInserterTestCase.java
index ef0efd41e19..22c17f556c8 100644
--- a/container-search/src/test/java/com/yahoo/search/yql/MinimalQueryInserterTestCase.java
+++ b/container-search/src/test/java/com/yahoo/search/yql/MinimalQueryInserterTestCase.java
@@ -1,24 +1,14 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.yql;
-import static org.junit.Assert.*;
-
+import com.google.common.base.Charsets;
+import com.yahoo.component.chain.Chain;
import com.yahoo.language.Language;
import com.yahoo.language.simple.SimpleLinguistics;
-import com.yahoo.search.grouping.GroupingRequest;
-
-import org.apache.http.client.utils.URIBuilder;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.yahoo.collections.Tuple2;
-import com.yahoo.component.Version;
-import com.yahoo.component.chain.Chain;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
import com.yahoo.search.Searcher;
+import com.yahoo.search.grouping.GroupingRequest;
import com.yahoo.search.query.Sorting.AttributeSorter;
import com.yahoo.search.query.Sorting.FieldOrder;
import com.yahoo.search.query.Sorting.LowerCaseSorter;
@@ -26,12 +16,20 @@ import com.yahoo.search.query.Sorting.Order;
import com.yahoo.search.query.Sorting.UcaSorter;
import com.yahoo.search.result.ErrorMessage;
import com.yahoo.search.searchchain.Execution;
+import org.apache.http.client.utils.URIBuilder;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
/**
* Smoke test for first generation YQL+ integration.
*/
@@ -264,6 +262,23 @@ public class MinimalQueryInserterTestCase {
}
@Test
+ public void testTimeoutWithGrouping() {
+ var select = "select x, y, z from sources * "
+ + "where (x > 0 AND y contains \"foo\" AND z contains \"bar\") "
+ + "order by x limit 20 offset 10 timeout 30 "
+ + "| all(group(y) max(3) each(output(count())));";
+ Query query = new Query("search/?yql="+ URLEncoder.encode(select, Charsets.UTF_8));
+ execution.search(query);
+
+ assertEquals(10, query.getHits());
+ assertEquals(10, query.getOffset());
+ assertEquals(30, query.getTimeout());
+
+ var parsed = query.yqlRepresentation(true);
+ assertEquals(select, parsed);
+ }
+
+ @Test
public void testOrdering() {
{
String yql = "select%20ignoredfield%20from%20ignoredsource%20where%20title%20contains%20%22madonna%22%20order%20by%20something%2C%20shoesize%20desc%20limit%20300%20timeout%203%3B";