You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by li...@apache.org on 2017/04/28 01:17:51 UTC
[05/17] kylin git commit: KYLIN-2462 fix PK/FK backward-compatibility
issue (By LiYang)
KYLIN-2462 fix PK/FK backward-compatibility issue (By LiYang)
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/675c0d82
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/675c0d82
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/675c0d82
Branch: refs/heads/master
Commit: 675c0d82a0e568cf6b7a4d36ae12fc8966d5d705
Parents: 8733dda
Author: lidongsjtu <li...@apache.org>
Authored: Thu Apr 13 20:00:26 2017 +0800
Committer: lidongsjtu <li...@apache.org>
Committed: Thu Apr 13 20:04:42 2017 +0800
----------------------------------------------------------------------
.../org/apache/kylin/common/KylinVersion.java | 47 +++++++++++++++-----
.../org/apache/kylin/cube/model/CubeDesc.java | 13 ++++++
2 files changed, 50 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/kylin/blob/675c0d82/core-common/src/main/java/org/apache/kylin/common/KylinVersion.java
----------------------------------------------------------------------
diff --git a/core-common/src/main/java/org/apache/kylin/common/KylinVersion.java b/core-common/src/main/java/org/apache/kylin/common/KylinVersion.java
index 465ca5a..14fcfd0 100644
--- a/core-common/src/main/java/org/apache/kylin/common/KylinVersion.java
+++ b/core-common/src/main/java/org/apache/kylin/common/KylinVersion.java
@@ -33,7 +33,7 @@ import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-public class KylinVersion {
+public class KylinVersion implements Comparable {
private static final String COMMIT_SHA1_v15 = "commit_SHA1";
private static final String COMMIT_SHA1_v13 = "commit.sha1";
@@ -66,22 +66,44 @@ public class KylinVersion {
return "" + major + "." + minor + "." + revision;
}
+ @Override
+ public int compareTo(Object o) {
+ KylinVersion v = (KylinVersion) o;
+ int comp;
+
+ comp = this.major - v.major;
+ if (comp != 0)
+ return comp;
+
+ comp = this.minor - v.minor;
+ if (comp != 0)
+ return comp;
+
+ comp = this.revision - v.revision;
+ if (comp != 0)
+ return comp;
+
+ return (this.isSnapshot ? 0 : 1) - (v.isSnapshot ? 0 : 1);
+ }
+
/**
* Require MANUAL updating kylin version per ANY upgrading.
*/
private static final KylinVersion CURRENT_KYLIN_VERSION = new KylinVersion("2.0.0");
+ private static final KylinVersion VERSION_200 = new KylinVersion("2.0.0");
+
private static final Set<KylinVersion> SIGNATURE_INCOMPATIBLE_REVISIONS = new HashSet<KylinVersion>();
/**
- * 1.5.1 is actually compatible with 1.5.0's cube. However the "calculate signature" method in 1.5.1 code base somehow
- * gives different signature values for 1.5.0 cubes. To prevent from users having to take care of this mess, as people
- * usually won't expect to take lots of efforts for small upgrade (from 1.5.0 to 1.5.1), a special list of
+ * 1.5.1 is actually compatible with 1.5.0's cube. However the "calculate signature" method in 1.5.1 code base somehow
+ * gives different signature values for 1.5.0 cubes. To prevent from users having to take care of this mess, as people
+ * usually won't expect to take lots of efforts for small upgrade (from 1.5.0 to 1.5.1), a special list of
* SIGNATURE_INCOMPATIBLE_REVISIONS is introduced to silently take care of such legacy cubes.
- *
+ *
* We should NEVER add new stuff to SIGNATURE_INCOMPATIBLE_REVISIONS. "calculate signature" should always return consistent values
* to compatible versions. If it's impossible to maintain consistent signatures between upgrade, we should increase the minor version,
- * e.g. it's better to skip 1.5.1 and use 1.6.0 as the next release version to 1.5.0, or even to use 2.0.0, as people tends to accept
+ * e.g. it's better to skip 1.5.1 and use 1.6.0 as the next release version to 1.5.0, or even to use 2.0.0, as people tends to accept
* doing more (e.g. Having to use sth like a metastore upgrade tool when upgrading Kylin)
*/
static {
@@ -100,6 +122,14 @@ public class KylinVersion {
return CURRENT_KYLIN_VERSION;
}
+ public static boolean isBefore200(String ver) {
+ return new KylinVersion(ver).compareTo(VERSION_200) < 0;
+ }
+
+ public static void main(String[] args) {
+ System.out.println(getKylinClientInformation());
+ }
+
public boolean isCompatibleWith(KylinVersion v) {
KylinVersion current = CURRENT_KYLIN_VERSION;
if (current.major != v.major || current.minor != v.minor) {
@@ -135,10 +165,6 @@ public class KylinVersion {
return !signatureIncompatible;
}
- public static void main(String[] args) {
- System.out.println(getKylinClientInformation());
- }
-
public static String getKylinClientInformation() {
StringBuilder buf = new StringBuilder();
@@ -172,4 +198,5 @@ public class KylinVersion {
return StringUtils.EMPTY;
}
}
+
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/kylin/blob/675c0d82/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
----------------------------------------------------------------------
diff --git a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
index 820a172..0cbe9b7 100644
--- a/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
+++ b/core-cube/src/main/java/org/apache/kylin/cube/model/CubeDesc.java
@@ -875,6 +875,19 @@ public class CubeDesc extends RootPersistentEntity implements IEngineAware {
private TblColRef initDimensionColRef(DimensionDesc dim, String colName) {
TblColRef col = model.findColumn(dim.getTable(), colName);
+
+ // for backward compatibility
+ if (KylinVersion.isBefore200(getVersion())) {
+ // always use FK instead PK, FK could be shared by more than one lookup tables
+ JoinDesc join = dim.getJoin();
+ if (join != null) {
+ int idx = ArrayUtils.indexOf(join.getPrimaryKeyColumns(), col);
+ if (idx >= 0) {
+ col = join.getForeignKeyColumns()[idx];
+ }
+ }
+ }
+
return initDimensionColRef(col);
}