http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java index 61fb73c..4810559 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestCubeRewriter.java @@ -135,7 +135,7 @@ public class TestCubeRewriter extends TestQueryRewrite { @Test public void testCubeQuery() throws Exception { CubeQueryContext rewrittenQuery = - rewriteCtx("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2")); + rewriteCtx("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2")); String expected = getExpectedQuery(TEST_CUBE_NAME, "select sum(testcube.msr2) FROM ", null, null, getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")); @@ -151,7 +151,7 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, false); conf.set(DRIVER_SUPPORTED_STORAGES, "C1,C2,C4"); CubeQueryContext cubeQueryContext = - rewriteCtx("cube select" + " SUM(msr2) from testCube where " + THIS_YEAR_RANGE, conf); + rewriteCtx("cube select SUM(msr2) from testCube where " + THIS_YEAR_RANGE, conf); PruneCauses<CubeFactTable> pruneCause = cubeQueryContext.getFactPruningMsgs(); int lessDataCauses = 0; for (Map.Entry<CubeFactTable, List<CandidateTablePruneCause>> entry : pruneCause.entrySet()) { @@ -167,7 +167,7 @@ public class TestCubeRewriter extends TestQueryRewrite { @Test public void testLightestFactFirst() throws Exception { // testFact is lighter than testFact2. - String hqlQuery = rewrite("cube select" + " SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages( + String hqlQuery = rewrite("cube select SUM(msr2) from testCube where " + TWO_DAYS_RANGE, getConfWithStorages( "C2")); String expected = getExpectedQuery(TEST_CUBE_NAME, "select sum(testcube.msr2) FROM ", null, null, @@ -202,7 +202,7 @@ public class TestCubeRewriter extends TestQueryRewrite { @Test public void testDerivedCube() throws ParseException, LensException, HiveException, ClassNotFoundException { CubeQueryContext rewrittenQuery = - rewriteCtx("cube select" + " SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2")); + rewriteCtx("cube select SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, getConfWithStorages("C2")); String expected = getExpectedQuery(DERIVED_CUBE_NAME, "select sum(derivedCube.msr2) FROM ", null, null, getWhereForDailyAndHourly2days(DERIVED_CUBE_NAME, "C2_testfact")); @@ -211,7 +211,7 @@ public class TestCubeRewriter extends TestQueryRewrite { assertNotNull(rewrittenQuery.getNonExistingParts()); LensException th = getLensExceptionInRewrite( - "select SUM(msr4) from derivedCube" + " where " + TWO_DAYS_RANGE, getConf()); + "select SUM(msr4) from derivedCube where " + TWO_DAYS_RANGE, getConf()); assertEquals(th.getErrorCode(), LensCubeErrorCode.COLUMN_NOT_FOUND.getLensErrorInfo().getErrorCode()); // test join @@ -219,27 +219,28 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setBoolean(DISABLE_AUTO_JOINS, false); String hqlQuery; - hqlQuery = rewrite("cube select" + " testdim2.name, SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, conf); + /* + Accessing join chains from derived cubes are not supported yet. + hqlQuery = rewrite("cube select dim2chain.name, SUM(msr2) from derivedCube where " + TWO_DAYS_RANGE, conf); expected = - getExpectedQuery(DERIVED_CUBE_NAME, "select testdim2.name, sum(derivedCube.msr2) FROM ", " JOIN " - + getDbName() + "c1_testdim2tbl testdim2 ON derivedCube.dim2 = " - + " testdim2.id and (testdim2.dt = 'latest') ", null, "group by (testdim2.name)", null, + getExpectedQuery(DERIVED_CUBE_NAME, "select dim2chain.name, sum(derivedCube.msr2) FROM ", " JOIN " + + getDbName() + "c1_testdim2tbl dim2chain ON derivedCube.dim2 = " + + " dim2chain.id and (dim2chain.dt = 'latest') ", null, "group by (dim2chain.name)", null, getWhereForDailyAndHourly2days(DERIVED_CUBE_NAME, "c1_summary2")); compareQueries(hqlQuery, expected); // Test that explicit join query passes with join resolver disabled conf.setBoolean(DISABLE_AUTO_JOINS, true); - List<String> joinWhereConds = new ArrayList<String>(); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "testdim2", StorageConstants.getPartitionsForLatest())); hqlQuery = - rewrite("cube select" + " testdim2.name, SUM(msr2) from derivedCube " - + " inner join testdim2 on derivedCube.dim2 = testdim2.id " + "where " + TWO_DAYS_RANGE, conf); + rewrite("cube select citydim.name, SUM(msr2) from derivedCube " + + " inner join citydim on derivedCube.cityid = citydim.id where " + TWO_DAYS_RANGE, conf); expected = - getExpectedQuery(DERIVED_CUBE_NAME, "select testdim2.name, sum(derivedCube.msr2) FROM ", - " inner JOIN " + getDbName() + "c1_testdim2tbl testdim2 ON derivedCube.dim2 = " + " testdim2.id ", null, - "group by (testdim2.name)", joinWhereConds, + getExpectedQuery(DERIVED_CUBE_NAME, "select citydim.name, sum(derivedCube.msr2) FROM ", + " inner JOIN " + getDbName() + + "c1_citytable citydim ON derivedCube.cityid = citydim.id and (citydim.dt = 'latest')", null, + "group by (citydim.name)", null, getWhereForDailyAndHourly2days(DERIVED_CUBE_NAME, "c1_summary2")); - compareQueries(hqlQuery, expected); + compareQueries(hqlQuery, expected);*/ } @Test @@ -619,24 +620,24 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setBoolean(DISABLE_AUTO_JOINS, false); String hql, expected; hql = rewrite( - "select countrydim.name, msr2 from" + " testCube" + " where countrydim.region = 'asia' and " + "select cubecountry.name, msr2 from" + " testCube" + " where cubecountry.region = 'asia' and " + TWO_DAYS_RANGE, conf); expected = - getExpectedQuery(TEST_CUBE_NAME, "select countrydim.name, sum(testcube.msr2)" + " FROM ", " JOIN " + getDbName() - + "c3_countrytable_partitioned countrydim on testcube.countryid=countrydim.id and countrydim.dt='latest'", - "countrydim.region='asia'", - " group by countrydim.name ", null, + getExpectedQuery(TEST_CUBE_NAME, "select cubecountry.name, sum(testcube.msr2)" + " FROM ", " JOIN " + getDbName() + + "c3_countrytable_partitioned cubecountry on testcube.countryid=cubecountry.id and cubecountry.dt='latest'", + "cubecountry.region='asia'", + " group by cubecountry.name ", null, getWhereForHourly2days(TEST_CUBE_NAME, "C3_testfact2_raw")); compareQueries(hql, expected); hql = rewrite( - "select statedim.name, statedim.countryid, msr2 from" + " testCube" + " where statedim.countryid = 5 and " + "select cubestate.name, cubestate.countryid, msr2 from" + " testCube" + " where cubestate.countryid = 5 and " + TWO_DAYS_RANGE, conf); expected = - getExpectedQuery(TEST_CUBE_NAME, "select statedim.name, statedim.countryid, sum(testcube.msr2)" + " FROM ", + getExpectedQuery(TEST_CUBE_NAME, "select cubestate.name, cubestate.countryid, sum(testcube.msr2)" + " FROM ", " JOIN " + getDbName() - + "c3_statetable_partitioned statedim ON" + " testCube.stateid = statedim.id and statedim.dt = 'latest'", - "statedim.countryid=5", - " group by statedim.name, statedim.countryid", null, + + "c3_statetable_partitioned cubestate ON" + " testCube.stateid = cubestate.id and cubestate.dt = 'latest'", + "cubestate.countryid=5", + " group by cubestate.name, cubestate.countryid", null, getWhereForHourly2days(TEST_CUBE_NAME, "C3_testfact2_raw")); compareQueries(hql, expected); } @@ -649,12 +650,9 @@ public class TestCubeRewriter extends TestQueryRewrite { String hqlQuery = rewrite("select SUM(msr2) from testCube" + " join citydim on testCube.cityid = citydim.id" + " where " + TWO_DAYS_RANGE, conf); - List<String> joinWhereConds = new ArrayList<String>(); - // joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest - // ())); String expected = getExpectedQuery(TEST_CUBE_NAME, "select sum(testcube.msr2)" + " FROM ", " INNER JOIN " + getDbName() - + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, null, joinWhereConds, + + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, null, null, getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")); compareQueries(hqlQuery, expected); @@ -673,16 +671,15 @@ public class TestCubeRewriter extends TestQueryRewrite { rewrite("select statedim.name, SUM(msr2) from" + " testCube" + " join citydim on testCube.cityid = citydim.id" + " left outer join statedim on statedim.id = citydim.stateid" + " right outer join zipdim on citydim.zipcode = zipdim.code" + " where " + TWO_DAYS_RANGE, getConf()); - joinWhereConds = new ArrayList<>(); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest())); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "zipdim", StorageConstants.getPartitionsForLatest())); expected = getExpectedQuery(TEST_CUBE_NAME, "select statedim.name," + " sum(testcube.msr2) FROM ", "INNER JOIN " + getDbName() - + "c1_citytable citydim ON" + " testCube.cityid = citydim.id LEFT OUTER JOIN " + getDbName() + + "c1_citytable citydim ON testCube.cityid = citydim.id and citydim.dt='latest' LEFT OUTER JOIN " + + getDbName() + "c1_statetable statedim" + " ON statedim.id = citydim.stateid AND " + "(statedim.dt = 'latest') RIGHT OUTER JOIN " + getDbName() + "c1_ziptable" - + " zipdim ON citydim.zipcode = zipdim.code", null, " group by" + " statedim.name ", joinWhereConds, + + " zipdim ON citydim.zipcode = zipdim.code and zipdim.dt='latest'", null, " group by" + " statedim.name ", + null, getWhereForHourly2days(TEST_CUBE_NAME, "C1_testfact2")); compareQueries(hqlQuery, expected); @@ -691,14 +688,12 @@ public class TestCubeRewriter extends TestQueryRewrite { rewrite("select st.name, SUM(msr2) from" + " testCube TC" + " join citydim CT on TC.cityid = CT.id" + " left outer join statedim ST on ST.id = CT.stateid" + " right outer join zipdim ZT on CT.zipcode = ZT.code" + " where " + TWO_DAYS_RANGE, getConf()); - joinWhereConds = new ArrayList<String>(); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "ct", StorageConstants.getPartitionsForLatest())); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "zt", StorageConstants.getPartitionsForLatest())); expected = getExpectedQuery("tc", "select st.name," + " sum(tc.msr2) FROM ", " INNER JOIN " + getDbName() - + "c1_citytable ct ON" + " tc.cityid = ct.id LEFT OUTER JOIN " + getDbName() + "c1_statetable st" + + "c1_citytable ct ON" + " tc.cityid = ct.id and ct.dt='latest' LEFT OUTER JOIN " + + getDbName() + "c1_statetable st" + " ON st.id = ct.stateid and (st.dt = 'latest') " + "RIGHT OUTER JOIN " + getDbName() + "c1_ziptable" - + " zt ON ct.zipcode = zt.code", null, " group by" + " st.name ", joinWhereConds, + + " zt ON ct.zipcode = zt.code and zt.dt='latest'", null, " group by" + " st.name ", null, getWhereForHourly2days("tc", "C1_testfact2")); compareQueries(hqlQuery, expected); @@ -727,7 +722,7 @@ public class TestCubeRewriter extends TestQueryRewrite { LensException th = getLensExceptionInRewrite( "select name, SUM(msr2) from testCube" + " join citydim" + " where " + TWO_DAYS_RANGE + " group by name", getConf()); - assertEquals(th.getErrorCode(), LensCubeErrorCode.NO_JOIN_CONDITION_AVAIABLE.getLensErrorInfo().getErrorCode()); + assertEquals(th.getErrorCode(), LensCubeErrorCode.NO_JOIN_CONDITION_AVAILABLE.getLensErrorInfo().getErrorCode()); } @Test @@ -779,13 +774,10 @@ public class TestCubeRewriter extends TestQueryRewrite { String hqlQuery = rewrite("select name, SUM(msr2) from" + " testCube join citydim on testCube.cityid = citydim.id where " + TWO_DAYS_RANGE, conf); - List<String> joinWhereConds = new ArrayList<String>(); - // joinWhereConds.add(StorageUtil.getWherePartClause("dt", "citydim", StorageConstants.getPartitionsForLatest - // ())); String expected = getExpectedQuery(TEST_CUBE_NAME, "select citydim.name," + " sum(testcube.msr2) FROM ", "INNER JOIN " + getDbName() + "c2_citytable citydim ON" + " testCube.cityid = citydim.id", null, " group by citydim.name ", - joinWhereConds, getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")); + null, getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")); compareQueries(hqlQuery, expected); hqlQuery = @@ -860,21 +852,21 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setBoolean(DISABLE_AUTO_JOINS, false); conf.set(DRIVER_SUPPORTED_STORAGES, "C1, C2"); hqlQuery = - rewrite("SELECT citydim.name AS g1," + " CASE WHEN citydim.name=='NULL' THEN 'NULL' " - + " WHEN citydim.name=='X' THEN 'X-NAME' " + " WHEN citydim.name=='Y' THEN 'Y-NAME' " - + " ELSE 'DEFAULT' END AS g2, " + " statedim.name AS g3," + " statedim.id AS g4, " - + " zipdim.code!=1 AND " + " ((zipdim.f1==\"xyz\" AND (zipdim.f2 >= \"3\" AND " - + " zipdim.f2 !=\"NULL\" AND zipdim.f2 != \"uk\")) " - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\" " - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" )) " - + " OR ((zipdim.f1==\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\"))" - + " AND citydim.id==12) ) AS g5," + " zipdim.code==1 AND " - + " ((zipdim.f1==\"xyz\" AND (zipdim.f2 >= \"3\" AND " - + " zipdim.f2 !=\"NULL\" AND zipdim.f2 != \"uk\")) " - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\" " - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" )) " - + " OR ((zipdim.f1==\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\"))" - + " AND citydim.id==12) ) AS g6, " + " zipdim.f1 AS g7, " + rewrite("SELECT cubecity.name AS g1," + " CASE WHEN cubecity.name=='NULL' THEN 'NULL' " + + " WHEN cubecity.name=='X' THEN 'X-NAME' " + " WHEN cubecity.name=='Y' THEN 'Y-NAME' " + + " ELSE 'DEFAULT' END AS g2, " + " cubestate.name AS g3," + " cubestate.id AS g4, " + + " cubezip.code!=1 AND " + " ((cubezip.f1==\"xyz\" AND (cubezip.f2 >= \"3\" AND " + + " cubezip.f2 !=\"NULL\" AND cubezip.f2 != \"uk\")) " + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\" " + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" )) " + + " OR ((cubezip.f1==\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\"))" + + " AND cubecity.id==12) ) AS g5," + " cubezip.code==1 AND " + + " ((cubezip.f1==\"xyz\" AND (cubezip.f2 >= \"3\" AND " + + " cubezip.f2 !=\"NULL\" AND cubezip.f2 != \"uk\")) " + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\" " + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" )) " + + " OR ((cubezip.f1==\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\"))" + + " AND cubecity.id==12) ) AS g6, " + " cubezip.f1 AS g7, " + " format_number(SUM(msr1),\"##################.###\") AS a1," + " format_number(SUM(msr2),\"##################.###\") AS a2, " + " format_number(SUM(msr3),\"##################.###\") AS a3, " @@ -884,35 +876,38 @@ public class TestCubeRewriter extends TestQueryRewrite { + " FROM testCube where " + TWO_DAYS_RANGE + " HAVING (SUM(msr1) >=1000) AND (SUM(msr2)>=0.01)", conf); String actualExpr = "" - + " join " + getDbName() + "c1_statetable statedim on testcube.stateid=statedim.id and (statedim.dt='latest')" - + " join " + getDbName() + "c1_ziptable zipdim on testcube.zipcode = zipdim.code and (zipdim.dt = 'latest') " - + " join " + getDbName() + "c1_citytable citydim on testcube.cityid = citydim.id and (citydim.dt = 'latest')" + + " join " + getDbName() + "c1_statetable cubestate on testcube.stateid=cubestate.id and " + + "(cubestate.dt='latest')" + + " join " + getDbName() + + "c1_ziptable cubezip on testcube.zipcode = cubezip.code and (cubezip.dt = 'latest') " + + " join " + getDbName() + + "c1_citytable cubecity on testcube.cityid = cubecity.id and (cubecity.dt = 'latest')" + ""; expected = getExpectedQuery( TEST_CUBE_NAME, - "SELECT ( citydim.name ) as `g1` ," - + " case when (( citydim.name ) == 'NULL' ) then 'NULL' when (( citydim.name ) == 'X' )" - + " then 'X-NAME' when (( citydim.name ) == 'Y' ) then 'Y-NAME'" - + " else 'DEFAULT' end as `g2` , ( statedim.name ) as `g3` , ( statedim.id ) as `g4` ," - + " ((( zipdim.code ) != 1 ) and ((((( zipdim.f1 ) == \"xyz\" )" - + " and (((( zipdim.f2 ) >= \"3\" ) and (( zipdim.f2 ) != \"NULL\" ))" - + " and (( zipdim.f2 ) != \"uk\" ))) or (((( zipdim.f2 ) == \"adc\" )" - + " and (( zipdim.f1 ) == \"js\" ))" - + " and ((( citydim.name ) == \"X\" ) or (( citydim.name ) == \"Y\" ))))" - + " or ((((( zipdim.f1 ) == \"api\" )" - + " or (( zipdim.f1 ) == \"uk\" )) or ((( zipdim.f1 ) == \"adc\" )" - + " and (( zipdim.f1 ) != \"js\" )))" - + " and (( citydim.id ) == 12 )))) as `g5` , ((( zipdim.code ) == 1 )" - + " and ((((( zipdim.f1 ) == \"xyz\" ) and (((( zipdim.f2 ) >= \"3\" )" - + " and (( zipdim.f2 ) != \"NULL\" ))" - + " and (( zipdim.f2 ) != \"uk\" ))) or (((( zipdim.f2 ) == \"adc\" )" - + " and (( zipdim.f1 ) == \"js\" ))" - + " and ((( citydim.name ) == \"X\" ) or (( citydim.name ) == \"Y\" ))))" - + " or ((((( zipdim.f1 ) == \"api\" )" - + " or (( zipdim.f1 ) == \"uk\" )) or ((( zipdim.f1 ) == \"adc\" )" - + " and (( zipdim.f1 ) != \"js\" )))" - + " and (( citydim.id ) == 12 )))) as `g6` , ( zipdim.f1 ) as `g7` ," + "SELECT ( cubecity.name ) as `g1` ," + + " case when (( cubecity.name ) == 'NULL' ) then 'NULL' when (( cubecity.name ) == 'X' )" + + " then 'X-NAME' when (( cubecity.name ) == 'Y' ) then 'Y-NAME'" + + " else 'DEFAULT' end as `g2` , ( cubestate.name ) as `g3` , ( cubestate.id ) as `g4` ," + + " ((( cubezip.code ) != 1 ) and ((((( cubezip.f1 ) == \"xyz\" )" + + " and (((( cubezip.f2 ) >= \"3\" ) and (( cubezip.f2 ) != \"NULL\" ))" + + " and (( cubezip.f2 ) != \"uk\" ))) or (((( cubezip.f2 ) == \"adc\" )" + + " and (( cubezip.f1 ) == \"js\" ))" + + " and ((( cubecity.name ) == \"X\" ) or (( cubecity.name ) == \"Y\" ))))" + + " or ((((( cubezip.f1 ) == \"api\" )" + + " or (( cubezip.f1 ) == \"uk\" )) or ((( cubezip.f1 ) == \"adc\" )" + + " and (( cubezip.f1 ) != \"js\" )))" + + " and (( cubecity.id ) == 12 )))) as `g5` , ((( cubezip.code ) == 1 )" + + " and ((((( cubezip.f1 ) == \"xyz\" ) and (((( cubezip.f2 ) >= \"3\" )" + + " and (( cubezip.f2 ) != \"NULL\" ))" + + " and (( cubezip.f2 ) != \"uk\" ))) or (((( cubezip.f2 ) == \"adc\" )" + + " and (( cubezip.f1 ) == \"js\" ))" + + " and ((( cubecity.name ) == \"X\" ) or (( cubecity.name ) == \"Y\" ))))" + + " or ((((( cubezip.f1 ) == \"api\" )" + + " or (( cubezip.f1 ) == \"uk\" )) or ((( cubezip.f1 ) == \"adc\" )" + + " and (( cubezip.f1 ) != \"js\" )))" + + " and (( cubecity.id ) == 12 )))) as `g6` , ( cubezip.f1 ) as `g7` ," + " format_number(sum(( testcube.msr1 )), \"##################.###\" ) as `a1` ," + " format_number(sum(( testcube.msr2 )), \"##################.###\" ) as `a2` ," + " format_number(sum(( testcube.msr3 )), \"##################.###\" ) as `a3`, " @@ -923,47 +918,48 @@ public class TestCubeRewriter extends TestQueryRewrite { + " FROM ", actualExpr, null, - " GROUP BY ( citydim.name ), case when (( citydim.name ) == 'NULL' ) " - + "then 'NULL' when (( citydim.name ) == 'X' ) then 'X-NAME' when (( citydim.name ) == 'Y' )" - + " then 'Y-NAME' else 'DEFAULT' end, ( statedim.name ), ( statedim.id )," - + " ((( zipdim.code ) != 1 ) and ((((( zipdim.f1 ) == \"xyz\" ) and (((( zipdim.f2 ) >= \"3\" )" - + " and (( zipdim.f2 ) != \"NULL\" )) and (( zipdim.f2 ) != \"uk\" ))) or (((( zipdim.f2 ) == \"adc\" )" - + " and (( zipdim.f1 ) == \"js\" )) and ((( citydim.name ) == \"X\" ) or (( citydim.name ) == \"Y\" ))))" - + " or ((((( zipdim.f1 ) == \"api\" ) or (( zipdim.f1 ) == \"uk\" )) or ((( zipdim.f1 ) == \"adc\" )" - + " and (( zipdim.f1 ) != \"js\" ))) and (( citydim.id ) == 12 )))), ((( zipdim.code ) == 1 ) and" - + " ((((( zipdim.f1 ) == \"xyz\" ) and (((( zipdim.f2 ) >= \"3\" ) and (( zipdim.f2 ) != \"NULL\" ))" - + " and (( zipdim.f2 ) != \"uk\" ))) or (((( zipdim.f2 ) == \"adc\" ) and (( zipdim.f1 ) == \"js\" ))" - + " and ((( citydim.name ) == \"X\" ) or (( citydim.name ) == \"Y\" )))) or ((((( zipdim.f1 ) == \"api\" )" - + " or (( zipdim.f1 ) == \"uk\" )) or ((( zipdim.f1 ) == \"adc\" ) and (( zipdim.f1 ) != \"js\" )))" - + " and (( citydim.id ) == 12 )))), ( zipdim.f1 ) HAVING ((sum(( testcube.msr1 )) >= 1000 ) " + " GROUP BY ( cubecity.name ), case when (( cubecity.name ) == 'NULL' ) " + + "then 'NULL' when (( cubecity.name ) == 'X' ) then 'X-NAME' when (( cubecity.name ) == 'Y' )" + + " then 'Y-NAME' else 'DEFAULT' end, ( cubestate.name ), ( cubestate.id )," + + " ((( cubezip.code ) != 1 ) and ((((( cubezip.f1 ) == \"xyz\" ) and (((( cubezip.f2 ) >= \"3\" )" + + " and (( cubezip.f2 ) != \"NULL\" )) and (( cubezip.f2 ) != \"uk\" ))) or (((( cubezip.f2 ) == \"adc\" )" + + " and (( cubezip.f1 ) == \"js\" )) and ((( cubecity.name ) == \"X\" ) or (( cubecity.name ) == \"Y\"" + + " ))))" + + " or ((((( cubezip.f1 ) == \"api\" ) or (( cubezip.f1 ) == \"uk\" )) or ((( cubezip.f1 ) == \"adc\" )" + + " and (( cubezip.f1 ) != \"js\" ))) and (( cubecity.id ) == 12 )))), ((( cubezip.code ) == 1 ) and" + + " ((((( cubezip.f1 ) == \"xyz\" ) and (((( cubezip.f2 ) >= \"3\" ) and (( cubezip.f2 ) != \"NULL\" ))" + + " and (( cubezip.f2 ) != \"uk\" ))) or (((( cubezip.f2 ) == \"adc\" ) and (( cubezip.f1 ) == \"js\" ))" + + " and ((( cubecity.name ) == \"X\" ) or (( cubecity.name ) == \"Y\" )))) or ((((( cubezip.f1 )==\"api\" )" + + " or (( cubezip.f1 ) == \"uk\" )) or ((( cubezip.f1 ) == \"adc\" ) and (( cubezip.f1 ) != \"js\" )))" + + " and (( cubecity.id ) == 12 )))), ( cubezip.f1 ) HAVING ((sum(( testcube.msr1 )) >= 1000 ) " + "and (sum(( testcube.msr2 )) >= 0.01 ))", null, getWhereForHourly2days("c1_testfact2_raw")); compareQueries(hqlQuery, expected); hqlQuery = rewrite( - "SELECT citydim.name AS g1," - + " CASE WHEN citydim.name=='NULL' THEN 'NULL' " - + " WHEN citydim.name=='X' THEN 'X-NAME' " - + " WHEN citydim.name=='Y' THEN 'Y-NAME' " + "SELECT cubecity.name AS g1," + + " CASE WHEN cubecity.name=='NULL' THEN 'NULL' " + + " WHEN cubecity.name=='X' THEN 'X-NAME' " + + " WHEN cubecity.name=='Y' THEN 'Y-NAME' " + " ELSE 'DEFAULT' END AS g2, " - + " statedim.name AS g3," - + " statedim.id AS g4, " - + " zipdim.code!=1 AND " - + " ((zipdim.f1==\"xyz\" AND (zipdim.f2 >= \"3\" AND " - + " zipdim.f2 !=\"NULL\" AND zipdim.f2 != \"uk\")) " - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\" " - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" )) " - + " OR ((zipdim.f1==\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\"))" - + " AND citydim.id==12) ) AS g5," - + " zipdim.code==1 AND " - + " ((zipdim.f1==\"xyz\" AND (zipdim.f2 >= \"3\" AND " - + " zipdim.f2 !=\"NULL\" AND zipdim.f2 != \"uk\")) " - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\" " - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" )) " - + " OR ((zipdim.f1==\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\"))" - + " AND citydim.id==12) ) AS g6, " - + " zipdim.f1 AS g7, " + + " cubestate.name AS g3," + + " cubestate.id AS g4, " + + " cubezip.code!=1 AND " + + " ((cubezip.f1==\"xyz\" AND (cubezip.f2 >= \"3\" AND " + + " cubezip.f2 !=\"NULL\" AND cubezip.f2 != \"uk\")) " + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\" " + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" )) " + + " OR ((cubezip.f1==\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\"))" + + " AND cubecity.id==12) ) AS g5," + + " cubezip.code==1 AND " + + " ((cubezip.f1==\"xyz\" AND (cubezip.f2 >= \"3\" AND " + + " cubezip.f2 !=\"NULL\" AND cubezip.f2 != \"uk\")) " + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\" " + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" )) " + + " OR ((cubezip.f1==\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\"))" + + " AND cubecity.id==12) ) AS g6, " + + " cubezip.f1 AS g7, " + " format_number(SUM(msr1),\"##################.###\") AS a1," + " format_number(SUM(msr2),\"##################.###\") AS a2, " + " format_number(SUM(msr3),\"##################.###\") AS a3, " @@ -972,20 +968,20 @@ public class TestCubeRewriter extends TestQueryRewrite { + " format_number(SUM(msr1)-(SUM(msr2)+SUM(msr3)),\"##################.###\") AS a6" + " FROM testCube where " + TWO_DAYS_RANGE - + " group by citydim.name, CASE WHEN citydim.name=='NULL' THEN 'NULL'" - + " WHEN citydim.name=='X' THEN 'X-NAME' WHEN citydim.name=='Y' THEN 'Y-NAME'" - + " ELSE 'DEFAULT' END, statedim.name, statedim.id, zipdim.code!=1 AND" - + " ((zipdim.f1==\"xyz\" AND (zipdim.f2 >= \"3\" AND zipdim.f2 !=\"NULL\" AND zipdim.f2 != \"uk\"))" - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\"" - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" ))" - + " OR ((zipdim.f1==\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\"))" - + " AND citydim.id==12) )," - + " zipdim.code==1 AND ((zipdim.f1==\"xyz\" AND ( zipdim.f2 >= \"3\" AND zipdim.f2 !=\"NULL\"" - + " AND zipdim.f2 != \"uk\"))" - + " OR (zipdim.f2==\"adc\" AND zipdim.f1==\"js\"" - + " AND ( citydim.name == \"X\" OR citydim.name == \"Y\" ))" - + " OR ((zipdim.f1=\"api\" OR zipdim.f1==\"uk\" OR (zipdim.f1==\"adc\" AND zipdim.f1!=\"js\")) AND" - + " citydim.id==12))," + " zipdim.f1 " + "HAVING (SUM(msr1) >=1000) AND (SUM(msr2)>=0.01)", conf); + + " group by cubecity.name, CASE WHEN cubecity.name=='NULL' THEN 'NULL'" + + " WHEN cubecity.name=='X' THEN 'X-NAME' WHEN cubecity.name=='Y' THEN 'Y-NAME'" + + " ELSE 'DEFAULT' END, cubestate.name, cubestate.id, cubezip.code!=1 AND" + + " ((cubezip.f1==\"xyz\" AND (cubezip.f2 >= \"3\" AND cubezip.f2 !=\"NULL\" AND cubezip.f2 != \"uk\"))" + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\"" + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" ))" + + " OR ((cubezip.f1==\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\"))" + + " AND cubecity.id==12) )," + + " cubezip.code==1 AND ((cubezip.f1==\"xyz\" AND ( cubezip.f2 >= \"3\" AND cubezip.f2 !=\"NULL\"" + + " AND cubezip.f2 != \"uk\"))" + + " OR (cubezip.f2==\"adc\" AND cubezip.f1==\"js\"" + + " AND ( cubecity.name == \"X\" OR cubecity.name == \"Y\" ))" + + " OR ((cubezip.f1=\"api\" OR cubezip.f1==\"uk\" OR (cubezip.f1==\"adc\" AND cubezip.f1!=\"js\")) AND" + + " cubecity.id==12))," + " cubezip.f1 " + "HAVING (SUM(msr1) >=1000) AND (SUM(msr2)>=0.01)", conf); compareQueries(hqlQuery, expected); } @@ -1570,18 +1566,16 @@ public class TestCubeRewriter extends TestQueryRewrite { public void testJoinPathColumnLifeValidation() throws Exception { HiveConf testConf = new HiveConf(new HiveConf(getConf(), HiveConf.class)); testConf.setBoolean(DISABLE_AUTO_JOINS, false); - System.out.println("@@ Joins disabled? " + testConf.get(DISABLE_AUTO_JOINS)); // Set column life of dim2 column in testCube CubeMetastoreClient client = CubeMetastoreClient.getInstance(testConf); Cube cube = (Cube) client.getCube(TEST_CUBE_NAME); - ReferencedDimAtrribute col = (ReferencedDimAtrribute) cube.getColumnByName("cdim2"); + BaseDimAttribute col = (BaseDimAttribute) cube.getColumnByName("cdim2"); assertNotNull(col); - final String query = "SELECT cycledim1.name, msr2 FROM testCube where " + TWO_DAYS_RANGE; + final String query = "SELECT cdimChain.name, msr2 FROM testCube where " + TWO_DAYS_RANGE; try { CubeQueryContext context = rewriteCtx(query, testConf); - System.out.println("TestJoinPathTimeRange: " + context.toHQL()); fail("Expected query to fail because of invalid column life"); } catch (LensException exc) { assertEquals(exc.getErrorCode(), LensCubeErrorCode.NO_JOIN_PATH.getLensErrorInfo().getErrorCode()); @@ -1595,10 +1589,9 @@ public class TestCubeRewriter extends TestQueryRewrite { Date oneWeekBack = DateUtils.addDays(TWODAYS_BACK, -7); // Alter cube.dim2 with an invalid column life - ReferencedDimAtrribute newDim2 = - new ReferencedDimAtrribute(new FieldSchema(col.getName(), "string", "invalid col"), col.getDisplayString(), - col.getReferences(), oneWeekBack, null, - col.getCost()); + BaseDimAttribute newDim2 = + new BaseDimAttribute(new FieldSchema(col.getName(), "string", "invalid col"), col.getDisplayString(), + oneWeekBack, null, col.getCost(), null); cube.alterDimension(newDim2); client.alterCube(TEST_CUBE_NAME, cube); String hql = rewrite(query, testConf); @@ -1678,7 +1671,7 @@ public class TestCubeRewriter extends TestQueryRewrite { @Test public void testSelectDimonlyJoinOnCube() throws Exception { - String query = "SELECT count (distinct citydim.name) from testCube where " + TWO_DAYS_RANGE; + String query = "SELECT count (distinct cubecity.name) from testCube where " + TWO_DAYS_RANGE; Configuration conf = new Configuration(getConf()); conf.setBoolean(DISABLE_AUTO_JOINS, false); String hql = rewrite(query, conf);
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java index af9daad..a8390ef 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestDenormalizationResolver.java @@ -65,12 +65,12 @@ public class TestDenormalizationResolver extends TestQueryRewrite { null); TestCubeRewriter.compareQueries(hqlQuery, expecteddim2big1); // with another table - hqlQuery = rewrite("select dim2big1, citydim.name, max(msr3)," + " msr2 from testCube" + " where " + hqlQuery = rewrite("select dim2big1, cubecity.name, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE_IT, conf); String expecteddim2big1WithAnotherTable = getExpectedQuery(cubeName, - "select testcube.dim2big1, citydim.name, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " - + getDbName() + "c1_citytable citydim " + "on testcube.cityid = citydim.id and citydim.dt = 'latest' ", null, - " group by testcube.dim2big1, citydim.name", null, + "select testcube.dim2big1, cubecity.name, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " + + getDbName() + "c1_citytable cubecity " + "on testcube.cityid = cubecity.id and cubecity.dt = 'latest' ", null, + " group by testcube.dim2big1, cubecity.name", null, getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"), null); TestCubeRewriter.compareQueries(hqlQuery, expecteddim2big1WithAnotherTable); @@ -84,70 +84,102 @@ public class TestDenormalizationResolver extends TestQueryRewrite { Configuration conf2 = new Configuration(conf); conf2.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2"); - hqlQuery = rewrite("select testdim3.name, dim2big1, max(msr3)," + " msr2 from testCube" + " where " + hqlQuery = rewrite("select dim3chain.name, dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE_IT, conf2); String expected = getExpectedQuery(cubeName, - "select testdim3.name, testcube.dim2big1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " - + getDbName() + "c2_testdim2tbl3 testdim2 " + "on testcube.dim2big1 = testdim2.bigid1" + " join " - + getDbName() + "c2_testdim3tbl testdim3 on " + "testdim2.testdim3id = testdim3.id", null, - " group by testdim3.name, (testcube.dim2big1)", null, + "select dim3chain.name, testcube.dim2big1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " + + getDbName() + "c2_testdim2tbl3 dim2chain " + "on testcube.dim2big1 = dim2chain.bigid1" + " join " + + getDbName() + "c2_testdim3tbl dim3chain on " + "dim2chain.testdim3id = dim3chain.id", null, + " group by dim3chain.name, (testcube.dim2big1)", null, getWhereForDailyAndHourly2daysWithTimeDim(cubeName, "it", "C2_summary4"), null); TestCubeRewriter.compareQueries(hqlQuery, expected); - hqlQuery = rewrite("select dim2big1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE_IT, conf2); + hqlQuery = rewrite("select dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE_IT, conf2); TestCubeRewriter.compareQueries(hqlQuery, expecteddim2big1); - hqlQuery = rewrite("select dim2big2, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE_IT, conf2); + hqlQuery = rewrite("select dim2big2, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE_IT, conf2); TestCubeRewriter.compareQueries(hqlQuery, expecteddim2big2); } @Test - public void testDenormsWithJoins() throws ParseException, LensException, HiveException, ClassNotFoundException { + public void testDenormsWithJoins() throws Exception { // all following queries use joins to get denorm fields Configuration tconf = new Configuration(this.conf); tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); - String hqlQuery = rewrite("select dim2big1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, + String hqlQuery = rewrite("select dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE, tconf); String expected = - getExpectedQuery(cubeName, "select testdim2.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " - + getDbName() + "c1_testdim2tbl2 testdim2 ON testcube.dim2 = " - + " testdim2.id and (testdim2.dt = 'latest') ", null, "group by (testdim2.bigid1)", null, + getExpectedQuery(cubeName, "select dim2chain.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " + + getDbName() + "c1_testdim2tbl2 dim2chain ON testcube.dim2 = " + + " dim2chain.id and (dim2chain.dt = 'latest') ", null, "group by (dim2chain.bigid1)", null, getWhereForDailyAndHourly2days(cubeName, "c1_summary2")); TestCubeRewriter.compareQueries(hqlQuery, expected); + } - hqlQuery = - rewrite("select testdim2.name, dim2big1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, tconf); - expected = + @Test + public void testDenormsWithJoinsWithChainFieldSelected() throws Exception { + Configuration tconf = new Configuration(this.conf); + tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); + String hqlQuery = rewrite("select dim2chain.name, dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE, + tconf); + String expected = getExpectedQuery(cubeName, - "select testdim2.name, testdim2.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " - + getDbName() + "c1_testdim2tbl2 testdim2 ON testcube.dim2 = " - + " testdim2.id and (testdim2.dt = 'latest') ", null, "group by testdim2.name, testdim2.bigid1", null, + "select dim2chain.name, dim2chain.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " + + getDbName() + "c1_testdim2tbl2 dim2chain ON testcube.dim2 = " + + " dim2chain.id and (dim2chain.dt = 'latest') ", null, "group by dim2chain.name, dim2chain.bigid1", null, getWhereForDailyAndHourly2days(cubeName, "c1_summary2")); TestCubeRewriter.compareQueries(hqlQuery, expected); + } - hqlQuery = - rewrite("select testdim2.name, dim2big1, max(msr3)," + " msr2 from testCube left outer join testdim2" - + " where " + TWO_DAYS_RANGE, tconf); - expected = + @Test + public void testDenormsWithJoinsWithChainFieldSelectedAndJoinTypeSpecified() throws Exception { + Configuration tconf = new Configuration(this.conf); + tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); + tconf.set(CubeQueryConfUtil.JOIN_TYPE_KEY, "LEFTOUTER"); + String hqlQuery = rewrite("select dim2chain.name, dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE, + tconf); + String expected = getExpectedQuery(cubeName, - "select testdim2.name, testdim2.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " left outer JOIN " - + getDbName() + "c1_testdim2tbl2 testdim2 ON testcube.dim2 = " - + " testdim2.id and (testdim2.dt = 'latest') ", null, "group by testdim2.name, testdim2.bigid1", null, + "select dim2chain.name, dim2chain.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " LEFT OUTER JOIN " + + getDbName() + "c1_testdim2tbl2 dim2chain ON testcube.dim2 = " + + " dim2chain.id and (dim2chain.dt = 'latest') ", null, "group by dim2chain.name, dim2chain.bigid1", null, getWhereForDailyAndHourly2days(cubeName, "c1_summary2")); TestCubeRewriter.compareQueries(hqlQuery, expected); + } - hqlQuery = - rewrite("select testdim3.name, dim2big1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, tconf); - expected = + @Test + public void testDenormsWithJoinsWithExplicitJoinSpecified() throws Exception { + Configuration tconf = new Configuration(this.conf); + tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); + // With explicit join specified, automatic join resolver is disabled. + // thus querying denorm variables will fail + getLensExceptionInRewrite("select testdim2.name, dim2big1, max(msr3), msr2 from testCube left outer join testdim2" + + " on testcube.dim2 = testdim2.id where " + TWO_DAYS_RANGE, tconf); + } + + @Test + public void testDenormsWithJoinsWithMergableChains() throws Exception { + Configuration tconf = new Configuration(this.conf); + tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); + String hqlQuery = + rewrite("select dim3chain.name, dim2big1, max(msr3), msr2 from testCube where " + TWO_DAYS_RANGE, + tconf); + String expected = getExpectedQuery(cubeName, - "select testdim3.name, testdim2.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " - + getDbName() + "c1_testdim2tbl3 testdim2 " - + "on testcube.dim2 = testdim2.id AND (testdim2.dt = 'latest')" + " join " + getDbName() - + "c1_testdim3tbl testdim3 on " + "testdim2.testdim3id = testdim3.id AND (testdim3.dt = 'latest')", - null, " group by testdim3.name, (testdim2.bigid1)", null, + "select dim3chain.name, dim2chain.bigid1, max(testcube.msr3), sum(testcube.msr2) FROM ", " JOIN " + + getDbName() + "c1_testdim2tbl3 dim2chain " + + "on testcube.dim2 = dim2chain.id AND (dim2chain.dt = 'latest')" + " join " + getDbName() + + "c1_testdim3tbl dim3chain on " + "dim2chain.testdim3id = dim3chain.id AND (dim3chain.dt = 'latest')", + null, " group by dim3chain.name, (dim2chain.bigid1)", null, getWhereForDailyAndHourly2days(cubeName, "c1_summary2")); TestCubeRewriter.compareQueries(hqlQuery, expected); + } + + @Test + public void testDenormsWithJoinsWithNoCandidateStorages() throws Exception { + Configuration tconf = new Configuration(this.conf); + tconf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1"); LensException e = getLensExceptionInRewrite( "select dim2big2, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, tconf); NoCandidateFactAvailableException ne = (NoCandidateFactAvailableException) e; @@ -208,9 +240,9 @@ public class TestDenormalizationResolver extends TestQueryRewrite { String hqlQuery = rewrite("select substrdim2big1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, tconf); String expected = - getExpectedQuery(cubeName, "select substr(testdim2.bigid1, 5), max(testcube.msr3), sum(testcube.msr2) FROM ", - " JOIN " + getDbName() + "c1_testdim2tbl2 testdim2 ON testcube.dim2 = " - + " testdim2.id and (testdim2.dt = 'latest') ", null, "group by substr(testdim2.bigid1, 5)", null, + getExpectedQuery(cubeName, "select substr(dim2chain.bigid1, 5), max(testcube.msr3), sum(testcube.msr2) FROM ", + " JOIN " + getDbName() + "c1_testdim2tbl2 dim2chain ON testcube.dim2 = " + + " dim2chain.id and (dim2chain.dt = 'latest') ", null, "group by substr(dim2chain.bigid1, 5)", null, getWhereForDailyAndHourly2days(cubeName, "c1_summary2")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -219,15 +251,15 @@ public class TestDenormalizationResolver extends TestQueryRewrite { public void testDimensionQuery() throws Exception { String hqlQuery = rewrite("select citydim.name, citydim.statename from" + " citydim", conf); - String joinExpr = " join " + getDbName() + "c1_statetable statedim on" - + " citydim.stateid = statedim.id and (statedim.dt = 'latest')"; - String expected = getExpectedQuery("citydim", "SELECT citydim.name, statedim.name FROM ", joinExpr, null, null, + String joinExpr = " join " + getDbName() + "c1_statetable citystate on" + + " citydim.stateid = citystate.id and (citystate.dt = 'latest')"; + String expected = getExpectedQuery("citydim", "SELECT citydim.name, citystate.name FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); hqlQuery = rewrite("select citydim.statename, citydim.name from" + " citydim", conf); - expected = getExpectedQuery("citydim", "SELECT statedim.name, citydim.name FROM ", joinExpr, null, null, + expected = getExpectedQuery("citydim", "SELECT citystate.name, citydim.name FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -261,9 +293,9 @@ public class TestDenormalizationResolver extends TestQueryRewrite { tConf.set(CubeQueryConfUtil.getValidStorageTablesKey("testFact2"), "C1_testFact2"); String hqlQuery = rewrite("select test_time_dim2, msr2 from testcube where " + TWO_DAYS_RANGE, tConf); String expected = - getExpectedQuery(cubeName, "select timehourchain.full_hour, sum(testcube.msr2) FROM ", " join " + getDbName() - + "c4_hourDimTbl timehourchain on testcube.test_time_dim_hour_id2 = timehourchain.id", null, - " group by timehourchain . full_hour ", null, + getExpectedQuery(cubeName, "select timehourchain2.full_hour, sum(testcube.msr2) FROM ", " join " + getDbName() + + "c4_hourDimTbl timehourchain2 on testcube.test_time_dim_hour_id2 = timehourchain2.id", null, + " group by timehourchain2 . full_hour ", null, getWhereForHourly2days("c1_testfact2")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -276,9 +308,9 @@ public class TestDenormalizationResolver extends TestQueryRewrite { tConf.set(CubeQueryConfUtil.getValidStorageTablesKey("testFact"), "C1_testFact"); String hqlQuery = rewrite("select test_time_dim2, msr2 from testcube where " + TWO_DAYS_RANGE, tConf); String expected = - getExpectedQuery(cubeName, "select timedatechain.full_date, sum(testcube.msr2) FROM ", " join " + getDbName() - + "c4_dayDimTbl timedatechain on testcube.test_time_dim_day_id2 = timedatechain.id", null, - " group by timedatechain . full_date ", null, + getExpectedQuery(cubeName, "select timedatechain2.full_date, sum(testcube.msr2) FROM ", " join " + getDbName() + + "c4_dayDimTbl timedatechain2 on testcube.test_time_dim_day_id2 = timedatechain2.id", null, + " group by timedatechain2 . full_date ", null, getWhereForDailyAndHourly2days(cubeName, "c1_testfact")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -302,7 +334,7 @@ public class TestDenormalizationResolver extends TestQueryRewrite { Configuration tConf = new Configuration(conf); tConf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, ""); CubeQueryContext cubeql = rewriteCtx("select citydim.zipcode, citydim.statename from" + " citydim", tConf); - Set<String> candidateDims = new HashSet<String>(); + Set<String> candidateDims = new HashSet<>(); for (CandidateDim cdim : cubeql.getCandidateDims().get(cubeql.getMetastoreClient().getDimension("citydim"))) { candidateDims.add(cdim.getName()); } @@ -314,10 +346,10 @@ public class TestDenormalizationResolver extends TestQueryRewrite { public void testDimensionQueryWithExpressionHavingDenormColumn() throws Exception { String hqlQuery = rewrite("select citydim.name, citydim.citystate from" + " citydim", conf); String joinExpr = - " join " + getDbName() + "c1_statetable statedim on" - + " citydim.stateid = statedim.id and (statedim.dt = 'latest')"; + " join " + getDbName() + "c1_statetable citystate on" + + " citydim.stateid = citystate.id and (citystate.dt = 'latest')"; String expected = - getExpectedQuery("citydim", "SELECT citydim.name, concat(citydim.name, \":\", statedim.name) FROM ", + getExpectedQuery("citydim", "SELECT citydim.name, concat(citydim.name, \":\", citystate.name) FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); } http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java index f48e1b7..669a8e9 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionContext.java @@ -50,7 +50,7 @@ public class TestExpressionContext extends TestQueryRewrite { public void testNestedExpressions() throws Exception { CubeQueryContext nestedExprQL = rewriteCtx("select nestedexpr from testCube where " + TWO_DAYS_RANGE, conf); Assert.assertNotNull(nestedExprQL.getExprCtx()); - List<String> expectedExpressions = new ArrayList<String>(); + List<String> expectedExpressions = new ArrayList<>(); expectedExpressions.add("avg(( testcube . roundedmsr2 ))"); expectedExpressions.add("avg(( testcube . equalsums ))"); expectedExpressions.add(" case when (( testcube . substrexpr ) = 'xyz' ) then avg(( testcube . msr5 ))" @@ -60,14 +60,14 @@ public class TestExpressionContext extends TestQueryRewrite { expectedExpressions.add("avg(((( testcube . msr3 ) + ( testcube . msr2 )) / 100 ))"); expectedExpressions.add(" case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg(( testcube . msr5 ))" + " when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then (avg(( testcube . msr4 )) / 100 ) end "); - expectedExpressions.add(" case when (substr(ascii(( testdim2 . name )), 3 ) = 'xyz' ) then" - + " avg(( testcube . msr5 )) when (substr(ascii(( testdim2 . name )), 3 ) = 'abc' ) then" + expectedExpressions.add(" case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" + + " avg(( testcube . msr5 )) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' ) then" + " (avg(( testcube . msr4 )) / 100 ) end "); expectedExpressions.add(" case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg((( testcube . msr2 )" + " + ( testcube . msr3 ))) when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then" + " (avg(( testcube . msr4 )) / 100 ) end "); - expectedExpressions.add(" case when (substr(ascii(( testdim2 . name )), 3 ) = 'xyz' ) then" - + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( testdim2 . name )), 3 ) = 'abc' )" + expectedExpressions.add(" case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" + + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' )" + " then (avg(( testcube . msr4 )) / 100 ) end "); expectedExpressions.add(" case when (( testcube . substrexpr ) = 'xyz' ) then avg((( testcube . msr2 )" + " + ( testcube . msr3 ))) when (( testcube . substrexpr ) = 'abc' ) then (avg(( testcube . msr4 )) / 100 )" @@ -75,11 +75,11 @@ public class TestExpressionContext extends TestQueryRewrite { expectedExpressions.add(" case when (substr(( testcube . dim1 ), 3 ) = 'xyz' ) then avg((( testcube . msr2 )" + " + ( testcube . msr3 ))) when (substr(( testcube . dim1 ), 3 ) = 'abc' ) then" + " (avg(( testcube . msr4 )) / 100 ) end "); - expectedExpressions.add(" case when (substr(ascii(( testdim2 . name )), 3 ) = 'xyz' ) then" - + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( testdim2 . name )), 3 ) = 'abc' )" + expectedExpressions.add(" case when (substr(ascii(( dim2chain . name )), 3 ) = 'xyz' ) then" + + " avg((( testcube . msr2 ) + ( testcube . msr3 ))) when (substr(ascii(( dim2chain . name )), 3 ) = 'abc' )" + " then (avg(( testcube . msr4 )) / 100 ) end "); - List<String> actualExpressions = new ArrayList<String>(); + List<String> actualExpressions = new ArrayList<>(); for (ExprSpecContext esc : nestedExprQL.getExprCtx().getExpressionContext("nestedexpr", "testcube").getAllExprs()) { actualExpressions.add(HQLParser.getString(esc.getFinalAST())); } @@ -92,14 +92,14 @@ public class TestExpressionContext extends TestQueryRewrite { CubeQueryContext nestedExprQL = rewriteCtx("select nestedExprWithTimes from testCube where " + TWO_DAYS_RANGE, conf); Assert.assertNotNull(nestedExprQL.getExprCtx()); - List<String> expectedExpressions = new ArrayList<String>(); + List<String> expectedExpressions = new ArrayList<>(); expectedExpressions.add("avg(( testcube . roundedmsr2 ))"); expectedExpressions.add("avg(( testcube . equalsums ))"); expectedExpressions.add("avg(round((( testcube . msr2 ) / 1000 )))"); expectedExpressions.add("avg((( testcube . msr3 ) + ( testcube . msr4 )))"); expectedExpressions.add("avg(((( testcube . msr3 ) + ( testcube . msr2 )) / 100 ))"); - List<String> actualExpressions = new ArrayList<String>(); + List<String> actualExpressions = new ArrayList<>(); for (ExprSpecContext esc : nestedExprQL.getExprCtx() .getExpressionContext("nestedexprwithtimes", "testcube").getAllExprs()) { actualExpressions.add(HQLParser.getString(esc.getFinalAST())); http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java index e77f919..6816fac 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestExpressionResolver.java @@ -56,10 +56,10 @@ public class TestExpressionResolver extends TestQueryRewrite { Assert.assertEquals(th.getErrorCode(), LensCubeErrorCode.COLUMN_NOT_FOUND.getLensErrorInfo().getErrorCode()); Assert.assertTrue(getLensExceptionErrorMessageInRewrite( - "select nocolexpr, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf).contains("nonexist")); + "select nocolexpr, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf).contains("nonexist")); Assert.assertTrue(getLensExceptionErrorMessageInRewrite( - "select invalidexpr, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf).contains("invalidexpr")); + "select invalidexpr, SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf).contains("invalidexpr")); th = getLensExceptionInRewrite("select invalidexpr, " + "SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf); @@ -194,56 +194,30 @@ public class TestExpressionResolver extends TestQueryRewrite { conf); String join1 = - " join " + getDbName() + "c1_citytable citydim" - + " on testcube.cityid = citydim.id and (citydim.dt = 'latest') "; + " join " + getDbName() + "c1_citytable cubecity" + + " on testcube.cityid = cubecity.id and (cubecity.dt = 'latest') "; String join2 = " join" + getDbName() - + "c1_statetable statedim on" + " testcube.stateid = statedim.id and (statedim.dt = 'latest')"; - String joinExpr; + + "c1_statetable cubestate on" + " testcube.stateid = cubestate.id and (cubestate.dt = 'latest')"; String expected = - getExpectedQuery(cubeName, "select concat(citydim.name, \":\", statedim.name)," + getExpectedQuery(cubeName, "select concat(cubecity.name, \":\", cubestate.name)," + " avg(testcube.msr1 + testcube.msr2) FROM ", join2 + join1, null, " and substr(testcube.dim1, 3) != 'XYZ'" - + " group by concat(citydim.name, \":\", statedim.name)", null, getWhereForHourly2days("C1_testfact2_raw")); + + " group by concat(cubecity.name, \":\", cubestate.name)", null, getWhereForHourly2days("C1_testfact2_raw")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @Test public void testExpressionInWhereWithJoinClausePassed() throws Exception { - - String hqlQuery = - rewrite("select cityAndState, avgmsr from testCube tc" + " join citydim cd join statedim sd " + " where " - + TWO_DAYS_RANGE + " and substrexpr != 'XYZ'", conf); - - String join1 = " inner join " + getDbName() + "c1_citytable cd" + " on tc.cityid = cd.id and (cd.dt = 'latest')"; - String join2 = " inner join" + getDbName() + "c1_statetable sd on" + " tc.stateid = sd.id and (sd.dt = 'latest')"; - String expected = - getExpectedQuery("tc", "select concat(cd.name, \":\", sd.name)," + " avg(tc.msr1 + tc.msr2) FROM ", - join2 + join1, null, " and substr(tc.dim1, 3) != 'XYZ'" + " group by concat(cd.name, \":\", sd.name)", null, - getWhereForHourly2days("tc", "C1_testfact2_raw")); - TestCubeRewriter.compareQueries(hqlQuery, expected); + assertLensExceptionInRewrite("select cityAndState, avgmsr from testCube tc join citydim cd join statedim sd where " + + TWO_DAYS_RANGE + " and substrexpr != 'XYZ'", conf, LensCubeErrorCode.NO_JOIN_CONDITION_AVAILABLE); } - //@Test + @Test public void testExpressionInJoinClause() throws Exception { // expression in join clause - /* - * This is broken right now as partial join conditions - * List<String> joinWhereConds = new ArrayList<String>(); - joinWhereConds.add(StorageUtil.getWherePartClause("dt", "statedim", StorageConstants.getPartitionsForLatest())); - String hqlQuery = - rewrite("select cityAndState, avgmsr from testCube " + " join citydim on substrexpr != 'XYZ' where " - + TWO_DAYS_RANGE, conf); - - String joinExpr = - "join" + getDbName() + "c1_statetable statedim on" + " testcube.stateid = statedim.id" - + " inner join " + getDbName() + "c1_citytable citydim" + " on testcube.cityid = citydim.id " - + " and substr(testcube.dim1, 3) != 'XYZ' and (citydim.dt = 'latest') "; - String expected = - getExpectedQuery(cubeName, "select concat(citydim.name, \":\", statedim.name)," - + " avg(testcube.msr1 + testcube.msr2) FROM ", joinExpr, null, - " group by concat(citydim.name, \":\", statedim.name)", joinWhereConds, - getWhereForHourly2days("C1_testfact2_raw")); - TestCubeRewriter.compareQueries(hqlQuery, expected);*/ + assertLensExceptionInRewrite("select cityAndState, avgmsr from testCube join citydim on substrexpr != 'XYZ' where " + + TWO_DAYS_RANGE, conf, LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE); } + @Test public void testExpressionInHaving() throws Exception { // expression with having clause @@ -318,8 +292,9 @@ public class TestExpressionResolver extends TestQueryRewrite { @Test public void testExpressionFieldWithOtherFields() throws Exception { - // select with expression which requires dimension tables. And there is a candidate, which is removed because - // the other fields which require the dimension tables as expression ones, are not reachable and + // select with expression which requires dimension tables. + // And there is a candidate, which is removed because + // required the dimension tables in the expression are not reachable and // the expression is not evaluable on the candidate. LensException th = getLensExceptionInRewrite("select cityStateName, msr2expr, msr5, msr15 from testCube where " @@ -360,15 +335,15 @@ public class TestExpressionResolver extends TestQueryRewrite { String joinExpr; String join1 = - " join " + getDbName() + "c1_ziptable zipdim on" + " citydim.zipcode = zipdim.code and (zipdim.dt = 'latest')"; - String join2 = " join " + getDbName() + "c1_statetable statedim on" - + " citydim.stateid = statedim.id and (statedim.dt = 'latest')"; + " join " + getDbName() + "c1_ziptable cityzip on" + " citydim.zipcode = cityzip.code and (cityzip.dt = 'latest')"; + String join2 = " join " + getDbName() + "c1_statetable citystate on" + + " citydim.stateid = citystate.id and (citystate.dt = 'latest')"; String join3 = " join " + getDbName() - + "c1_countrytable countrydim on" + " statedim.countryid = countrydim.id"; + + "c1_countrytable citycountry on" + " citystate.countryid = citycountry.id"; joinExpr = join2 + join3 + join1; String expected = - getExpectedQuery("citydim", "SELECT citydim.name, concat((citydim.name), \":\", (statedim.name )," - + " \":\",(countrydim.name), \":\" , ( zipdim . code )) FROM ", joinExpr, null, null, "c1_citytable", true); + getExpectedQuery("citydim", "SELECT citydim.name, concat((citydim.name), \":\", (citystate.name )," + + " \":\",(citycountry.name), \":\" , ( cityzip . code )) FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -399,15 +374,15 @@ public class TestExpressionResolver extends TestQueryRewrite { String joinExpr; String join1 = - " join " + getDbName() + "c1_ziptable zipdim on" + " citydim.zipcode = zipdim.code and (zipdim.dt = 'latest')"; - String join2 = " join " + getDbName() + "c1_statetable statedim on" - + " citydim.stateid = statedim.id and (statedim.dt = 'latest')"; + " join " + getDbName() + "c1_ziptable cityzip on" + " citydim.zipcode = cityzip.code and (cityzip.dt = 'latest')"; + String join2 = " join " + getDbName() + "c1_statetable citystate on" + + " citydim.stateid = citystate.id and (citystate.dt = 'latest')"; String join3 = " join " + getDbName() - + "c1_countrytable countrydim on" + " statedim.countryid = countrydim.id"; + + "c1_countrytable citycountry on" + " citystate.countryid = citycountry.id"; joinExpr = join2 + join3 + join1; String expected = - getExpectedQuery("citydim", "SELECT citydim.name as `cname`, concat((citydim.name), \":\", (statedim.name )," - + " \":\",(countrydim.name), \":\" , ( zipdim . code )) as `caddr` FROM ", joinExpr, null, null, + getExpectedQuery("citydim", "SELECT citydim.name as `cname`, concat((citydim.name), \":\", (citystate.name )," + + " \":\",(citycountry.name), \":\" , ( cityzip . code )) as `caddr` FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -418,14 +393,14 @@ public class TestExpressionResolver extends TestQueryRewrite { String joinExpr = "" - + " join " + getDbName() + "c1_statetable statedim on ct.stateid = statedim.id and (statedim.dt = 'latest')" - + " join " + getDbName() + "c1_countrytable countrydim on statedim.countryid = countrydim.id" - + " join " + getDbName() + "c1_ziptable zipdim on ct.zipcode = zipdim.code and (zipdim.dt = 'latest')" + + " join " + getDbName() + "c1_statetable citystate on ct.stateid = citystate.id and (citystate.dt = 'latest')" + + " join " + getDbName() + "c1_countrytable citycountry on citystate.countryid = citycountry.id" + + " join " + getDbName() + "c1_ziptable cityzip on ct.zipcode = cityzip.code and (cityzip.dt = 'latest')" + ""; String expected = - getExpectedQuery("ct", "SELECT ct.name, concat((ct.name), \":\", (statedim.name )," - + " \":\",(countrydim.name), \":\" , ( zipdim . code )) FROM ", joinExpr, null, null, "c1_citytable", true); + getExpectedQuery("ct", "SELECT ct.name, concat((ct.name), \":\", (citystate.name )," + + " \":\",(citycountry.name), \":\" , ( cityzip . code )) FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -444,14 +419,13 @@ public class TestExpressionResolver extends TestQueryRewrite { String joinExpr = "" - + " join " + getDbName() + "c1_statetable statedim on ct.stateid = statedim.id and (statedim.dt = 'latest')" - + " join " + getDbName() + "c1_countrytable countrydim on statedim.countryid = countrydim.id" - + " join " + getDbName() + "c1_ziptable zipdim on ct.zipcode = zipdim.code and (zipdim.dt = 'latest')" - + ""; + + " join " + getDbName() + "c1_statetable citystate on ct.stateid = citystate.id and (citystate.dt = 'latest')" + + " join " + getDbName() + "c1_countrytable citycountry on citystate.countryid = citycountry.id" + + " join " + getDbName() + "c1_ziptable cityzip on ct.zipcode = cityzip.code and (cityzip.dt = 'latest')"; String expected = - getExpectedQuery("ct", "SELECT ct.name as `cname`, concat((ct.name), \":\", (statedim.name )," - + " \":\",(countrydim.name), \":\" , ( zipdim . code )) as `caddr` FROM ", joinExpr, null, null, + getExpectedQuery("ct", "SELECT ct.name as `cname`, concat((ct.name), \":\", (citystate.name )," + + " \":\",(citycountry.name), \":\" , ( cityzip . code )) as `caddr` FROM ", joinExpr, null, null, "c1_citytable", true); TestCubeRewriter.compareQueries(hqlQuery, expected); }