KYLIN-2356 Incorrect result when filter on numeric columns Signed-off-by: Billy Liu <billy...@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/master-cdh5.7 Commit: 980b03b1abb8af82a9bceeb497847fe17c19c3e3 Parents: c64f55b Author: zhengdong <zhe...@outlook.com> Authored: Thu Jan 5 15:05:35 2017 +0800 Committer: Billy Liu <billy...@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); } }