KYLIN-2320 fix getSizeOfId() for empty TrieDictionaryForest
Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/30d3763f Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/30d3763f Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/30d3763f Branch: refs/heads/master-hbase1.x Commit: 30d3763f8256a9e88ae9620499021e99771b3351 Parents: 73a4029 Author: Yang Li <liy...@apache.org> Authored: Sat Dec 24 07:34:12 2016 +0800 Committer: Yang Li <liy...@apache.org> Committed: Sat Dec 24 14:46:38 2016 +0800 ---------------------------------------------------------------------- .../apache/kylin/dict/TrieDictionaryForest.java | 4 +- .../kylin/dict/TrieDictionaryForestTest.java | 41 ++++++++++++++++---- 2 files changed, 35 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/30d3763f/core-dictionary/src/main/java/org/apache/kylin/dict/TrieDictionaryForest.java ---------------------------------------------------------------------- diff --git a/core-dictionary/src/main/java/org/apache/kylin/dict/TrieDictionaryForest.java b/core-dictionary/src/main/java/org/apache/kylin/dict/TrieDictionaryForest.java index 1015b11..e746348 100755 --- a/core-dictionary/src/main/java/org/apache/kylin/dict/TrieDictionaryForest.java +++ b/core-dictionary/src/main/java/org/apache/kylin/dict/TrieDictionaryForest.java @@ -87,7 +87,7 @@ public class TrieDictionaryForest<T> extends Dictionary<T> { @Override public int getSizeOfId() { if (trees.isEmpty()) - return -1; + return 1; int maxOffset = accuOffset.get(accuOffset.size() - 1); TrieDictionary<T> lastTree = trees.get(trees.size() - 1); int sizeOfId = BytesUtil.sizeForValue(baseId + maxOffset + lastTree.getMaxId() + 1); @@ -96,7 +96,7 @@ public class TrieDictionaryForest<T> extends Dictionary<T> { @Override public int getSizeOfValue() { - int maxValue = -1; + int maxValue = 0; for (TrieDictionary<T> tree : trees) maxValue = Math.max(maxValue, tree.getSizeOfValue()); return maxValue; http://git-wip-us.apache.org/repos/asf/kylin/blob/30d3763f/core-dictionary/src/test/java/org/apache/kylin/dict/TrieDictionaryForestTest.java ---------------------------------------------------------------------- diff --git a/core-dictionary/src/test/java/org/apache/kylin/dict/TrieDictionaryForestTest.java b/core-dictionary/src/test/java/org/apache/kylin/dict/TrieDictionaryForestTest.java index 32a6ab5..238bb31 100755 --- a/core-dictionary/src/test/java/org/apache/kylin/dict/TrieDictionaryForestTest.java +++ b/core-dictionary/src/test/java/org/apache/kylin/dict/TrieDictionaryForestTest.java @@ -52,6 +52,14 @@ import org.junit.Test; public class TrieDictionaryForestTest { @Test + public void testEmptyDict() { + ArrayList<String> strs = new ArrayList<String>(); + TrieDictionaryForestBuilder<String> builder = newDictBuilder(strs, 0); + TrieDictionaryForest<String> dict = builder.build(); + assertSameBehaviorAsTrie(dict, strs, 0); + } + + @Test public void testBasicFound() { ArrayList<String> strs = new ArrayList<String>(); strs.add("part"); @@ -67,11 +75,11 @@ public class TrieDictionaryForestTest { dict.dump(System.out); int expectId = baseId; for (String s : strs) { - System.out.println("value:" + s + " expect id:" + expectId); assertEquals(expectId, dict.getIdFromValue(s)); expectId++; } - System.out.println("test ok"); + + assertSameBehaviorAsTrie(dict, strs, baseId); } @Test //one string one tree @@ -95,11 +103,11 @@ public class TrieDictionaryForestTest { assertEquals(strs.size(), dict.getTrees().size()); int expectId = baseId; for (String s : strs) { - System.out.println("value:" + s + " expect id:" + expectId); assertEquals(expectId, dict.getIdFromValue(s)); expectId++; } - System.out.println("test ok"); + + assertSameBehaviorAsTrie(dict, strs, baseId); } @Test @@ -115,11 +123,13 @@ public class TrieDictionaryForestTest { dict.dump(System.out); //null value query int id = dict.getIdFromValue(null, 0); - System.out.println(id); + assertEquals(255, id); id = dict.getIdFromValue(null, 1); - System.out.println(id); + assertEquals(255, id); id = dict.getIdFromValue(null, -1); - System.out.println(id); + assertEquals(255, id); + + assertSameBehaviorAsTrie(dict, strs, 0); } @Test @@ -940,7 +950,7 @@ public class TrieDictionaryForestTest { b.addValue(strs.next()); return b; } - + private static class RandomStrings implements Iterable<String> { final private int size; @@ -1022,4 +1032,19 @@ public class TrieDictionaryForestTest { return testData; } + private void assertSameBehaviorAsTrie(TrieDictionaryForest<String> dict, ArrayList<String> strs, int baseId) { + TrieDictionaryBuilder<String> trieBuilder = new TrieDictionaryBuilder<>(new StringBytesConverter()); + for (String s : strs) { + if (s != null) + trieBuilder.addValue(s); + } + TrieDictionary<String> trie = trieBuilder.build(baseId); + + assertEquals(trie.getMaxId(), dict.getMaxId()); + assertEquals(trie.getMinId(), dict.getMinId()); + assertEquals(trie.getSize(), dict.getSize()); + assertEquals(trie.getSizeOfId(), dict.getSizeOfId()); + assertEquals(trie.getSizeOfValue(), dict.getSizeOfValue()); + } + }