Repository: kylin Updated Branches: refs/heads/2.2.x 5bb397c79 -> b0dfc049c
APACHE-KYLIN-2600: fix Incorrectly setting the range start Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/b0dfc049 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/b0dfc049 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/b0dfc049 Branch: refs/heads/2.2.x Commit: b0dfc049c1b4cd39d943de0a7a8760ba3d6fdfab Parents: 5bb397c Author: Zhong <[email protected]> Authored: Thu Oct 12 00:50:21 2017 +0800 Committer: lidongsjtu <[email protected]> Committed: Thu Oct 12 19:56:58 2017 +0800 ---------------------------------------------------------------------- .../kylin/cube/gridtable/RecordComparators.java | 18 +++++++++++++++--- .../kylin/storage/gtrecord/DictGridTableTest.java | 8 ++++++++ 2 files changed, 23 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/b0dfc049/core-cube/src/main/java/org/apache/kylin/cube/gridtable/RecordComparators.java ---------------------------------------------------------------------- diff --git a/core-cube/src/main/java/org/apache/kylin/cube/gridtable/RecordComparators.java b/core-cube/src/main/java/org/apache/kylin/cube/gridtable/RecordComparators.java index 43ea30b..44b19ab 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/gridtable/RecordComparators.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/gridtable/RecordComparators.java @@ -25,15 +25,27 @@ public class RecordComparators { public static RecordComparator getRangeStartComparator(final IGTComparator comp) { return new RecordComparator(new ComparatorEx<ByteArray>() { + boolean isMinNull(byte[] array) { + if (array == null) { + return true; + } + for (int i = 0; i < array.length; i++) { + if (array[i] != 0) { + return false; + } + } + return true; + } + @Override public int compare(ByteArray a, ByteArray b) { - if (a.array() == null) { - if (b.array() == null) { + if (isMinNull(a.array())) { + if (isMinNull(b.array())) { return 0; } else { return -1; } - } else if (b.array() == null) { + } else if (isMinNull(b.array())) { return 1; } else { return comp.compare(a, b); http://git-wip-us.apache.org/repos/asf/kylin/blob/b0dfc049/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java ---------------------------------------------------------------------- diff --git a/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java b/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java index e4767e0..e80a67c 100644 --- a/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java +++ b/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java @@ -81,6 +81,7 @@ public class DictGridTableTest extends LocalFileMetadataTestCase { private CompareTupleFilter timeComp4; private CompareTupleFilter timeComp5; private CompareTupleFilter timeComp6; + private CompareTupleFilter timeComp7; private CompareTupleFilter ageComp1; private CompareTupleFilter ageComp2; private CompareTupleFilter ageComp3; @@ -107,6 +108,7 @@ public class DictGridTableTest extends LocalFileMetadataTestCase { timeComp4 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "2015-01-15")); timeComp5 = compare(info.colRef(0), FilterOperatorEnum.GT, enc(info, 0, "2015-01-15")); timeComp6 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "2015-01-14")); + timeComp7 = compare(info.colRef(0), FilterOperatorEnum.EQ, enc(info, 0, "1970-01-01")); ageComp1 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "10")); ageComp2 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "20")); ageComp3 = compare(info.colRef(1), FilterOperatorEnum.EQ, enc(info, 1, "30")); @@ -165,6 +167,12 @@ public class DictGridTableTest extends LocalFileMetadataTestCase { r.get(0).fuzzyKeys.toString()); } { + LogicalTupleFilter filter = or(and(timeComp3, ageComp3), and(timeComp7, ageComp1)); + CubeScanRangePlanner planner = new CubeScanRangePlanner(info, null, null, filter); + List<GTScanRange> r = planner.planScanRanges(); + assertEquals("[[0, 10]-[1421280000000, 30]]", r.toString()); + } + { LogicalTupleFilter filter = or(timeComp2, timeComp1, timeComp6); CubeScanRangePlanner planner = new CubeScanRangePlanner(info, Pair.newPair(segmentStart, segmentEnd), info.colRef(0), filter);
