Repository: kylin Updated Branches: refs/heads/KYLIN-1971 [created] a75bad87f
KYLIN-1971 bug fix, model matching must match joining tables Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/a75bad87 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/a75bad87 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/a75bad87 Branch: refs/heads/KYLIN-1971 Commit: a75bad87fba2aad240dda226385eb2ca9396771e Parents: 634aeaa Author: Yang Li <liy...@apache.org> Authored: Sat Nov 19 21:58:21 2016 +0800 Committer: Yang Li <liy...@apache.org> Committed: Sat Nov 19 21:58:21 2016 +0800 ---------------------------------------------------------------------- .../kylin/dict/NumberDictionaryBuilder.java | 3 + .../apache/kylin/metadata/model/ColumnDesc.java | 6 ++ .../kylin/metadata/model/DataModelDesc.java | 2 + .../apache/kylin/metadata/model/JoinDesc.java | 63 +++++++++++++------- .../apache/kylin/query/relnode/OLAPJoinRel.java | 1 + .../kylin/query/relnode/OLAPTableScan.java | 1 + 6 files changed, 56 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/core-dictionary/src/main/java/org/apache/kylin/dict/NumberDictionaryBuilder.java ---------------------------------------------------------------------- diff --git a/core-dictionary/src/main/java/org/apache/kylin/dict/NumberDictionaryBuilder.java b/core-dictionary/src/main/java/org/apache/kylin/dict/NumberDictionaryBuilder.java index 0655ce1..68a05d4 100644 --- a/core-dictionary/src/main/java/org/apache/kylin/dict/NumberDictionaryBuilder.java +++ b/core-dictionary/src/main/java/org/apache/kylin/dict/NumberDictionaryBuilder.java @@ -21,8 +21,11 @@ package org.apache.kylin.dict; import org.apache.kylin.common.util.Bytes; /** + * Use <code>NumberDictionaryForestBuilder</code> instead. + * * @author yangli9 */ +@Deprecated public class NumberDictionaryBuilder<T> extends TrieDictionaryBuilder<T> { NumberDictionary.NumberBytesCodec codec = new NumberDictionary.NumberBytesCodec(NumberDictionary.MAX_DIGITS_BEFORE_DECIMAL_POINT); http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java b/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java index e0184b4..7d9133d 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/model/ColumnDesc.java @@ -191,6 +191,12 @@ public class ColumnDesc implements Serializable { } else if (!name.equals(other.name)) return false; + if (table == null) { + if (other.table != null) + return false; + } else if (!table.equals(other.table)) + return false; + if (datatype == null) { if (other.datatype != null) return false; http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/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 7c39a25..139fcbe 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 @@ -369,6 +369,8 @@ public class DataModelDesc extends RootPersistentEntity { fkCols[i] = col; } join.setForeignKeyColumns(fkCols); + + join.sortByFK(); // Validate join in dimension if (pkCols.length != fkCols.length) { http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/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 5beda0a..1dd8725 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 @@ -23,6 +23,7 @@ import java.util.Arrays; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.common.base.Preconditions; /** */ @@ -98,6 +99,37 @@ public class JoinDesc { this.foreignKeyColumns = foreignKeyColumns; } + public void sortByFK() { + Preconditions.checkState(primaryKey.length == foreignKey.length && primaryKey.length == primaryKeyColumns.length && foreignKey.length == foreignKeyColumns.length); + boolean cont = true; + int n = foreignKey.length; + for (int i = 0; i < n - 1 && cont; i++) { + cont = false; + for (int j = i; j < n - 1; j++) { + int jj = j + 1; + if (foreignKey[j].compareTo(foreignKey[jj]) > 0) { + swap(foreignKey, j, jj); + swap(primaryKey, j, jj); + swap(foreignKeyColumns, j, jj); + swap(primaryKeyColumns, j, jj); + cont = true; + } + } + } + } + + private void swap(String[] arr, int j, int jj) { + String tmp = arr[j]; + arr[j] = arr[jj]; + arr[jj] = tmp; + } + + private void swap(TblColRef[] arr, int j, int jj) { + TblColRef tmp = arr[j]; + arr[j] = arr[jj]; + arr[jj] = tmp; + } + @Override public int hashCode() { final int prime = 31; @@ -118,9 +150,10 @@ public class JoinDesc { return false; JoinDesc other = (JoinDesc) obj; - if (!this.colRefsEqualIgnoringOrder(foreignKeyColumns, other.foreignKeyColumns)) + // note pk/fk are sorted, sortByFK() + if (!Arrays.equals(foreignKeyColumns, other.foreignKeyColumns)) return false; - if (!this.colRefsEqualIgnoringOrder(primaryKeyColumns, other.primaryKeyColumns)) + if (!Arrays.equals(primaryKeyColumns, other.primaryKeyColumns)) return false; if (!this.type.equalsIgnoreCase(other.getType())) @@ -128,39 +161,29 @@ public class JoinDesc { return true; } - private boolean colRefsEqualIgnoringOrder(TblColRef[] a, TblColRef[] b) { - if (a.length != b.length) - return false; - - return Arrays.asList(a).containsAll(Arrays.asList(b)); - } - // equals() without alias public boolean matches(JoinDesc other) { if (!this.type.equalsIgnoreCase(other.getType())) return false; - if (!this.columnsEqualIgnoringOrder(foreignKeyColumns, other.foreignKeyColumns)) + + // note pk/fk are sorted, sortByFK() + if (!this.columnDescEquals(foreignKeyColumns, other.foreignKeyColumns)) return false; - if (!this.columnsEqualIgnoringOrder(primaryKeyColumns, other.primaryKeyColumns)) + if (!this.columnDescEquals(primaryKeyColumns, other.primaryKeyColumns)) return false; return true; } - private boolean columnsEqualIgnoringOrder(TblColRef[] a, TblColRef[] b) { + private boolean columnDescEquals(TblColRef[] a, TblColRef[] b) { if (a.length != b.length) return false; - int match = 0; for (int i = 0; i < a.length; i++) { - for (int j = 0; j < b.length; j++) { - if (a[i].getColumnDesc().equals(b[j].getColumnDesc())) { - match++; - break; - } - } + if (a[i].getColumnDesc().equals(b[i].getColumnDesc()) == false) + return false; } - return match == a.length; + return true; } @Override http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java index 265d65d..4c0a1dc 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPJoinRel.java @@ -220,6 +220,7 @@ public class OLAPJoinRel extends EnumerableJoin implements OLAPRel { join.setForeignKeyColumns(fkCols.toArray(new TblColRef[fkCols.size()])); join.setPrimaryKey(pks.toArray(COLUMN_ARRAY_MARKER)); join.setPrimaryKeyColumns(pkCols.toArray(new TblColRef[pkCols.size()])); + join.sortByFK(); return join; } http://git-wip-us.apache.org/repos/asf/kylin/blob/a75bad87/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java ---------------------------------------------------------------------- diff --git a/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java b/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java index 8b5ad78..e63a978 100644 --- a/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java +++ b/query/src/main/java/org/apache/kylin/query/relnode/OLAPTableScan.java @@ -239,6 +239,7 @@ public class OLAPTableScan extends TableScan implements OLAPRel, EnumerableRel { return new ColumnRowType(columns); } + @SuppressWarnings("deprecation") public TblColRef makeRewriteColumn(String name) { TableRef tableRef = columnRowType.getColumnByIndex(0).getTableRef(); return tableRef.makeFakeColumn(name);