Repository: kylin
Updated Branches:
  refs/heads/2.0-rc 9f743fb78 -> b0ecfe750


KYLIN-1306 Null strings are not applied during fast cubing


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/b0ecfe75
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/b0ecfe75
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/b0ecfe75

Branch: refs/heads/2.0-rc
Commit: b0ecfe7507bf1d9994ff9fb76d45a868aa3347cb
Parents: 9f743fb
Author: shaofengshi <shaofeng...@apache.org>
Authored: Tue Jan 12 16:23:04 2016 +0800
Committer: shaofengshi <shaofeng...@apache.org>
Committed: Tue Jan 12 16:23:21 2016 +0800

----------------------------------------------------------------------
 .../InMemCubeBuilderInputConverter.java         | 27 ++++++++++++++++++++
 1 file changed, 27 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/b0ecfe75/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilderInputConverter.java
----------------------------------------------------------------------
diff --git 
a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilderInputConverter.java
 
b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilderInputConverter.java
index 69a9fc9..4d6f758 100644
--- 
a/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilderInputConverter.java
+++ 
b/core-cube/src/main/java/org/apache/kylin/cube/inmemcubing/InMemCubeBuilderInputConverter.java
@@ -18,6 +18,7 @@
 package org.apache.kylin.cube.inmemcubing;
 
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Lists;
 import org.apache.kylin.common.util.Bytes;
 import org.apache.kylin.cube.kv.RowConstants;
 import org.apache.kylin.cube.model.CubeDesc;
@@ -40,6 +41,7 @@ import java.util.Map;
 public class InMemCubeBuilderInputConverter {
 
     private static final LongMutable ONE = new LongMutable(1l);
+    public static final byte[] HIVE_NULL = Bytes.toBytes("\\N");
     
     private final CubeDesc cubeDesc;
     private final CubeJoinedFlatTableDesc intermediateTableDesc;
@@ -49,6 +51,7 @@ public class InMemCubeBuilderInputConverter {
     private final ByteBuffer valueBuf = 
ByteBuffer.allocate(RowConstants.ROWVALUE_BUFFER_SIZE);
     private final Map<Integer, Dictionary<String>> topNLiteralColDictMap;
     private final GTInfo gtInfo;
+    protected List<byte[]> nullBytes;
     
 
     public InMemCubeBuilderInputConverter(CubeDesc cubeDesc, Map<Integer, 
Dictionary<String>> topNLiteralColDictMap, GTInfo gtInfo) {
@@ -59,6 +62,7 @@ public class InMemCubeBuilderInputConverter {
         this.measureDescs = cubeDesc.getMeasures().toArray(new 
MeasureDesc[measureCount]);
         this.measureCodec = new MeasureCodec(cubeDesc.getMeasures());
         this.topNLiteralColDictMap = 
Preconditions.checkNotNull(topNLiteralColDictMap, "topNLiteralColDictMap cannot 
be null");
+        initNullBytes();
     }
     
     public final GTRecord convert(List<String> row) {
@@ -82,6 +86,9 @@ public class InMemCubeBuilderInputConverter {
 
         for (int i = 0; i < keySize; i++) {
             key[i] = 
row.get(intermediateTableDesc.getRowKeyColumnIndexes()[i]);
+            if (key[i] != null && isNull(Bytes.toBytes((String)key[i]))) {
+                key[i] = null;
+            }
         }
 
         return key;
@@ -143,4 +150,24 @@ public class InMemCubeBuilderInputConverter {
         return v == null ? null : Bytes.toBytes(v);
     }
 
+    private void initNullBytes() {
+        nullBytes = Lists.newArrayList();
+        nullBytes.add(HIVE_NULL);
+        String[] nullStrings = cubeDesc.getNullStrings();
+        if (nullStrings != null) {
+            for (String s : nullStrings) {
+                nullBytes.add(Bytes.toBytes(s));
+            }
+        }
+    }
+
+    private boolean isNull(byte[] v) {
+        for (byte[] nullByte : nullBytes) {
+            if (Bytes.equals(v, nullByte))
+                return true;
+        }
+        return false;
+    }
+
+    
 }

Reply via email to