diff options
author | Olli Virtanen <olli.virtanen@oath.com> | 2019-06-05 11:53:26 +0200 |
---|---|---|
committer | Olli Virtanen <olli.virtanen@oath.com> | 2019-06-05 11:53:26 +0200 |
commit | 925d605450b02e8ee6550cbdde0c7d38778bf6ae (patch) | |
tree | dce6e8023bb8b453b305030a256b9385c47762ad /container-search | |
parent | 3126938c9df79485f470c0ccc50d24beb6d75a0c (diff) |
Fix processing of timeout embedded in YQL query
Diffstat (limited to 'container-search')
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"; |