You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lens.apache.org by de...@apache.org on 2016/02/03 13:10:53 UTC
[33/51] [abbrv] lens git commit: LENS-926 : Fixes Chain ref column
from bridge table to be resolved correctly
LENS-926 : Fixes Chain ref column from bridge table to be resolved correctly
Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/91ccec77
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/91ccec77
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/91ccec77
Branch: refs/heads/current-release-line
Commit: 91ccec775bfff7732da41b6a6d13e01752750f7f
Parents: 5d2dccb
Author: Amareshwari Sriramadasu <am...@gmail.com>
Authored: Thu Jan 21 17:43:26 2016 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Thu Jan 21 17:43:26 2016 +0530
----------------------------------------------------------------------
.../cube/parse/DenormalizationResolver.java | 46 +--
.../lens/cube/parse/join/AutoJoinContext.java | 2 +-
.../apache/lens/cube/parse/CubeTestSetup.java | 20 +-
.../lens/cube/parse/TestBridgeTableQueries.java | 293 +++++++++++++++++++
.../lens/cube/parse/TestCubeRewriter.java | 3 +-
.../lens/cube/parse/TestJoinResolver.java | 225 ++------------
6 files changed, 354 insertions(+), 235 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
index c83b9ac..f2dc2e5 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/DenormalizationResolver.java
@@ -37,6 +37,7 @@ import org.apache.hadoop.hive.ql.parse.HiveParser;
import org.antlr.runtime.CommonToken;
+import lombok.Getter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
@@ -67,14 +68,13 @@ public class DenormalizationResolver implements ContextRewriter {
@ToString
public static class PickedReference {
- TableReference reference;
+ @Getter
ChainRefCol chainRef;
String srcAlias;
String pickedFor;
- PickedReference(TableReference reference, String srcAlias, String pickedFor) {
+ PickedReference(String srcAlias, String pickedFor) {
this.srcAlias = srcAlias;
- this.reference = reference;
this.pickedFor = pickedFor;
}
@@ -83,38 +83,22 @@ public class DenormalizationResolver implements ContextRewriter {
this.chainRef = chainRef;
this.pickedFor = pickedFor;
}
-
- String getDestTable() {
- if (chainRef != null) {
- return chainRef.getChainName();
- }
- return reference.getDestTable();
- }
-
- String getRefColumn() {
- if (chainRef != null) {
- return chainRef.getRefColumn();
- }
- return reference.getDestColumn();
- }
}
public static class DenormalizationContext {
// map of column name to all references
- private Map<String, Set<ReferencedQueriedColumn>> referencedCols =
- new HashMap<String, Set<ReferencedQueriedColumn>>();
+ private Map<String, Set<ReferencedQueriedColumn>> referencedCols = new HashMap<>();
// candidate table name to all the references columns it needs
- private Map<String, Set<ReferencedQueriedColumn>> tableToRefCols =
- new HashMap<String, Set<ReferencedQueriedColumn>>();
+ private Map<String, Set<ReferencedQueriedColumn>> tableToRefCols = new HashMap<>();
private CubeQueryContext cubeql;
// set of all picked references once all candidate tables are picked
- private Set<PickedReference> pickedRefs = new HashSet<PickedReference>();
+ private Set<PickedReference> pickedRefs = new HashSet<>();
// index on column name for picked references with map from column name to
// pickedrefs
- private Map<String, Set<PickedReference>> pickedReferences = new HashMap<String, Set<PickedReference>>();
+ private Map<String, Set<PickedReference>> pickedReferences = new HashMap<>();
DenormalizationContext(CubeQueryContext cubeql) {
this.cubeql = cubeql;
@@ -123,7 +107,7 @@ public class DenormalizationResolver implements ContextRewriter {
void addReferencedCol(String col, ReferencedQueriedColumn refer) {
Set<ReferencedQueriedColumn> refCols = referencedCols.get(col);
if (refCols == null) {
- refCols = new HashSet<ReferencedQueriedColumn>();
+ refCols = new HashSet<>();
referencedCols.put(col, refCols);
}
refCols.add(refer);
@@ -144,7 +128,7 @@ public class DenormalizationResolver implements ContextRewriter {
log.info("Adding denormalized column for column:{} for table:{}", col, table);
Set<ReferencedQueriedColumn> refCols = tableToRefCols.get(table.getName());
if (refCols == null) {
- refCols = new HashSet<ReferencedQueriedColumn>();
+ refCols = new HashSet<>();
tableToRefCols.put(table.getName(), refCols);
}
refCols.add(refer);
@@ -167,7 +151,7 @@ public class DenormalizationResolver implements ContextRewriter {
private void addPickedReference(String col, PickedReference refer) {
Set<PickedReference> refCols = pickedReferences.get(col);
if (refCols == null) {
- refCols = new HashSet<PickedReference>();
+ refCols = new HashSet<>();
pickedReferences.put(col, refCols);
}
refCols.add(refer);
@@ -187,7 +171,7 @@ public class DenormalizationResolver implements ContextRewriter {
public Set<Dimension> rewriteDenormctx(CandidateFact cfact, Map<Dimension, CandidateDim> dimsToQuery,
boolean replaceFact) throws LensException {
- Set<Dimension> refTbls = new HashSet<Dimension>();
+ Set<Dimension> refTbls = new HashSet<>();
if (!tableToRefCols.isEmpty()) {
// pick referenced columns for fact
@@ -206,7 +190,8 @@ public class DenormalizationResolver implements ContextRewriter {
// Add the picked references to dimsToQuery
for (PickedReference picked : pickedRefs) {
if (isPickedFor(picked, cfact, dimsToQuery)) {
- refTbls.add((Dimension) cubeql.getCubeTableForAlias(picked.getDestTable()));
+ refTbls.add((Dimension) cubeql.getCubeTableForAlias(picked.getChainRef().getChainName()));
+ cubeql.addColumnsQueried(picked.getChainRef().getChainName(), picked.getChainRef().getRefColumn());
}
}
}
@@ -286,10 +271,11 @@ public class DenormalizationResolver implements ContextRewriter {
return;
}
ASTNode newTableNode =
- new ASTNode(new CommonToken(HiveParser.Identifier, query.getAliasForTableName(refered.getDestTable())));
+ new ASTNode(new CommonToken(HiveParser.Identifier, refered.getChainRef().getChainName()));
tableNode.setChild(0, newTableNode);
- ASTNode newColumnNode = new ASTNode(new CommonToken(HiveParser.Identifier, refered.getRefColumn()));
+ ASTNode newColumnNode = new ASTNode(new CommonToken(HiveParser.Identifier,
+ refered.getChainRef().getRefColumn()));
node.setChild(1, newColumnNode);
} else {
// recurse down
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/lens-cube/src/main/java/org/apache/lens/cube/parse/join/AutoJoinContext.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/parse/join/AutoJoinContext.java b/lens-cube/src/main/java/org/apache/lens/cube/parse/join/AutoJoinContext.java
index 4c30d3f..f70cbe4 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/parse/join/AutoJoinContext.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/parse/join/AutoJoinContext.java
@@ -167,7 +167,7 @@ public class AutoJoinContext {
public String getFromString(String fromTable, CandidateFact fact, Set<Dimension> qdims,
Map<Dimension, CandidateDim> dimsToQuery, CubeQueryContext cubeql) throws LensException {
String fromString = fromTable;
- log.info("All paths dump:{}", cubeql.getAutoJoinCtx().getAllPaths());
+ log.info("All paths dump:{} Queried dims:{}", cubeql.getAutoJoinCtx().getAllPaths(), qdims);
if (qdims == null || qdims.isEmpty()) {
return fromString;
}
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
index caea3af..100d7c9 100644
--- a/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/CubeTestSetup.java
@@ -945,6 +945,18 @@ public class CubeTestSetup {
cubeDimensions2.add(new BaseDimAttribute(new FieldSchema("userid", "int", "userid")));
cubeDimensions2.add(new BaseDimAttribute(new FieldSchema("xuserid", "int", "userid")));
cubeDimensions2.add(new BaseDimAttribute(new FieldSchema("yuserid", "int", "userid")));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("xsports", "array<string>", ""),
+ "xuser sports", "xusersports", "name", null, null, null));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("ysports", "array<string>", ""),
+ "yuser sports", "yusersports", "name", null, null, null));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("sports", "array<string>", ""),
+ "user sports", "usersports", "name", null, null, null));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("sportids", "array<int>", ""),
+ "user sports", "userInterestIds", "sport_id", null, null, null));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("statecountry", "string", ""),
+ "state country", "cubestatecountry", "name", null, null, null));
+ cubeDimensions2.add(new ReferencedDimAttribute(new FieldSchema("citycountry", "string", ""),
+ "city country", "cubecitystatecountry", "name", null, null, null));
Map<String, String> cubeProperties = new HashMap<>();
cubeProperties.put(MetastoreUtil.getCubeTimedDimensionListKey(BASE_CUBE_NAME),
@@ -1104,9 +1116,13 @@ public class CubeTestSetup {
cubeDimensions2.add(
new ReferencedDimAttribute(new FieldSchema("cityStateCapital", "string", "State's capital thru city"),
"State's capital thru city", "cityState", "capital", null, null, null));
- client.createCube(BASE_CUBE_NAME, cubeMeasures2, cubeDimensions2, exprs, joinChains, cubeProperties);
+ Set<ExprColumn> baseExprs = new HashSet<>(exprs);
+ baseExprs.add(new ExprColumn(new FieldSchema("substrsprorts", "String", "substr of sports"), "substr sports",
+ "substr(sports, 10)"));
- Map<String, String> derivedProperties = new HashMap<String, String>();
+ client.createCube(BASE_CUBE_NAME, cubeMeasures2, cubeDimensions2, baseExprs, joinChains, cubeProperties);
+
+ Map<String, String> derivedProperties = new HashMap<>();
derivedProperties.put(MetastoreConstants.CUBE_ALL_FIELDS_QUERIABLE, "true");
Set<String> measures = new HashSet<>();
measures.add("msr1");
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
new file mode 100644
index 0000000..e66c39b
--- /dev/null
+++ b/lens-cube/src/test/java/org/apache/lens/cube/parse/TestBridgeTableQueries.java
@@ -0,0 +1,293 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.lens.cube.parse;
+
+import static org.apache.lens.cube.metadata.DateFactory.TWO_DAYS_RANGE;
+import static org.apache.lens.cube.parse.CubeTestSetup.*;
+
+import static org.testng.Assert.assertTrue;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hive.conf.HiveConf;
+
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+public class TestBridgeTableQueries extends TestQueryRewrite {
+
+ private static HiveConf hConf = new HiveConf(TestBridgeTableQueries.class);
+
+ @BeforeTest
+ public void setupInstance() throws Exception {
+ hConf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
+ hConf.setBoolean(CubeQueryConfUtil.DISABLE_AUTO_JOINS, false);
+ hConf.setBoolean(CubeQueryConfUtil.ENABLE_GROUP_BY_TO_SELECT, true);
+ hConf.setBoolean(CubeQueryConfUtil.ENABLE_SELECT_TO_GROUPBY, true);
+ hConf.setBoolean(CubeQueryConfUtil.DISABLE_AGGREGATE_RESOLVER, false);
+ hConf.setBoolean(CubeQueryConfUtil.ENABLE_FLATTENING_FOR_BRIDGETABLES, true);
+ }
+
+ @Test
+ public void testBridgeTablesWithoutDimtablePartitioning() throws Exception {
+ String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
+ + " from " + getDbName() + "c1_user_interests_tbl user_interests"
+ + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports"
+ + " on userdim.id = usersports.user_id ",
+ null, "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testBridgeTablesForExprFieldWithoutDimtablePartitioning() throws Exception {
+ String query = "select substr(usersports.name, 10), sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected = getExpectedQuery("basecube", "select substr(usersports.name, 10), sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
+ + " from " + getDbName() + "c1_user_interests_tbl user_interests"
+ + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports"
+ + " on userdim.id = usersports.user_id ",
+ null, "group by substr(( usersports . name ), 10 )", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select substrsprorts, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testFlattenBridgeTablesOFF() throws Exception {
+ Configuration conf = new Configuration(hConf);
+ conf.setBoolean(CubeQueryConfUtil.ENABLE_FLATTENING_FOR_BRIDGETABLES, false);
+ String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, conf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join " + getDbName() + "c1_user_interests_tbl user_interests on userdim.id = user_interests.user_id"
+ + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id",
+ null, "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, conf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testFlattenBridgeTablesWithCustomAggregate() throws Exception {
+ Configuration conf = new Configuration(hConf);
+ conf.set(CubeQueryConfUtil.BRIDGE_TABLE_FIELD_AGGREGATOR, "custom_aggr");
+ String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, conf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,custom_aggr(usersports.name) as name"
+ + " from " + getDbName() + "c1_user_interests_tbl user_interests"
+ + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports"
+ + " on userdim.id = usersports.user_id ",
+ null, "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, conf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testBridgeTablesWithMegringChains() throws Exception {
+ String query = "select userInterestIds.sport_id, usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected = getExpectedQuery("basecube", "select userInterestIds.sport_id, usersports.name,"
+ + " sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim on basecube.userid = userdim.id join (select userinterestids"
+ + ".user_id as user_id,collect_set(userinterestids.sport_id) as sport_id from " + getDbName()
+ + "c1_user_interests_tbl userinterestids group by userinterestids.user_id) userinterestids on userdim.id = "
+ + "userinterestids.user_id join (select userinterestids.user_id as user_id,collect_set(usersports.name) as name"
+ + " from " + getDbName() + "c1_user_interests_tbl userinterestids join "
+ + getDbName() + "c1_sports_tbl usersports on userinterestids.sport_id = usersports.id"
+ + " group by userinterestids.user_id) usersports on userdim.id = usersports.user_id",
+ null, "group by userInterestIds.sport_id, usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sportids, sports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testBridgeTablesWithMultipleFacts() throws Exception {
+ String query = "select usersports.name, sum(msr2), sum(msr12) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected1 = getExpectedQuery("basecube",
+ "select usersports.name as `name`, sum(basecube.msr2) as `msr2` FROM ", " join " + getDbName()
+ + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+ + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+ + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+ "group by usersports.name", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ String expected2 = getExpectedQuery("basecube",
+ "select usersports.name as `name`, sum(basecube.msr12) as `msr12` FROM ", " join " + getDbName()
+ + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+ + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+ + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+ "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact2_base"));
+ TestCubeRewriter.compareContains(expected1, hqlQuery);
+ TestCubeRewriter.compareContains(expected2, hqlQuery);
+ String lower = hqlQuery.toLowerCase();
+ assertTrue(
+ lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq2.msr2 msr2, mq1.msr12 msr12 from ")
+ || lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq1.msr2 msr2, mq2.msr12 msr12 from "), hqlQuery);
+
+ assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
+ hqlQuery);
+
+ // run with chain ref column
+ query = "select sports, sum(msr2), sum(msr12) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ expected1 = getExpectedQuery("basecube",
+ "select usersports.name as `sports`, sum(basecube.msr2) as `msr2` FROM ", " join " + getDbName()
+ + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+ + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+ + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+ "group by usersports.name", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ expected2 = getExpectedQuery("basecube",
+ "select usersports.name as `sports`, sum(basecube.msr12) as `msr12` FROM ", " join " + getDbName()
+ + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
+ + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
+ + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
+ "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact2_base"));
+ TestCubeRewriter.compareContains(expected1, hqlQuery);
+ TestCubeRewriter.compareContains(expected2, hqlQuery);
+ lower = hqlQuery.toLowerCase();
+ assertTrue(
+ lower.startsWith("select coalesce(mq1.sports, mq2.sports) sports, mq2.msr2 msr2, mq1.msr12 msr12 from ")
+ || lower.startsWith("select coalesce(mq1.sports, mq2.sports) sports, mq1.msr2 msr2, mq2.msr12 msr12 from "),
+ hqlQuery);
+
+ assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.sports <=> mq2.sports"),
+ hqlQuery);
+ }
+
+ @Test
+ public void testBridgeTablesWithMultipleChains() throws Exception {
+ String query = "select usersports.name, xusersports.name, yusersports.name, sum(msr2) from basecube where "
+ + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, xusersports.name, yusersports.name,"
+ + " sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim_1 on basecube.userid = userdim_1.id "
+ + " join (select user_interests_1.user_id as user_id, collect_set(usersports.name) as name from "
+ + getDbName() + "c1_user_interests_tbl user_interests_1 join " + getDbName() + "c1_sports_tbl usersports on "
+ + "user_interests_1.sport_id = usersports.id group by user_interests_1.user_id) "
+ + "usersports on userdim_1.id = usersports.user_id"
+ + " join " + getDbName() + "c1_usertable userdim_0 on basecube.yuserid = userdim_0.id "
+ + " join (select user_interests_0.user_id as user_id,collect_set(yusersports.name) as name from "
+ + getDbName() + "c1_user_interests_tbl user_interests_0 join " + getDbName() + "c1_sports_tbl yusersports on "
+ + " user_interests_0.sport_id = yusersports.id group by user_interests_0.user_id) yusersports on userdim_0.id ="
+ + " yusersports.user_id join " + getDbName() + "c1_usertable userdim on basecube.xuserid = userdim.id"
+ + " join (select user_interests.user_id as user_id,collect_set(xusersports.name) as name from "
+ + getDbName() + "c1_user_interests_tbl user_interests join " + getDbName() + "c1_sports_tbl xusersports"
+ + " on user_interests.sport_id = xusersports.id group by user_interests.user_id) xusersports on userdim.id = "
+ + " xusersports.user_id", null, "group by usersports.name, xusersports.name, yusersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, xsports, ysports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testBridgeTablesWithDimTablePartitioning() throws Exception {
+ Configuration conf = new Configuration(hConf);
+ conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
+ String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, conf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c2_usertable userdim ON basecube.userid = userdim.id and userdim.dt='latest' "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
+ + " from " + getDbName() + "c2_user_interests_tbl user_interests"
+ + " join " + getDbName() + "c2_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " and usersports.dt='latest and user_interests.dt='latest'"
+ + " group by user_interests.user_id) usersports"
+ + " on userdim.id = usersports.user_id ",
+ null, "group by usersports.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c2_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, conf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+
+ @Test
+ public void testBridgeTablesWithNormalJoins() throws Exception {
+ String query = "select usersports.name, cubestatecountry.name, cubecitystatecountry.name,"
+ + " sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ String hqlQuery = rewrite(query, hConf);
+ String expected = getExpectedQuery("basecube", "select usersports.name, cubestatecountry.name, "
+ + "cubecitystatecountry.name, sum(basecube.msr2) FROM ",
+ " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
+ + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
+ + " from " + getDbName() + "c1_user_interests_tbl user_interests"
+ + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
+ + " group by user_interests.user_id) usersports"
+ + " on userdim.id = usersports.user_id "
+ + " 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'"
+ + " join " + getDbName()
+ + "c1_countrytable cubecitystatecountry on statedim_0.countryid=cubecitystatecountry.id"
+ + " join " + getDbName() + "c1_statetable statedim on basecube.stateid=statedim.id and (statedim.dt = 'latest')"
+ + " join " + getDbName() + "c1_countrytable cubestatecountry on statedim.countryid=cubestatecountry.id ",
+ null, "group by usersports.name, cubestatecountry.name, cubecitystatecountry.name", null,
+ getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ // run with chain ref column
+ query = "select sports, statecountry, citycountry, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
+ hqlQuery = rewrite(query, hConf);
+ TestCubeRewriter.compareQueries(hqlQuery, expected);
+ }
+}
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/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 698f36c..e569fb1 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
@@ -306,7 +306,8 @@ public class TestCubeRewriter extends TestQueryRewrite {
System.err.println("__FAILED__ " + method + "\n\tExpected: " + expected + "\n\t---------\n\tActual: " + actual);
}
- assertTrue(actualTrimmed.toLowerCase().contains(expectedTrimmed.toLowerCase()));
+ assertTrue(actualTrimmed.toLowerCase().contains(expectedTrimmed.toLowerCase()), "Expected:" + expected
+ + "Actual:" + actual);
}
@Test
http://git-wip-us.apache.org/repos/asf/lens/blob/91ccec77/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 2cf92b9..6430ed1 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
@@ -86,7 +86,7 @@ public class TestJoinResolver extends TestQueryRewrite {
expectedClauses.add(getDbName()
+ "c1_testdim4tbl dim4chain on testdim3.testdim4id = dim4chain.id and (dim4chain.dt = 'latest')");
- List<String> actualClauses = new ArrayList<String>();
+ List<String> actualClauses = new ArrayList<>();
for (String clause : StringUtils.splitByWholeSeparator(getAutoResolvedFromString(rewrittenQuery), "join")) {
if (StringUtils.isNotBlank(clause)) {
actualClauses.add(clause.trim());
@@ -135,13 +135,13 @@ public class TestJoinResolver extends TestQueryRewrite {
String hqlQuery = rewrite(query, hconf);
String expected = getExpectedQuery("testcube", "select citydim.name, testDim4.name, sum(testcube.msr2) FROM ",
" left outer JOIN " + getDbName() + "c1_citytable citydim on testcube.cityid = citydim.id +"
- + " and (( citydim . name ) = 'FOOBAR' ) and (citydim.dt = 'latest')"
- + " right outer join " + getDbName()
- + "c1_testdim2tbl testdim2 on testcube.dim2 = testdim2.id and (testdim2.dt = 'latest')"
- + " right outer join " + getDbName() + "c1_testdim3tbl testdim3 on testdim2.testdim3id = testdim3.id and "
- + "(testdim3.dt = 'latest') "
- + " right outer join " + getDbName() + "c1_testdim4tbl testdim4 on testdim3.testdim4id = testdim4.id and "
- + "(( testdim4 . name ) = 'TESTDIM4NAME' ) and (testdim4.dt = 'latest')",
+ + " and (( citydim . name ) = 'FOOBAR' ) and (citydim.dt = 'latest')"
+ + " right outer join " + getDbName()
+ + "c1_testdim2tbl testdim2 on testcube.dim2 = testdim2.id and (testdim2.dt = 'latest')"
+ + " right outer join " + getDbName() + "c1_testdim3tbl testdim3 on testdim2.testdim3id = testdim3.id and "
+ + "(testdim3.dt = 'latest') "
+ + " right outer join " + getDbName() + "c1_testdim4tbl testdim4 on testdim3.testdim4id = testdim4.id and "
+ + "(( testdim4 . name ) = 'TESTDIM4NAME' ) and (testdim4.dt = 'latest')",
null, "group by citydim.name, testdim4.name", null,
getWhereForDailyAndHourly2days("testcube", "c1_summary3"));
TestCubeRewriter.compareQueries(hqlQuery, expected);
@@ -177,7 +177,7 @@ public class TestJoinResolver extends TestQueryRewrite {
// Check that aliases are preserved in the join clause
String expected = getExpectedQuery("testcube", "select cubecity.name, sum(testcube.msr2) FROM ",
" left outer join " + getDbName()
- + "c1_citytable cubecity ON testcube.cityid = cubecity.id and (cubecity.dt = 'latest')",
+ + "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);
@@ -186,7 +186,7 @@ public class TestJoinResolver extends TestQueryRewrite {
// Check that aliases are preserved in the join clause
expected = getExpectedQuery("testcube", "select cubecity.name, sum(testcube.msr2) FROM ",
" full outer join " + getDbName()
- + "c1_citytable cubecity ON testcube.cityid = cubecity.id and (cubecity.dt = 'latest')",
+ + "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);
@@ -195,7 +195,7 @@ public class TestJoinResolver extends TestQueryRewrite {
// Check that aliases are preserved in the join clause
expected = getExpectedQuery("testcube", "select cubecity.name, sum(testcube.msr2) FROM ",
" right outer join " + getDbName()
- + "c1_citytable cubecity ON testcube.cityid = cubecity.id",
+ + "c1_citytable cubecity ON testcube.cityid = cubecity.id",
null, " and (cubecity.dt = 'latest') group by cubecity.name", null,
getWhereForHourly2days("testcube", "c1_testfact2"));
TestCubeRewriter.compareQueries(hqlQuery, expected);
@@ -224,7 +224,7 @@ public class TestJoinResolver extends TestQueryRewrite {
// Check that aliases are preserved in the join clause
String expected = getExpectedQuery("t", "select cubecity.name, sum(t.msr2) FROM ",
" left outer join " + getDbName()
- + "c1_citytable cubecity ON t.cityid = cubecity.id and (cubecity.dt = 'latest')",
+ + "c1_citytable cubecity ON t.cityid = cubecity.id and (cubecity.dt = 'latest')",
null, " group by cubecity.name", null, getWhereForHourly2days("t", "c1_testfact2"));
TestCubeRewriter.compareQueries(hqlQuery, expected);
}
@@ -237,7 +237,7 @@ public class TestJoinResolver extends TestQueryRewrite {
String hqlQuery = rewrite(query, tConf);
String expected =
getExpectedQuery("citydim", "select citydim.name, citystate.name from ", " inner join " + getDbName()
- + "c1_statetable citystate on citydim.stateid = citystate.id and (citystate.dt = 'latest')",
+ + "c1_statetable citystate on citydim.stateid = citystate.id and (citystate.dt = 'latest')",
null, " limit 10", "c1_citytable", true);
compareQueries(hqlQuery, expected);
}
@@ -252,7 +252,7 @@ public class TestJoinResolver extends TestQueryRewrite {
String hqlQuery = rewrite(queryWithJoin, tConf);
String expected =
getExpectedQuery("citydim", "select citydim.name, statedim.name from ", " inner join " + getDbName()
- + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
+ + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
null, null, "c1_citytable", false);
compareQueries(hqlQuery, expected);
}
@@ -264,7 +264,7 @@ public class TestJoinResolver extends TestQueryRewrite {
String hqlQuery = rewrite(q1, hconf);
String expected =
getExpectedQuery("citydim", "select citydim.name, statedim.name from ", " left outer join " + getDbName()
- + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
+ + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
null, null, "c1_citytable", false);
compareQueries(hqlQuery, expected);
@@ -273,7 +273,7 @@ public class TestJoinResolver extends TestQueryRewrite {
hqlQuery = rewrite(q2, hconf);
expected =
getExpectedQuery("citydim", "select citydim.name, statedim.name from ", " right outer join " + getDbName()
- + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
+ + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
null, null, "c1_citytable", false);
compareQueries(hqlQuery, expected);
@@ -282,8 +282,10 @@ public class TestJoinResolver extends TestQueryRewrite {
hqlQuery = rewrite(q3, hconf);
expected =
getExpectedQuery("citydim", "select citydim.name, statedim.name from ", " full outer join " + getDbName()
- + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
+ + "c1_statetable statedim on citydim.stateid = statedim.id and citydim.dt='latest' and statedim.dt='latest'",
null, null, "c1_citytable", false);
+ compareQueries(hqlQuery, expected);
+
}
@Test
@@ -294,7 +296,7 @@ public class TestJoinResolver extends TestQueryRewrite {
String hqlQuery = rewrite(q, conf);
String expected =
getExpectedQuery("citydim", "select citydim.name, citystate.name from ", " left outer join " + getDbName()
- + "c1_statetable citystate on citydim.stateid = citystate.id and (citystate.dt = 'latest')",
+ + "c1_statetable citystate on citydim.stateid = citystate.id and (citystate.dt = 'latest')",
null, " limit 10", "c1_citytable", true);
compareQueries(hqlQuery, expected);
@@ -302,7 +304,7 @@ public class TestJoinResolver extends TestQueryRewrite {
hqlQuery = rewrite(q, conf);
expected =
getExpectedQuery("citydim", "select citydim.name, citystate.name from ", " right outer join " + getDbName()
- + "c1_statetable citystate on citydim.stateid = citystate.id and (citydim.dt = 'latest')",
+ + "c1_statetable citystate on citydim.stateid = citystate.id and (citydim.dt = 'latest')",
" citystate.dt='latest' ", "limit 10", "c1_citytable", false);
compareQueries(hqlQuery, expected);
@@ -451,8 +453,8 @@ public class TestJoinResolver extends TestQueryRewrite {
// Test 4 Dim only query with join chains
- List<String> expectedClauses = new ArrayList<String>();
- List<String> actualClauses = new ArrayList<String>();
+ List<String> expectedClauses = new ArrayList<>();
+ List<String> actualClauses = new ArrayList<>();
String dimOnlyQuery = "select testDim2.name, testDim2.cityStateCapital FROM testDim2 where " + TWO_DAYS_RANGE;
CubeQueryRewriter driver = new CubeQueryRewriter(hconf, hconf);
CubeQueryContext rewrittenQuery = driver.rewrite(dimOnlyQuery);
@@ -636,7 +638,7 @@ public class TestJoinResolver extends TestQueryRewrite {
CubeQueryContext rewrittenQuery = driver.rewrite(dimOnlyQuery);
rewrittenQuery.toHQL();
Dimension citydim = CubeMetastoreClient.getInstance(hconf).getDimension("citydim");
- Set<String> cdimTables = new HashSet<String>();
+ Set<String> cdimTables = new HashSet<>();
for (CandidateDim cdim : rewrittenQuery.getCandidateDims().get(citydim)) {
cdimTables.add(cdim.getName());
}
@@ -660,183 +662,4 @@ public class TestJoinResolver extends TestQueryRewrite {
assertLensExceptionInRewrite("select unreachableDim_chain.name from testcube where " + TWO_DAYS_RANGE, hconf,
LensCubeErrorCode.NO_FACT_HAS_COLUMN);
}
-
- @Test
- public void testBridgeTablesWithoutDimtablePartitioning() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
- + " from " + getDbName() + "c1_user_interests_tbl user_interests"
- + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " group by user_interests.user_id) usersports"
- + " on userdim.id = usersports.user_id ",
- null, "group by usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
-
- @Test
- public void testFlattenBridgeTablesOFF() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- conf.setBoolean(CubeQueryConfUtil.ENABLE_FLATTENING_FOR_BRIDGETABLES, false);
- String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join " + getDbName() + "c1_user_interests_tbl user_interests on userdim.id = user_interests.user_id"
- + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id",
- null, "group by usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
-
- @Test
- public void testFlattenBridgeTablesWithCustomAggregate() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- conf.set(CubeQueryConfUtil.BRIDGE_TABLE_FIELD_AGGREGATOR, "custom_aggr");
- String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join (select user_interests.user_id as user_id,custom_aggr(usersports.name) as name"
- + " from " + getDbName() + "c1_user_interests_tbl user_interests"
- + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " group by user_interests.user_id) usersports"
- + " on userdim.id = usersports.user_id ",
- null, "group by usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
-
- @Test
- public void testBridgeTablesWithMegringChains() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- String query = "select userInterestIds.sport_id, usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select userInterestIds.sport_id, usersports.name,"
- + " sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim on basecube.userid = userdim.id join (select userinterestids"
- + ".user_id as user_id,collect_set(userinterestids.sport_id) as sport_id from " + getDbName()
- + "c1_user_interests_tbl userinterestids group by userinterestids.user_id) userinterestids on userdim.id = "
- + "userinterestids.user_id join (select userinterestids.user_id as user_id,collect_set(usersports.name) as name"
- + " from " + getDbName() + "c1_user_interests_tbl userinterestids join "
- + getDbName() + "c1_sports_tbl usersports on userinterestids.sport_id = usersports.id"
- + " group by userinterestids.user_id) usersports on userdim.id = usersports.user_id",
- null, "group by userInterestIds.sport_id, usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
-
- @Test
- public void testBridgeTablesWithMultipleFacts() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- String query = "select usersports.name, sum(msr2), sum(msr12) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected1 = getExpectedQuery("basecube",
- "select usersports.name as `name`, sum(basecube.msr2) as `msr2` FROM ", " join " + getDbName()
- + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
- + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
- + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
- "group by usersports.name", null, getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- String expected2 = getExpectedQuery("basecube",
- "select usersports.name as `name`, sum(basecube.msr12) as `msr12` FROM ", " join " + getDbName()
- + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name" + " from "
- + getDbName() + "c1_user_interests_tbl user_interests" + " join " + getDbName()
- + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " group by user_interests.user_id) usersports" + " on userdim.id = usersports.user_id ", null,
- "group by usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact2_base"));
- TestCubeRewriter.compareContains(expected1, hqlQuery);
- TestCubeRewriter.compareContains(expected2, hqlQuery);
- String lower = hqlQuery.toLowerCase();
- assertTrue(
- lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq2.msr2 msr2, mq1.msr12 msr12 from ")
- || lower.startsWith("select coalesce(mq1.name, mq2.name) name, mq1.msr2 msr2, mq2.msr12 msr12 from "), hqlQuery);
-
- assertTrue(hqlQuery.contains("mq1 full outer join ") && hqlQuery.endsWith("mq2 on mq1.name <=> mq2.name"),
- hqlQuery);
- }
-
- @Test
- public void testBridgeTablesWithMultipleChains() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- String query = "select usersports.name, xusersports.name, yusersports.name, sum(msr2) from basecube where "
- + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, xusersports.name, yusersports.name,"
- + " sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim_1 on basecube.userid = userdim_1.id "
- + " join (select user_interests_1.user_id as user_id, collect_set(usersports.name) as name from "
- + getDbName() + "c1_user_interests_tbl user_interests_1 join " + getDbName() + "c1_sports_tbl usersports on "
- + "user_interests_1.sport_id = usersports.id group by user_interests_1.user_id) "
- + "usersports on userdim_1.id = usersports.user_id"
- + " join " + getDbName() + "c1_usertable userdim_0 on basecube.yuserid = userdim_0.id "
- + " join (select user_interests_0.user_id as user_id,collect_set(yusersports.name) as name from "
- + getDbName() + "c1_user_interests_tbl user_interests_0 join " + getDbName() + "c1_sports_tbl yusersports on "
- + " user_interests_0.sport_id = yusersports.id group by user_interests_0.user_id) yusersports on userdim_0.id ="
- + " yusersports.user_id join " + getDbName() + "c1_usertable userdim on basecube.xuserid = userdim.id"
- + " join (select user_interests.user_id as user_id,collect_set(xusersports.name) as name from "
- + getDbName() + "c1_user_interests_tbl user_interests join " + getDbName() + "c1_sports_tbl xusersports"
- + " on user_interests.sport_id = xusersports.id group by user_interests.user_id) xusersports on userdim.id = "
- + " xusersports.user_id", null, "group by usersports.name, xusersports.name, yusersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
- @Test
- public void testBridgeTablesWithDimTablePartitioning() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C2");
- String query = "select usersports.name, sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c2_usertable userdim ON basecube.userid = userdim.id and userdim.dt='latest' "
- + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
- + " from " + getDbName() + "c2_user_interests_tbl user_interests"
- + " join " + getDbName() + "c2_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " and usersports.dt='latest and user_interests.dt='latest'"
- + " group by user_interests.user_id) usersports"
- + " on userdim.id = usersports.user_id ",
- null, "group by usersports.name", null,
- getWhereForDailyAndHourly2days("basecube", "c2_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
-
- @Test
- public void testBridgeTablesWithNormalJoins() throws Exception {
- Configuration conf = new Configuration(hconf);
- conf.set(CubeQueryConfUtil.DRIVER_SUPPORTED_STORAGES, "C1");
- String query = "select usersports.name, cubestatecountry.name, cubecitystatecountry.name,"
- + " sum(msr2) from basecube where " + TWO_DAYS_RANGE;
- String hqlQuery = rewrite(query, conf);
- String expected = getExpectedQuery("basecube", "select usersports.name, cubestatecountry.name, "
- + "cubecitystatecountry.name, sum(basecube.msr2) FROM ",
- " join " + getDbName() + "c1_usertable userdim ON basecube.userid = userdim.id "
- + " join (select user_interests.user_id as user_id,collect_set(usersports.name) as name"
- + " from " + getDbName() + "c1_user_interests_tbl user_interests"
- + " join " + getDbName() + "c1_sports_tbl usersports on user_interests.sport_id = usersports.id"
- + " group by user_interests.user_id) usersports"
- + " on userdim.id = usersports.user_id "
- + " 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'"
- + " join " + getDbName()
- + "c1_countrytable cubecitystatecountry on statedim_0.countryid=cubecitystatecountry.id"
- + " join " + getDbName() + "c1_statetable statedim on basecube.stateid=statedim.id and (statedim.dt = 'latest')"
- + " join " + getDbName() + "c1_countrytable cubestatecountry on statedim.countryid=cubestatecountry.id ",
- null, "group by usersports.name, cubestatecountry.name, cubecitystatecountry.name", null,
- getWhereForDailyAndHourly2days("basecube", "c1_testfact1_base"));
- TestCubeRewriter.compareQueries(hqlQuery, expected);
- }
}