Repository: kylin Updated Branches: refs/heads/master b0a406ff3 -> c6108a78e
KYLIN-2383 let HLLC handle NULL input correctly Project: http://git-wip-us.apache.org/repos/asf/kylin/repo Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/c6108a78 Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/c6108a78 Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/c6108a78 Branch: refs/heads/master Commit: c6108a78eeca8e4b906aeba4f94e28addd974676 Parents: b0a406f Author: Li Yang <liy...@apache.org> Authored: Thu Jan 12 15:59:51 2017 +0800 Committer: Li Yang <liy...@apache.org> Committed: Thu Jan 12 16:01:17 2017 +0800 ---------------------------------------------------------------------- .../apache/kylin/measure/MeasureIngester.java | 1 + .../org/apache/kylin/measure/MeasureType.java | 1 + .../kylin/measure/hllc/HLLCMeasureType.java | 20 ++++-- .../kylin/measure/hllc/HLLCMeasureTypeTest.java | 65 ++++++++++++++++++++ .../apache/kylin/rest/service/QueryService.java | 3 + 5 files changed, 86 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/kylin/blob/c6108a78/core-metadata/src/main/java/org/apache/kylin/measure/MeasureIngester.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureIngester.java b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureIngester.java index 26b7298..ed2cb02 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureIngester.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureIngester.java @@ -26,6 +26,7 @@ import java.util.Collection; import java.util.Map; abstract public class MeasureIngester<V> implements java.io.Serializable { + private static final long serialVersionUID = 1L; public static MeasureIngester<?> create(MeasureDesc measure) { return measure.getFunction().getMeasureType().newIngester(); http://git-wip-us.apache.org/repos/asf/kylin/blob/c6108a78/core-metadata/src/main/java/org/apache/kylin/measure/MeasureType.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureType.java b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureType.java index 3338c8c..f609dd5 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/MeasureType.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/MeasureType.java @@ -39,6 +39,7 @@ import java.util.Map; * @param <T> the Java type of aggregation data object, e.g. HLLCounter */ abstract public class MeasureType<T> implements java.io.Serializable { + private static final long serialVersionUID = 1L; /* ============================================================================ * Define http://git-wip-us.apache.org/repos/asf/kylin/blob/c6108a78/core-metadata/src/main/java/org/apache/kylin/measure/hllc/HLLCMeasureType.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/hllc/HLLCMeasureType.java b/core-metadata/src/main/java/org/apache/kylin/measure/hllc/HLLCMeasureType.java index de36b08..51c5a66 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/hllc/HLLCMeasureType.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/hllc/HLLCMeasureType.java @@ -34,6 +34,7 @@ import org.apache.kylin.metadata.model.TblColRef; import com.google.common.collect.ImmutableMap; public class HLLCMeasureType extends MeasureType<HLLCounter> { + private static final long serialVersionUID = 1L; public static final String FUNC_COUNT_DISTINCT = FunctionDesc.FUNC_COUNT_DISTINCT; public static final String DATATYPE_HLLC = "hllc"; @@ -93,15 +94,26 @@ public class HLLCMeasureType extends MeasureType<HLLCounter> { @Override public MeasureIngester<HLLCounter> newIngester() { return new MeasureIngester<HLLCounter>() { + private static final long serialVersionUID = 1L; + HLLCounter current = new HLLCounter(dataType.getPrecision()); @Override public HLLCounter valueOf(String[] values, MeasureDesc measureDesc, Map<TblColRef, Dictionary<String>> dictionaryMap) { HLLCounter hllc = current; hllc.clear(); - for (String v : values) { - if (v != null) - hllc.add(v); + if (values.length == 1) { + if (values[0] != null) + hllc.add(values[0]); + } else { + boolean allNull = true; + StringBuilder buf = new StringBuilder(); + for (String v : values) { + allNull = (allNull && v == null); + buf.append(v); + } + if (!allNull) + hllc.add(buf.toString()); } return hllc; } @@ -133,5 +145,5 @@ public class HLLCMeasureType extends MeasureType<HLLCounter> { public static boolean isCountDistinct(FunctionDesc func) { return FUNC_COUNT_DISTINCT.equalsIgnoreCase(func.getExpression()); } - + } http://git-wip-us.apache.org/repos/asf/kylin/blob/c6108a78/core-metadata/src/test/java/org/apache/kylin/measure/hllc/HLLCMeasureTypeTest.java ---------------------------------------------------------------------- diff --git a/core-metadata/src/test/java/org/apache/kylin/measure/hllc/HLLCMeasureTypeTest.java b/core-metadata/src/test/java/org/apache/kylin/measure/hllc/HLLCMeasureTypeTest.java new file mode 100644 index 0000000..acd2ea3 --- /dev/null +++ b/core-metadata/src/test/java/org/apache/kylin/measure/hllc/HLLCMeasureTypeTest.java @@ -0,0 +1,65 @@ +/* + * 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.measure.hllc; + +import static org.junit.Assert.*; + +import org.apache.kylin.common.util.LocalFileMetadataTestCase; +import org.apache.kylin.measure.MeasureIngester; +import org.apache.kylin.measure.MeasureType; +import org.apache.kylin.measure.MeasureTypeFactory; +import org.apache.kylin.metadata.datatype.DataType; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class HLLCMeasureTypeTest extends LocalFileMetadataTestCase { + + @Before + public void setUp() throws Exception { + this.createTestMetadata(); + } + + @After + public void after() throws Exception { + this.cleanupTestMetadata(); + } + + @Test + public void testIngest() { + MeasureType<HLLCounter> mtype = (MeasureType<HLLCounter>) MeasureTypeFactory.create(HLLCMeasureType.FUNC_COUNT_DISTINCT, DataType.getType("hllc(10)")); + MeasureIngester<HLLCounter> ingester = mtype.newIngester(); + HLLCounter hllc; + + hllc = ingester.valueOf(new String[] { null }, null, null); + assertEquals(0, hllc.getCountEstimate()); + + hllc = ingester.valueOf(new String[] { null, null }, null, null); + assertEquals(0, hllc.getCountEstimate()); + + hllc = ingester.valueOf(new String[] { "" }, null, null); + assertEquals(1, hllc.getCountEstimate()); + + hllc = ingester.valueOf(new String[] { "", null }, null, null); + assertEquals(1, hllc.getCountEstimate()); + + hllc = ingester.valueOf(new String[] { "abc" }, null, null); + assertEquals(1, hllc.getCountEstimate()); + } +} http://git-wip-us.apache.org/repos/asf/kylin/blob/c6108a78/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java ---------------------------------------------------------------------- diff --git a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java index bc644cc..98eb7cb 100644 --- a/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java +++ b/server-base/src/main/java/org/apache/kylin/rest/service/QueryService.java @@ -325,6 +325,9 @@ public class QueryService extends BasicService { if (!(Constant.SERVER_MODE_QUERY.equals(serverMode.toLowerCase()) || Constant.SERVER_MODE_ALL.equals(serverMode.toLowerCase()))) { throw new InternalErrorException("Query is not allowed in " + serverMode + " mode."); } + if (StringUtils.isBlank(sqlRequest.getProject())) { + throw new InternalErrorException("Project cannot be empty. Please select a project."); + } final String queryId = UUID.randomUUID().toString(); if (sqlRequest.getBackdoorToggles() != null)