From 04c9aa9320b635c850d7f5d7d074f4e3a74b0d2b Mon Sep 17 00:00:00 2001 From: shaofengshi Date: Mon, 1 Dec 2014 11:43:21 +0800 Subject: [PATCH] Continue the refactor on mete data structure change. --- .../java/com/kylinolap/cube/model/CubeDesc.java | 27 ++++++------- .../com/kylinolap/cube/model/DimensionDesc.java | 45 +++++++++++----------- .../com/kylinolap/metadata/model/TableDesc.java | 6 +++ 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java index 51130f9..aedb80f 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/CubeDesc.java @@ -99,8 +99,6 @@ public String toString() { private String modelName; @JsonProperty("description") private String description; - @JsonProperty("fact_table") - private String factTable; @JsonProperty("null_string") private String[] nullStrings; @JsonProperty("filter_condition") @@ -245,7 +243,7 @@ public DimensionDesc findDimensionByName(String dimName) { HashSet tableNames = new HashSet(); List result = new ArrayList(); - tableNames.add(factTable.toUpperCase()); + tableNames.add(this.getFactTable().toUpperCase()); for (DimensionDesc dim : dimensions) { String table = dim.getTable(); if (table != null) @@ -435,7 +433,7 @@ public boolean equals(Object o) { if (!name.equals(cubeDesc.name)) return false; - if (!factTable.equals(cubeDesc.factTable)) + if (!getFactTable().equals(cubeDesc.getFactTable())) return false; return true; @@ -445,13 +443,13 @@ public boolean equals(Object o) { public int hashCode() { int result = 0; result = 31 * result + name.hashCode(); - result = 31 * result + factTable.hashCode(); + result = 31 * result + getFactTable().hashCode(); return result; } @Override public String toString() { - return "CubeDesc [name=" + name + ", factTable=" + factTable + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; + return "CubeDesc [name=" + name + ", factTable=" + getFactTable() + ", cubePartitionDesc=" + cubePartitionDesc + ", dimensions=" + dimensions + ", measures=" + measures + ", rowkey=" + rowkey + ", hbaseMapping=" + hbaseMapping + "]"; } public String calculateSignature() { @@ -459,7 +457,7 @@ public String calculateSignature() { try { md = MessageDigest.getInstance("MD5"); StringBuilder sigString = new StringBuilder(); - sigString.append(this.name).append("|").append(this.factTable).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); + sigString.append(this.name).append("|").append(this.getFactTable()).append("|").append(JsonUtil.writeValueAsString(this.cubePartitionDesc)).append("|").append(JsonUtil.writeValueAsString(this.dimensions)).append("|").append(JsonUtil.writeValueAsString(this.measures)).append("|").append(JsonUtil.writeValueAsString(this.rowkey)).append("|").append(JsonUtil.writeValueAsString(this.hbaseMapping)); byte[] signature = md.digest(sigString.toString().getBytes()); return new String(Base64.encodeBase64(signature)); @@ -482,11 +480,8 @@ public void init(KylinConfig config, Map tables) { this.errors.clear(); this.config = config; - if (factTable != null) - factTable = factTable.toUpperCase(); - for (DimensionDesc dim : dimensions) { - dim.init(tables); + dim.init(this, tables); } sortDimAndMeasure(); @@ -680,16 +675,16 @@ private void initJoinColumns(Map tables) { } join.setPrimaryKeyColumns(pkCols); // foreign key - TableDesc factTable = tables.get(this.factTable); + TableDesc factTable = tables.get(this.getFactTable()); if (factTable == null) { - addError("Fact table does not exist:" + this.factTable); + addError("Fact table does not exist:" + this.getFactTable()); } String[] fks = join.getForeignKey(); TblColRef[] fkCols = new TblColRef[fks.length]; for (int i = 0; i < fks.length; i++) { ColumnDesc col = factTable.findColumnByName(fks[i]); if (col == null) { - addError("Can't find column " + fks[i] + " in table " + this.factTable); + addError("Can't find column " + fks[i] + " in table " + this.getFactTable()); } TblColRef colRef = new TblColRef(col); fks[i] = colRef.getName(); @@ -698,11 +693,11 @@ private void initJoinColumns(Map tables) { join.setForeignKeyColumns(fkCols); // Validate join in dimension if (pkCols.length != fkCols.length) { - addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.factTable + ") " + Arrays.toString(fks)); + addError("Primary keys(" + dim.getTable() + ")" + Arrays.toString(pks) + " are not consistent with Foreign keys(" + this.getFactTable() + ") " + Arrays.toString(fks)); } for (int i = 0; i < fkCols.length; i++) { if (!fkCols[i].getDatatype().equals(pkCols[i].getDatatype())) { - addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.factTable + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); + addError("Primary key " + dim.getTable() + "." + pkCols[i].getName() + "." + pkCols[i].getDatatype() + " are not consistent with Foreign key " + this.getFactTable() + "." + fkCols[i].getName() + "." + fkCols[i].getDatatype()); } } diff --git a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java index 3d9c7e3..8c43fd7 100644 --- a/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java +++ b/cube/src/main/java/com/kylinolap/cube/model/DimensionDesc.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.kylinolap.common.util.StringUtil; import com.kylinolap.metadata.model.JoinDesc; +import com.kylinolap.metadata.model.LookupDesc; import com.kylinolap.metadata.model.TableDesc; import com.kylinolap.metadata.model.realization.TblColRef; @@ -37,16 +38,12 @@ private int id; @JsonProperty("name") private String name; - @JsonProperty("join") private JoinDesc join; @JsonProperty("hierarchy") private HierarchyDesc[] hierarchy; - @JsonProperty("table") private String table; @JsonProperty("column") private String column; - @JsonProperty("datatype") - private String datatype; @JsonProperty("derived") private String[] derived; @@ -65,22 +62,11 @@ public boolean isHierarchyColumn(TblColRef col) { return false; } - public String getDatatype() { - return datatype; - } - - public void setDatatype(String datatype) { - this.datatype = datatype; - } public String getTable() { return table.toUpperCase(); } - public void setTable(String table) { - this.table = table; - } - public int getId() { return id; } @@ -93,10 +79,6 @@ public JoinDesc getJoin() { return join; } - public void setJoin(JoinDesc join) { - this.join = join; - } - public String getName() { return name; } @@ -173,25 +155,42 @@ public int hashCode() { @Override public String toString() { - return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", datatype=" + datatype + ", derived=" + Arrays.toString(derived) + "]"; + return "DimensionDesc [name=" + name + ", join=" + join + ", hierarchy=" + Arrays.toString(hierarchy) + ", table=" + table + ", column=" + column + ", derived=" + Arrays.toString(derived) + "]"; } - public void init(Map tables) { + public void init(CubeDesc cubeDesc, Map tables) { if (name != null) name = name.toUpperCase(); - if (table != null) - table = table.toUpperCase(); if (column != null) column = column.toUpperCase(); + + // parse 'column' to get the table name; if table name is not appeared, use fact table; + String[] splits = this.column.split("."); + if (splits.length > 1) { + table = splits[splits.length - 2].toUpperCase(); + } else { + table = cubeDesc.getFactTable().toUpperCase(); + } TableDesc tableDesc = tables.get(table); if (tableDesc == null) throw new IllegalStateException("Can't find table " + table + " on dimension " + name); + boolean isOnFactTable = table.equalsIgnoreCase(cubeDesc.getFactTable()); + if (hierarchy != null && hierarchy.length == 0) hierarchy = null; if (derived != null && derived.length == 0) derived = null; + + if(!isOnFactTable) { + for(LookupDesc lookup: cubeDesc.getModel().getLookups()) { + if(lookup.getTable().equals(table)) { + join = lookup.getJoin(); + break; + } + } + } if (join != null) { StringUtil.toUpperCaseArray(join.getForeignKey(), join.getForeignKey()); diff --git a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java index 0014e0f..917cc60 100644 --- a/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java +++ b/metadata/src/main/java/com/kylinolap/metadata/model/TableDesc.java @@ -40,6 +40,12 @@ private DatabaseDesc database; public ColumnDesc findColumnByName(String name) { + //ignore the db name and table name + int lastIndexOfDot = name.lastIndexOf("."); + if (lastIndexOfDot >= 0) { + name = name.substring(lastIndexOfDot + 1); + } + for (ColumnDesc c : columns) { // return first matched column if (name.equalsIgnoreCase(c.getName())) {