minor, refactor on JoinTree
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/9f603d31 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/9f603d31 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/9f603d31 Branch: refs/heads/master Commit: 9f603d3188bd20070ea10cbe5fc0eecc28703633 Parents: 26e191a Author: lidongsjtu <lid...@apache.org> Authored: Thu Nov 16 23:58:25 2017 +0800 Committer: Hongbin Ma <m...@kyligence.io> Committed: Wed Dec 20 10:09:10 2017 +0800 ---------------------------------------------------------------------- .../org/apache/kylin/job/JoinedFlatTable.java | 2 +- .../kylin/metadata/model/DataModelDesc.java | 5 +- .../apache/kylin/metadata/model/JoinDesc.java | 28 ----------- .../apache/kylin/metadata/model/JoinsTree.java | 50 +++++++++++++++++++- 4 files changed, 53 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/9f603d31/core-job/src/main/java/org/apache/kylin/job/JoinedFlatTable.java ---------------------------------------------------------------------- diff --git a/core-job/src/main/java/org/apache/kylin/job/JoinedFlatTable.java b/core-job/src/main/java/org/apache/kylin/job/JoinedFlatTable.java index d731d4f..d918777 100644 --- a/core-job/src/main/java/org/apache/kylin/job/JoinedFlatTable.java +++ b/core-job/src/main/java/org/apache/kylin/job/JoinedFlatTable.java @@ -178,7 +178,7 @@ public class JoinedFlatTable { if (i > 0) { sql.append(" AND "); } - sql.append(fk[i].getIdentity() + " = " + pk[i].getIdentity()); + sql.append(fk[i].getExpressionInSourceDB() + " = " + pk[i].getExpressionInSourceDB()); } sql.append(sep); http://git-wip-us.apache.org/repos/asf/kylin/blob/9f603d31/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java index bf0db73..4dd4399 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/DataModelDesc.java @@ -404,11 +404,12 @@ public class DataModelDesc extends RootPersistentEntity { alias = alias.toUpperCase(); join.setAlias(alias); - TableRef ref = new TableRef(this, alias, tableDesc, true); + boolean isLookup = join.getKind() == TableKind.LOOKUP; + TableRef ref = new TableRef(this, alias, tableDesc, isLookup); join.setTableRef(ref); addAlias(ref); - (join.getKind() == TableKind.LOOKUP ? lookupTableRefs : factTableRefs).add(ref); + (isLookup ? lookupTableRefs : factTableRefs).add(ref); } tableNameMap.putAll(aliasMap); http://git-wip-us.apache.org/repos/asf/kylin/blob/9f603d31/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinDesc.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinDesc.java index b16ad7d..4bf9af3 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinDesc.java @@ -187,34 +187,6 @@ public class JoinDesc implements Serializable { return true; } - // equals() without alias - public boolean matches(JoinDesc other) { - if (other == null) - return false; - - if (!this.type.equalsIgnoreCase(other.getType())) - return false; - - // note pk/fk are sorted, sortByFK() - if (!this.columnDescEquals(foreignKeyColumns, other.foreignKeyColumns)) - return false; - if (!this.columnDescEquals(primaryKeyColumns, other.primaryKeyColumns)) - return false; - - return true; - } - - private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) { - if (a.length != b.length) - return false; - - for (int i = 0; i < a.length; i++) { - if (a[i].getColumnDesc().equals(b[i].getColumnDesc()) == false) - return false; - } - return true; - } - @Override public String toString() { return "JoinDesc [type=" + type + ", primary_key=" + Arrays.toString(primaryKey) + ", foreign_key=" + Arrays.toString(foreignKey) + "]"; http://git-wip-us.apache.org/repos/asf/kylin/blob/9f603d31/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinsTree.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinsTree.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinsTree.java index a37c6be..2ee2b34 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinsTree.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/JoinsTree.java @@ -30,8 +30,10 @@ import com.google.common.collect.Lists; public class JoinsTree implements Serializable { private static final long serialVersionUID = 1L; + private static final IJoinDescMatcher DEFAULT_JOINDESC_MATCHER = new DefaultJoinDescMatcher(); final Map<String, Chain> tableChains = new LinkedHashMap<>(); + private IJoinDescMatcher joinDescMatcher = DEFAULT_JOINDESC_MATCHER; public JoinsTree(TableRef rootTable, List<JoinDesc> joins) { for (JoinDesc join : joins) { @@ -108,7 +110,8 @@ public class JoinsTree implements Serializable { matches = anotherChain.join == null && chain.table.getTableDesc().getIdentity().equals(anotherChain.table.getTableDesc().getIdentity()); } else { - matches = chain.join.matches(anotherChain.join) && matchChain(chain.fkSide, anotherChain.fkSide, matchUp); + matches = joinDescMatcher.matches(chain.join, anotherChain.join) + && matchChain(chain.fkSide, anotherChain.fkSide, matchUp); } if (matches) { @@ -140,6 +143,10 @@ public class JoinsTree implements Serializable { return tableChains; } + public void setJoinDescMatcher(IJoinDescMatcher joinDescMatcher) { + this.joinDescMatcher = joinDescMatcher; + } + public static class Chain implements Serializable { private static final long serialVersionUID = 1L; @@ -170,4 +177,45 @@ public class JoinsTree implements Serializable { } } + public static interface IJoinDescMatcher { + boolean matches(JoinDesc join1, JoinDesc join2); + } + + public static class DefaultJoinDescMatcher implements IJoinDescMatcher { + @Override + public boolean matches(JoinDesc join1, JoinDesc join2) { + if (join1 == null) { + return join2 == null; + } else if (join2 == null) { + return false; + } else { + + if (!join1.getType().equalsIgnoreCase(join2.getType())) + return false; + + // note pk/fk are sorted, sortByFK() + if (!this.columnDescEquals(join1.getForeignKeyColumns(), join2.getForeignKeyColumns())) + return false; + if (!this.columnDescEquals(join1.getPrimaryKeyColumns(), join2.getPrimaryKeyColumns())) + return false; + + return true; + } + } + + private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) { + if (a.length != b.length) + return false; + + for (int i = 0; i < a.length; i++) { + if (columnDescEquals(a[i].getColumnDesc(), b[i].getColumnDesc()) == false) + return false; + } + return true; + } + + protected boolean columnDescEquals(ColumnDesc a, ColumnDesc b) { + return a == null ? b == null : a.equals(b); + } + } }