Repository: kylin
Updated Branches:
  refs/heads/2.x-staging 5db430706 -> 829f5d312


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

Branch: refs/heads/2.x-staging
Commit: 829f5d3129d0521d22d42bd43ba07a83bc2945be
Parents: 5db4307
Author: shaofengshi <shaofeng...@apache.org>
Authored: Tue Jan 12 16:23:04 2016 +0800
Committer: shaofengshi <shaofeng...@apache.org>
Committed: Tue Jan 12 17:28:34 2016 +0800

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


http://git-wip-us.apache.org/repos/asf/kylin/blob/829f5d31/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 3e9a67d..a1eb6da 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
@@ -17,10 +17,13 @@
 */
 package org.apache.kylin.cube.inmemcubing;
 
+import org.apache.kylin.common.util.Bytes;
+
 import java.util.List;
 import java.util.Map;
 
 import org.apache.kylin.common.util.Dictionary;
+import com.google.common.collect.Lists;
 import org.apache.kylin.cube.model.CubeDesc;
 import org.apache.kylin.cube.model.CubeJoinedFlatTableDesc;
 import org.apache.kylin.gridtable.GTInfo;
@@ -35,12 +38,15 @@ import org.apache.kylin.metadata.model.TblColRef;
  */
 public class InMemCubeBuilderInputConverter {
 
+    public static final byte[] HIVE_NULL = Bytes.toBytes("\\N");
+    
     private final CubeJoinedFlatTableDesc intermediateTableDesc;
     private final MeasureDesc[] measureDescs;
     private final MeasureIngester<?>[] measureIngesters;
     private final int measureCount;
     private final Map<TblColRef, Dictionary<String>> dictionaryMap;
     private final GTInfo gtInfo;
+    protected List<byte[]> nullBytes;
     
 
     public InMemCubeBuilderInputConverter(CubeDesc cubeDesc, Map<TblColRef, 
Dictionary<String>> dictionaryMap, GTInfo gtInfo) {
@@ -50,6 +56,7 @@ public class InMemCubeBuilderInputConverter {
         this.measureDescs = cubeDesc.getMeasures().toArray(new 
MeasureDesc[measureCount]);
         this.measureIngesters = MeasureIngester.create(cubeDesc.getMeasures());
         this.dictionaryMap = dictionaryMap;
+        initNullBytes(cubeDesc);
     }
     
     public final GTRecord convert(List<String> row) {
@@ -73,6 +80,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;
@@ -112,4 +122,24 @@ public class InMemCubeBuilderInputConverter {
         return measureIngesters[idxOfMeasure].valueOf(inputToMeasure, measure, 
dictionaryMap);
     }
 
+    private void initNullBytes(CubeDesc cubeDesc) {
+        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