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:48 UTC
[28/51] [abbrv] lens git commit: LENS-735 : Remove accepting
TableReferences for ReferenceDimAttribute
LENS-735 : Remove accepting TableReferences for ReferenceDimAttribute
Project: http://git-wip-us.apache.org/repos/asf/lens/repo
Commit: http://git-wip-us.apache.org/repos/asf/lens/commit/908530f5
Tree: http://git-wip-us.apache.org/repos/asf/lens/tree/908530f5
Diff: http://git-wip-us.apache.org/repos/asf/lens/diff/908530f5
Branch: refs/heads/current-release-line
Commit: 908530f5883ae8844c6a16cb5564c926cc10bf19
Parents: c73d584
Author: Amareshwari Sriramadasu <am...@gmail.com>
Authored: Mon Jan 11 13:24:32 2016 +0530
Committer: Rajat Khandelwal <ra...@gmail.com>
Committed: Mon Jan 11 13:24:33 2016 +0530
----------------------------------------------------------------------
lens-api/src/main/resources/cube-0.1.xsd | 36 +-
lens-api/src/main/resources/lens-errors.conf | 11 +-
.../lens/cli/TestLensDimensionCommands.java | 28 +-
.../resources/cube_with_no_weight_facts.xml | 8 +-
lens-cli/src/test/resources/sample-cube.xml | 14 +-
lens-cli/src/test/resources/test-dimension.xml | 22 +-
.../lens/cube/error/LensCubeErrorCode.java | 6 +-
.../lens/cube/metadata/AbstractBaseTable.java | 53 +-
.../lens/cube/metadata/AbstractCubeTable.java | 26 +-
.../org/apache/lens/cube/metadata/Cube.java | 111 ++-
.../apache/lens/cube/metadata/CubeColumn.java | 1 -
.../lens/cube/metadata/CubeDimensionTable.java | 21 +-
.../lens/cube/metadata/CubeFactTable.java | 15 +-
.../lens/cube/metadata/CubeMetastoreClient.java | 11 +-
.../apache/lens/cube/metadata/DerivedCube.java | 31 +-
.../apache/lens/cube/metadata/Dimension.java | 20 +-
.../apache/lens/cube/metadata/JoinChain.java | 16 +-
.../cube/metadata/ReferencedDimAtrribute.java | 195 -----
.../cube/metadata/ReferencedDimAttribute.java | 115 +++
.../apache/lens/cube/metadata/SchemaGraph.java | 377 ---------
.../lens/cube/metadata/join/JoinPath.java | 101 +++
.../cube/metadata/join/TableRelationship.java | 46 +
.../apache/lens/cube/parse/AutoJoinContext.java | 760 -----------------
.../apache/lens/cube/parse/CandidateDim.java | 16 +-
.../lens/cube/parse/CubeQueryContext.java | 94 +--
.../cube/parse/DenormalizationResolver.java | 74 +-
.../apache/lens/cube/parse/DimHQLContext.java | 4 +-
.../apache/lens/cube/parse/FieldValidator.java | 9 +-
.../org/apache/lens/cube/parse/HQLParser.java | 2 +-
.../org/apache/lens/cube/parse/JoinClause.java | 144 ----
.../apache/lens/cube/parse/JoinResolver.java | 262 +-----
.../org/apache/lens/cube/parse/JoinTree.java | 164 ----
.../org/apache/lens/cube/parse/StorageUtil.java | 8 +-
.../lens/cube/parse/TimerangeResolver.java | 10 +-
.../lens/cube/parse/join/AutoJoinContext.java | 719 ++++++++++++++++
.../apache/lens/cube/parse/join/JoinClause.java | 139 +++
.../apache/lens/cube/parse/join/JoinTree.java | 164 ++++
.../apache/lens/cube/parse/join/JoinUtils.java | 49 ++
.../cube/metadata/TestCubeMetastoreClient.java | 284 +++++--
.../apache/lens/cube/parse/CubeTestSetup.java | 843 ++++++++++++++-----
.../FieldsCannotBeQueriedTogetherTest.java | 11 +-
.../lens/cube/parse/TestBaseCubeQueries.java | 26 +-
.../lens/cube/parse/TestCubeRewriter.java | 279 +++---
.../cube/parse/TestDenormalizationResolver.java | 140 +--
.../lens/cube/parse/TestExpressionContext.java | 20 +-
.../lens/cube/parse/TestExpressionResolver.java | 102 +--
.../lens/cube/parse/TestJoinResolver.java | 534 +++++-------
.../lens/cube/parse/TestQueryRewrite.java | 10 +
.../lens/cube/parse/TestRewriterPlan.java | 10 +-
.../parse/TestTimeRangeWriterWithQuery.java | 53 +-
.../src/main/resources/cube-queries.sql | 74 +-
lens-examples/src/main/resources/customer.xml | 4 +-
.../src/main/resources/dimension-queries.sql | 14 +-
lens-examples/src/main/resources/sales-cube.xml | 12 +-
.../src/main/resources/sample-cube.xml | 21 +-
.../main/resources/sample-db-only-dimension.xml | 24 +-
.../src/main/resources/sample-dimension.xml | 24 +-
.../apache/lens/server/metastore/JAXBUtils.java | 54 +-
.../server/metastore/TestMetastoreService.java | 17 +-
.../apache/lens/storage/db/TestDBStorage.java | 11 +-
60 files changed, 3156 insertions(+), 3293 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-api/src/main/resources/cube-0.1.xsd
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/cube-0.1.xsd b/lens-api/src/main/resources/cube-0.1.xsd
index 4092133..d195b08 100644
--- a/lens-api/src/main/resources/cube-0.1.xsd
+++ b/lens-api/src/main/resources/cube-0.1.xsd
@@ -393,25 +393,13 @@
<xs:complexContent>
<xs:extension base="x_field">
<xs:sequence>
- <xs:element name="ref_spec" maxOccurs="1" minOccurs="0">
+ <xs:element type="x_chain_column" name="chain_ref_column" maxOccurs="unbounded" minOccurs="0">
<xs:annotation>
<xs:documentation>
- Reference specifiction needs to be specified if the attribute is a reference attribute. It
- can either be table reference or a chained column
-
- ref_spec can be specified as a list of table references to
- which the attribute is refering to.
- For ex : userid refers user.id, xuser.id, yuser.id, zuser.id.
-
- Alternately, ref_spec could be list of chained columns each specifed with chain name and column name.
+ Chain column specification needs to be specified if the attribute is a reference attribute.
+ It can be list of chained columns each specified with chain name and column name.
</xs:documentation>
</xs:annotation>
- <xs:complexType>
- <xs:choice maxOccurs="1" minOccurs="1">
- <xs:element type="x_table_references" name="table_references" maxOccurs="1" minOccurs="1"/>
- <xs:element type="x_chain_column" name="chain_ref_column" maxOccurs="unbounded" minOccurs="1"/>
- </xs:choice>
- </xs:complexType>
</xs:element>
<xs:element name="hierarchy" type="x_dim_attributes" maxOccurs="1" minOccurs="0">
<xs:annotation>
@@ -471,13 +459,6 @@
</xs:documentation>
</xs:annotation>
</xs:attribute>
- <xs:attribute type="xs:boolean" name="join_key" default="true">
- <xs:annotation>
- <xs:documentation>
- This flag will tell whether the attribute can be used as a join key or not
- </xs:documentation>
- </xs:annotation>
- </xs:attribute>
</xs:extension>
</xs:complexContent>
</xs:complexType>
@@ -531,17 +512,6 @@
</xs:attribute>
</xs:complexType>
- <xs:complexType name="x_table_references">
- <xs:annotation>
- <xs:documentation>
- Set of table references.
- </xs:documentation>
- </xs:annotation>
- <xs:sequence>
- <xs:element type="x_table_reference" name="table_reference" maxOccurs="unbounded" minOccurs="1"/>
- </xs:sequence>
- </xs:complexType>
-
<xs:element name="x_join_chains" type="x_join_chains"/>
<xs:complexType name="x_join_chains">
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-api/src/main/resources/lens-errors.conf
----------------------------------------------------------------------
diff --git a/lens-api/src/main/resources/lens-errors.conf b/lens-api/src/main/resources/lens-errors.conf
index c7ccea1..9087fcd 100644
--- a/lens-api/src/main/resources/lens-errors.conf
+++ b/lens-api/src/main/resources/lens-errors.conf
@@ -207,7 +207,7 @@ lensCubeErrorsForQuery = [
{
errorCode = 3018
httpStatusCode = ${BAD_REQUEST}
- errorMsg = "No join condition available"
+ errorMsg = "Default aggregate is not set for measure: %s"
}
{
@@ -219,7 +219,7 @@ lensCubeErrorsForQuery = [
{
errorCode = 3020
httpStatusCode = ${BAD_REQUEST}
- errorMsg = "Default aggregate is not set for measure: %s"
+ errorMsg = "No join condition available"
}
{
@@ -294,6 +294,13 @@ lensCubeErrorsForQuery = [
httpStatusCode = ${INTERNAL_SERVER_ERROR}
errorMsg = "Could not parse expression %s"
}
+
+ {
+ errorCode = 3033
+ httpStatusCode = ${BAD_REQUEST}
+ errorMsg = "Could not find queried table or chain: %s"
+ }
+
]
lensCubeErrorsForMetastore = [
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionCommands.java
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionCommands.java b/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionCommands.java
index 42c6bae..160699b 100644
--- a/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionCommands.java
+++ b/lens-cli/src/test/java/org/apache/lens/cli/TestLensDimensionCommands.java
@@ -27,7 +27,7 @@ import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
-import org.apache.lens.api.metastore.XJoinChains;
+import org.apache.lens.api.metastore.*;
import org.apache.lens.cli.commands.LensDimensionCommands;
import org.apache.lens.cli.table.XJoinChainTable;
import org.apache.lens.client.LensClient;
@@ -62,6 +62,8 @@ public class TestLensDimensionCommands extends LensCliApplicationTest {
* the URI syntax exception
*/
public static void createDimension() throws URISyntaxException {
+ getCommand().createDimension(new File(
+ TestLensCubeCommands.class.getClassLoader().getResource("test-detail.xml").toURI()));
URL dimensionSpec = TestLensDimensionCommands.class.getClassLoader().getResource("test-dimension.xml");
getCommand().createDimension(new File(dimensionSpec.toURI()));
}
@@ -81,16 +83,38 @@ public class TestLensDimensionCommands extends LensCliApplicationTest {
createDimension();
dimensionList = getCommand().showDimensions();
Assert.assertTrue(dimensionList.contains("test_dim"));
+ Assert.assertTrue(dimensionList.contains("test_detail"));
testFields(getCommand());
testJoinChains(getCommand());
testUpdateCommand(new File(dimensionSpec.toURI()), getCommand());
getCommand().dropDimension("test_dim");
+ getCommand().dropDimension("test_detail");
dimensionList = getCommand().showDimensions();
Assert.assertFalse(dimensionList.contains("test_dim"));
+ Assert.assertFalse(dimensionList.contains("test_detail"));
}
private void testJoinChains(LensDimensionCommands command) {
- assertEquals(command.showJoinChains("test_dim"), new XJoinChainTable(new XJoinChains()).toString());
+ XJoinChains chains = new XJoinChains();
+ XJoinChain chain1 = new XJoinChain();
+ chain1.setPaths(new XJoinPaths());
+ XJoinPath path = new XJoinPath();
+ path.setEdges(new XJoinEdges());
+ XJoinEdge edge1 = new XJoinEdge();
+ XTableReference ref1 = new XTableReference();
+ ref1.setTable("test_dim");
+ ref1.setColumn("d2id");
+ XTableReference ref2 = new XTableReference();
+ ref2.setTable("test_detail");
+ ref2.setColumn("id");
+ edge1.setFrom(ref1);
+ edge1.setTo(ref2);
+ path.getEdges().getEdge().add(edge1);
+ chain1.setName("dim2chain");
+ chain1.getPaths().getPath().add(path);
+ chain1.setDestTable("test_detail");
+ chains.getJoinChain().add(chain1);
+ assertEquals(command.showJoinChains("test_dim"), new XJoinChainTable(chains).toString());
}
private void testFields(LensDimensionCommands qCom) {
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cli/src/test/resources/cube_with_no_weight_facts.xml
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/resources/cube_with_no_weight_facts.xml b/lens-cli/src/test/resources/cube_with_no_weight_facts.xml
index 263ca88..13736b2 100644
--- a/lens-cli/src/test/resources/cube_with_no_weight_facts.xml
+++ b/lens-cli/src/test/resources/cube_with_no_weight_facts.xml
@@ -30,13 +30,7 @@
<dim_attributes>
<dim_attribute name="dim1" type="INT" />
<dim_attribute name="dim2" type="INT" start_time='2013-12-01T00:00:00' />
- <dim_attribute name="dim3" type="INT">
- <ref_spec>
- <table_references>
- <table_reference table="dim_table" column="id" />
- </table_references>
- </ref_spec>
- </dim_attribute>
+ <dim_attribute name="dim3" type="INT"/>
</dim_attributes>
<expressions>
<expression name="expr_msr5" type="DOUBLE">
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cli/src/test/resources/sample-cube.xml
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/resources/sample-cube.xml b/lens-cli/src/test/resources/sample-cube.xml
index d72d279..e3b3284 100644
--- a/lens-cli/src/test/resources/sample-cube.xml
+++ b/lens-cli/src/test/resources/sample-cube.xml
@@ -34,19 +34,11 @@
<dim_attributes>
<dim_attribute name="dim1" type="INT" />
<dim_attribute name="dim2" type="INT" start_time='2013-12-01T00:00:00' />
- <dim_attribute name="dim3" type="INT">
- <ref_spec>
- <table_references>
- <table_reference table="dim_table" column="id" />
- </table_references>
- </ref_spec>
- </dim_attribute>
+ <dim_attribute name="dim3" type="INT"/>
<dim_attribute name="dimDetail" type="string" description="City name to which the customer belongs"
display_string="Customer City">
- <ref_spec>
- <chain_ref_column chain_name="testdimchain" ref_col="detail" />
- <chain_ref_column chain_name="testdetailchain" ref_col="name" />
- </ref_spec>
+ <chain_ref_column chain_name="testdimchain" ref_col="detail" />
+ <chain_ref_column chain_name="testdetailchain" ref_col="name" />
</dim_attribute>
</dim_attributes>
<expressions>
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cli/src/test/resources/test-dimension.xml
----------------------------------------------------------------------
diff --git a/lens-cli/src/test/resources/test-dimension.xml b/lens-cli/src/test/resources/test-dimension.xml
index 6eb3d31..2fa47f1 100644
--- a/lens-cli/src/test/resources/test-dimension.xml
+++ b/lens-cli/src/test/resources/test-dimension.xml
@@ -25,13 +25,7 @@
<dim_attribute name="id" type="INT" />
<dim_attribute name="name" type="STRING" />
<dim_attribute name="detail" type="STRING" start_time='2013-12-01T00:00:00' />
- <dim_attribute name="d2id" type="INT" start_time='2013-12-01T00:00:00'>
- <ref_spec>
- <table_references>
- <table_reference table="test_dim2" column="id" />
- </table_references>
- </ref_spec>
- </dim_attribute>
+ <dim_attribute name="d2id" type="INT" start_time='2013-12-01T00:00:00'/>
<dim_attribute name="inline" type="STRING" >
<values>A</values>
<values>B</values>
@@ -46,6 +40,20 @@
</dim_attribute>
</attributes>
+ <join_chains>
+ <join_chain name="dim2chain">
+ <paths>
+ <path>
+ <edges>
+ <edge>
+ <from table="test_dim" column="d2id" />
+ <to table="test_detail" column="id" />
+ </edge>
+ </edges>
+ </path>
+ </paths>
+ </join_chain>
+ </join_chains>
<properties>
<property name="test_dim.prop" value="test" />
<property name="dimension.test_dim.timed.dimension" value="dt" />
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
index 68cd80b..61d08b2 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/error/LensCubeErrorCode.java
@@ -43,7 +43,7 @@ public enum LensCubeErrorCode {
CANNOT_USE_TIMERANGE_WRITER(3017, 100),
NO_DEFAULT_AGGREGATE(3018, 200),
EXPRESSION_NOT_IN_ANY_FACT(3019, 300),
- NO_JOIN_CONDITION_AVAIABLE(3020, 400),
+ NO_JOIN_CONDITION_AVAILABLE(3020, 400),
NO_JOIN_PATH(3021, 500),
COLUMN_UNAVAILABLE_IN_TIME_RANGE(3022, 600),
NO_DIM_HAS_COLUMN(3023, 700),
@@ -53,9 +53,11 @@ public enum LensCubeErrorCode {
NO_CANDIDATE_DIM_AVAILABLE(3027, 1100),
NO_CANDIDATE_FACT_AVAILABLE(3028, 1200),
NO_CANDIDATE_DIM_STORAGE_TABLES(3029, 1300),
- NO_STORAGE_TABLE_AVAIABLE(3030, 1400),
+ NO_STORAGE_TABLE_AVAILABLE(3030, 1400),
STORAGE_UNION_DISABLED(3031, 1500),
COULD_NOT_PARSE_EXPRESSION(3032, 1500),
+ QUERIED_TABLE_NOT_FOUND(3033, 0),
+
// Error codes greater than 3100 are errors while doing a metastore operation.
ERROR_IN_ENTITY_DEFINITION(3101, 100),
TIMELINE_ABSENT(3102, 100),
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractBaseTable.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractBaseTable.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractBaseTable.java
index 88c9ee8..5543308 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractBaseTable.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractBaseTable.java
@@ -23,7 +23,6 @@ import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
import com.google.common.base.Preconditions;
@@ -38,7 +37,7 @@ import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class AbstractBaseTable extends AbstractCubeTable {
private final Set<ExprColumn> expressions;
- private static final List<FieldSchema> COLUMNS = new ArrayList<FieldSchema>();
+ private static final List<FieldSchema> COLUMNS = new ArrayList<>();
private final Map<String, ExprColumn> exprMap;
@Getter
private final Set<JoinChain> joinChains;
@@ -52,9 +51,9 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
properties, double weight) {
super(name, COLUMNS, properties, weight);
- exprMap = new HashMap<String, ExprColumn>();
+ exprMap = new HashMap<>();
if (exprs == null) {
- this.expressions = new HashSet<ExprColumn>();
+ this.expressions = new HashSet<>();
} else {
this.expressions = exprs;
}
@@ -66,10 +65,10 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
if (joinChains != null) {
this.joinChains = joinChains;
} else {
- this.joinChains = new HashSet<JoinChain>();
+ this.joinChains = new HashSet<>();
}
- chainMap = new HashMap<String, JoinChain>();
+ chainMap = new HashMap<>();
for (JoinChain chain : this.joinChains) {
chainMap.put(chain.getName().toLowerCase(), chain);
}
@@ -78,12 +77,12 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
public AbstractBaseTable(Table tbl) {
super(tbl);
this.expressions = getExpressions(getName(), getProperties());
- exprMap = new HashMap<String, ExprColumn>();
+ exprMap = new HashMap<>();
for (ExprColumn expr : expressions) {
exprMap.put(expr.getName().toLowerCase(), expr);
}
this.joinChains = getJoinChains(this, getJoinChainListPropKey(getName()), getProperties());
- chainMap = new HashMap<String, JoinChain>();
+ chainMap = new HashMap<>();
for (JoinChain chain : joinChains) {
chainMap.put(chain.getName().toLowerCase(), chain);
}
@@ -110,7 +109,7 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
private static Set<ExprColumn> getExpressions(String name, Map<String, String> props) {
- Set<ExprColumn> exprs = new HashSet<ExprColumn>();
+ Set<ExprColumn> exprs = new HashSet<>();
String exprStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getExpressionListKey(name));
if (!StringUtils.isBlank(exprStr)) {
String[] names = exprStr.split(",");
@@ -152,7 +151,7 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
public ExprColumn getExpressionByName(String exprName) {
- return exprMap.get(exprName == null ? exprName : exprName.toLowerCase());
+ return exprMap.get(exprName == null ? null : exprName.toLowerCase());
}
public CubeColumn getColumnByName(String column) {
@@ -162,10 +161,9 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
/**
* Alters the expression if already existing or just adds if it is new expression.
*
- * @param expr
- * @throws HiveException
+ * @param expr ExprColumn
*/
- public void alterExpression(ExprColumn expr) throws HiveException {
+ public void alterExpression(ExprColumn expr) {
if (expr == null) {
throw new NullPointerException("Cannot add null expression");
}
@@ -183,9 +181,9 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
/**
- * Remove the measure with name specified
+ * Remove the expression with name specified
*
- * @param exprName
+ * @param exprName expression name
*/
public void removeExpression(String exprName) {
if (exprMap.containsKey(exprName.toLowerCase())) {
@@ -197,7 +195,7 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
public Set<String> getExpressionNames() {
- Set<String> exprNames = new HashSet<String>();
+ Set<String> exprNames = new HashSet<>();
for (ExprColumn f : getExpressions()) {
exprNames.add(f.getName().toLowerCase());
}
@@ -225,10 +223,9 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
/**
* Alters the joinchain if already existing or just adds if it is new chain
*
- * @param joinchain
- * @throws HiveException
+ * @param joinchain join chain
*/
- public void alterJoinChain(JoinChain joinchain) throws HiveException {
+ public void alterJoinChain(JoinChain joinchain) {
if (joinchain == null) {
throw new NullPointerException("Cannot add null joinchain");
}
@@ -251,20 +248,20 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
/**
- * Returns the property key for Cube/Dimension specific join chain list
+ * Get the property key for Cube/Dimension specific join chain list
*
- * @param tblname
- * @return
+ * @param tblName table name
+ * @return the property key for Cube/Dimension specific join chain list
*/
- protected abstract String getJoinChainListPropKey(String tblname);
+ protected abstract String getJoinChainListPropKey(String tblName);
/**
* Get join chains from properties
*
- * @return
+ * @return set of join chains
*/
private static Set<JoinChain> getJoinChains(AbstractBaseTable tbl, String propName, Map<String, String> props) {
- Set<JoinChain> joinChains = new HashSet<JoinChain>();
+ Set<JoinChain> joinChains = new HashSet<>();
String joinChainsStr = MetastoreUtil.getNamedStringValue(props, propName);
if (!StringUtils.isBlank(joinChainsStr)) {
String[] cnames = joinChainsStr.split(",");
@@ -277,7 +274,7 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
}
public Set<String> getJoinChainNames() {
- Set<String> chainNames = new HashSet<String>();
+ Set<String> chainNames = new HashSet<>();
for (JoinChain f : getJoinChains()) {
chainNames.add(f.getName().toLowerCase());
}
@@ -286,9 +283,9 @@ public abstract class AbstractBaseTable extends AbstractCubeTable {
/**
- * Remove the joinchain with name specified
+ * Remove the join chain with name specified
*
- * @param chainName
+ * @param chainName chain name
*/
public boolean removeJoinChain(String chainName) {
if (chainMap.containsKey(chainName.toLowerCase())) {
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractCubeTable.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractCubeTable.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractCubeTable.java
index da3a7e5..01098c4 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractCubeTable.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/AbstractCubeTable.java
@@ -21,16 +21,16 @@ package org.apache.lens.cube.metadata;
import java.util.*;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
+import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public abstract class AbstractCubeTable implements Named {
private final String name;
private final List<FieldSchema> columns;
- private final Map<String, String> properties = new HashMap<String, String>();
+ private final Map<String, String> properties = new HashMap<>();
private double weight;
protected AbstractCubeTable(String name, List<FieldSchema> columns, Map<String, String> props, double weight) {
@@ -82,7 +82,7 @@ public abstract class AbstractCubeTable implements Named {
/**
* Alters the weight of table
*
- * @param weight
+ * @param weight Weight of the table.
*/
public void alterWeight(double weight) {
this.weight = weight;
@@ -102,7 +102,7 @@ public abstract class AbstractCubeTable implements Named {
/**
* Remove property specified by the key
*
- * @param propKey
+ * @param propKey property key
*/
public void removeProperty(String propKey) {
properties.remove(propKey);
@@ -111,13 +111,9 @@ public abstract class AbstractCubeTable implements Named {
/**
* Alters the column if already existing or just adds it if it is new column
*
- * @param column
- * @throws HiveException
+ * @param column The column spec as FieldSchema - name, type and a comment
*/
- protected void alterColumn(FieldSchema column) throws HiveException {
- if (column == null) {
- throw new HiveException("Column cannot be null");
- }
+ protected void alterColumn(@NonNull FieldSchema column) {
Iterator<FieldSchema> columnItr = columns.iterator();
int alterPos = -1;
int i = 0;
@@ -144,13 +140,9 @@ public abstract class AbstractCubeTable implements Named {
/**
* Adds or alters the columns passed
*
- * @param columns
- * @throws HiveException
+ * @param columns The collection of columns
*/
- protected void addColumns(Collection<FieldSchema> columns) throws HiveException {
- if (columns == null) {
- throw new HiveException("Columns cannot be null");
- }
+ protected void addColumns(@NonNull Collection<FieldSchema> columns) {
for (FieldSchema column : columns) {
alterColumn(column);
}
@@ -202,7 +194,7 @@ public abstract class AbstractCubeTable implements Named {
public Set<String> getAllFieldNames() {
List<FieldSchema> fields = getColumns();
- Set<String> columns = new HashSet<String>(fields.size());
+ Set<String> columns = new HashSet<>(fields.size());
for (FieldSchema f : fields) {
columns.add(f.getName().toLowerCase());
}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
index f09da37..b376aaf 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Cube.java
@@ -22,9 +22,9 @@ import java.lang.reflect.Constructor;
import java.util.*;
import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
+import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -55,12 +55,12 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
this.measures = measures;
this.dimensions = dimensions;
- measureMap = new HashMap<String, CubeMeasure>();
+ measureMap = new HashMap<>();
for (CubeMeasure m : measures) {
measureMap.put(m.getName().toLowerCase(), m);
}
- dimMap = new HashMap<String, CubeDimAttribute>();
+ dimMap = new HashMap<>();
for (CubeDimAttribute dim : dimensions) {
dimMap.put(dim.getName().toLowerCase(), dim);
}
@@ -73,12 +73,12 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
this.measures = getMeasures(getName(), getProperties());
this.dimensions = getDimensions(getName(), getProperties());
- measureMap = new HashMap<String, CubeMeasure>();
+ measureMap = new HashMap<>();
for (CubeMeasure m : measures) {
measureMap.put(m.getName().toLowerCase(), m);
}
- dimMap = new HashMap<String, CubeDimAttribute>();
+ dimMap = new HashMap<>();
for (CubeDimAttribute dim : dimensions) {
addAllDimsToMap(dim);
}
@@ -103,7 +103,7 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
public Set<String> getTimedDimensions() {
String str = getProperties().get(MetastoreUtil.getCubeTimedDimensionListKey(getName()));
- Set<String> timedDimensions = new HashSet<String>();
+ Set<String> timedDimensions = new HashSet<>();
if (str != null) {
timedDimensions.addAll(Arrays.asList(StringUtils.split(str, ',')));
}
@@ -137,7 +137,7 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
}
public static Set<CubeMeasure> getMeasures(String name, Map<String, String> props) {
- Set<CubeMeasure> measures = new HashSet<CubeMeasure>();
+ Set<CubeMeasure> measures = new HashSet<>();
String measureStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getCubeMeasureListKey(name));
String[] names = measureStr.split(",");
for (String measureName : names) {
@@ -157,21 +157,23 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
}
public static Set<CubeDimAttribute> getDimensions(String name, Map<String, String> props) {
- Set<CubeDimAttribute> dimensions = new HashSet<CubeDimAttribute>();
+ Set<CubeDimAttribute> dimensions = new HashSet<>();
String dimStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getCubeDimensionListKey(name));
- String[] names = dimStr.split(",");
- for (String dimName : names) {
- String className = props.get(MetastoreUtil.getDimensionClassPropertyKey(dimName));
- CubeDimAttribute dim;
- try {
- Class<?> clazz = Class.forName(className);
- Constructor<?> constructor;
- constructor = clazz.getConstructor(String.class, Map.class);
- dim = (CubeDimAttribute) constructor.newInstance(new Object[]{dimName, props});
- } catch (Exception e) {
- throw new IllegalArgumentException("Invalid dimension", e);
+ if (StringUtils.isNotBlank(dimStr)) {
+ String[] names = dimStr.split(",");
+ for (String dimName : names) {
+ String className = props.get(MetastoreUtil.getDimensionClassPropertyKey(dimName));
+ CubeDimAttribute dim;
+ try {
+ Class<?> clazz = Class.forName(className);
+ Constructor<?> constructor;
+ constructor = clazz.getConstructor(String.class, Map.class);
+ dim = (CubeDimAttribute) constructor.newInstance(new Object[]{dimName, props});
+ } catch (Exception e) {
+ throw new IllegalArgumentException("Invalid dimension", e);
+ }
+ dimensions.add(dim);
}
- dimensions.add(dim);
}
return dimensions;
}
@@ -226,14 +228,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Alters the measure if already existing or just adds if it is new measure.
*
- * @param measure
- * @throws HiveException
+ * @param measure new measure definition
*/
- public void alterMeasure(CubeMeasure measure) throws HiveException {
- if (measure == null) {
- throw new NullPointerException("Cannot add null measure");
- }
-
+ public void alterMeasure(@NonNull CubeMeasure measure) {
// Replace measure if already existing
if (measureMap.containsKey(measure.getName().toLowerCase())) {
measures.remove(getMeasureByName(measure.getName()));
@@ -249,9 +246,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Remove the joinchain with name specified
*
- * @param chainName
+ * @param chainName chain name
*/
- public boolean removeJoinChain(String chainName) {
+ public boolean removeJoinChain(@NonNull String chainName) {
if (super.removeJoinChain(chainName)) {
log.info("Removing dimension {}", getDimAttributeByName(chainName));
return true;
@@ -262,14 +259,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Alters the dimension if already existing or just adds if it is new dimension
*
- * @param dimension
- * @throws HiveException
+ * @param dimension the dim attribute
*/
- public void alterDimension(CubeDimAttribute dimension) throws HiveException {
- if (dimension == null) {
- throw new NullPointerException("Cannot add null dimension");
- }
-
+ public void alterDimension(@NonNull CubeDimAttribute dimension) {
// Replace dimension if already existing
if (dimMap.containsKey(dimension.getName().toLowerCase())) {
dimensions.remove(getDimAttributeByName(dimension.getName()));
@@ -284,11 +276,11 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
- * Remove the dimension with name specified
+ * Remove the attribute with name specified
*
- * @param dimName
+ * @param dimName attribute name
*/
- public void removeDimension(String dimName) {
+ public void removeDimension(@NonNull String dimName) {
if (dimMap.containsKey(dimName.toLowerCase())) {
log.info("Removing dimension {}", getDimAttributeByName(dimName));
dimensions.remove(getDimAttributeByName(dimName));
@@ -300,9 +292,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Remove the measure with name specified
*
- * @param msrName
+ * @param msrName measure name
*/
- public void removeMeasure(String msrName) {
+ public void removeMeasure(@NonNull String msrName) {
if (measureMap.containsKey(msrName.toLowerCase())) {
log.info("Removing measure {}", getMeasureByName(msrName));
measures.remove(getMeasureByName(msrName));
@@ -314,17 +306,13 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Adds the timed dimension
*
- * @param timedDimension
- * @throws HiveException
+ * @param timedDimension time dimension
*/
- public void addTimedDimension(String timedDimension) throws HiveException {
- if (timedDimension == null || timedDimension.isEmpty()) {
- throw new HiveException("Invalid timed dimension " + timedDimension);
- }
+ public void addTimedDimension(@NonNull String timedDimension) {
timedDimension = timedDimension.toLowerCase();
Set<String> timeDims = getTimedDimensions();
if (timeDims == null) {
- timeDims = new LinkedHashSet<String>();
+ timeDims = new LinkedHashSet<>();
}
if (timeDims.contains(timedDimension)) {
log.info("Timed dimension {} is already present in cube {}", timedDimension, getName());
@@ -338,13 +326,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
/**
* Removes the timed dimension
*
- * @param timedDimension
- * @throws HiveException
+ * @param timedDimension time dimension
*/
- public void removeTimedDimension(String timedDimension) throws HiveException {
- if (timedDimension == null || timedDimension.isEmpty()) {
- throw new HiveException("Invalid timed dimension " + timedDimension);
- }
+ public void removeTimedDimension(@NonNull String timedDimension) {
timedDimension = timedDimension.toLowerCase();
Set<String> timeDims = getTimedDimensions();
if (timeDims != null && timeDims.contains(timedDimension)) {
@@ -360,7 +344,7 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
@Override
public Set<String> getMeasureNames() {
- Set<String> measureNames = new HashSet<String>();
+ Set<String> measureNames = new HashSet<>();
for (CubeMeasure f : getMeasures()) {
measureNames.add(f.getName().toLowerCase());
}
@@ -369,7 +353,7 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
@Override
public Set<String> getDimAttributeNames() {
- Set<String> dimNames = new HashSet<String>();
+ Set<String> dimNames = new HashSet<>();
for (CubeDimAttribute f : getDimAttributes()) {
MetastoreUtil.addColumnNames(f, dimNames);
}
@@ -378,9 +362,9 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
@Override
public boolean allFieldsQueriable() {
- String canbeQueried = getProperties().get(MetastoreConstants.CUBE_ALL_FIELDS_QUERIABLE);
- if (canbeQueried != null) {
- return Boolean.parseBoolean(canbeQueried);
+ String canBeQueried = getProperties().get(MetastoreConstants.CUBE_ALL_FIELDS_QUERIABLE);
+ if (canBeQueried != null) {
+ return Boolean.parseBoolean(canBeQueried);
}
return true;
}
@@ -398,22 +382,21 @@ public class Cube extends AbstractBaseTable implements CubeInterface {
* @see org.apache.lens.cube.metadata.AbstractBaseTable
*/
@Override
- protected String getJoinChainListPropKey(String tblname) {
+ protected String getJoinChainListPropKey(@NonNull String tblname) {
return MetastoreUtil.getCubeJoinChainListKey(getName());
}
- public String getPartitionColumnOfTimeDim(String timeDimName) {
+ public String getPartitionColumnOfTimeDim(@NonNull String timeDimName) {
String partCol = getProperties().get(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX + timeDimName);
return StringUtils.isNotBlank(partCol) ? partCol : timeDimName;
}
- public String getTimeDimOfPartitionColumn(String partCol) {
+ public String getTimeDimOfPartitionColumn(@NonNull String partCol) {
Map<String, String> properties = getProperties();
for (Map.Entry<String, String> entry : properties.entrySet()) {
if (entry.getKey().startsWith(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX)
&& entry.getValue().equalsIgnoreCase(partCol)) {
- String timeDim = entry.getKey().replace(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX, "");
- return timeDim;
+ return entry.getKey().replace(MetastoreConstants.TIMEDIM_TO_PART_MAPPING_PFX, "");
}
}
return partCol;
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeColumn.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeColumn.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeColumn.java
index b04532f..77024c0 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeColumn.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeColumn.java
@@ -24,7 +24,6 @@ import java.util.Date;
import java.util.Map;
import java.util.TimeZone;
-
import com.google.common.base.Optional;
import lombok.NonNull;
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeDimensionTable.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeDimensionTable.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeDimensionTable.java
index cd80d64..713f476 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeDimensionTable.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeDimensionTable.java
@@ -22,17 +22,17 @@ import java.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
import com.google.common.collect.Sets;
+import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public final class CubeDimensionTable extends AbstractCubeTable {
private String dimName; // dimension name the dimtabe belongs to
- private final Map<String, UpdatePeriod> snapshotDumpPeriods = new HashMap<String, UpdatePeriod>();
+ private final Map<String, UpdatePeriod> snapshotDumpPeriods = new HashMap<>();
public CubeDimensionTable(String dimName, String dimTblName, List<FieldSchema> columns, double weight,
Map<String, UpdatePeriod> snapshotDumpPeriods) {
@@ -61,7 +61,7 @@ public final class CubeDimensionTable extends AbstractCubeTable {
private static Map<String, UpdatePeriod> getSnapshotDumpPeriods(Set<String> storages) {
- Map<String, UpdatePeriod> snapshotDumpPeriods = new HashMap<String, UpdatePeriod>();
+ Map<String, UpdatePeriod> snapshotDumpPeriods = new HashMap<>();
for (String storage : storages) {
snapshotDumpPeriods.put(storage, null);
}
@@ -134,7 +134,7 @@ public final class CubeDimensionTable extends AbstractCubeTable {
private static Map<String, UpdatePeriod> getDumpPeriods(String name, Map<String, String> params) {
String storagesStr = params.get(MetastoreUtil.getDimensionStorageListKey(name));
if (!StringUtils.isBlank(storagesStr)) {
- Map<String, UpdatePeriod> dumpPeriods = new HashMap<String, UpdatePeriod>();
+ Map<String, UpdatePeriod> dumpPeriods = new HashMap<>();
for (String storage : StringUtils.split(storagesStr, ",")) {
String dumpPeriod = params.get(MetastoreUtil.getDimensionDumpPeriodKey(name, storage));
if (dumpPeriod != null) {
@@ -193,7 +193,7 @@ public final class CubeDimensionTable extends AbstractCubeTable {
/**
* Alter the dimension name that the table belongs to
*
- * @param newDimName
+ * @param newDimName new dimension name.
*/
public void alterUberDim(String newDimName) {
this.dimName = newDimName;
@@ -205,13 +205,8 @@ public final class CubeDimensionTable extends AbstractCubeTable {
*
* @param storage Storage name
* @param period The new value
- * @throws HiveException
*/
- public void alterSnapshotDumpPeriod(String storage, UpdatePeriod period) throws HiveException {
- if (storage == null) {
- throw new HiveException("Cannot add null storage for " + getName());
- }
-
+ public void alterSnapshotDumpPeriod(@NonNull String storage, UpdatePeriod period) {
if (snapshotDumpPeriods.containsKey(storage)) {
log.info("Updating dump period for {} from {} to {}", storage, snapshotDumpPeriods.get(storage), period);
}
@@ -221,12 +216,12 @@ public final class CubeDimensionTable extends AbstractCubeTable {
}
@Override
- public void alterColumn(FieldSchema column) throws HiveException {
+ public void alterColumn(FieldSchema column) {
super.alterColumn(column);
}
@Override
- public void addColumns(Collection<FieldSchema> columns) throws HiveException {
+ public void addColumns(Collection<FieldSchema> columns) {
super.addColumns(columns);
}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeFactTable.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeFactTable.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeFactTable.java
index b1fec8c..643bcfe 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeFactTable.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeFactTable.java
@@ -20,12 +20,12 @@ package org.apache.lens.cube.metadata;
import java.util.*;
+import org.apache.lens.cube.error.LensCubeErrorCode;
import org.apache.lens.cube.metadata.UpdatePeriod.UpdatePeriodComparator;
import org.apache.lens.server.api.error.LensException;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
import com.google.common.collect.Lists;
@@ -261,11 +261,11 @@ public class CubeFactTable extends AbstractCubeTable {
*
* @param storage
* @param updatePeriods
- * @throws HiveException
*/
- public void alterStorage(String storage, Set<UpdatePeriod> updatePeriods) throws HiveException {
+ public void alterStorage(String storage, Set<UpdatePeriod> updatePeriods) throws LensException{
if (!storageUpdatePeriods.containsKey(storage)) {
- throw new HiveException("Invalid storage" + storage);
+ throw new LensException(LensCubeErrorCode.ERROR_IN_ENTITY_DEFINITION.getLensErrorInfo(),
+ "Invalid storage" + storage);
}
storageUpdatePeriods.put(storage, updatePeriods);
addUpdatePeriodProperies(getName(), getProperties(), storageUpdatePeriods);
@@ -276,9 +276,8 @@ public class CubeFactTable extends AbstractCubeTable {
*
* @param storage
* @param updatePeriods
- * @throws HiveException
*/
- void addStorage(String storage, Set<UpdatePeriod> updatePeriods) throws HiveException {
+ void addStorage(String storage, Set<UpdatePeriod> updatePeriods) {
storageUpdatePeriods.put(storage, updatePeriods);
addUpdatePeriodProperies(getName(), getProperties(), storageUpdatePeriods);
}
@@ -296,12 +295,12 @@ public class CubeFactTable extends AbstractCubeTable {
}
@Override
- public void alterColumn(FieldSchema column) throws HiveException {
+ public void alterColumn(FieldSchema column) {
super.alterColumn(column);
}
@Override
- public void addColumns(Collection<FieldSchema> columns) throws HiveException {
+ public void addColumns(Collection<FieldSchema> columns) {
super.addColumns(columns);
}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
index ae0fb90..dcb932e 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/CubeMetastoreClient.java
@@ -85,7 +85,6 @@ public class CubeMetastoreClient {
PartitionTimelineCache partitionTimelineCache = new PartitionTimelineCache();
// dbname to client mapping
private static final Map<String, CubeMetastoreClient> CLIENT_MAPPING = Maps.newConcurrentMap();
- private SchemaGraph schemaGraph;
// Set of all storage table names for which latest partitions exist
private final Set<String> latestLookupCache = Sets.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
@@ -627,7 +626,8 @@ public class CubeMetastoreClient {
* @throws HiveException
*/
public void createCube(String name, Set<CubeMeasure> measures, Set<CubeDimAttribute> dimensions,
- Set<ExprColumn> expressions, Set<JoinChain> chains, Map<String, String> properties) throws HiveException {
+ Set<ExprColumn> expressions, Set<JoinChain> chains, Map<String, String> properties)
+ throws HiveException {
Cube cube = new Cube(name, measures, dimensions, expressions, chains, properties, 0L);
createCube(cube);
}
@@ -1858,13 +1858,6 @@ public class CubeMetastoreClient {
return false;
}
- public synchronized SchemaGraph getSchemaGraph() throws HiveException {
- if (schemaGraph == null) {
- schemaGraph = new SchemaGraph(this);
- }
- return schemaGraph;
- }
-
/**
*
* @param table table name
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
index 681aa7b..4c73785 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/DerivedCube.java
@@ -25,22 +25,21 @@ import org.apache.lens.server.api.error.LensException;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.metastore.api.FieldSchema;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
import com.google.common.collect.Lists;
public class DerivedCube extends AbstractCubeTable implements CubeInterface {
- private static final List<FieldSchema> COLUMNS = new ArrayList<FieldSchema>();
+ private static final List<FieldSchema> COLUMNS = new ArrayList<>();
static {
COLUMNS.add(new FieldSchema("dummy", "string", "dummy column"));
}
private final Cube parent;
- private final Set<String> measures = new HashSet<String>();
- private final Set<String> dimensions = new HashSet<String>();
+ private final Set<String> measures = new HashSet<>();
+ private final Set<String> dimensions = new HashSet<>();
public DerivedCube(String name, Set<String> measures, Set<String> dimensions, Cube parent) throws LensException {
this(name, measures, dimensions, new HashMap<String, String>(), 0L, parent);
@@ -99,8 +98,8 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
this.parent = parent;
}
- private Set<CubeMeasure> cachedMeasures = new HashSet<CubeMeasure>();
- private Set<CubeDimAttribute> cachedDims = new HashSet<CubeDimAttribute>();
+ private Set<CubeMeasure> cachedMeasures = new HashSet<>();
+ private Set<CubeDimAttribute> cachedDims = new HashSet<>();
public Set<CubeMeasure> getMeasures() {
synchronized (measures) {
@@ -152,7 +151,7 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
}
public static Set<String> getMeasures(String name, Map<String, String> props) {
- Set<String> measures = new HashSet<String>();
+ Set<String> measures = new HashSet<>();
String measureStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getCubeMeasureListKey(name));
measures.addAll(Arrays.asList(StringUtils.split(measureStr, ',')));
return measures;
@@ -161,7 +160,7 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
public Set<String> getTimedDimensions() {
String str = getProperties().get(MetastoreUtil.getCubeTimedDimensionListKey(getName()));
if (str != null) {
- Set<String> timedDimensions = new HashSet<String>();
+ Set<String> timedDimensions = new HashSet<>();
timedDimensions.addAll(Arrays.asList(StringUtils.split(str, ',')));
return timedDimensions;
} else {
@@ -170,7 +169,7 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
}
public static Set<String> getDimensions(String name, Map<String, String> props) {
- Set<String> dimensions = new HashSet<String>();
+ Set<String> dimensions = new HashSet<>();
String dimStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getCubeDimensionListKey(name));
dimensions.addAll(Arrays.asList(StringUtils.split(dimStr, ',')));
return dimensions;
@@ -236,10 +235,9 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
/**
* Add a new measure
*
- * @param measure
- * @throws HiveException
+ * @param measure measure name
*/
- public void addMeasure(String measure) throws HiveException {
+ public void addMeasure(String measure) {
measures.add(measure.toLowerCase());
updateMeasureProperties();
}
@@ -247,10 +245,9 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
/**
* Add a new dimension
*
- * @param dimension
- * @throws HiveException
+ * @param dimension attribute name
*/
- public void addDimension(String dimension) throws HiveException {
+ public void addDimension(String dimension) {
dimensions.add(dimension.toLowerCase());
updateDimAttributeProperties();
}
@@ -287,7 +284,7 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
@Override
public Set<String> getDimAttributeNames() {
- Set<String> dimNames = new HashSet<String>();
+ Set<String> dimNames = new HashSet<>();
for (CubeDimAttribute f : getDimAttributes()) {
MetastoreUtil.addColumnNames(f, dimNames);
}
@@ -311,7 +308,7 @@ public class DerivedCube extends AbstractCubeTable implements CubeInterface {
@Override
public Set<String> getAllFieldNames() {
- Set<String> fieldNames = new HashSet<String>();
+ Set<String> fieldNames = new HashSet<>();
fieldNames.addAll(getMeasureNames());
fieldNames.addAll(getDimAttributeNames());
fieldNames.addAll(getTimedDimensions());
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/Dimension.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Dimension.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Dimension.java
index 27cbc30..86eb6eb 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/Dimension.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/Dimension.java
@@ -24,9 +24,9 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.metadata.Table;
+import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@@ -48,7 +48,7 @@ public class Dimension extends AbstractBaseTable {
super(name, expressions, joinChains, properties, weight);
this.attributes = attributes;
- attributeMap = new HashMap<String, CubeDimAttribute>();
+ attributeMap = new HashMap<>();
for (CubeDimAttribute dim : attributes) {
attributeMap.put(dim.getName().toLowerCase(), dim);
}
@@ -59,7 +59,7 @@ public class Dimension extends AbstractBaseTable {
super(tbl);
this.attributes = getAttributes(getName(), getProperties());
- attributeMap = new HashMap<String, CubeDimAttribute>();
+ attributeMap = new HashMap<>();
for (CubeDimAttribute attr : attributes) {
addAllAttributesToMap(attr);
}
@@ -108,7 +108,7 @@ public class Dimension extends AbstractBaseTable {
}
public static Set<CubeDimAttribute> getAttributes(String name, Map<String, String> props) {
- Set<CubeDimAttribute> attributes = new HashSet<CubeDimAttribute>();
+ Set<CubeDimAttribute> attributes = new HashSet<>();
String attrStr = MetastoreUtil.getNamedStringValue(props, MetastoreUtil.getDimAttributeListKey(name));
String[] names = attrStr.split(",");
for (String attrName : names) {
@@ -135,11 +135,6 @@ public class Dimension extends AbstractBaseTable {
return MetastoreUtil.getDimensionJoinChainListKey(tblname);
}
-// public boolean isChainedColumn(String name) {
-// Preconditions.checkArgument(name != null);
-// return ((ReferencedDimAtrribute) attributeMap.get(name.toLowerCase())).isChainedColumn();
-// }
-
@Override
public int hashCode() {
return super.hashCode();
@@ -185,13 +180,8 @@ public class Dimension extends AbstractBaseTable {
* Alters the attribute if already existing or just adds if it is new attribute
*
* @param attribute
- * @throws HiveException
*/
- public void alterAttribute(CubeDimAttribute attribute) throws HiveException {
- if (attribute == null) {
- throw new NullPointerException("Cannot add null attribute");
- }
-
+ public void alterAttribute(@NonNull CubeDimAttribute attribute) {
// Replace dimension if already existing
if (attributeMap.containsKey(attribute.getName().toLowerCase())) {
attributes.remove(getAttributeByName(attribute.getName()));
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/JoinChain.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/JoinChain.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/JoinChain.java
index 6250905..cc8929f 100644
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/JoinChain.java
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/JoinChain.java
@@ -20,8 +20,8 @@ package org.apache.lens.cube.metadata;
import java.util.*;
-import org.apache.lens.cube.metadata.SchemaGraph.JoinPath;
-import org.apache.lens.cube.metadata.SchemaGraph.TableRelationship;
+import org.apache.lens.cube.metadata.join.JoinPath;
+import org.apache.lens.cube.metadata.join.TableRelationship;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.metadata.HiveException;
@@ -313,14 +313,14 @@ public class JoinChain implements Named {
}
/**
- * Convert join paths to schemaGraph's JoinPath
+ * Convert join chain paths to JoinPath objects
*
* @param client
- * @return List<SchemaGraph.JoinPath>
+ * @return List<JoinPath>
* @throws HiveException
*/
- public List<SchemaGraph.JoinPath> getRelationEdges(CubeMetastoreClient client) throws HiveException {
- List<SchemaGraph.JoinPath> schemaGraphPaths = new ArrayList<SchemaGraph.JoinPath>();
+ public List<JoinPath> getRelationEdges(CubeMetastoreClient client) throws HiveException {
+ List<JoinPath> joinPaths = new ArrayList<>();
for (Path path : paths) {
JoinPath jp = new JoinPath();
// Add edges from dimension to cube
@@ -328,8 +328,8 @@ public class JoinChain implements Named {
jp.addEdge(path.links.get(i).toDimToDimRelationship(client));
}
jp.addEdge(path.links.get(0).toCubeOrDimRelationship(client));
- schemaGraphPaths.add(jp);
+ joinPaths.add(jp);
}
- return schemaGraphPaths;
+ return joinPaths;
}
}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAtrribute.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAtrribute.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAtrribute.java
deleted file mode 100644
index c51b489..0000000
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAtrribute.java
+++ /dev/null
@@ -1,195 +0,0 @@
-/**
- * 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.metadata;
-
-import java.util.*;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.hadoop.hive.metastore.api.FieldSchema;
-
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.ToString;
-
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class ReferencedDimAtrribute extends BaseDimAttribute {
- private static final char CHAIN_REF_COL_SEPARATOR = ',';
-
- @Getter
- private final List<TableReference> references = new ArrayList<>();
- // boolean whether to say the key is only a denormalized variable kept or can
- // be used in join resolution as well
- @Getter private Boolean isJoinKey = true;
- @Getter private List<ChainRefCol> chainRefColumns = new ArrayList<>();
-
- @Data
- public static class ChainRefCol {
- private final String chainName;
- private final String refColumn;
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, TableReference reference) {
- this(column, displayString, reference, null, null, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, TableReference reference, Date startTime,
- Date endTime, Double cost) {
- this(column, displayString, reference, startTime, endTime, cost, true);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, TableReference reference, Date startTime,
- Date endTime, Double cost, boolean isJoinKey) {
- this(column, displayString, reference, startTime, endTime, cost, isJoinKey, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, TableReference reference, Date startTime,
- Date endTime, Double cost, boolean isJoinKey, Long numOfDistinctValues) {
- super(column, displayString, startTime, endTime, cost, numOfDistinctValues);
- this.references.add(reference);
- this.isJoinKey = isJoinKey;
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, Collection<TableReference> references) {
- this(column, displayString, references, null, null, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, Collection<TableReference> references,
- Date startTime, Date endTime, Double cost) {
- this(column, displayString, references, startTime, endTime, cost, true);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, Collection<TableReference> references,
- Date startTime, Date endTime, Double cost, boolean isJoinKey) {
- this(column, displayString, references, startTime, endTime, cost, isJoinKey, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, Collection<TableReference> references,
- Date startTime, Date endTime, Double cost, boolean isJoinKey, Long numOfDistinctValues) {
- this(column, displayString, references, startTime, endTime, cost, isJoinKey, numOfDistinctValues, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, Collection<TableReference> references,
- Date startTime, Date endTime, Double cost, boolean isJoinKey, Long numOfDistinctValues, List<String> values) {
- super(column, displayString, startTime, endTime, cost, numOfDistinctValues, values);
- this.references.addAll(references);
- this.isJoinKey = isJoinKey;
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, String chainName, String refColumn,
- Date startTime, Date endTime, Double cost) {
- this(column, displayString, chainName, refColumn, startTime, endTime, cost, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, String chainName, String refColumn,
- Date startTime, Date endTime, Double cost, Long numOfDistinctValues) {
- this(column, displayString,
- Collections.singletonList(new ChainRefCol(chainName.toLowerCase(), refColumn.toLowerCase())), startTime, endTime,
- cost, numOfDistinctValues);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, List<ChainRefCol> chainRefCols,
- Date startTime, Date endTime, Double cost, Long numOfDistinctValues) {
- this(column, displayString, chainRefCols, startTime, endTime, cost, numOfDistinctValues, null);
- }
-
- public ReferencedDimAtrribute(FieldSchema column, String displayString, List<ChainRefCol> chainRefCols,
- Date startTime, Date endTime, Double cost, Long numOfDistinctValues, List<String> values) {
- super(column, displayString, startTime, endTime, cost, numOfDistinctValues, values);
- chainRefColumns.addAll(chainRefCols);
- this.isJoinKey = false;
- }
-
- public void addReference(TableReference reference) {
- references.add(reference);
- }
-
- public boolean removeReference(TableReference ref) {
- return references.remove(ref);
- }
-
- public boolean useAsJoinKey() {
- return isJoinKey;
- }
-
- @Override
- public void addProperties(Map<String, String> props) {
- super.addProperties(props);
- if (!chainRefColumns.isEmpty()) {
- StringBuilder chainNamesValue = new StringBuilder();
- StringBuilder refColsValue = new StringBuilder();
- Iterator<ChainRefCol> iter = chainRefColumns.iterator();
- // Add the first without appending separator
- ChainRefCol chainRefCol = iter.next();
- chainNamesValue.append(chainRefCol.getChainName());
- refColsValue.append(chainRefCol.getRefColumn());
- while (iter.hasNext()) {
- chainRefCol = iter.next();
- chainNamesValue.append(CHAIN_REF_COL_SEPARATOR).append(chainRefCol.getChainName());
- refColsValue.append(CHAIN_REF_COL_SEPARATOR).append(chainRefCol.getRefColumn());
- }
- props.put(MetastoreUtil.getDimRefChainNameKey(getName()), chainNamesValue.toString());
- props.put(MetastoreUtil.getDimRefChainColumnKey(getName()), refColsValue.toString());
- } else {
- props.put(MetastoreUtil.getDimensionSrcReferenceKey(getName()),
- MetastoreUtil.getReferencesString(references));
- props.put(MetastoreUtil.getDimUseAsJoinKey(getName()), isJoinKey.toString());
- }
- }
-
- /**
- * This is used only for serializing
- *
- * @param name
- * @param props
- */
- public ReferencedDimAtrribute(String name, Map<String, String> props) {
- super(name, props);
- String chNamesStr = props.get(MetastoreUtil.getDimRefChainNameKey(getName()));
- if (!StringUtils.isBlank(chNamesStr)) {
- String refColsStr = props.get(MetastoreUtil.getDimRefChainColumnKey(getName()));
- String[] chainNames = StringUtils.split(chNamesStr, ",");
- String[] refCols = StringUtils.split(refColsStr, ",");
- for (int i = 0; i < chainNames.length; i++) {
- chainRefColumns.add(new ChainRefCol(chainNames[i], refCols[i]));
- }
- this.isJoinKey = false;
- } else {
- String refListStr = props.get(MetastoreUtil.getDimensionSrcReferenceKey(getName()));
- String[] refListDims = StringUtils.split(refListStr, ",");
- for (String refDimRaw : refListDims) {
- references.add(new TableReference(refDimRaw));
- }
- String isJoinKeyStr = props.get(MetastoreUtil.getDimUseAsJoinKey(name));
- if (isJoinKeyStr != null) {
- isJoinKey = Boolean.parseBoolean(isJoinKeyStr);
- }
- }
- }
-
- /**
- * Tells whether the attribute is retrieved from chain
- *
- * @return true/false
- */
- public boolean isChainedColumn() {
- return !chainRefColumns.isEmpty();
- }
-}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAttribute.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAttribute.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAttribute.java
new file mode 100644
index 0000000..9a1c44b
--- /dev/null
+++ b/lens-cube/src/main/java/org/apache/lens/cube/metadata/ReferencedDimAttribute.java
@@ -0,0 +1,115 @@
+/**
+ * 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.metadata;
+
+import java.util.*;
+
+import org.apache.lens.cube.error.LensCubeErrorCode;
+import org.apache.lens.server.api.error.LensException;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.hive.metastore.api.FieldSchema;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.ToString;
+
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ReferencedDimAttribute extends BaseDimAttribute {
+ private static final char CHAIN_REF_COL_SEPARATOR = ',';
+ @Getter
+ private List<ChainRefCol> chainRefColumns = new ArrayList<>();
+
+ @Data
+ public static class ChainRefCol {
+ private final String chainName;
+ private final String refColumn;
+ }
+
+ public ReferencedDimAttribute(FieldSchema column, String displayString, String chainName, String refColumn,
+ Date startTime, Date endTime, Double cost) throws LensException {
+ this(column, displayString, chainName, refColumn, startTime, endTime, cost, null);
+ }
+
+ public ReferencedDimAttribute(FieldSchema column, String displayString, String chainName, String refColumn,
+ Date startTime, Date endTime, Double cost, Long numOfDistinctValues) throws LensException {
+ this(column, displayString,
+ Collections.singletonList(new ChainRefCol(chainName.toLowerCase(), refColumn.toLowerCase())), startTime, endTime,
+ cost, numOfDistinctValues);
+ }
+
+ public ReferencedDimAttribute(FieldSchema column, String displayString, List<ChainRefCol> chainRefCols,
+ Date startTime, Date endTime, Double cost, Long numOfDistinctValues) throws LensException {
+ this(column, displayString, chainRefCols, startTime, endTime, cost, numOfDistinctValues, null);
+ }
+
+ public ReferencedDimAttribute(FieldSchema column, String displayString, List<ChainRefCol> chainRefCols,
+ Date startTime, Date endTime, Double cost, Long numOfDistinctValues, List<String> values) throws LensException {
+ super(column, displayString, startTime, endTime, cost, numOfDistinctValues, values);
+ if (chainRefCols.isEmpty()) {
+ throw new LensException(LensCubeErrorCode.ERROR_IN_ENTITY_DEFINITION.getLensErrorInfo(), " Ref column: "
+ + getName() + " does not have any chain_ref_column defined");
+ }
+ chainRefColumns.addAll(chainRefCols);
+ }
+
+ @Override
+ public void addProperties(Map<String, String> props) {
+ super.addProperties(props);
+ StringBuilder chainNamesValue = new StringBuilder();
+ StringBuilder refColsValue = new StringBuilder();
+ Iterator<ChainRefCol> iterator = chainRefColumns.iterator();
+ // Add the first without appending separator
+ ChainRefCol chainRefCol = iterator.next();
+ chainNamesValue.append(chainRefCol.getChainName());
+ refColsValue.append(chainRefCol.getRefColumn());
+ while (iterator.hasNext()) {
+ chainRefCol = iterator.next();
+ chainNamesValue.append(CHAIN_REF_COL_SEPARATOR).append(chainRefCol.getChainName());
+ refColsValue.append(CHAIN_REF_COL_SEPARATOR).append(chainRefCol.getRefColumn());
+ }
+ props.put(MetastoreUtil.getDimRefChainNameKey(getName()), chainNamesValue.toString());
+ props.put(MetastoreUtil.getDimRefChainColumnKey(getName()), refColsValue.toString());
+ }
+
+ /**
+ * This is used only for serializing
+ *
+ * @param name attribute name
+ * @param props Properties
+ */
+ public ReferencedDimAttribute(String name, Map<String, String> props) throws LensException {
+ super(name, props);
+ String chNamesStr = props.get(MetastoreUtil.getDimRefChainNameKey(getName()));
+ if (!StringUtils.isBlank(chNamesStr)) {
+ String refColsStr = props.get(MetastoreUtil.getDimRefChainColumnKey(getName()));
+ String[] chainNames = StringUtils.split(chNamesStr, ",");
+ String[] refCols = StringUtils.split(refColsStr, ",");
+ for (int i = 0; i < chainNames.length; i++) {
+ chainRefColumns.add(new ChainRefCol(chainNames[i], refCols[i]));
+ }
+ } else {
+ throw new LensException(LensCubeErrorCode.ERROR_IN_ENTITY_DEFINITION.getLensErrorInfo(), " Ref column: "
+ + getName() + " does not have any chain_ref_column defined");
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/lens/blob/908530f5/lens-cube/src/main/java/org/apache/lens/cube/metadata/SchemaGraph.java
----------------------------------------------------------------------
diff --git a/lens-cube/src/main/java/org/apache/lens/cube/metadata/SchemaGraph.java b/lens-cube/src/main/java/org/apache/lens/cube/metadata/SchemaGraph.java
deleted file mode 100644
index fa230ef..0000000
--- a/lens-cube/src/main/java/org/apache/lens/cube/metadata/SchemaGraph.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/**
- * 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.metadata;
-
-import java.util.*;
-
-import org.apache.hadoop.hive.ql.metadata.HiveException;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.RequiredArgsConstructor;
-
-public class SchemaGraph {
- /*
- * An edge in the schema graph
- */
- @Data
- @AllArgsConstructor
- @RequiredArgsConstructor
- public static class TableRelationship {
- final String fromColumn;
- final AbstractCubeTable fromTable;
- final String toColumn;
- final AbstractCubeTable toTable;
- boolean mapsToMany = false;
-
- @Override
- public String toString() {
- return fromTable.getName() + "." + fromColumn + "->" + toTable.getName() + "." + toColumn
- + (mapsToMany ? "[n]" : "");
- }
-
- }
-
- /**
- * A list of table relationships that can be combined to get a join clause
- */
- public static class JoinPath {
- final List<TableRelationship> edges;
- // Store the map of a table against all columns of that table which are in the path
- private Map<AbstractCubeTable, List<String>> columnsForTable = new HashMap<AbstractCubeTable, List<String>>();
-
- public JoinPath() {
- edges = new ArrayList<TableRelationship>();
- }
-
- public JoinPath(JoinPath other) {
- edges = new ArrayList<TableRelationship>(other.edges);
- }
-
- public void initColumnsForTable() {
- if (!columnsForTable.isEmpty()) {
- // already inited
- return;
- }
- for (TableRelationship edge : edges) {
- addColumnsForEdge(edge);
- }
- }
-
- public void addEdge(TableRelationship edge) {
- edges.add(edge);
- }
-
- public boolean isEmpty() {
- return edges.isEmpty();
- }
-
- public List<TableRelationship> getEdges() {
- return edges;
- }
-
- private void addColumnsForEdge(TableRelationship edge) {
- addColumn(edge.getFromTable(), edge.getFromColumn());
- addColumn(edge.getToTable(), edge.getToColumn());
- }
-
- private void addColumn(AbstractCubeTable table, String column) {
- if (table == null || column == null) {
- return;
- }
- List<String> columns = columnsForTable.get(table);
- if (columns == null) {
- columns = new ArrayList<String>();
- columnsForTable.put(table, columns);
- }
- columns.add(column);
- }
-
- public List<String> getColumnsForTable(AbstractCubeTable table) {
- return columnsForTable.get(table);
- }
-
- public Set<AbstractCubeTable> getAllTables() {
- return columnsForTable.keySet();
- }
-
- public boolean containsColumnOfTable(String column, AbstractCubeTable table) {
- for (TableRelationship edge : edges) {
- if ((table.equals(edge.getFromTable()) && column.equals(edge.getFromColumn()))
- || table.equals(edge.getToTable()) && column.equals(edge.getToColumn())) {
- return true;
- }
- }
- return false;
- }
-
- public String toString() {
- return edges.toString();
- }
- }
-
- /**
- * Perform a search for join paths on the schema graph
- */
- public static class GraphSearch {
- private final AbstractCubeTable source;
- private final AbstractCubeTable target;
- // edges going out of the table
- private final Map<AbstractCubeTable, Set<TableRelationship>> outGraph;
- // egds coming into the table
- private final Map<AbstractCubeTable, Set<TableRelationship>> inGraph;
- // Used in tests to validate that all paths are searched
-
- public GraphSearch(AbstractCubeTable source, AbstractCubeTable target, SchemaGraph graph) {
- this.source = source;
- this.target = target;
-
- if (target instanceof CubeInterface) {
- this.outGraph = graph.getCubeGraph((CubeInterface) target);
- this.inGraph = graph.getCubeInGraph((CubeInterface) target);
- } else if (target instanceof Dimension) {
- this.outGraph = graph.getDimOnlyGraph();
- this.inGraph = graph.getDimOnlyInGraph();
- } else {
- throw new IllegalArgumentException("Target neither cube nor dimension");
- }
- }
-
- public List<JoinPath> findAllPathsToTarget() {
- return findAllPathsToTarget(source, new JoinPath(), new HashSet<AbstractCubeTable>());
- }
-
- /**
- * Recursive DFS to get all paths between source and target. Let path till this node = p Paths at node adjacent to
- * target = [edges leading to target] Path at a random node = [path till this node + p for each p in
- * path(neighbors)]
- */
- List<JoinPath> findAllPathsToTarget(AbstractCubeTable source, JoinPath joinPathTillSource,
- Set<AbstractCubeTable> visited) {
- List<JoinPath> joinPaths = new ArrayList<JoinPath>();
- visited.add(source);
-
- if (inGraph.get(source) == null) {
- return joinPaths;
- }
- for (TableRelationship edge : inGraph.get(source)) {
- if (visited.contains(edge.getFromTable())) {
- continue;
- }
-
-
- JoinPath p = new JoinPath(joinPathTillSource);
- p.addEdge(edge);
- AbstractCubeTable neighbor = edge.getFromTable();
- if (neighbor.getName().equals(target.getName())) {
- // Got a direct path
- joinPaths.add(p);
- } else if (neighbor instanceof Dimension) {
- List<JoinPath> pathsFromNeighbor = findAllPathsToTarget(neighbor, new JoinPath(p), visited);
- for (JoinPath pn : pathsFromNeighbor) {
- if (!pn.isEmpty()) {
- joinPaths.add(pn);
- }
- }
- }
- }
-
- return joinPaths;
- }
- }
-
- /**
- * Graph of tables in the cube metastore. Links between the tables are relationships in the cube.
- */
- private final CubeMetastoreClient metastore;
- // Graph for each cube
- // graph with out going edges
- private Map<CubeInterface, Map<AbstractCubeTable, Set<TableRelationship>>> cubeOutGraph;
- // graph with incoming edges
- private Map<CubeInterface, Map<AbstractCubeTable, Set<TableRelationship>>> cubeInGraph;
-
- // sub graph that contains only dimensions, mainly used while checking connectivity between a set of dimensions
- // graph with out going edges
- private Map<AbstractCubeTable, Set<TableRelationship>> dimOnlyOutGraph;
- // graph with incoming edges
- private Map<AbstractCubeTable, Set<TableRelationship>> dimOnlyInGraph;
-
- public SchemaGraph(CubeMetastoreClient metastore) throws HiveException {
- this.metastore = metastore;
- buildSchemaGraph();
- }
-
- public Map<AbstractCubeTable, Set<TableRelationship>> getCubeGraph(CubeInterface cube) {
- return cubeOutGraph.get(cube);
- }
-
- public Map<AbstractCubeTable, Set<TableRelationship>> getDimOnlyGraph() {
- return dimOnlyOutGraph;
- }
-
- public Map<AbstractCubeTable, Set<TableRelationship>> getCubeInGraph(CubeInterface cube) {
- return cubeInGraph.get(cube);
- }
-
- public Map<AbstractCubeTable, Set<TableRelationship>> getDimOnlyInGraph() {
- return dimOnlyInGraph;
- }
-
- /**
- * Build the schema graph for all cubes and dimensions
- *
- * @return
- * @throws org.apache.hadoop.hive.ql.metadata.HiveException
- */
- private void buildSchemaGraph() throws HiveException {
- cubeOutGraph = new HashMap<CubeInterface, Map<AbstractCubeTable, Set<TableRelationship>>>();
- cubeInGraph = new HashMap<CubeInterface, Map<AbstractCubeTable, Set<TableRelationship>>>();
- for (CubeInterface cube : metastore.getAllCubes()) {
- Map<AbstractCubeTable, Set<TableRelationship>> outGraph
- = new HashMap<AbstractCubeTable, Set<TableRelationship>>();
- Map<AbstractCubeTable, Set<TableRelationship>> inGraph
- = new HashMap<AbstractCubeTable, Set<TableRelationship>>();
- buildGraph((AbstractCubeTable) cube, outGraph, inGraph);
-
- for (Dimension dim : metastore.getAllDimensions()) {
- buildGraph(dim, outGraph, inGraph);
- }
-
- cubeOutGraph.put(cube, outGraph);
- cubeInGraph.put(cube, inGraph);
- }
-
- dimOnlyOutGraph = new HashMap<AbstractCubeTable, Set<TableRelationship>>();
- dimOnlyInGraph = new HashMap<AbstractCubeTable, Set<TableRelationship>>();
- for (Dimension dim : metastore.getAllDimensions()) {
- buildGraph(dim, dimOnlyOutGraph, dimOnlyInGraph);
- }
- }
-
- private List<CubeDimAttribute> getRefDimensions(AbstractCubeTable cube) throws HiveException {
- List<CubeDimAttribute> refDimensions = new ArrayList<CubeDimAttribute>();
- Set<CubeDimAttribute> allAttrs = null;
- if (cube instanceof CubeInterface) {
- allAttrs = ((CubeInterface) cube).getDimAttributes();
- } else if (cube instanceof Dimension) {
- allAttrs = ((Dimension) cube).getAttributes();
- } else {
- throw new HiveException("Not a valid table type" + cube);
- }
- // find out all dimensions which link to other dimension tables
- for (CubeDimAttribute dim : allAttrs) {
- if (dim instanceof ReferencedDimAtrribute) {
- if (((ReferencedDimAtrribute) dim).useAsJoinKey()) {
- refDimensions.add(dim);
- }
- } else if (dim instanceof HierarchicalDimAttribute) {
- for (CubeDimAttribute hdim : ((HierarchicalDimAttribute) dim).getHierarchy()) {
- if (hdim instanceof ReferencedDimAtrribute && ((ReferencedDimAtrribute) hdim).useAsJoinKey()) {
- refDimensions.add(hdim);
- }
- }
- }
- }
- return refDimensions;
- }
-
- // Build schema graph for a cube/dimension
- private void buildGraph(AbstractCubeTable cubeTable, Map<AbstractCubeTable, Set<TableRelationship>> outGraph,
- Map<AbstractCubeTable, Set<TableRelationship>> inGraph)
- throws HiveException {
- List<CubeDimAttribute> refDimensions = getRefDimensions(cubeTable);
-
- // build graph for each linked dimension
- for (CubeDimAttribute dim : refDimensions) {
- // Find out references leading from dimension columns of the cube/dimension if any
- if (dim instanceof ReferencedDimAtrribute) {
- ReferencedDimAtrribute refDim = (ReferencedDimAtrribute) dim;
- List<TableReference> refs = refDim.getReferences();
-
- for (TableReference ref : refs) {
- String destColumnName = ref.getDestColumn();
- String destTableName = ref.getDestTable();
-
- if (metastore.isDimension(destTableName)) {
- // Cube -> Dimension or Dimension -> Dimension reference
- Dimension relatedDim = metastore.getDimension(destTableName);
- addLinks(refDim.getName(), cubeTable, destColumnName, relatedDim, ref.isMapsToMany(), outGraph, inGraph);
- } else {
- throw new HiveException("Dim -> Cube references are not supported: " + dim.getName() + "."
- + refDim.getName() + "->" + destTableName + "." + destColumnName);
- }
- } // end loop for refs from a dim
- }
- }
- }
-
- private void addLinks(String srcCol, AbstractCubeTable srcTbl, String destCol, AbstractCubeTable destTbl,
- boolean mapsToMany, Map<AbstractCubeTable, Set<TableRelationship>> outGraph,
- Map<AbstractCubeTable, Set<TableRelationship>> inGraph) {
-
- TableRelationship rel = new TableRelationship(srcCol, srcTbl, destCol, destTbl, mapsToMany);
-
- Set<TableRelationship> inEdges = inGraph.get(destTbl);
- if (inEdges == null) {
- inEdges = new LinkedHashSet<TableRelationship>();
- inGraph.put(destTbl, inEdges);
- }
- inEdges.add(rel);
-
- Set<TableRelationship> outEdges = outGraph.get(srcTbl);
- if (outEdges == null) {
- outEdges = new LinkedHashSet<TableRelationship>();
- outGraph.put(srcTbl, outEdges);
- }
-
- outEdges.add(rel);
-
- }
-
- public void print() {
- for (CubeInterface cube : cubeOutGraph.keySet()) {
- Map<AbstractCubeTable, Set<TableRelationship>> graph = cubeOutGraph.get(cube);
- System.out.println("**Cube " + cube.getName() + " Out egdes");
- System.out.println("--Out Graph-Nodes=" + graph.size());
- for (AbstractCubeTable tab : graph.keySet()) {
- System.out.println(tab.getName() + "::" + graph.get(tab));
- }
- }
- System.out.println("**Dim only outgraph");
- System.out.println("--Out Graph-Nodes=" + dimOnlyOutGraph.size());
- for (AbstractCubeTable tab : dimOnlyOutGraph.keySet()) {
- System.out.println(tab.getName() + "::" + dimOnlyOutGraph.get(tab));
- }
-
- for (CubeInterface cube : cubeInGraph.keySet()) {
- Map<AbstractCubeTable, Set<TableRelationship>> graph = cubeInGraph.get(cube);
- System.out.println("**Cube " + cube.getName() + " In egdes");
- System.out.println("--In Graph-Nodes=" + graph.size());
- for (AbstractCubeTable tab : graph.keySet()) {
- System.out.println(tab.getName() + "::" + graph.get(tab));
- }
- }
- System.out.println("**Dim only Ingraph");
- System.out.println("--In Graph-Nodes=" + dimOnlyInGraph.size());
- for (AbstractCubeTable tab : dimOnlyInGraph.keySet()) {
- System.out.println(tab.getName() + "::" + dimOnlyInGraph.get(tab));
- }
-
- }
-}