Repository: kylin
Updated Branches:
  refs/heads/master 634aeaa94 -> 1d4f57af7


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/1d4f57af
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/1d4f57af
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/1d4f57af

Branch: refs/heads/master
Commit: 1d4f57af7cf0ab89a1e1acd10bb4d1aaec1012cf
Parents: 634aeaa
Author: Yang Li <liy...@apache.org>
Authored: Sat Nov 19 21:58:21 2016 +0800
Committer: Yang Li <liy...@apache.org>
Committed: Sun Nov 20 07:48:48 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 +
 .../v1/coprocessor/observer/RowTypeTest.java    | 69 --------------------
 7 files changed, 56 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/1d4f57af/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/1d4f57af/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/1d4f57af/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/1d4f57af/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/1d4f57af/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/1d4f57af/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);

http://git-wip-us.apache.org/repos/asf/kylin/blob/1d4f57af/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/RowTypeTest.java
----------------------------------------------------------------------
diff --git 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/RowTypeTest.java
 
b/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/RowTypeTest.java
deleted file mode 100644
index 364be9a..0000000
--- 
a/storage-hbase/src/test/java/org/apache/kylin/storage/hbase/cube/v1/coprocessor/observer/RowTypeTest.java
+++ /dev/null
@@ -1,69 +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.kylin.storage.hbase.cube.v1.coprocessor.observer;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-
-import org.apache.kylin.common.util.LocalFileMetadataTestCase;
-import org.apache.kylin.cube.CubeInstance;
-import org.apache.kylin.cube.CubeManager;
-import org.apache.kylin.cube.cuboid.Cuboid;
-import org.apache.kylin.cube.model.CubeDesc;
-import org.apache.kylin.storage.hbase.common.coprocessor.CoprocessorRowType;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * @author yangli9
- * 
- */
-public class RowTypeTest extends LocalFileMetadataTestCase {
-
-    @Before
-    public void setUp() throws Exception {
-        this.createTestMetadata();
-    }
-
-    @After
-    public void after() throws Exception {
-        this.cleanupTestMetadata();
-    }
-
-    @Test
-    public void testSerialize() {
-
-        CubeInstance cube = 
CubeManager.getInstance(getTestConfig()).getCube("test_kylin_cube_without_slr_ready");
-        CubeDesc cubeDesc = cube.getDescriptor();
-        long baseCuboidId = Cuboid.getBaseCuboidId(cubeDesc);
-        Cuboid cuboid = Cuboid.findById(cubeDesc, baseCuboidId);
-
-        CoprocessorRowType rowType = 
CoprocessorRowType.fromCuboid(cube.getLatestReadySegment(), cuboid);
-        byte[] bytes = CoprocessorRowType.serialize(rowType);
-        CoprocessorRowType copy = CoprocessorRowType.deserialize(bytes);
-
-        assertTrue(Arrays.equals(rowType.columnSizes, copy.columnSizes));
-        for (int i = 0; i < rowType.columns.length; i++) {
-            assertEquals(rowType.columns[i].getColumnDesc(), 
copy.columns[i].getColumnDesc());
-        }
-    }
-}

Reply via email to