From 9f603d3188bd20070ea10cbe5fc0eecc28703633 Mon Sep 17 00:00:00 2001 From: lidongsjtu Date: Thu, 16 Nov 2017 23:58:25 +0800 Subject: [PATCH] minor, refactor on JoinTree --- .../org/apache/kylin/job/JoinedFlatTable.java | 2 +- .../kylin/metadata/model/DataModelDesc.java | 5 +- .../apache/kylin/metadata/model/JoinDesc.java | 28 ----------- .../kylin/metadata/model/JoinsTree.java | 50 ++++++++++++++++++- 4 files changed, 53 insertions(+), 32 deletions(-) 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 d731d4f80b9..d9187770b86 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 static void appendJoinStatement(IJoinedFlatTableDesc flatDesc, StringBuil 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); 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 bf0db7360e8..4dd43993e93 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 @@ private void initTableAlias(Map tables) { 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); 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 b16ad7d3ce2..4bf9af34764 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 boolean equals(Object obj) { 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) + "]"; 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 a37c6beb529..2ee2b346461 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 @@ public class JoinsTree implements Serializable { private static final long serialVersionUID = 1L; + private static final IJoinDescMatcher DEFAULT_JOINDESC_MATCHER = new DefaultJoinDescMatcher(); final Map tableChains = new LinkedHashMap<>(); + private IJoinDescMatcher joinDescMatcher = DEFAULT_JOINDESC_MATCHER; public JoinsTree(TableRef rootTable, List joins) { for (JoinDesc join : joins) { @@ -108,7 +110,8 @@ private boolean matchChain(Chain chain, Chain anotherChain, Map 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 Map getTableChains() { 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 Chain getFkSide() { } } + 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); + } + } }