This is an automated email from the ASF dual-hosted git repository. jhyde pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/calcite.git
commit 5b73f3665a762006d41c3aac6a05437e2ccdded3 Author: Julian Hyde <[email protected]> AuthorDate: Sat May 6 14:44:28 2023 -0700 In tests, don't allow multi-line strings as argument to CalciteAssert.returnsUnordered `CalciteAssert` sorts the lines (for `returnsUnordered`, but not for `returnsOrdered`) and joins them using '\n', so if each 'line' is actually multiple lines the sort does not have the desired effect. The simplest solution is to require the 'lines' to be just single lines, for both `returnsUnordered` and `returnsOrdered`. If this breaks one of your tests, just change the concatenated strings to a comma-separated list. --- .../java/org/apache/calcite/test/JdbcTest.java | 4 +- .../apache/calcite/test/ReflectiveSchemaTest.java | 4 +- .../org/apache/calcite/test/TableFunctionTest.java | 4 +- .../test/enumerable/EnumerableCalcTest.java | 50 ++++--- .../test/enumerable/EnumerableJoinTest.java | 17 +-- .../test/enumerable/EnumerableRepeatUnionTest.java | 7 +- .../enumerable/EnumerableStringComparisonTest.java | 34 ++--- .../org/apache/calcite/test/DruidAdapter2IT.java | 90 +++++++----- .../org/apache/calcite/test/DruidAdapterIT.java | 94 +++++++------ .../org/apache/calcite/test/SparkAdapterTest.java | 154 +++++++++++++-------- .../org/apache/calcite/test/CalciteAssert.java | 23 +++ 11 files changed, 289 insertions(+), 192 deletions(-) diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java b/core/src/test/java/org/apache/calcite/test/JdbcTest.java index 4a5425bf4a..ec94130431 100644 --- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java +++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java @@ -7772,7 +7772,9 @@ public class JdbcTest { + " EnumerableValues(tuples=[[{ 1, 2 }]])\n" + " EnumerableCalc(expr#0..1=[{inputs}], expr#2=[+($t0, $t1)], expr#3=[-($t0, $t1)], EXPR$0=[$t2], EXPR$1=[$t3])\n" + " EnumerableValues(tuples=[[{ 3, 4 }, { 5, 6 }]])\n") - .returnsUnordered("X=11; Y=-1\nX=1; Y=2\nX=7; Y=-1"); + .returnsUnordered("X=11; Y=-1", + "X=1; Y=2", + "X=7; Y=-1"); } /** Test case for diff --git a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java index 36bffc61b6..d6d15d92b9 100644 --- a/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java +++ b/core/src/test/java/org/apache/calcite/test/ReflectiveSchemaTest.java @@ -904,7 +904,9 @@ public class ReflectiveSchemaTest { .withSchema("s", CATCHALL) .query("select (\"value\" = 3 and unknown) or ( \"value\" = 3 ) " + "from \"s\".\"primesCustomBoxed\"") - .returnsUnordered("EXPR$0=false\nEXPR$0=false\nEXPR$0=true"); + .returnsUnordered("EXPR$0=false", + "EXPR$0=false", + "EXPR$0=true"); } @Test void testDecimalNegate() { diff --git a/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java b/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java index ab50be530c..2ac6a96d72 100644 --- a/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java +++ b/core/src/test/java/org/apache/calcite/test/TableFunctionTest.java @@ -480,7 +480,9 @@ class TableFunctionTest { final String q = "select \"N\" + 1 as c\n" + "from table(\"s\".\"fibonacci2\"(3))\n" + "group by \"N\""; - with().query(q).returnsUnordered("C=2\nC=3\nC=4"); + with().query(q).returnsUnordered("C=2", + "C=3", + "C=4"); } @Test void testCrossApply() { diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java index 42b8c3123f..7e801e18f8 100644 --- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java +++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableCalcTest.java @@ -61,37 +61,46 @@ class EnumerableCalcTest { * Posix regex operators cannot be used within RelBuilder</a>. */ @Test void testPosixRegexCaseSensitive() { - checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE, - "empid=200; name=Eric"); - checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE, ""); + checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE) + .returnsUnordered("empid=200; name=Eric"); + checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_SENSITIVE) + .returnsUnordered(); } @Test void testPosixRegexCaseInsensitive() { - checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE, - "empid=200; name=Eric"); - checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE, - "empid=200; name=Eric"); + checkPosixRegex("E..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE) + .returnsUnordered("empid=200; name=Eric"); + checkPosixRegex("e..c", SqlStdOperatorTable.POSIX_REGEX_CASE_INSENSITIVE) + .returnsUnordered("empid=200; name=Eric"); } @Test void testNegatedPosixRegexCaseSensitive() { - checkPosixRegex("E..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE, - "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; name=Sebastian"); - checkPosixRegex("e..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE, - "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; name=Sebastian", "empid=200; name=Eric"); + checkPosixRegex("E..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE) + .returnsUnordered("empid=100; name=Bill", + "empid=110; name=Theodore", + "empid=150; name=Sebastian"); + checkPosixRegex("e..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_SENSITIVE) + .returnsUnordered("empid=100; name=Bill", + "empid=110; name=Theodore", + "empid=150; name=Sebastian", + "empid=200; name=Eric"); } @Test void testNegatedPosixRegexCaseInsensitive() { - checkPosixRegex("E..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE, - "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; name=Sebastian"); - checkPosixRegex("e..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE, - "empid=100; name=Bill", "empid=110; name=Theodore", "empid=150; name=Sebastian"); + checkPosixRegex("E..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE) + .returnsUnordered("empid=100; name=Bill", + "empid=110; name=Theodore", + "empid=150; name=Sebastian"); + checkPosixRegex("e..c", SqlStdOperatorTable.NEGATED_POSIX_REGEX_CASE_INSENSITIVE) + .returnsUnordered("empid=100; name=Bill", + "empid=110; name=Theodore", + "empid=150; name=Sebastian"); } - private void checkPosixRegex( + private CalciteAssert.AssertQuery checkPosixRegex( String literalValue, - SqlOperator operator, - String... expectedResult) { - CalciteAssert.that() + SqlOperator operator) { + return CalciteAssert.that() .withSchema("s", new ReflectiveSchema(new HrSchema())) .withRel( builder -> builder @@ -104,7 +113,6 @@ class EnumerableCalcTest { .project( builder.field("empid"), builder.field("name")) - .build()) - .returnsUnordered(expectedResult); + .build()); } } diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java index 81aef12448..30f69f1034 100644 --- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java +++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableJoinTest.java @@ -211,9 +211,8 @@ class EnumerableJoinTest { + " EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableCalc(expr#0..3=[{inputs}], proj#0..1=[{exprs}])\n" + " EnumerableTableScan(table=[[s, depts]])\n") - .returnsUnordered("" - + "empid=110; name=Theodore; dept_name=Sales; e_deptno=10; d_deptno=10\n" - + "empid=150; name=Sebastian; dept_name=Sales; e_deptno=10; d_deptno=10"); + .returnsUnordered("empid=110; name=Theodore; dept_name=Sales; e_deptno=10; d_deptno=10", + "empid=150; name=Sebastian; dept_name=Sales; e_deptno=10; d_deptno=10"); } /** Test case for @@ -250,7 +249,10 @@ class EnumerableJoinTest { + " EnumerableSort(sort0=[$0], sort1=[$1], dir0=[ASC], dir1=[ASC])\n" + " EnumerableCalc(expr#0..4=[{inputs}], deptno=[$t1], commission=[$t4])\n" + " EnumerableTableScan(table=[[s, emps]])\n") - .returnsUnordered("empid=100\nempid=110\nempid=150\nempid=200"); + .returnsUnordered("empid=100", + "empid=110", + "empid=150", + "empid=200"); } /** Test case for @@ -326,10 +328,9 @@ class EnumerableJoinTest { + " EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableCalc(expr#0..4=[{inputs}], empid=[$t0], name=[$t2])\n" + " EnumerableTableScan(table=[[s, emps]])\n") - .returnsUnordered("" - + "empid=2; name=Emp2\n" - + "empid=3; name=Emp3\n" - + "empid=5; name=Emp5"); + .returnsUnordered("empid=2; name=Emp2", + "empid=3; name=Emp3", + "empid=5; name=Emp5"); } private CalciteAssert.AssertThat tester(boolean forceDecorrelate, diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java index b7c18f4a33..4ee3f51cee 100644 --- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java +++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableRepeatUnionTest.java @@ -313,9 +313,8 @@ class EnumerableRepeatUnionTest { + " BindableTableScan(table=[[#DELTA#]])\n" + " EnumerableCalc(expr#0..4=[{inputs}], expr#5=[$cor1], expr#6=[$t5.subordinateid], expr#7=[=($t6, $t0)], empid=[$t0], name=[$t2], $condition=[$t7])\n" + " EnumerableTableScan(table=[[s, emps]])\n") - .returnsUnordered("" - + "empid=2; name=Emp2\n" - + "empid=3; name=Emp3\n" - + "empid=5; name=Emp5"); + .returnsUnordered("empid=2; name=Emp2", + "empid=3; name=Emp3", + "empid=5; name=Emp5"); } } diff --git a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java index 6f0fd0273a..fd12311b49 100644 --- a/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java +++ b/core/src/test/java/org/apache/calcite/test/enumerable/EnumerableStringComparisonTest.java @@ -111,11 +111,11 @@ class EnumerableStringComparisonTest { .explainHookMatches("" + "EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'hr' }, { 'Administration' }, { 'MARKETING' }]])\n") - .returnsOrdered("name=Administration\n" - + "name=Legal\n" - + "name=MARKETING\n" - + "name=hr\n" - + "name=presales"); + .returnsOrdered("name=Administration", + "name=Legal", + "name=MARKETING", + "name=hr", + "name=presales"); } @Test void testSortStringSpecialCollation() { @@ -130,11 +130,11 @@ class EnumerableStringComparisonTest { .explainHookMatches("" + "EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'hr' }, { 'Administration' }, { 'MARKETING' }]])\n") - .returnsOrdered("name=Administration\n" - + "name=hr\n" - + "name=Legal\n" - + "name=MARKETING\n" - + "name=presales"); + .returnsOrdered("name=Administration", + "name=hr", + "name=Legal", + "name=MARKETING", + "name=presales"); } @Test void testMergeJoinOnStringSpecialCollation() { @@ -162,8 +162,8 @@ class EnumerableStringComparisonTest { + " EnumerableValues(tuples=[[{ 'Legal' }, { 'presales' }, { 'HR' }, { 'Administration' }, { 'Marketing' }]])\n" + " EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableValues(tuples=[[{ 'Marketing' }, { 'bureaucracy' }, { 'Sales' }, { 'HR' }]])\n") - .returnsOrdered("name=HR; name0=HR\n" - + "name=Marketing; name0=Marketing"); + .returnsOrdered("name=HR; name0=HR", + "name=Marketing; name0=Marketing"); } /** Test case for @@ -193,11 +193,11 @@ class EnumerableStringComparisonTest { + " EnumerableValues(tuples=[[{ 'facilities' }, { 'HR' }, { 'administration' }, { 'Marketing' }]])\n" + " EnumerableSort(sort0=[$0], dir0=[ASC])\n" + " EnumerableValues(tuples=[[{ 'Marketing' }, { 'administration' }, { 'presales' }, { 'HR' }]])\n") - .returnsOrdered("name=administration\n" - + "name=facilities\n" - + "name=HR\n" - + "name=Marketing\n" - + "name=presales"); + .returnsOrdered("name=administration", + "name=facilities", + "name=HR", + "name=Marketing", + "name=presales"); } /** Test case for diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java index a98ba3998d..021a9d0041 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapter2IT.java @@ -650,7 +650,7 @@ public class DruidAdapter2IT { + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])"; final String sql = "select count(*) from \"foodmart\""; sql(sql) - .returns("EXPR$0=86829\n") + .returnsUnordered("EXPR$0=86829") .queryContains(new DruidChecker(druidQuery)) .explainContains(explain); } @@ -1562,11 +1562,13 @@ public class DruidAdapter2IT { + "'direction':'ascending','dimensionOrder':'numeric'}]}," + "'aggregations':[{'type':'count','name':'C'},{'type':'longSum'," + "'name':'S','fieldName':'unit_sales'}]"; - sql(sqlQuery).returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36\ntimestamp=1997-12-29" - + " 00:00:00; C=321; S=982\ntimestamp=1997-12-28 00:00:00; C=480; " - + "S=1496\ntimestamp=1997-12-27 00:00:00; C=363; S=1156\ntimestamp=1997-12-26 00:00:00; " - + "C=144; S=420").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36", + "timestamp=1997-12-29 00:00:00; C=321; S=982", + "timestamp=1997-12-28 00:00:00; C=480; S=1496", + "timestamp=1997-12-27 00:00:00; C=363; S=1156", + "timestamp=1997-12-26 00:00:00; C=144; S=420") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testNumericOrderingOfOrderByOperatorTimeExtract() { @@ -1581,10 +1583,13 @@ public class DruidAdapter2IT { + "'direction':'ascending','dimensionOrder':'numeric'}," + "{'dimension':'extract_year','direction':'descending'," + "'dimensionOrder':'numeric'}]}"; - sql(sqlQuery).returnsOrdered("D=30; M=3; Y=1997; C=114; S=351\nD=30; M=5; Y=1997; " - + "C=24; S=34\nD=30; M=6; Y=1997; C=73; S=183\nD=30; M=7; Y=1997; C=29; S=54\nD=30; M=8; " - + "Y=1997; C=137; S=422").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("D=30; M=3; Y=1997; C=114; S=351", + "D=30; M=5; Y=1997; C=24; S=34", + "D=30; M=6; Y=1997; C=73; S=183", + "D=30; M=7; Y=1997; C=29; S=54", + "D=30; M=8; Y=1997; C=137; S=422") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testNumericOrderingOfOrderByOperatorStringDims() { @@ -1594,10 +1599,13 @@ public class DruidAdapter2IT { final String druidSubQuery = "'limitSpec':{'type':'default','limit':5," + "'columns':[{'dimension':'brand_name','direction':'descending'," + "'dimensionOrder':'lexicographic'}]}"; - sql(sqlQuery).returnsOrdered("brand_name=Washington; C=576; S=1775\nbrand_name=Walrus; C=457;" - + " S=1399\nbrand_name=Urban; C=299; S=924\nbrand_name=Tri-State; C=2339; " - + "S=7270\nbrand_name=Toucan; C=123; S=380").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("brand_name=Washington; C=576; S=1775", + "brand_name=Walrus; C=457; S=1399", + "brand_name=Urban; C=299; S=924", + "brand_name=Tri-State; C=2339; S=7270", + "brand_name=Toucan; C=123; S=380") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testGroupByWeekExtract() { @@ -1622,7 +1630,10 @@ public class DruidAdapter2IT { + "'timeZone':'UTC','locale':'en-US'}}]}]}," + "'aggregations':[]," + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; - sql(sql).returnsOrdered("EXPR$0=10\nEXPR$0=11").queryContains(new DruidChecker(druidQuery)); + sql(sql) + .returnsOrdered("EXPR$0=10", + "EXPR$0=11") + .queryContains(new DruidChecker(druidQuery)); } /** Test case for @@ -2388,9 +2399,9 @@ public class DruidAdapter2IT { new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\"," + "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true," + "\"ordering\":\"numeric\"}")); - q.returnsUnordered("EXPR$0=10.16; product_id=1554\n" - + "EXPR$0=45.05; product_id=1556\n" - + "EXPR$0=88.5; product_id=1555"); + q.returnsUnordered("EXPR$0=10.16; product_id=1554", + "EXPR$0=45.05; product_id=1556", + "EXPR$0=88.5; product_id=1555"); } @Test void testFilterClauseWithMetricAndTimeAndAggregates() { @@ -2403,10 +2414,10 @@ public class DruidAdapter2IT { new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\"," + "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true," + "\"ordering\":\"numeric\"}")) - .returnsUnordered("EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=13.25; product_id=1556"); + .returnsUnordered("EXPR$0=10.6; product_id=1556", + "EXPR$0=10.6; product_id=1556", + "EXPR$0=10.6; product_id=1556", + "EXPR$0=13.25; product_id=1556"); } /** Tests that an aggregate with a nested filter clause has its filter @@ -3331,9 +3342,9 @@ public class DruidAdapter2IT { + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3"; sql(sql) .runs() - .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; D=2\n" - + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2\n" - + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2") + .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; D=2", + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2", + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2") .explainContains("PLAN=EnumerableInterpreter\n" + " BindableSort(sort0=[$2], dir0=[ASC], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" @@ -3347,9 +3358,9 @@ public class DruidAdapter2IT { + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3"; sql(sql) .runs() - .returnsOrdered("EXPR$0=0.5357357987441458; D=2\n" - + "EXPR$0=0.22760480207557643; D=2\n" - + "EXPR$0=0.11259322182897047; D=2") + .returnsOrdered("EXPR$0=0.5357357987441458; D=2", + "EXPR$0=0.22760480207557643; D=2", + "EXPR$0=0.11259322182897047; D=2") .explainContains("PLAN=EnumerableInterpreter\n" + " BindableSort(sort0=[$1], dir0=[ASC], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" @@ -3511,8 +3522,11 @@ public class DruidAdapter2IT { final String sql = "SELECT \"product_id\", SUBSTRING(\"product_id\" from 1 for 2) FROM " + FOODMART_TABLE + " GROUP BY \"product_id\""; - sql(sql).limit(3).returnsOrdered( - "product_id=1; EXPR$1=1\nproduct_id=10; EXPR$1=10\nproduct_id=100; EXPR$1=10") + sql(sql) + .limit(3) + .returnsOrdered("product_id=1; EXPR$1=1", + "product_id=10; EXPR$1=10", + "product_id=100; EXPR$1=10") .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" + "2992-01-10T00:00:00.000Z]], projects=[[$1]], groups=[{0}], aggs=[[]], " @@ -3755,10 +3769,10 @@ public class DruidAdapter2IT { + "{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}]," + "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",", "QUARTER")); - q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05\n" - + "EXPR$0=2; product_id=1; EXPR$2=62.7\n" - + "EXPR$0=3; product_id=1; EXPR$2=88.35\n" - + "EXPR$0=4; product_id=1; EXPR$2=48.45"); + q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05", + "EXPR$0=2; product_id=1; EXPR$2=62.7", + "EXPR$0=3; product_id=1; EXPR$2=88.35", + "EXPR$0=4; product_id=1; EXPR$2=48.45"); } @Test void testExtractQuarter() { @@ -3773,10 +3787,10 @@ public class DruidAdapter2IT { + "\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}]," + "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",", "QUARTER")); - q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35\n" - + "EXPR$0=2; EXPR$1=132666.27\n" - + "EXPR$0=3; EXPR$1=140271.89\n" - + "EXPR$0=4; EXPR$1=152671.62"); + q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35", + "EXPR$0=2; EXPR$1=132666.27", + "EXPR$0=3; EXPR$1=140271.89", + "EXPR$0=4; EXPR$1=152671.62"); } @Test void testCastTimestamp1() { diff --git a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java index 6aab15f328..d45f4169a8 100644 --- a/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java +++ b/druid/src/test/java/org/apache/calcite/test/DruidAdapterIT.java @@ -920,7 +920,7 @@ public class DruidAdapterIT { + "2992-01-10T00:00:00.000Z]], groups=[{}], aggs=[[COUNT()]])"; final String sql = "select count(*) from \"foodmart\""; sql(sql) - .returns("EXPR$0=86829\n") + .returnsUnordered("EXPR$0=86829") .queryContains(new DruidChecker(druidQuery)) .explainContains(explain); } @@ -1859,11 +1859,13 @@ public class DruidAdapterIT { + "'direction':'ascending','dimensionOrder':'numeric'}]}," + "'aggregations':[{'type':'count','name':'C'},{'type':'longSum'," + "'name':'S','fieldName':'unit_sales'}]"; - sql(sqlQuery).returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36\ntimestamp=1997-12-29" - + " 00:00:00; C=321; S=982\ntimestamp=1997-12-28 00:00:00; C=480; " - + "S=1496\ntimestamp=1997-12-27 00:00:00; C=363; S=1156\ntimestamp=1997-12-26 00:00:00; " - + "C=144; S=420").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("timestamp=1997-12-30 00:00:00; C=22; S=36", + "timestamp=1997-12-29 00:00:00; C=321; S=982", + "timestamp=1997-12-28 00:00:00; C=480; S=1496", + "timestamp=1997-12-27 00:00:00; C=363; S=1156", + "timestamp=1997-12-26 00:00:00; C=144; S=420") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testNumericOrderingOfOrderByOperatorTimeExtract() { @@ -1878,10 +1880,13 @@ public class DruidAdapterIT { + "'direction':'ascending','dimensionOrder':'numeric'}," + "{'dimension':'extract_year','direction':'descending'," + "'dimensionOrder':'numeric'}]}"; - sql(sqlQuery).returnsOrdered("D=30; M=3; Y=1997; C=114; S=351\nD=30; M=5; Y=1997; " - + "C=24; S=34\nD=30; M=6; Y=1997; C=73; S=183\nD=30; M=7; Y=1997; C=29; S=54\nD=30; M=8; " - + "Y=1997; C=137; S=422").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("D=30; M=3; Y=1997; C=114; S=351", + "D=30; M=5; Y=1997; C=24; S=34", + "D=30; M=6; Y=1997; C=73; S=183", + "D=30; M=7; Y=1997; C=29; S=54", + "D=30; M=8; Y=1997; C=137; S=422") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testNumericOrderingOfOrderByOperatorStringDims() { @@ -1891,10 +1896,13 @@ public class DruidAdapterIT { final String druidSubQuery = "'limitSpec':{'type':'default','limit':5," + "'columns':[{'dimension':'brand_name','direction':'descending'," + "'dimensionOrder':'lexicographic'}]}"; - sql(sqlQuery).returnsOrdered("brand_name=Washington; C=576; S=1775\nbrand_name=Walrus; C=457;" - + " S=1399\nbrand_name=Urban; C=299; S=924\nbrand_name=Tri-State; C=2339; " - + "S=7270\nbrand_name=Toucan; C=123; S=380").queryContains(new DruidChecker(druidSubQuery)); - + sql(sqlQuery) + .returnsOrdered("brand_name=Washington; C=576; S=1775", + "brand_name=Walrus; C=457; S=1399", + "brand_name=Urban; C=299; S=924", + "brand_name=Tri-State; C=2339; S=7270", + "brand_name=Toucan; C=123; S=380") + .queryContains(new DruidChecker(druidSubQuery)); } @Test void testGroupByWeekExtract() { @@ -1919,7 +1927,10 @@ public class DruidAdapterIT { + "'timeZone':'UTC','locale':'en-US'}}]}]}," + "'aggregations':[]," + "'intervals':['1900-01-09T00:00:00.000Z/2992-01-10T00:00:00.000Z']}"; - sql(sql).returnsOrdered("EXPR$0=10\nEXPR$0=11").queryContains(new DruidChecker(druidQuery)); + sql(sql) + .returnsOrdered("EXPR$0=10", + "EXPR$0=11") + .queryContains(new DruidChecker(druidQuery)); } /** Test case for @@ -2708,9 +2719,9 @@ public class DruidAdapterIT { new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\"," + "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true," + "\"ordering\":\"numeric\"}")); - q.returnsUnordered("EXPR$0=10.16; product_id=1554\n" - + "EXPR$0=45.05; product_id=1556\n" - + "EXPR$0=88.5; product_id=1555"); + q.returnsUnordered("EXPR$0=10.16; product_id=1554", + "EXPR$0=45.05; product_id=1556", + "EXPR$0=88.5; product_id=1555"); } @Test void testFilterClauseWithMetricAndTimeAndAggregates() { @@ -2725,10 +2736,10 @@ public class DruidAdapterIT { new DruidChecker("\"queryType\":\"groupBy\"", "{\"type\":\"bound\"," + "\"dimension\":\"store_cost\",\"lower\":\"5\",\"lowerStrict\":true," + "\"ordering\":\"numeric\"}")) - .returnsUnordered("EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=10.6; product_id=1556\n" - + "EXPR$0=13.25; product_id=1556"); + .returnsUnordered("EXPR$0=10.6; product_id=1556", + "EXPR$0=10.6; product_id=1556", + "EXPR$0=10.6; product_id=1556", + "EXPR$0=13.25; product_id=1556"); } /** Tests that an aggregate with a nested filter clause has its filter @@ -3991,9 +4002,9 @@ public class DruidAdapterIT { + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3"; sql(sql, FOODMART) .runs() - .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; D=2\n" - + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2\n" - + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2") + .returnsOrdered("EXPR$0=1.060758881219386; EXPR$1=0.5172204046388567; D=2", + "EXPR$0=0.8316025520509229; EXPR$1=0.6544084288365644; D=2", + "EXPR$0=0.24267723077545622; EXPR$1=0.9286289016881148; D=2") .explainContains("PLAN=EnumerableInterpreter\n" + " BindableSort(sort0=[$2], dir0=[ASC], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" @@ -4007,9 +4018,9 @@ public class DruidAdapterIT { + FOODMART_TABLE + "WHERE \"store_sales\" < 20 order by D limit 3"; sql(sql, FOODMART) .runs() - .returnsOrdered("EXPR$0=0.5357357987441458; D=2\n" - + "EXPR$0=0.22760480207557643; D=2\n" - + "EXPR$0=0.11259322182897047; D=2") + .returnsOrdered("EXPR$0=0.5357357987441458; D=2", + "EXPR$0=0.22760480207557643; D=2", + "EXPR$0=0.11259322182897047; D=2") .explainContains("PLAN=EnumerableInterpreter\n" + " BindableSort(sort0=[$1], dir0=[ASC], fetch=[3])\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" @@ -4047,8 +4058,8 @@ public class DruidAdapterIT { final String sql = "SELECT SUM(-\"store_sales\" * 2) as S FROM " + FOODMART_TABLE + "Group by \"timestamp\" order by s LIMIT 2"; sql(sql, FOODMART) - .returnsOrdered("S=-15918.02\n" - + "S=-14115.96") + .returnsOrdered("S=-15918.02", + "S=-14115.96") .explainContains("PLAN=EnumerableCalc(expr#0..1=[{inputs}], S=[$t1])\n" + " EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" @@ -4181,8 +4192,11 @@ public class DruidAdapterIT { final String sql = "SELECT \"product_id\", SUBSTRING(\"product_id\" from 1 for 2) FROM " + FOODMART_TABLE + " GROUP BY \"product_id\""; - sql(sql, FOODMART).limit(3).returnsOrdered( - "product_id=1; EXPR$1=1\nproduct_id=10; EXPR$1=10\nproduct_id=100; EXPR$1=10") + sql(sql, FOODMART) + .limit(3) + .returnsOrdered("product_id=1; EXPR$1=1", + "product_id=10; EXPR$1=10", + "product_id=100; EXPR$1=10") .explainContains("PLAN=EnumerableInterpreter\n" + " DruidQuery(table=[[foodmart, foodmart]], intervals=[[1900-01-09T00:00:00.000Z/" + "2992-01-10T00:00:00.000Z]], projects=[[$1]], groups=[{0}], aggs=[[]], " @@ -4449,10 +4463,10 @@ public class DruidAdapterIT { + "{\"type\":\"default\",\"dimension\":\"product_id\",\"outputName\":\"product_id\",\"outputType\":\"STRING\"}]," + "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",", "QUARTER")); - q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05\n" - + "EXPR$0=2; product_id=1; EXPR$2=62.7\n" - + "EXPR$0=3; product_id=1; EXPR$2=88.35\n" - + "EXPR$0=4; product_id=1; EXPR$2=48.45"); + q.returnsOrdered("EXPR$0=1; product_id=1; EXPR$2=37.05", + "EXPR$0=2; product_id=1; EXPR$2=62.7", + "EXPR$0=3; product_id=1; EXPR$2=88.35", + "EXPR$0=4; product_id=1; EXPR$2=48.45"); } @Test void testExtractQuarter() { @@ -4467,10 +4481,10 @@ public class DruidAdapterIT { + "\"dimensions\":[{\"type\":\"default\",\"dimension\":\"vc\",\"outputName\":\"vc\",\"outputType\":\"LONG\"}]," + "\"virtualColumns\":[{\"type\":\"expression\",\"name\":\"vc\",\"expression\":\"timestamp_extract(\\\"__time\\\",", "QUARTER")); - q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35\n" - + "EXPR$0=2; EXPR$1=132666.27\n" - + "EXPR$0=3; EXPR$1=140271.89\n" - + "EXPR$0=4; EXPR$1=152671.62"); + q.returnsOrdered("EXPR$0=1; EXPR$1=139628.35", + "EXPR$0=2; EXPR$1=132666.27", + "EXPR$0=3; EXPR$1=140271.89", + "EXPR$0=4; EXPR$1=152671.62"); } diff --git a/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java b/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java index 559ee34135..468dee9463 100644 --- a/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java +++ b/spark/src/test/java/org/apache/calcite/test/SparkAdapterTest.java @@ -63,10 +63,12 @@ class SparkAdapterTest { final String plan = "PLAN=" + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])"; - final String expectedResult = "EXPR$0=1; EXPR$1=a\n" - + "EXPR$0=2; EXPR$1=b\n"; + final String[] expectedResult = { + "EXPR$0=1; EXPR$1=a", + "EXPR$0=2; EXPR$1=b" + }; - sql(sql).returns(expectedResult) + sql(sql).returnsOrdered(expectedResult) .explainContains(plan); } @@ -76,13 +78,13 @@ class SparkAdapterTest { + "from " + VALUES1 + "\n" + "where x < 2"; - final String expectedResult = "X=1; Y=a\n"; + final String[] expectedResult = {"X=1; Y=a"}; final String plan = "PLAN=" + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[2], expr#3=[<($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n"; - sql(sql).returns(expectedResult) + sql(sql).returnsUnordered(expectedResult) .explainContains(plan); } @@ -94,10 +96,12 @@ class SparkAdapterTest { + "EnumerableAggregate(group=[{0, 1}])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -118,8 +122,10 @@ class SparkAdapterTest { + " EnumerableAggregate(group=[{0, 1}], groups=[[{0, 1}, {0}]], SUM_X=[$SUM0($0)], MIN_Y=[MIN($1)], MAX_Y=[MAX($1)], CNT_Y=[COUNT()], $g=[GROUPING($0, $1)])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n"; - final String expectedResult = "SUM_X=2; MIN_Y=a; MAX_Y=b; CNT_Y=2; CNT_DIST_Y=2\n" - + "SUM_X=6; MIN_Y=b; MAX_Y=c; CNT_Y=3; CNT_DIST_Y=2"; + final String[] expectedResult = { + "SUM_X=2; MIN_Y=a; MAX_Y=b; CNT_Y=2; CNT_DIST_Y=2", + "SUM_X=6; MIN_Y=b; MAX_Y=c; CNT_Y=3; CNT_DIST_Y=2" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -233,13 +239,15 @@ class SparkAdapterTest { + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=b", + "X=2; Y=c", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -257,10 +265,12 @@ class SparkAdapterTest { + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -278,8 +288,10 @@ class SparkAdapterTest { + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=2; Y=b"; + final String[] expectedResult = { + "X=1; Y=a", + "X=2; Y=b" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -380,11 +392,13 @@ class SparkAdapterTest { + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "Y=a; Z=a\n" - + "Y=b; Z=a\n" - + "Y=b; Z=b\n" - + "Y=c; Z=b\n" - + "Y=c; Z=b"; + final String[] expectedResult = { + "Y=a; Z=a", + "Y=b; Z=a", + "Y=b; Z=b", + "Y=c; Z=b", + "Y=c; Z=b" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -403,11 +417,13 @@ class SparkAdapterTest { + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "Z=a\n" - + "Z=a\n" - + "Z=b\n" - + "Z=b\n" - + "Z=b"; + final String[] expectedResult = { + "Z=a", + "Z=a", + "Z=b", + "Z=b", + "Z=b" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -477,8 +493,10 @@ class SparkAdapterTest { + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[[3..4]]], expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 3, 'b' }, { 4, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=3; Y=b\n" - + "X=4; Y=c"; + final String[] expectedResult = { + "X=3; Y=b", + "X=4; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -493,8 +511,10 @@ class SparkAdapterTest { + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[3, 4]], expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 3, 'b' }, { 4, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=3; Y=b\n" - + "X=4; Y=c"; + final String[] expectedResult = { + "X=3; Y=b", + "X=4; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -508,11 +528,13 @@ class SparkAdapterTest { final String plan = "PLAN=" + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=c", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -541,11 +563,13 @@ class SparkAdapterTest { + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[Sarg[1, 2]], expr#3=[SEARCH($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=c", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -559,11 +583,13 @@ class SparkAdapterTest { final String plan = "PLAN=" + "EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n\n"; - final String expectedResult = "X=1; Y=a\n" - + "X=1; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=1; Y=a", + "X=1; Y=b", + "X=2; Y=b", + "X=2; Y=c", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -601,10 +627,12 @@ class SparkAdapterTest { + " EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], expr#3=[>($t0, $t2)], proj#0..1=[{exprs}], $condition=[$t3])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }, { 1, 'b' }, { 2, 'c' }, { 2, 'c' }]])\n"; - final String expectedResult = "X=2; Y=b\n" - + "X=2; Y=b\n" - + "X=2; Y=c\n" - + "X=2; Y=c"; + final String[] expectedResult = { + "X=2; Y=b", + "X=2; Y=b", + "X=2; Y=c", + "X=2; Y=c" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -643,8 +671,10 @@ class SparkAdapterTest { + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[1], expr#3=[+($t0, $t2)], expr#4=[>($t3, $t2)], X=[$t0], $condition=[$t4])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n\n"; - final String expectedResult = "X=1\n" - + "X=2"; + final String[] expectedResult = { + "X=1", + "X=2" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); @@ -689,8 +719,10 @@ class SparkAdapterTest { + "EnumerableCalc(expr#0..1=[{inputs}], expr#2=[/($t0, $t0)], expr#3=[1], expr#4=[=($t2, $t3)], X=[$t0], $condition=[$t4])\n" + " EnumerableValues(tuples=[[{ 1, 'a' }, { 2, 'b' }]])\n\n"; - final String expectedResult = "X=1\n" - + "X=2"; + final String[] expectedResult = { + "X=1", + "X=2" + }; sql(sql).returnsUnordered(expectedResult) .explainContains(plan); diff --git a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java index b5a0adaf57..2d72e41447 100644 --- a/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java +++ b/testkit/src/main/java/org/apache/calcite/test/CalciteAssert.java @@ -406,9 +406,32 @@ public class CalciteAssert { /** Checks that the {@link ResultSet} returns the given set of lines, * optionally sorting. * + * <p>The lines must not contain line breaks. If you have written + * + * <pre>{@code + * checkUnordered("line1\n" + * + "line2") + * }</pre> + * + * <p>you should instead write + * + * <pre>{@code + * checkUnordered("line1", + * "line2") + * }</pre> + * + * <p>so that result-checking is order-independent. + * * @see Matchers#returnsUnordered(String...) */ static Consumer<ResultSet> checkResult(final boolean sort, final boolean head, final String... lines) { + // Check that none of the lines contains a line break. + for (String line : lines) { + if (line.contains("\n")) { + throw new AssertionError("expected line has line breaks: " + line); + } + } + return resultSet -> { try { final List<String> expectedList = Lists.newArrayList(lines);
