You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kylin.apache.org by sh...@apache.org on 2017/01/05 12:05:57 UTC

[04/11] kylin git commit: KYLIN-2356 Incorrect result when filter on numeric columns

KYLIN-2356 Incorrect result when filter on numeric columns

Signed-off-by: Billy Liu <bi...@apache.org>


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

Branch: refs/heads/sparkcubing-rebase
Commit: 980b03b1abb8af82a9bceeb497847fe17c19c3e3
Parents: c64f55b
Author: zhengdong <zh...@outlook.com>
Authored: Thu Jan 5 15:05:35 2017 +0800
Committer: Billy Liu <bi...@apache.org>
Committed: Thu Jan 5 17:45:20 2017 +0800

----------------------------------------------------------------------
 .../filter/FilterCodeSystemFactory.java         | 98 ++++++++++++++++++++
 .../translate/DerivedFilterTranslator.java      |  4 +-
 2 files changed, 100 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/980b03b1/core-metadata/src/main/java/org/apache/kylin/metadata/filter/FilterCodeSystemFactory.java
----------------------------------------------------------------------
diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/filter/FilterCodeSystemFactory.java b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/FilterCodeSystemFactory.java
new file mode 100755
index 0000000..bae8cf9
--- /dev/null
+++ b/core-metadata/src/main/java/org/apache/kylin/metadata/filter/FilterCodeSystemFactory.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+*/
+
+package org.apache.kylin.metadata.filter;
+
+import java.nio.ByteBuffer;
+import java.util.HashMap;
+
+import org.apache.kylin.common.util.BytesUtil;
+import org.apache.kylin.metadata.datatype.DataType;
+
+/**
+ * Created by donald.zheng on 2016/12/19.
+ */
+public class FilterCodeSystemFactory {
+    private final static HashMap<String, IFilterCodeSystem> codeSystemMap = new HashMap<>();
+
+    static {
+        codeSystemMap.put("string", StringCodeSystem.INSTANCE);
+        codeSystemMap.put("integer", new IntegerCodeSystem());
+        codeSystemMap.put("decimal", new DecimalCodeSystem());
+    }
+
+    public static IFilterCodeSystem getFilterCodeSystem(DataType dataType) {
+        if (dataType.isIntegerFamily()) {
+            return codeSystemMap.get("integer");
+        } else if (dataType.isNumberFamily()) {
+            return codeSystemMap.get("decimal");
+        } else {
+            return codeSystemMap.get("string");
+        }
+    }
+
+    private static class IntegerCodeSystem implements IFilterCodeSystem {
+
+        @Override
+        public boolean isNull(Object code) {
+            return code == null;
+        }
+
+        @Override
+        public void serialize(Object code, ByteBuffer buf) {
+            BytesUtil.writeLong(Long.parseLong(code.toString()), buf);
+        }
+
+        @Override
+        public Object deserialize(ByteBuffer buf) {
+            return BytesUtil.readLong(buf);
+        }
+
+        @Override
+        public int compare(Object o, Object t1) {
+            long l1 = Long.parseLong(o.toString());
+            long l2 = Long.parseLong(t1.toString());
+            return Long.compare(l1, l2);
+        }
+    }
+
+    private static class DecimalCodeSystem implements IFilterCodeSystem {
+        @Override
+        public boolean isNull(Object code) {
+            return code == null;
+        }
+
+        @Override
+        public void serialize(Object code, ByteBuffer buf) {
+            BytesUtil.writeUTFString(code.toString(), buf);
+        }
+
+        @Override
+        public Object deserialize(ByteBuffer buf) {
+            return Double.parseDouble(BytesUtil.readUTFString(buf));
+        }
+
+        @Override
+        public int compare(Object o, Object t1) {
+            double d1 = Double.parseDouble(o.toString());
+            double d2 = Double.parseDouble(t1.toString());
+            return Double.compare(d1, d2);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/kylin/blob/980b03b1/core-storage/src/main/java/org/apache/kylin/storage/translate/DerivedFilterTranslator.java
----------------------------------------------------------------------
diff --git a/core-storage/src/main/java/org/apache/kylin/storage/translate/DerivedFilterTranslator.java b/core-storage/src/main/java/org/apache/kylin/storage/translate/DerivedFilterTranslator.java
old mode 100644
new mode 100755
index 13c655c..f4150fe
--- a/core-storage/src/main/java/org/apache/kylin/storage/translate/DerivedFilterTranslator.java
+++ b/core-storage/src/main/java/org/apache/kylin/storage/translate/DerivedFilterTranslator.java
@@ -31,8 +31,8 @@ import org.apache.kylin.dict.lookup.LookupStringTable;
 import org.apache.kylin.metadata.filter.ColumnTupleFilter;
 import org.apache.kylin.metadata.filter.CompareTupleFilter;
 import org.apache.kylin.metadata.filter.ConstantTupleFilter;
+import org.apache.kylin.metadata.filter.FilterCodeSystemFactory;
 import org.apache.kylin.metadata.filter.LogicalTupleFilter;
-import org.apache.kylin.metadata.filter.StringCodeSystem;
 import org.apache.kylin.metadata.filter.TupleFilter;
 import org.apache.kylin.metadata.filter.TupleFilter.FilterOperatorEnum;
 import org.apache.kylin.metadata.model.TblColRef;
@@ -78,7 +78,7 @@ public class DerivedFilterTranslator {
         SingleColumnTuple tuple = new SingleColumnTuple(derivedCol);
         for (String[] row : lookup.getAllRows()) {
             tuple.value = row[di];
-            if (compf.evaluate(tuple, StringCodeSystem.INSTANCE)) {
+            if (compf.evaluate(tuple, FilterCodeSystemFactory.getFilterCodeSystem(derivedCol.getColumnDesc().getType()))) {
                 collect(row, pi, satisfyingHostRecords);
             }
         }