Repository: lens Updated Branches: refs/heads/lens-1381 4af769ee3 -> 975fa2c2b
http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/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 2a9be16..cf937a8 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 @@ -24,6 +24,7 @@ import static org.apache.lens.cube.metadata.UpdatePeriod.*; import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.*; import static org.apache.lens.cube.parse.CubeQueryConfUtil.*; import static org.apache.lens.cube.parse.CubeTestSetup.*; + import static org.testng.Assert.*; import java.text.DateFormat; @@ -51,6 +52,7 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import lombok.extern.slf4j.Slf4j; @@ -102,14 +104,13 @@ public class TestCubeRewriter extends TestQueryRewrite { System.out.println("expected " + expected); compareQueries(rewrittenQuery.toHQL(), expected); - //TODO union : Fact names are different. Check after MaXCoveringFactResolver. //test with msr2 on different fact -// rewrittenQuery = rewriteCtx("select SUM(msr2) from testCube where " + timeRangeString, conf); -// expected = "select SUM((testCube.msr2)) as `sum(msr2)` from TestQueryRewrite.c0_testFact testcube" -// + " WHERE ((( testcube . dt ) between '" + from + "' and '" + to + "' ))"; -// System.out.println("rewrittenQuery.toHQL() " + rewrittenQuery.toHQL()); -// System.out.println("expected " + expected); -// compareQueries(rewrittenQuery.toHQL(), expected); + rewrittenQuery = rewriteCtx("select SUM(msr2) from testCube where " + timeRangeString, conf); + expected = "select SUM((testCube.msr2)) as `sum(msr2)` from TestQueryRewrite.c2_testfact testcube" + + " WHERE ((( testcube . dt ) between '" + from + "' and '" + to + "' ))"; + System.out.println("rewrittenQuery.toHQL() " + rewrittenQuery.toHQL()); + System.out.println("expected " + expected); + compareQueries(rewrittenQuery.toHQL(), expected); //from date 6 days back timeRangeString = getTimeRangeString(DAILY, -6, 0, qFmt); @@ -143,7 +144,6 @@ public class TestCubeRewriter extends TestQueryRewrite { // assertNotNull(rewrittenQuery.getNonExistingParts()); } - //TODO union: Verify after MaxCoveringFactResolver changes. @Test public void testMaxCoveringFact() throws Exception { Configuration conf = getConf(); @@ -189,16 +189,14 @@ public class TestCubeRewriter extends TestQueryRewrite { assertEquals(th.getErrorCode(), LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo().getErrorCode()); NoCandidateFactAvailableException ne = (NoCandidateFactAvailableException) th; PruneCauses.BriefAndDetailedError pruneCauses = ne.getJsonMessage(); - //TODO union : check the error code. Its coming as "Columns [msr2] are not present in any table" - //TODO union : Need to check partition resolution flow in StorageTableResolver. -// int endIndex = MISSING_PARTITIONS.errorFormat.length() - 3; -// assertEquals( -// pruneCauses.getBrief().substring(0, endIndex), -// MISSING_PARTITIONS.errorFormat.substring(0, endIndex) -// ); -// assertEquals(pruneCauses.getDetails().get("testfact").size(), 1); -// assertEquals(pruneCauses.getDetails().get("testfact").iterator().next().getCause(), -// MISSING_PARTITIONS); + int endIndex = MISSING_PARTITIONS.errorFormat.length() - 3; + assertEquals( + pruneCauses.getBrief().substring(0, endIndex), + MISSING_PARTITIONS.errorFormat.substring(0, endIndex) + ); + assertEquals(pruneCauses.getDetails().get("c1_testfact").size(), 1); + assertEquals(pruneCauses.getDetails().get("c1_testfact").iterator().next().getCause(), + MISSING_PARTITIONS); } @Test @@ -209,9 +207,10 @@ public class TestCubeRewriter extends TestQueryRewrite { getExpectedQuery(DERIVED_CUBE_NAME, "select sum(derivedCube.msr2) as `sum(msr2)` FROM ", null, null, getWhereForDailyAndHourly2days(DERIVED_CUBE_NAME, "C2_testfact")); compareQueries(rewrittenQuery.toHQL(), expected); - System.out.println("Non existing parts:" + rewrittenQuery.getNonExistingParts()); - //TODO union: Check this in a better way. -// assertNotNull(rewrittenQuery.getNonExistingParts()); + + System.out.println("Non existing parts:" + ((StorageCandidate) rewrittenQuery.getCandidates().iterator().next()) + .getNonExistingPartitions()); + assertNotNull(((StorageCandidate) rewrittenQuery.getCandidates().iterator().next()).getNonExistingPartitions()); LensException th = getLensExceptionInRewrite( "select SUM(msr4) from derivedCube where " + TWO_DAYS_RANGE, getConf()); @@ -414,8 +413,8 @@ public class TestCubeRewriter extends TestQueryRewrite { "select cubestate.name, cubestate.countryid, msr2 from" + " testCube" + " where cubestate.countryid = 5 and " + TWO_DAYS_RANGE, conf); expected = - getExpectedQuery(TEST_CUBE_NAME, "select cubestate.name as `name`, " + - "cubestate.countryid as `countryid`, sum(testcube.msr2) as `msr2`" + " FROM ", + getExpectedQuery(TEST_CUBE_NAME, "select cubestate.name as `name`, " + + "cubestate.countryid as `countryid`, sum(testcube.msr2) as `msr2`" + " FROM ", " JOIN " + getDbName() + "c3_statetable_partitioned cubestate ON" + " testCube.stateid = cubestate.id and cubestate.dt = 'latest'", "cubestate.countryid=5", @@ -448,54 +447,51 @@ public class TestCubeRewriter extends TestQueryRewrite { getConfWithStorages("C2")); compareQueries(hqlQuery, expected); - //TODO union : Wrong fact selected. Verify after MaxCoveringFactResolver changes. // q2 -// hqlQuery = -// 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()); -// expected = -// getExpectedQuery(TEST_CUBE_NAME, -// "select statedim.name as `name`," + " sum(testcube.msr2) as `SUM(msr2)` FROM ", "INNER 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 and zipdim.dt='latest'", null, " group by" + " statedim.name ", -// null, -// getWhereForHourly2days(TEST_CUBE_NAME, "C1_testfact2")); -// compareQueries(hqlQuery, expected); - - //TODO union : Wrong fact selected. Verify after MaxCoveringFactResolver changes. + hqlQuery = + 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()); + expected = + getExpectedQuery(TEST_CUBE_NAME, + "select statedim.name as `name`," + " sum(testcube.msr2) as `SUM(msr2)` FROM ", "INNER 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 and zipdim.dt='latest'", null, " group by" + " statedim.name ", + null, + getWhereForHourly2days(TEST_CUBE_NAME, "C1_testfact2")); + compareQueries(hqlQuery, expected); + // q3 -// hqlQuery = -// 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()); -// expected = -// getExpectedQuery("tc", "select st.name as `name`," + " sum(tc.msr2) as `sum(msr2)` FROM ", -// " INNER JOIN " + getDbName() -// + "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 and zt.dt='latest'", null, " group by" + " st.name ", null, -// getWhereForHourly2days("tc", "C1_testfact2")); -// compareQueries(hqlQuery, expected); - - //TODO union : Wrong fact selected. Verify after MaxCoveringFactResolver changes. + hqlQuery = + 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()); + expected = + getExpectedQuery("tc", "select st.name as `name`," + " sum(tc.msr2) as `sum(msr2)` FROM ", + " INNER JOIN " + getDbName() + + "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 and zt.dt='latest'", null, " group by" + " st.name ", null, + getWhereForHourly2days("tc", "C1_testfact2")); + compareQueries(hqlQuery, expected); + // q4 -// hqlQuery = -// rewrite("select citydim.name, SUM(msr2) from" + " testCube" -// + " left outer join citydim on testCube.cityid = citydim.id" -// + " left outer join zipdim on citydim.zipcode = zipdim.code" + " where " + TWO_DAYS_RANGE, getConf()); -// expected = -// getExpectedQuery(TEST_CUBE_NAME, "select citydim.name as `name`," + " sum(testcube.msr2) as `sum(msr2)`FROM ", -// " LEFT OUTER JOIN " -// + getDbName() + "c1_citytable citydim ON" + " testCube.cityid = citydim.id and (citydim.dt = 'latest') " -// + " LEFT OUTER JOIN " + getDbName() + "c1_ziptable" + " zipdim ON citydim.zipcode = zipdim.code AND " -// + "(zipdim.dt = 'latest')", null, " group by" + " citydim.name ", null, -// getWhereForHourly2days(TEST_CUBE_NAME, "C1_testfact2")); -// compareQueries(hqlQuery, expected); + hqlQuery = + rewrite("select citydim.name, SUM(msr2) from" + " testCube" + + " left outer join citydim on testCube.cityid = citydim.id" + + " left outer join zipdim on citydim.zipcode = zipdim.code" + " where " + TWO_DAYS_RANGE, getConf()); + expected = + getExpectedQuery(TEST_CUBE_NAME, "select citydim.name as `name`," + " sum(testcube.msr2) as `sum(msr2)`FROM ", + " LEFT OUTER JOIN " + + getDbName() + "c1_citytable citydim ON" + " testCube.cityid = citydim.id and (citydim.dt = 'latest') " + + " LEFT OUTER JOIN " + getDbName() + "c1_ziptable" + " zipdim ON citydim.zipcode = zipdim.code AND " + + "(zipdim.dt = 'latest')", null, " group by" + " citydim.name ", null, + getWhereForHourly2days(TEST_CUBE_NAME, "C1_testfact2")); + compareQueries(hqlQuery, expected); hqlQuery = rewrite("select SUM(msr2) from testCube" + " join countrydim on testCube.countryid = countrydim.id" + " where " @@ -634,8 +630,8 @@ public class TestCubeRewriter extends TestQueryRewrite { Configuration conf = getConf(); conf.set(DRIVER_SUPPORTED_STORAGES, "C2"); - String hqlQuery = - rewrite("select name, SUM(msr2) from" + " testCube join citydim on testCube.cityid = citydim.id where " + String hqlQuery = + rewrite("select name, SUM(msr2) from" + " testCube join citydim on testCube.cityid = citydim.id where " + TWO_DAYS_RANGE, conf); String expected = getExpectedQuery(TEST_CUBE_NAME, "select citydim.name as `name`, sum(testcube.msr2) as `sum(msr2)` FROM " @@ -955,7 +951,6 @@ public class TestCubeRewriter extends TestQueryRewrite { /* The test is to check no failure on partial data when the flag FAIL_QUERY_ON_PARTIAL_DATA is not set */ - // TODO union : check after MaxCoveringFactResolver @Test public void testQueryWithMeasureWithDataCompletenessTagWithNoFailureOnPartialData() throws ParseException, LensException { @@ -968,24 +963,22 @@ public class TestCubeRewriter extends TestQueryRewrite { compareQueries(hqlQuery, expected); } - // TODO union : check after MaxCoveringFactResolver @Test public void testQueryWithMeasureWithDataCompletenessPresentInMultipleFacts() throws ParseException, - LensException { + LensException { /*In this query a measure is used which is present in two facts with different %completeness. While resolving the facts, the fact with the higher dataCompletenessFactor gets picked up.*/ Configuration conf = getConf(); conf.setStrings(CubeQueryConfUtil.COMPLETENESS_CHECK_PART_COL, "dt"); String hqlQuery = rewrite("select SUM(msr9) from basecube where " + TWO_DAYS_RANGE, conf); String expected = getExpectedQuery("basecube", "select sum(basecube.msr9) as `sum(msr9)` FROM ", null, null, - getWhereForHourly2days("basecube", "c1_testfact5_raw_base")); + getWhereForHourly2days("basecube", "c1_testfact5_raw_base")); compareQueries(hqlQuery, expected); } - // TODO union : check after MaxCoveringFactResolver - @Test + @Test public void testCubeWhereQueryWithMeasureWithDataCompletenessAndFailIfPartialDataFlagSet() throws ParseException, - LensException { + LensException { /*In this query a measure is used for which dataCompletenessTag is set and the flag FAIL_QUERY_ON_PARTIAL_DATA is set. The partitions for the queried range are present but some of the them have incomplete data. So, the query throws NO_CANDIDATE_FACT_AVAILABLE Exception*/ @@ -993,15 +986,16 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setStrings(CubeQueryConfUtil.COMPLETENESS_CHECK_PART_COL, "dt"); conf.setBoolean(CubeQueryConfUtil.FAIL_QUERY_ON_PARTIAL_DATA, true); - LensException e = getLensExceptionInRewrite("select SUM(msr9) from basecube where " + TWO_DAYS_RANGE, conf); + LensException e = getLensExceptionInRewrite("select SUM(msr9) from basecube where " + + TWO_DAYS_RANGE, conf); assertEquals(e.getErrorCode(), LensCubeErrorCode.NO_CANDIDATE_FACT_AVAILABLE.getLensErrorInfo().getErrorCode()); NoCandidateFactAvailableException ne = (NoCandidateFactAvailableException) e; PruneCauses.BriefAndDetailedError pruneCauses = ne.getJsonMessage(); /*Since the Flag FAIL_QUERY_ON_PARTIAL_DATA is set, and thhe queried fact has incomplete data, hence, we expect the prune cause to be INCOMPLETE_PARTITION. The below check is to validate this.*/ assertEquals(pruneCauses.getBrief().substring(0, INCOMPLETE_PARTITION.errorFormat.length() - 3), - INCOMPLETE_PARTITION.errorFormat.substring(0, - INCOMPLETE_PARTITION.errorFormat.length() - 3), pruneCauses.getBrief()); + INCOMPLETE_PARTITION.errorFormat.substring(0, + INCOMPLETE_PARTITION.errorFormat.length() - 3), pruneCauses.getBrief()); } @Test @@ -1021,7 +1015,8 @@ public class TestCubeRewriter extends TestQueryRewrite { MISSING_PARTITIONS.errorFormat.length() - 3), pruneCauses.getBrief()); Set<String> expectedSet = - Sets.newTreeSet(Arrays.asList("summary1", "summary2", "testfact2_raw", "summary3", "testfact")); + Sets.newTreeSet(Arrays.asList("c1_testfact2_raw", "c1_summary3", "c1_summary2", + "c1_summary1", "c2_testfact", "c1_testfact")); boolean missingPartitionCause = false; for (String key : pruneCauses.getDetails().keySet()) { Set<String> actualKeySet = Sets.newTreeSet(Splitter.on(',').split(key)); @@ -1033,12 +1028,13 @@ public class TestCubeRewriter extends TestQueryRewrite { } assertTrue(missingPartitionCause, MISSING_PARTITIONS + " error does not occur for facttables set " + expectedSet + " Details :" + pruneCauses.getDetails()); - assertEquals(pruneCauses.getDetails().get("testfactmonthly").iterator().next().getCause(), - NO_FACT_UPDATE_PERIODS_FOR_GIVEN_RANGE); - assertEquals(pruneCauses.getDetails().get("testfact2").iterator().next().getCause(), + assertEquals(pruneCauses.getDetails().get("c1_testfact2").iterator().next().getCause(), MISSING_PARTITIONS); - assertEquals(pruneCauses.getDetails().get("cheapfact").iterator().next().getCause(), - NO_CANDIDATE_STORAGES); + /* + assertEquals(pruneCauses.getDetails().get("c4_testfact,c3_testfact,c3_testfact2_raw,c4_testfact2," + + "c99_cheapfact,c5_testfact").iterator().next().getCause(), + UNSUPPORTED_STORAGE); + CandidateTablePruneCause cheapFactPruneCauses = pruneCauses.getDetails().get("cheapfact").iterator().next(); assertEquals(cheapFactPruneCauses.getDimStoragePruningCauses().get("c0"), CandidateTablePruneCause.CandidateTablePruneCode.TIME_RANGE_NOT_ANSWERABLE); @@ -1046,6 +1042,7 @@ public class TestCubeRewriter extends TestQueryRewrite { CandidateTablePruneCause.CandidateTablePruneCode.UNSUPPORTED_STORAGE); assertEquals(pruneCauses.getDetails().get("summary4").iterator().next().getCause(), TIMEDIM_NOT_SUPPORTED); assertTrue(pruneCauses.getDetails().get("summary4").iterator().next().getUnsupportedTimeDims().contains("d_time")); + */ } @Test @@ -1063,18 +1060,19 @@ public class TestCubeRewriter extends TestQueryRewrite { @Test public void testNoCandidateDimAvailableExceptionCompare() throws Exception { - //Max cause COLUMN_NOT_FOUND, Ordinal 9 + //Max cause COLUMN_NOT_FOUND, Ordinal 2 PruneCauses<CubeDimensionTable> pr1 = new PruneCauses<CubeDimensionTable>(); pr1.addPruningMsg(new CubeDimensionTable(new Table("test", "citydim")), - CandidateTablePruneCause.columnNotFound("test1", "test2", "test3")); + CandidateTablePruneCause.columnNotFound( + CandidateTablePruneCause.CandidateTablePruneCode.COLUMN_NOT_FOUND, "test1", "test2", "test3")); NoCandidateDimAvailableException ne1 = new NoCandidateDimAvailableException(pr1); - //Max cause EXPRESSION_NOT_EVALUABLE, Ordinal 6 + //Max cause EXPRESSION_NOT_EVALUABLE, Ordinal 14 PruneCauses<CubeDimensionTable> pr2 = new PruneCauses<CubeDimensionTable>(); pr2.addPruningMsg(new CubeDimensionTable(new Table("test", "citydim")), CandidateTablePruneCause.expressionNotEvaluable("testexp1", "testexp2")); NoCandidateDimAvailableException ne2 = new NoCandidateDimAvailableException(pr2); - assertEquals(ne1.compareTo(ne2), 3); + assertEquals(ne1.compareTo(ne2), -12); } @Test @@ -1261,8 +1259,8 @@ public class TestCubeRewriter extends TestQueryRewrite { " testcube.cityid > 100 ", " group by testcube.cityid having" + " sum(testCube.msr2) < 1000", getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")), getExpectedQuery(TEST_CUBE_NAME, "SELECT testCube.cityid as `cityid`, sum(testCube.msr2) as `msr2`" + " FROM ", - " testcube.cityid > 100 ", " group by testcube.cityid having" - + " sum(testCube.msr2) < 1000 order by testCube.cityid asc", + " testcube.cityid > 100 ", " group by testCube.cityid having" + + " sum(testCube.msr2) < 1000 order by cityid asc", getWhereForDailyAndHourly2days(TEST_CUBE_NAME, "C2_testfact")), }; Configuration conf = getConf(); @@ -1319,8 +1317,8 @@ public class TestCubeRewriter extends TestQueryRewrite { getConf()); expected = getExpectedQuery(TEST_CUBE_NAME, "select testcube.dim1 as `dim1`, testcube,dim2 as `dim2`, " - + "count(testcube.msr4) as `count(msr4)`, sum(testcube.msr2) as `sum(msr2)`, " + - "max(testcube.msr3) as `msr3` FROM ", null, " group by testcube.dim1, testcube.dim2", + + "count(testcube.msr4) as `count(msr4)`, sum(testcube.msr2) as `sum(msr2)`, " + + "max(testcube.msr3) as `msr3` FROM ", null, " group by testcube.dim1, testcube.dim2", getWhereForDailyAndHourly2daysWithTimeDim(TEST_CUBE_NAME, "it", "C2_summary2"), null); compareQueries(hqlQuery, expected); @@ -1390,8 +1388,6 @@ public class TestCubeRewriter extends TestQueryRewrite { compareQueries(hqlQuery, expected); } - // TODO union : Uncomment below test after deleting CandidateFact - /* @Test public void testLookAhead() throws Exception { @@ -1400,15 +1396,15 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setClass(CubeQueryConfUtil.TIME_RANGE_WRITER_CLASS, AbridgedTimeRangeWriter.class, TimeRangeWriter.class); CubeQueryContext ctx = rewriteCtx("select dim1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE_IT, conf); - //assertEquals(ctx.candidateFacts.size(), 1); - //CandidateFact candidateFact = ctx.candidateFacts.iterator().next(); - Set<FactPartition> partsQueried = new TreeSet<>(candidateFact.getPartsQueried()); + assertEquals(ctx.getCandidates().size(), 1); + Candidate candidate = ctx.getCandidates().iterator().next(); + Set<FactPartition> partsQueried = new TreeSet<>(((StorageCandidate)candidate).getParticipatingPartitions()); Date ceilDay = DAILY.getCeilDate(getDateWithOffset(DAILY, -2)); Date nextDay = DateUtils.addDays(ceilDay, 1); Date nextToNextDay = DateUtils.addDays(nextDay, 1); HashSet<String> storageTables = Sets.newHashSet(); - for (String storageTable : candidateFact.getStorageTables()) { - storageTables.add(storageTable.split("\\.")[1]); + for (StorageCandidate sc : CandidateUtil.getStorageCandidates(candidate)) { + storageTables.add(sc.getName()); } TreeSet<FactPartition> expectedPartsQueried = Sets.newTreeSet(); for (TimePartition p : Iterables.concat( @@ -1429,11 +1425,11 @@ public class TestCubeRewriter extends TestQueryRewrite { conf.setInt(CubeQueryConfUtil.LOOK_AHEAD_PT_PARTS_PFX, 3); ctx = rewriteCtx("select dim1, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE_IT, conf); - partsQueried = new TreeSet<>(ctx.candidateFacts.iterator().next().getPartsQueried()); + partsQueried = new TreeSet<>(((StorageCandidate)ctx.getCandidates().iterator().next()) + .getParticipatingPartitions()); // pt does not exist beyond 1 day. So in this test, max look ahead possible is 3 assertEquals(partsQueried, expectedPartsQueried); } - */ @Test public void testCubeQueryWithMultipleRanges() throws Exception { @@ -1495,7 +1491,6 @@ public class TestCubeRewriter extends TestQueryRewrite { compareQueries(hqlQuery, expected); } - //TODO union : Wrong fact selected. Verify after MaxCoveringFactResolver changes. @Test public void testJoinWithMultipleAliases() throws Exception { String cubeQl = @@ -1570,7 +1565,6 @@ public class TestCubeRewriter extends TestQueryRewrite { } } - //TODO union: Verify after MaxCoveringFactResolver changes. @Test public void testTimeDimensionAndPartCol() throws Exception { // Test if time dimension is replaced with partition column http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/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 a3bb77c..fb803a2 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 @@ -191,38 +191,44 @@ public class TestDenormalizationResolver extends TestQueryRewrite { "select dim2big2, max(msr3)," + " msr2 from testCube" + " where " + TWO_DAYS_RANGE, tconf); NoCandidateFactAvailableException ne = (NoCandidateFactAvailableException) e; PruneCauses.BriefAndDetailedError error = ne.getJsonMessage(); - Assert.assertEquals(error.getBrief(), CandidateTablePruneCode.NO_CANDIDATE_STORAGES.errorFormat); + Assert.assertEquals(error.getBrief(), CandidateTablePruneCode.UNSUPPORTED_STORAGE.errorFormat); HashMap<String, List<CandidateTablePruneCause>> details = error.getDetails(); for (Map.Entry<String, List<CandidateTablePruneCause>> entry : details.entrySet()) { - if (entry.getValue().equals(Arrays.asList(CandidateTablePruneCause.columnNotFound("dim2big2")))) { + if (entry.getValue().equals(Arrays.asList(CandidateTablePruneCause.columnNotFound( + CandidateTablePruneCode.COLUMN_NOT_FOUND, "dim2big2")))) { Set<String> expectedKeySet = - Sets.newTreeSet(Splitter.on(',').split("summary1,cheapfact,testfactmonthly,testfact2,testfact")); + Sets.newTreeSet(Splitter.on(',').split("c1_summary1, c1_testfact,c1_testfact2")); Assert.assertTrue(expectedKeySet.equals(Sets.newTreeSet(Splitter.on(',').split(entry.getKey())))); } if (entry.getValue().equals( Arrays.asList(new CandidateTablePruneCause(CandidateTablePruneCode.INVALID_DENORM_TABLE)))) { Set<String> expectedKeySet = - Sets.newTreeSet(Splitter.on(',').split("summary2,testfact2_raw,summary3")); + Sets.newTreeSet(Splitter.on(',').split("c2_summary2, c2_summary3, c1_testfact2_raw, " + + "c3_testfact2_raw, c1_summary3,c1_summary2")); Assert.assertTrue(expectedKeySet.equals(Sets.newTreeSet(Splitter.on(',').split(entry.getKey())))); } - if (entry.getKey().equals("testfact_continuous")) { + if (entry.getKey().equals("c0_testfact_continuous")) { Assert.assertTrue(entry.getValue().equals( - Arrays.asList(CandidateTablePruneCause.columnNotFound("msr2", "msr3"))) - || entry.getValue().equals(Arrays.asList(CandidateTablePruneCause.columnNotFound("msr3", "msr2")))); + Arrays.asList(CandidateTablePruneCause.columnNotFound(CandidateTablePruneCode.COLUMN_NOT_FOUND, + "msr2", "msr3"))) + || entry.getValue().equals(Arrays.asList(CandidateTablePruneCause.columnNotFound( + CandidateTablePruneCode.COLUMN_NOT_FOUND, "msr3", "msr2")))); } - if (entry.getKey().equals("summary4")) { + if (entry.getKey().equals("c2_summary2, c2_summary3, c2_summary4, c4_testfact, c2_summary1, c3_testfact, " + + "c3_testfact2_raw, c4_testfact2, c99_cheapfact, c5_testfact, c0_cheapfact, " + + "c2_testfact, c2_testfactmonth, c0_testfact")) { List<CandidateTablePruneCause> expectedPruneCauses = Arrays.asList(CandidateTablePruneCause.noCandidateStoragesForDimtable( - new HashMap<String, CandidateTablePruneCode>() { - { - put("C2", CandidateTablePruneCode.UNSUPPORTED_STORAGE); - } - })); + new HashMap<String, CandidateTablePruneCode>() { + { + put("C2", CandidateTablePruneCode.UNSUPPORTED_STORAGE); + } + })); Assert.assertTrue(entry.getValue().equals(expectedPruneCauses)); } } @@ -279,23 +285,21 @@ public class TestDenormalizationResolver extends TestQueryRewrite { "No dimension table has the queried columns " + "for citydim, columns: [name, statename, nocandidatecol]"); } - // TODO union : Fix testcase after deleting CandidateFact - /* @Test public void testCubeQueryWithTwoRefCols() throws Exception { Configuration tConf = new Configuration(conf); tConf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, ""); CubeQueryContext cubeql = rewriteCtx("select dim2, test_time_dim2 from testcube where " + TWO_DAYS_RANGE, tConf); - Set<String> candidateFacts = new HashSet<String>(); - for (CandidateFact cfact : cubeql.getCandidateFacts()) { - candidateFacts.add(cfact.getName().toLowerCase()); + Set<String> candidates = new HashSet<String>(); + for (Candidate cand : cubeql.getCandidates()) { + candidates.add(cand.toString()); } // testfact contains test_time_dim_day_id, but not dim2 - it should have been removed. - Assert.assertFalse(candidateFacts.contains("testfact")); + Assert.assertFalse(candidates.contains("testfact")); // summary2 contains dim2, but not test_time_dim2 - it should have been removed. - Assert.assertFalse(candidateFacts.contains("summary2")); + Assert.assertFalse(candidates.contains("summary2")); } -*/ + @Test public void testCubeQueryWithHourDimJoin() throws Exception { Configuration tConf = new Configuration(conf); @@ -336,8 +340,8 @@ public class TestDenormalizationResolver extends TestQueryRewrite { + "c1_citytable citydim on basecube.cityid = citydim.id and (citydim.dt = 'latest') " + " join " + getDbName() + "c1_ziptable cityzip on citydim.zipcode = cityzip.code and (cityzip.dt = 'latest')"; String expected = - getExpectedQuery("basecube", "SELECT (cityzip.code) as `code`, (basecube.dim22) as `dim22`, " + - "(basecube.msr11) as `msr11` FROM ", joinExpr, null, null, null, + getExpectedQuery("basecube", "SELECT (cityzip.code) as `code`, (basecube.dim22) as `dim22`, " + + "(basecube.msr11) as `msr11` FROM ", joinExpr, null, null, null, getWhereForHourly2days("basecube", "C1_testfact2_raw_base")); TestCubeRewriter.compareQueries(hqlQuery, expected); } http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/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 f93a548..dd18ffd 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 @@ -91,7 +91,8 @@ public class TestExpressionResolver extends TestQueryRewrite { String hqlQuery = rewrite("select msr2 from testCube" + " where " + TWO_DAYS_RANGE + " and substrexpr != 'XYZ'", conf); String expected = - getExpectedQuery(cubeName, "select sum(testcube.msr2) as `msr2` FROM ", null, " and substr(testCube.dim1, 3) != 'XYZ'", + getExpectedQuery(cubeName, "select sum(testcube.msr2) as `msr2` FROM ", null, + " and substr(testCube.dim1, 3) != 'XYZ'", getWhereForDailyAndHourly2days(cubeName, "c1_summary1")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @@ -252,10 +253,11 @@ public class TestExpressionResolver extends TestQueryRewrite { + " group by booleancut having msr6 > 100.0 order by booleancut", conf); String expected = getExpectedQuery(cubeName, "SELECT (((testcube.dim1) != 'x') and ((testcube.dim2) != 10)) as `booleancut`, " - + "avg(((testcube.msr1) + (testcube.msr2))) as `avgmsr` FROM ", null, " and substr(testCube.dim1, 3) != 'XYZ' " + + "avg(((testcube.msr1) + (testcube.msr2))) as `avgmsr` FROM ", null, + " and substr(testCube.dim1, 3) != 'XYZ' " + " group by testCube.dim1 != 'x' AND testCube.dim2 != 10" + " having (sum(testCube.msr2) + max(testCube.msr3))/ count(testcube.msr4) > 100.0" - + " order by testCube.dim1 != 'x' AND testCube.dim2 != 10 asc", getWhereForHourly2days("C1_testfact2_raw")); + + " order by booleancut asc", getWhereForHourly2days("C1_testfact2_raw")); TestCubeRewriter.compareQueries(hqlQuery, expected); } @Test @@ -287,8 +289,8 @@ public class TestExpressionResolver extends TestQueryRewrite { @Test public void testMultipleExpressionsPickingSecondExpression() throws Exception { String hqlQuery = rewrite("select equalsums from testCube where " + TWO_DAYS_RANGE, conf); - String expected = getExpectedQuery(cubeName, "select (max(testCube.msr3) + sum(testCube.msr2))/100 " + - "as `equalsums` FROM ", null, null, getWhereForHourly2days(cubeName, "C1_testfact2")); + String expected = getExpectedQuery(cubeName, "select (max(testCube.msr3) + sum(testCube.msr2))/100 " + + "as `equalsums` FROM ", null, null, getWhereForHourly2days(cubeName, "C1_testfact2")); TestCubeRewriter.compareQueries(hqlQuery, expected); } http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java index 0d7e8ef..f31156a 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestJoinResolver.java @@ -186,8 +186,8 @@ public class TestJoinResolver extends TestQueryRewrite { String query = "select cubecity.name, msr2 FROM testCube WHERE " + TWO_DAYS_RANGE; String hqlQuery = rewrite(query, tConf); // Check that aliases are preserved in the join clause - String expected = getExpectedQuery("testcube", "SELECT (cubecity.name) as `name`, sum((testcube.msr2)) " + - "as `msr2` FROM ", " left outer join " + getDbName() + String expected = getExpectedQuery("testcube", "SELECT (cubecity.name) as `name`, sum((testcube.msr2)) " + + "as `msr2` FROM ", " left outer join " + getDbName() + "c1_citytable cubecity ON testcube.cityid = cubecity.id and (cubecity.dt = 'latest')", null, " group by cubecity.name", null, getWhereForHourly2days("testcube", "c1_testfact2")); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -356,9 +356,11 @@ public class TestJoinResolver extends TestQueryRewrite { // Single joinchain with two chains, accessed as refcolumn query = "select cityStateCapital, sum(msr2) from basecube where " + TWO_DAYS_RANGE; hqlQuery = rewrite(query, hconf); - expected = getExpectedQuery("basecube", "SELECT (citystate.capital) as `citystatecapital`, sum((basecube.msr2)) as `sum(msr2)` FROM ", - " join " + getDbName() + "c1_citytable citydim ON baseCube.cityid = citydim.id and citydim.dt = 'latest'" - + " join " + getDbName() + "c1_statetable cityState ON citydim.stateid=cityState.id and cityState.dt= 'latest'", + expected = getExpectedQuery("basecube", "SELECT (citystate.capital) as `citystatecapital`, " + + "sum((basecube.msr2)) as `sum(msr2)` FROM ", + " join " + getDbName() + "c1_citytable citydim ON baseCube.cityid = citydim.id and citydim.dt = 'latest'" + + " join " + getDbName() + "c1_statetable cityState ON citydim.stateid=cityState.id " + + "and cityState.dt= 'latest'", null, "group by citystate.capital", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base")); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -375,7 +377,7 @@ public class TestJoinResolver extends TestQueryRewrite { + "sum((basecube.msr2)) as `sum(msr2)` FROM ", " join " + getDbName() + "c1_citytable citydim ON baseCube.cityid = citydim.id and citydim.dt = 'latest'" + " join " + getDbName() + "c1_statetable cityState ON citydim.stateid=cityState.id and cityState.dt= 'latest'", - null, "group by citystate.capital order by citystate.capital asc", + null, "group by citystate.capital order by citystatecapital", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base")); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -454,8 +456,8 @@ public class TestJoinResolver extends TestQueryRewrite { query = "select cubeStateCountry.name, cubeCityStateCountry.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE; hqlQuery = rewrite(query, hconf); expected = getExpectedQuery("basecube", - "SELECT (cubestatecountry.name) as `name`, (cubecitystatecountry.name) as `name`, sum((basecube.msr2)) as `sum(msr2)` FROM ", - "" + "SELECT (cubestatecountry.name) as `name`, (cubecitystatecountry.name) as `name`, sum((basecube.msr2)) " + + "as `sum(msr2)` FROM ", "" + " join " + getDbName() + "c1_citytable citydim on basecube.cityid = citydim.id and (citydim.dt = 'latest')" + " join " + getDbName() + "c1_statetable statedim_0 on citydim.stateid=statedim_0.id and statedim_0.dt='latest'" @@ -617,8 +619,8 @@ public class TestJoinResolver extends TestQueryRewrite { query = "select cubecity.name, dim4chain.name, testdim3id, avg(msr2) from testcube where " + TWO_DAYS_RANGE; hqlQuery = rewrite(query, hconf); - expected = getExpectedQuery("testcube", "select cubecity.name as `name`, dim4chain.name as `name`, " + - "dim3chain.id as `testdim3id`, avg(testcube.msr2) as `avg(msr2)`" + expected = getExpectedQuery("testcube", "select cubecity.name as `name`, dim4chain.name as `name`, " + + "dim3chain.id as `testdim3id`, avg(testcube.msr2) as `avg(msr2)`" + "FROM ", " join " + getDbName() + "c1_testdim2tbl testdim2 ON testcube.dim2 = testdim2.id and testdim2.dt = 'latest'" + " join " + getDbName() http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java index 27a18f4..f9a5421 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestQueryMetrics.java @@ -47,24 +47,26 @@ public class TestQueryMetrics extends TestQueryRewrite { Assert.assertTrue(reg.getGauges().keySet().containsAll(Arrays.asList( "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AggregateResolver-ITER-6", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.AliasReplacer-ITER-1", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-11", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse" + + ".CandidateCoveringSetsResolver-ITER-13", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-12", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.CandidateTableResolver-ITER-5", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ColumnResolver-ITER-0", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-16", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-17", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.DenormalizationResolver-ITER-3", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ExpressionResolver-ITER-17", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ExpressionResolver-ITER-18", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.ExpressionResolver-ITER-2", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.FieldValidator-ITER-8", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.GroupbyResolver-ITER-7", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-9", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-19", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-20", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-18", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.MaxCoveringFactResolver-ITER-14", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-12", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-13", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-15", - "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimeRangeChecker-ITER-10", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.JoinResolver-ITER-10", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LeastPartitionResolver-ITER-20", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestDimensionResolver-ITER-21", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.LightestFactResolver-ITER-19", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.MaxCoveringFactResolver-ITER-15", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-14", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-16", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.StorageTableResolver-ITER-9", + "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimeRangeChecker-ITER-11", "lens.MethodMetricGauge.testCubeRewriteStackName-org.apache.lens.cube.parse.TimerangeResolver-ITER-4") ), reg.getGauges().keySet().toString()); } http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java index a14296c..76ea77d 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestRewriterPlan.java @@ -63,7 +63,6 @@ public class TestRewriterPlan extends TestQueryRewrite { Assert.assertTrue(plan.getPartitions().get("c2_testfact").size() > 1); } - //TODO union : Wrong fact name picked. Check after MaxCoveringSetResolver changes. @Test public void testPlanExtractionForComplexQuery() throws Exception { // complex query @@ -86,7 +85,6 @@ public class TestRewriterPlan extends TestQueryRewrite { Assert.assertEquals(plan.getPartitions().get("citytable").size(), 1); } - //TODO union : Wrong fact name picked. Check after MaxCoveringSetResolver changes. @Test public void testPlanExtractionForMultipleQueries() throws Exception { // simple query http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeResolver.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeResolver.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeResolver.java index 280a8c4..1e5facd 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeResolver.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeResolver.java @@ -21,15 +21,14 @@ package org.apache.lens.cube.parse; import static org.apache.lens.cube.metadata.DateFactory.*; import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.COLUMN_NOT_FOUND; -import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.FACT_NOT_AVAILABLE_IN_RANGE; +import static org.apache.lens.cube.parse.CandidateTablePruneCause. + CandidateTablePruneCode.STORAGE_NOT_AVAILABLE_IN_RANGE; +import static org.apache.lens.cube.parse.CandidateTablePruneCause.CandidateTablePruneCode.UNSUPPORTED_STORAGE; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.Set; +import java.util.*; import org.apache.lens.cube.error.NoCandidateFactAvailableException; import org.apache.lens.cube.metadata.TimeRange; @@ -74,12 +73,14 @@ public class TestTimeRangeResolver extends TestQueryRewrite { getConf()); NoCandidateFactAvailableException ne = (NoCandidateFactAvailableException) e; PruneCauses.BriefAndDetailedError causes = ne.getJsonMessage(); - assertTrue(causes.getBrief().contains("Columns [msr2] are not present in any table")); - assertEquals(causes.getDetails().size(), 2); + assertTrue(causes.getBrief().contains("No storages available for all of these time ranges: " + + "[dt [2016-01-01-00:00:00,000 to 2017-01-01-00:00:00,000)]")); + assertEquals(causes.getDetails().size(), 3); Set<CandidateTablePruneCause.CandidateTablePruneCode> expectedPruneCodes = Sets.newTreeSet(); - expectedPruneCodes.add(FACT_NOT_AVAILABLE_IN_RANGE); expectedPruneCodes.add(COLUMN_NOT_FOUND); + expectedPruneCodes.add(UNSUPPORTED_STORAGE); + expectedPruneCodes.add(STORAGE_NOT_AVAILABLE_IN_RANGE); Set<CandidateTablePruneCause.CandidateTablePruneCode> actualPruneCodes = Sets.newTreeSet(); for (List<CandidateTablePruneCause> cause : causes.getDetails().values()) { assertEquals(cause.size(), 1); @@ -93,13 +94,27 @@ public class TestTimeRangeResolver extends TestQueryRewrite { CubeQueryContext ctx = rewriteCtx("select msr12 from basecube where " + TWO_DAYS_RANGE + " or " + TWO_DAYS_RANGE_BEFORE_4_DAYS, getConf()); - assertEquals(ctx.getFactPruningMsgs().get(ctx.getMetastoreClient().getCubeFact("testfact_deprecated")).size(), 1); - CandidateTablePruneCause pruningMsg = - ctx.getFactPruningMsgs().get(ctx.getMetastoreClient().getCubeFact("testfact_deprecated")).get(0); + List<CandidateTablePruneCause> causes = findPruningMessagesForStorage("c3_testfact_deprecated", + ctx.getStoragePruningMsgs()); + assertEquals(causes.size(), 1); + assertEquals(causes.get(0).getCause(), UNSUPPORTED_STORAGE); + + causes = findPruningMessagesForStorage("c4_testfact_deprecated", ctx.getStoragePruningMsgs()); + assertEquals(causes.size(), 1); + assertEquals(causes.get(0).getCause(), UNSUPPORTED_STORAGE); + // testfact_deprecated's validity should be in between of both ranges. So both ranges should be in the invalid list // That would prove that parsing of properties has gone through successfully - assertEquals(pruningMsg.getCause(), FACT_NOT_AVAILABLE_IN_RANGE); - assertTrue(pruningMsg.getInvalidRanges().containsAll(ctx.getTimeRanges())); + + causes = findPruningMessagesForStorage("c1_testfact_deprecated", ctx.getStoragePruningMsgs()); + assertEquals(causes.size(), 1); + assertEquals(causes.get(0).getCause(), STORAGE_NOT_AVAILABLE_IN_RANGE); + assertTrue(causes.get(0).getInvalidRanges().containsAll(ctx.getTimeRanges())); + + causes = findPruningMessagesForStorage("c2_testfact_deprecated", ctx.getStoragePruningMsgs()); + assertEquals(causes.size(), 1); + assertEquals(causes.get(0).getCause(), STORAGE_NOT_AVAILABLE_IN_RANGE); + assertTrue(causes.get(0).getInvalidRanges().containsAll(ctx.getTimeRanges())); } @Test @@ -115,4 +130,21 @@ public class TestTimeRangeResolver extends TestQueryRewrite { assertEquals(timeRange.getFromDate(), from.getTime()); assertEquals(timeRange.getToDate(), dt.toDate()); } + + /** + * + * @param stoargeName storageName_factName + * @param allStoragePruningMsgs + * @return + */ + private static List<CandidateTablePruneCause> findPruningMessagesForStorage(String stoargeName, + PruneCauses<StorageCandidate> allStoragePruningMsgs) { + for (StorageCandidate sc : allStoragePruningMsgs.keySet()) { + if (sc.getName().equals(stoargeName)) { + return allStoragePruningMsgs.get(sc); + } + } + return new ArrayList<CandidateTablePruneCause>(); + } + } http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeWriterWithQuery.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeWriterWithQuery.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeWriterWithQuery.java index 1eb7217..09e09f8 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeWriterWithQuery.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestTimeRangeWriterWithQuery.java @@ -79,7 +79,7 @@ public class TestTimeRangeWriterWithQuery extends TestQueryRewrite { return cal.getTime(); } - //TODO union : Wrong fact table picked. Check after MaxCoveringSetResolver + //TODO union : Revisit Continuous update period. @Test public void testCubeQueryContinuousUpdatePeriod() throws Exception { LensException th = null; @@ -102,10 +102,11 @@ public class TestTimeRangeWriterWithQuery extends TestQueryRewrite { String hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + twoDaysInRangeClause, conf); Map<String, String> whereClauses = new HashMap<String, String>(); whereClauses.put( - getDbName() + "c1_testfact", + getDbName() + "c2_testfact", TestBetweenTimeRangeWriter.getBetweenClause(cubeName, "dt", getDateWithOffset(DAILY, -2), getDateWithOffset(DAILY, 0), CONTINUOUS.format())); - String expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) as `sum(msr2)` FROM ", null, null, whereClauses); + String expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) as `sum(msr2)` FROM ", + null, null, whereClauses); System.out.println("HQL:" + hqlQuery); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -119,13 +120,13 @@ public class TestTimeRangeWriterWithQuery extends TestQueryRewrite { whereClauses = new HashMap<String, String>(); whereClauses.put( - getDbName() + "c1_testfact", + getDbName() + "c2_testfact", TestBetweenTimeRangeWriter.getBetweenClause(cubeName, "dt", getDateWithOffset(DAILY, -2), getDateWithOffset(DAILY, 0), CONTINUOUS.format()) + " OR" + TestBetweenTimeRangeWriter.getBetweenClause(cubeName, "dt", getDateWithOffset(DAILY, -6), getDateWithOffset(DAILY, 0), CONTINUOUS.format())); - expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, whereClauses); + expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) as `sum(msr2)` FROM ", null, null, whereClauses); System.out.println("HQL:" + hqlQuery); TestCubeRewriter.compareQueries(hqlQuery, expected); @@ -133,10 +134,10 @@ public class TestTimeRangeWriterWithQuery extends TestQueryRewrite { conf.set(CubeQueryConfUtil.PART_WHERE_CLAUSE_DATE_FORMAT, "yyyy-MM-dd HH:mm:ss"); hqlQuery = rewrite("select SUM(msr2) from testCube" + " where " + TWO_DAYS_RANGE, conf); whereClauses = new HashMap<String, String>(); - whereClauses.put(getDbName() + "c1_testfact", TestBetweenTimeRangeWriter.getBetweenClause(cubeName, + whereClauses.put(getDbName() + "c2_testfact", TestBetweenTimeRangeWriter.getBetweenClause(cubeName, "dt", getUptoHour(TWODAYS_BACK), getUptoHour(NOW), TestTimeRangeWriter.DB_FORMAT)); - expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) FROM ", null, null, whereClauses); + expected = getExpectedQuery(cubeName, "select sum(testcube.msr2) as `sum(msr2)` FROM ", null, null, whereClauses); System.out.println("HQL:" + hqlQuery); TestCubeRewriter.compareQueries(hqlQuery, expected); } http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionAndJoinCandidates.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionAndJoinCandidates.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionAndJoinCandidates.java index 935c739..931f789 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionAndJoinCandidates.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionAndJoinCandidates.java @@ -107,8 +107,8 @@ public class TestUnionAndJoinCandidates extends TestQueryRewrite { + "sum(0.0) as `alias4` FROM TestQueryRewrite.c1_union_join_ctx_fact2"; expectedInnerSelect3 = "SELECT (basecube.union_join_ctx_cityid) as `alias0`, (cubecityjoinunionctx.name) " + "as `alias1`, case when (basecube.union_join_ctx_cityid) is null then 0 else " - + "(basecube.union_join_ctx_cityid) end as `alias2`, sum(0.0) as `alias3`, " + - "sum((basecube.union_join_ctx_msr2)) as `alias4` FROM TestQueryRewrite.c1_union_join_ctx_fact3"; + + "(basecube.union_join_ctx_cityid) end as `alias2`, sum(0.0) as `alias3`, " + + "sum((basecube.union_join_ctx_msr2)) as `alias4` FROM TestQueryRewrite.c1_union_join_ctx_fact3"; String outerGroupBy = "GROUP BY (basecube.alias0), (basecube.alias1), (basecube.alias2)"; compareContains(outerSelect, rewrittenQuery); compareContains(expectedInnerSelect1, rewrittenQuery); @@ -120,28 +120,25 @@ public class TestUnionAndJoinCandidates extends TestQueryRewrite { colsSelected = " union_join_ctx_cityid as `city id`, union_join_ctx_cityname, sum(union_join_ctx_msr1), " + "sum(union_join_ctx_msr2), union_join_ctx_non_zero_msr2_sum, union_join_ctx_msr1_greater_than_100, " + "sum(union_join_ctx_msr1) + 10 "; - //colsSelected = " union_join_ctx_cityid as `city id`, union_join_ctx_msr1_greater_than_100, union_join_ctx_non_zero_msr2_sum "; whereCond = " union_join_ctx_zipcode = 'a' and union_join_ctx_cityid = 'b' and " + "(" + TWO_MONTHS_RANGE_UPTO_DAYS + ")"; rewrittenQuery = rewrite("select " + colsSelected + " from basecube where " + whereCond, conf); outerSelect = "SELECT (basecube.alias0) as `city id`, (basecube.alias1) as `union_join_ctx_cityname`, " + "sum((basecube.alias2)) as `sum(union_join_ctx_msr1)`, sum((basecube.alias3)) " + "as `sum(union_join_ctx_msr2)`, sum((basecube.alias4)) as `union_join_ctx_non_zero_msr2_sum`, " - + "case when (sum((basecube.alias5)) > 100) then \"high\" else \"low\" end " - + "as `union_join_ctx_msr1_greater_than_100`, (sum((basecube.alias6)) + 10) " + + "case when (sum((basecube.alias2)) > 100) then \"high\" else \"low\" end as " + + "`union_join_ctx_msr1_greater_than_100`, (sum((basecube.alias2)) + 10) " + "as `(sum(union_join_ctx_msr1) + 10)` FROM "; expectedInnerSelect1 = "SELECT (basecube.union_join_ctx_cityid) as `alias0`, " + "(cubecityjoinunionctx.name) as `alias1`, sum((basecube.union_join_ctx_msr1)) as `alias2`, " - + "sum(0.0) as `alias3`, sum(0.0) as `alias4`, sum((basecube.union_join_ctx_msr1)) as `alias5`, " - + "sum((basecube.union_join_ctx_msr1)) as `alias6`"; + + "sum(0.0) as `alias3`, sum(0.0) as `alias4` FROM"; expectedInnerSelect2 = "SELECT (basecube.union_join_ctx_cityid) as `alias0`, " + "(cubecityjoinunionctx.name) as `alias1`, sum((basecube.union_join_ctx_msr1)) as `alias2`, " - + "sum(0.0) as `alias3`, sum(0.0) as `alias4`, sum((basecube.union_join_ctx_msr1)) as `alias5`, " - + "sum((basecube.union_join_ctx_msr1)) as `alias6`"; - expectedInnerSelect3 = "SELECT (basecube.union_join_ctx_cityid) as `alias0`, " - + "(cubecityjoinunionctx.name) as `alias1`, sum(0.0) as `alias2`, sum((basecube.union_join_ctx_msr2)) " - + "as `alias3`, sum(case when ((basecube.union_join_ctx_msr2) > 0) then (basecube.union_join_ctx_msr2) " - + "else 0 end) as `alias4`, sum(0.0) as `alias5`, sum(0.0) as `alias6`"; + + "sum(0.0) as `alias3`, sum(0.0) as `alias4` FROM"; + expectedInnerSelect3 = "SELECT (basecube.union_join_ctx_cityid) as `alias0`, (cubecityjoinunionctx.name) " + + "as `alias1`, sum(0.0) as `alias2`, sum((basecube.union_join_ctx_msr2)) as `alias3`, " + + "sum(case when ((basecube.union_join_ctx_msr2) > 0) then (basecube.union_join_ctx_msr2) else 0 end) " + + "as `alias4` FROM"; String innerGroupBy = "GROUP BY (basecube.union_join_ctx_cityid), (cubecityjoinunionctx.name)"; outerGroupBy = "GROUP BY (basecube.alias0), (basecube.alias1)"; http://git-wip-us.apache.org/repos/asf/lens/blob/975fa2c2/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java ---------------------------------------------------------------------- diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java index 42282e9..c984a05 100644 --- a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java +++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestUnionQueries.java @@ -334,7 +334,6 @@ public class TestUnionQueries extends TestQueryRewrite { } } - //TODO union : Revisit after MaxCoveringFactResolver @Test public void testCubeWhereQueryWithMultipleTables() throws Exception { Configuration conf = getConf();