This is an automated email from the ASF dual-hosted git repository. nic pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/kylin.git
The following commit(s) were added to refs/heads/master by this push: new 0dc8f2c Revert "Kylin 3392 support sum(null)" 0dc8f2c is described below commit 0dc8f2c29628d1eb1a975481d23f56fdeb3e0544 Author: rupengwang <wangrup...@live.cn> AuthorDate: Fri Sep 20 17:19:43 2019 +0800 Revert "Kylin 3392 support sum(null)" This reverts commit 1a2f779a074c1d03703eebbb7506d171ef26ce56. --- .../org/apache/kylin/common/util/BytesUtil.java | 49 +----- .../kylin/measure/basic/BasicMeasureType.java | 10 +- .../kylin/measure/basic/BigDecimalIngester.java | 17 +- .../measure/basic/BigDecimalMaxAggregator.java | 13 +- .../measure/basic/BigDecimalMinAggregator.java | 13 +- .../measure/basic/BigDecimalSumAggregator.java | 10 +- .../kylin/measure/basic/CountAggregator.java | 53 ------ .../apache/kylin/measure/basic/DoubleIngester.java | 7 +- .../kylin/measure/basic/DoubleMaxAggregator.java | 15 +- .../kylin/measure/basic/DoubleMinAggregator.java | 15 +- .../kylin/measure/basic/DoubleSumAggregator.java | 16 +- .../apache/kylin/measure/basic/LongIngester.java | 2 +- .../kylin/measure/basic/LongMaxAggregator.java | 15 +- .../kylin/measure/basic/LongMinAggregator.java | 15 +- .../kylin/measure/basic/LongSumAggregator.java | 16 +- .../metadata/datatype/BigDecimalSerializer.java | 18 +-- .../kylin/metadata/datatype/DoubleSerializer.java | 13 +- .../kylin/metadata/datatype/LongSerializer.java | 4 +- .../kylin/measure/basic/BasicAggregatorTest.java | 178 --------------------- .../kylin/metadata/datatype/SerializerTest.java | 136 ---------------- .../kylin/engine/mr/steps/CubeReducerTest.java | 8 +- 21 files changed, 70 insertions(+), 553 deletions(-) diff --git a/core-common/src/main/java/org/apache/kylin/common/util/BytesUtil.java b/core-common/src/main/java/org/apache/kylin/common/util/BytesUtil.java index 1434bf7..e14f6cc 100644 --- a/core-common/src/main/java/org/apache/kylin/common/util/BytesUtil.java +++ b/core-common/src/main/java/org/apache/kylin/common/util/BytesUtil.java @@ -6,9 +6,9 @@ * 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. @@ -31,10 +31,6 @@ public class BytesUtil { } public static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - // for there are some extra available code, just like binary {-113, 0}, when using variable-length serialization method to compress a Long number value. - // as for binary {-113, 0}, it should represents the 0L according to the #org.apache.kylin.common.util.BytesUtil.writeVLong algorithm. However, the 0L value - // is just use {0} rather than {-113, 0} or {-114, 0, 0}. - public static final byte[] VNULL_BYTE_ARRAY = new byte[] { -113, 0 }; public static void writeByte(byte num, byte[] bytes, int offset, int size) { for (int i = offset + size - 1; i >= offset; i--) { @@ -221,38 +217,13 @@ public class BytesUtil { // ============================================================================ public static void writeVInt(int i, ByteBuffer out) { - writeVLong((long) i, out); - } - public static void writeVLongObject(Long i, ByteBuffer out) { - if (i == null) { - out.put(VNULL_BYTE_ARRAY); - return; - } writeVLong(i, out); - } - public static Long readVLongObject(ByteBuffer in) { - byte firstByte = in.get(); - int len = decodeVIntSize(firstByte); - if (len == 1) { - return (long) firstByte; - } - long i = 0; - byte b = 0; - for (int idx = 0; idx < len - 1; idx++) { - b = in.get(); - i = i << 8; - i = i | (b & 0xFF); - } - - if (len == 2 && equalsNullByteArray(firstByte, b)) - return null; - - return (isNegativeVInt(firstByte) ? (i ^ -1L) : i); } public static void writeVLong(long i, ByteBuffer out) { + if (i >= -112 && i <= 127) { out.put((byte) i); return; @@ -285,7 +256,7 @@ public class BytesUtil { byte firstByte = in.get(); int len = decodeVIntSize(firstByte); if (len == 1) { - return (long) firstByte; + return firstByte; } long i = 0; for (int idx = 0; idx < len - 1; idx++) { @@ -293,7 +264,6 @@ public class BytesUtil { i = i << 8; i = i | (b & 0xFF); } - return (isNegativeVInt(firstByte) ? (i ^ -1L) : i); } @@ -509,6 +479,7 @@ public class BytesUtil { } /** + * * @param hex String value of a byte array in hex, e.g, "\\x00\\x0A"; * @return the byte array that the hex represented. */ @@ -522,14 +493,4 @@ public class BytesUtil { return b; } - private static boolean equalsNullByteArray(Byte... bytes) { - if (bytes == null || bytes.length < 2) - return false; - - if (VNULL_BYTE_ARRAY[0] == bytes[0] && VNULL_BYTE_ARRAY[1] == bytes[1]) - return true; - - return false; - } - } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java index b292f5f..b0836df 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BasicMeasureType.java @@ -6,15 +6,15 @@ * 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.basic; @@ -98,9 +98,7 @@ public class BasicMeasureType extends MeasureType { @Override public MeasureAggregator<?> newAggregator() { - if (isCount()) { - return new CountAggregator(); - } else if (isSum()) { + if (isSum() || isCount()) { if (dataType.isDecimal()) return new BigDecimalSumAggregator(); else if (dataType.isIntegerFamily()) diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalIngester.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalIngester.java index 1810324..5194606 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalIngester.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalIngester.java @@ -6,15 +6,15 @@ * 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.basic; @@ -26,20 +26,17 @@ import org.apache.kylin.measure.MeasureIngester; import org.apache.kylin.metadata.model.MeasureDesc; import org.apache.kylin.metadata.model.TblColRef; -@SuppressWarnings("serial") public class BigDecimalIngester extends MeasureIngester<BigDecimal> { @Override - public BigDecimal valueOf(String[] values, MeasureDesc measureDesc, - Map<TblColRef, Dictionary<String>> dictionaryMap) { + public BigDecimal valueOf(String[] values, MeasureDesc measureDesc, Map<TblColRef, Dictionary<String>> dictionaryMap) { if (values.length > 1) throw new IllegalArgumentException(); - if (values[0] == null || values[0].length() == 0) { - return null; - } else { + if (values[0] == null || values[0].length() == 0) + return new BigDecimal(0); + else return new BigDecimal(values[0]); - } } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMaxAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMaxAggregator.java index d94d89a..7a57965 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMaxAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMaxAggregator.java @@ -36,15 +36,10 @@ public class BigDecimalMaxAggregator extends MeasureAggregator<BigDecimal> { @Override public void aggregate(BigDecimal value) { - if (value != null) { - if (max == null) { - max = value; - return; - } - - if (max.compareTo(value) < 0) - max = value; - } + if (max == null) + max = value; + else if (max.compareTo(value) < 0) + max = value; } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMinAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMinAggregator.java index 370bb46..71ba7fb 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMinAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalMinAggregator.java @@ -36,15 +36,10 @@ public class BigDecimalMinAggregator extends MeasureAggregator<BigDecimal> { @Override public void aggregate(BigDecimal value) { - if (value != null) { - if (min == null) { - min = value; - return; - } - - if (min.compareTo(value) > 0) - min = value; - } + if (min == null) + min = value; + else if (min.compareTo(value) > 0) + min = value; } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalSumAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalSumAggregator.java index ed29088..fa59c54 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalSumAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/BigDecimalSumAggregator.java @@ -36,12 +36,12 @@ public class BigDecimalSumAggregator extends MeasureAggregator<BigDecimal> { @Override public void aggregate(BigDecimal value) { - if (value != null) { - if (sum == null) - sum = new BigDecimal(0); - - sum = sum.add(value); + if (value == null) + return; + if (sum == null) { + sum = new BigDecimal(0); } + sum = sum.add(value); } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/CountAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/CountAggregator.java deleted file mode 100644 index ab868f5..0000000 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/CountAggregator.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.basic; - -import org.apache.kylin.measure.MeasureAggregator; - -@SuppressWarnings("serial") -public class CountAggregator extends MeasureAggregator<Long> { - - Long sum = 0L; - - @Override - public void reset() { - sum = 0L; - } - - @Override - public void aggregate(Long value) { - sum += value; - } - - @Override - public Long aggregate(Long value1, Long value2) { - return Long.valueOf(value1 + value2); - } - - @Override - public Long getState() { - return sum; - } - - @Override - public int getMemBytesEstimate() { - return guessLongMemBytes(); - } - -} diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleIngester.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleIngester.java index 71bf896..90ecb0d 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleIngester.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleIngester.java @@ -32,11 +32,10 @@ public class DoubleIngester extends MeasureIngester<Double> { if (values.length > 1) throw new IllegalArgumentException(); - if (values[0] == null || values[0].length() == 0) { - return null; - } else { + if (values[0] == null || values[0].length() == 0) + return new Double(0); + else return Double.parseDouble(values[0]); - } } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMaxAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMaxAggregator.java index 2587577..f33555e 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMaxAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMaxAggregator.java @@ -34,21 +34,14 @@ public class DoubleMaxAggregator extends MeasureAggregator<Double> { @Override public void aggregate(Double value) { - if (value != null) { - if (max == null) - max = -Double.MAX_VALUE; - - max = Math.max(max, value); - } + if (max == null) + max = value; + else if (max < value) + max = value; } @Override public Double aggregate(Double value1, Double value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Math.max(value1, value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMinAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMinAggregator.java index a9a68bc..8e69f21 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMinAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleMinAggregator.java @@ -34,21 +34,14 @@ public class DoubleMinAggregator extends MeasureAggregator<Double> { @Override public void aggregate(Double value) { - if (value != null) { - if (min == null) - min = Double.MAX_VALUE; - - min = Math.min(value, min); - } + if (min == null) + min = value; + else if (min > value) + min = value; } @Override public Double aggregate(Double value1, Double value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Math.min(value1, value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleSumAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleSumAggregator.java index 45d8951..df0ba52 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleSumAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/DoubleSumAggregator.java @@ -25,30 +25,20 @@ import org.apache.kylin.measure.MeasureAggregator; @SuppressWarnings("serial") public class DoubleSumAggregator extends MeasureAggregator<Double> { - Double sum = null; + Double sum = new Double(0); @Override public void reset() { - sum = null; + sum = new Double(0); } @Override public void aggregate(Double value) { - if (value != null) { - if (sum == null) - sum = 0d; - - sum = sum + value; - } + sum = sum + value; } @Override public Double aggregate(Double value1, Double value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Double.valueOf(value1 + value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongIngester.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongIngester.java index b48c4a9..793acf2 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongIngester.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongIngester.java @@ -33,7 +33,7 @@ public class LongIngester extends MeasureIngester<Long> { throw new IllegalArgumentException(); if (values[0] == null || values[0].length() == 0) - return null; + return new Long(0L); else return Long.valueOf(values[0]); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMaxAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMaxAggregator.java index 200f648..b9a2b94 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMaxAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMaxAggregator.java @@ -34,21 +34,14 @@ public class LongMaxAggregator extends MeasureAggregator<Long> { @Override public void aggregate(Long value) { - if (value != null) { - if (max == null) - max = Long.MIN_VALUE; - - max = Math.max(max, value); - } + if (max == null) + max = value; + else if (max < value) + max = value; } @Override public Long aggregate(Long value1, Long value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Math.max(value1, value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMinAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMinAggregator.java index 0a66d3c..9185142 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMinAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongMinAggregator.java @@ -34,21 +34,14 @@ public class LongMinAggregator extends MeasureAggregator<Long> { @Override public void aggregate(Long value) { - if (value != null) { - if (min == null) - min = Long.MAX_VALUE; - - min = Math.min(value, min); - } + if (min == null) + min = value; + else if (min > value) + min = value; } @Override public Long aggregate(Long value1, Long value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Math.min(value1, value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongSumAggregator.java b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongSumAggregator.java index 9fd8e6e..1f9c0d7 100644 --- a/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongSumAggregator.java +++ b/core-metadata/src/main/java/org/apache/kylin/measure/basic/LongSumAggregator.java @@ -25,30 +25,20 @@ import org.apache.kylin.measure.MeasureAggregator; @SuppressWarnings("serial") public class LongSumAggregator extends MeasureAggregator<Long> { - Long sum = null; + Long sum = new Long(0L); @Override public void reset() { - sum = null; + sum = new Long(0L); } @Override public void aggregate(Long value) { - if (value != null) { - if (sum == null) - sum = 0L; - - sum += value; - } + sum += value; } @Override public Long aggregate(Long value1, Long value2) { - if (value1 == null) - return value2; - if (value2 == null) - return value1; - return Long.valueOf(value1 + value2); } diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/BigDecimalSerializer.java b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/BigDecimalSerializer.java index 8d2a454..967c00d 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/BigDecimalSerializer.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/BigDecimalSerializer.java @@ -47,7 +47,8 @@ public class BigDecimalSerializer extends DataTypeSerializer<BigDecimal> { @Override public void serialize(BigDecimal value, ByteBuffer out) { if (value == null) { - BytesUtil.writeVLongObject(null, out); + BytesUtil.writeVInt(0, out); + BytesUtil.writeVInt(-1, out); return; } @@ -62,25 +63,24 @@ public class BigDecimalSerializer extends DataTypeSerializer<BigDecimal> { throw new IllegalArgumentException("'" + value + "' exceeds the expected length for type " + type); } - BytesUtil.writeVLong(value.scale(), out); + BytesUtil.writeVInt(value.scale(), out); BytesUtil.writeVInt(bytes.length, out); out.put(bytes); } @Override public BigDecimal deserialize(ByteBuffer in) { - Long scale = BytesUtil.readVLongObject(in); - if (scale == null) - return null; + int scale = BytesUtil.readVInt(in); + int n = BytesUtil.readVInt(in); - if ((scale > Integer.MAX_VALUE) || (scale < Integer.MIN_VALUE)) { - throw new IllegalArgumentException("value too long to fit in integer"); + if (n < 0) { + return null; } - int n = BytesUtil.readVInt(in); + byte[] bytes = new byte[n]; in.get(bytes); - return new BigDecimal(new BigInteger(bytes), scale.intValue()); + return new BigDecimal(new BigInteger(bytes), scale); } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DoubleSerializer.java b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DoubleSerializer.java index 05cd77d..d3677bf 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DoubleSerializer.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/DoubleSerializer.java @@ -30,23 +30,12 @@ public class DoubleSerializer extends DataTypeSerializer<Double> { @Override public void serialize(Double value, ByteBuffer out) { - // use Double.NaN binary represent NULL,for Double.NaN is replaced by NULL in Hive - if (value == null) { - out.putDouble(Double.NaN); - return; - } - out.putDouble(value); } @Override public Double deserialize(ByteBuffer in) { - Double value = in.getDouble(); - if (Double.compare(Double.NaN, value) == 0) { - return null; - } - - return value; + return in.getDouble(); } @Override diff --git a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/LongSerializer.java b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/LongSerializer.java index 46cb0c8..9f72a82 100644 --- a/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/LongSerializer.java +++ b/core-metadata/src/main/java/org/apache/kylin/metadata/datatype/LongSerializer.java @@ -32,12 +32,12 @@ public class LongSerializer extends DataTypeSerializer<Long> { @Override public void serialize(Long value, ByteBuffer out) { - BytesUtil.writeVLongObject(value, out); + BytesUtil.writeVLong(value, out); } @Override public Long deserialize(ByteBuffer in) { - return BytesUtil.readVLongObject(in); + return BytesUtil.readVLong(in); } @Override diff --git a/core-metadata/src/test/java/org/apache/kylin/measure/basic/BasicAggregatorTest.java b/core-metadata/src/test/java/org/apache/kylin/measure/basic/BasicAggregatorTest.java deleted file mode 100644 index 8673d25..0000000 --- a/core-metadata/src/test/java/org/apache/kylin/measure/basic/BasicAggregatorTest.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * 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.basic; - -import java.math.BigDecimal; - -import org.apache.kylin.measure.MeasureAggregator; -import org.junit.Assert; -import org.junit.Test; - -public class BasicAggregatorTest { - - @Test - public void testSumNull() throws Exception { - // Sum NULL - testNullAggregator(LongSumAggregator.class); - testNullAggregator(DoubleSumAggregator.class); - testNullAggregator(BigDecimalSumAggregator.class); - - // Max NULL - testNullAggregator(LongMaxAggregator.class); - testNullAggregator(DoubleMaxAggregator.class); - testNullAggregator(BigDecimalMaxAggregator.class); - - // Min NULL - testNullAggregator(LongMinAggregator.class); - testNullAggregator(DoubleMinAggregator.class); - testNullAggregator(BigDecimalMinAggregator.class); - } - - @Test - public void testSumNormal() throws Exception { - // sum long - LongSumAggregator sumAggregator = new LongSumAggregator(); - testNormalAggregator(sumAggregator, 0L, 1234L); - testNormalAggregator(sumAggregator, 1234L, 1234L); - testNormalAggregator(sumAggregator, -1234L, 2345L); - testNormalAggregator(sumAggregator, -1234L, -2345L); - testNormalAggregator(sumAggregator, Long.MAX_VALUE - 1, 1L); - testNormalAggregator(sumAggregator, Long.MIN_VALUE + 1, Long.MAX_VALUE); - // sum double - DoubleSumAggregator doubleSumAggregator = new DoubleSumAggregator(); - testNormalAggregator(doubleSumAggregator, 0.0d, 1234.6d); - testNormalAggregator(doubleSumAggregator, -1234.5678d, 1234.65d); - testNormalAggregator(doubleSumAggregator, -1234.5678d, -1234.65d); - testNormalAggregator(doubleSumAggregator, Double.MAX_VALUE - 0.34d, 0.34d); - testNormalAggregator(doubleSumAggregator, Double.MIN_VALUE, Double.MIN_VALUE); - testNormalAggregator(doubleSumAggregator, -Double.MAX_VALUE, -Double.MIN_VALUE); - // sum big-decimal - BigDecimalSumAggregator bigDecimalSumAggregator = new BigDecimalSumAggregator(); - testNormalAggregator(bigDecimalSumAggregator, new BigDecimal(0), new BigDecimal(0)); - testNormalAggregator(bigDecimalSumAggregator, new BigDecimal(12345678.098765432), - new BigDecimal(123456789.09876543211)); - testNormalAggregator(bigDecimalSumAggregator, new BigDecimal(-1222345678.098765432), - new BigDecimal(-456123456789.09876543211)); - testNormalAggregator(bigDecimalSumAggregator, new BigDecimal(-456712345678.098765432), - new BigDecimal(123456789.09876543211)); - - // max long - LongMaxAggregator maxLongAggregator = new LongMaxAggregator(); - testNormalAggregator(maxLongAggregator, 0L, 1234L); - testNormalAggregator(maxLongAggregator, 1234L, 1234L); - testNormalAggregator(maxLongAggregator, -1234L, 2345L); - testNormalAggregator(maxLongAggregator, -1234L, -2345L); - testNormalAggregator(maxLongAggregator, Long.MAX_VALUE - 1, 1L); - testNormalAggregator(maxLongAggregator, Long.MIN_VALUE + 1, Long.MAX_VALUE); - // max double - DoubleMaxAggregator doubleMaxAggregator = new DoubleMaxAggregator(); - testNormalAggregator(doubleMaxAggregator, 0.0d, 1234.6d); - testNormalAggregator(doubleMaxAggregator, -1234.5678d, 1234.65d); - testNormalAggregator(doubleMaxAggregator, -1234.5678d, -1234.65d); - testNormalAggregator(doubleMaxAggregator, Double.MAX_VALUE - 0.34d, 0.34d); - testNormalAggregator(doubleMaxAggregator, Double.MIN_VALUE, Double.MIN_VALUE); - testNormalAggregator(doubleMaxAggregator, -Double.MAX_VALUE, -Double.MIN_VALUE); - // max big-decimal - BigDecimalMaxAggregator bigDecimalMaxAggregator = new BigDecimalMaxAggregator(); - testNormalAggregator(bigDecimalMaxAggregator, new BigDecimal(0), new BigDecimal(0)); - testNormalAggregator(bigDecimalMaxAggregator, new BigDecimal(12345678.098765432), - new BigDecimal(123456789.09876543211)); - testNormalAggregator(bigDecimalMaxAggregator, new BigDecimal(-1222345678.098765432), - new BigDecimal(-456123456789.09876543211)); - testNormalAggregator(bigDecimalMaxAggregator, new BigDecimal(-456712345678.098765432), - new BigDecimal(123456789.09876543211)); - - // min long - LongMinAggregator longMinAggregator = new LongMinAggregator(); - testNormalAggregator(longMinAggregator, 0L, 1234L); - testNormalAggregator(longMinAggregator, 1234L, 1234L); - testNormalAggregator(longMinAggregator, -1234L, 2345L); - testNormalAggregator(longMinAggregator, -1234L, -2345L); - testNormalAggregator(longMinAggregator, Long.MAX_VALUE - 1, 1L); - testNormalAggregator(longMinAggregator, Long.MIN_VALUE + 1, Long.MAX_VALUE); - // min double - DoubleMinAggregator doubleMinAggregator = new DoubleMinAggregator(); - testNormalAggregator(doubleMinAggregator, 0.0d, 1234.6d); - testNormalAggregator(doubleMinAggregator, -1234.5678d, 1234.65d); - testNormalAggregator(doubleMinAggregator, -1234.5678d, -1234.65d); - testNormalAggregator(doubleMinAggregator, Double.MAX_VALUE - 0.34d, 0.34d); - testNormalAggregator(doubleMinAggregator, Double.MIN_VALUE, Double.MIN_VALUE); - testNormalAggregator(doubleMinAggregator, -Double.MAX_VALUE, -Double.MIN_VALUE); - // min big-decimal - BigDecimalMinAggregator bigDecimalMinAggregator = new BigDecimalMinAggregator(); - testNormalAggregator(bigDecimalMinAggregator, new BigDecimal(0), new BigDecimal(0)); - testNormalAggregator(bigDecimalMinAggregator, new BigDecimal(12345678.098765432), - new BigDecimal(123456789.09876543211)); - testNormalAggregator(bigDecimalMinAggregator, new BigDecimal(-1222345678.098765432), - new BigDecimal(-456123456789.09876543211)); - testNormalAggregator(bigDecimalMinAggregator, new BigDecimal(-456712345678.098765432), - new BigDecimal(123456789.09876543211)); - } - - private void testNullAggregator(Class<? extends MeasureAggregator> clazz) throws Exception { - MeasureAggregator aggregator = clazz.newInstance(); - aggregator.aggregate(null); - Assert.assertEquals(null, aggregator.getState()); - Assert.assertEquals(null, aggregator.aggregate(null, null)); - - Number value = null; - if (aggregator.getState() instanceof Long) { - value = 1234L; - } else if (aggregator.getState() instanceof Double) { - value = 1234.456; - } else if (aggregator.getState() instanceof BigDecimal) { - value = new BigDecimal(12340.56789); - } - aggregator.aggregate(value); - Assert.assertEquals(value, aggregator.getState()); - } - - private <V> void testNormalAggregator(MeasureAggregator<V> aggregator, V value1, V value2) { - aggregator.reset(); - V res = aggregator.aggregate(value1, value2); - if (aggregator.getClass().getName().contains("Max")) { - // max - if (value1 instanceof Long) - Assert.assertEquals(Math.max((Long) value1, (Long) value2), res); - else if (value1 instanceof Double) - Assert.assertEquals(Math.max((Double) value1, (Double) value2), (Double) res, 0.000001); - else - Assert.assertEquals(((BigDecimal) value1).max((BigDecimal) value2), res); - - } else if (aggregator.getClass().getName().contains("Min")) { - // min - if (value1 instanceof Long) - Assert.assertEquals(Math.min((Long) value1, (Long) value2), res); - else if (value1 instanceof Double) - Assert.assertEquals(Math.min((Double) value1, (Double) value2), (Double) res, 0.0000001); - else - Assert.assertEquals(((BigDecimal) value1).min((BigDecimal) value2), res); - - } else { - // sum - if (value1 instanceof Long) - Assert.assertEquals(((Long) value1) + ((Long) value2), res); - else if (value1 instanceof Double) - Assert.assertEquals(((Double) value1) + ((Double) value2), (Double) res, 0.000001); - else - Assert.assertEquals(((BigDecimal) value1).add((BigDecimal) value2), res); - } - } - -} diff --git a/core-metadata/src/test/java/org/apache/kylin/metadata/datatype/SerializerTest.java b/core-metadata/src/test/java/org/apache/kylin/metadata/datatype/SerializerTest.java deleted file mode 100644 index 2ac2383..0000000 --- a/core-metadata/src/test/java/org/apache/kylin/metadata/datatype/SerializerTest.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * 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.datatype; - -import static org.junit.Assert.assertEquals; - -import java.math.BigDecimal; -import java.nio.ByteBuffer; - -import org.apache.kylin.common.util.LocalFileMetadataTestCase; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -/** - */ -public class SerializerTest extends LocalFileMetadataTestCase { - - private static BigDecimalSerializer bigDecimalSerializer; - private static LongSerializer longSerializer; - private static DoubleSerializer doubleSerializer; - - private ByteBuffer buffer; - - @AfterClass - public static void after() throws Exception { - cleanAfterClass(); - } - - @BeforeClass - public static void beforeClass() { - staticCreateTestMetadata(); - bigDecimalSerializer = new BigDecimalSerializer(DataType.getType("decimal")); - longSerializer = new LongSerializer(DataType.getType("long")); - doubleSerializer = new DoubleSerializer(DataType.getType("double")); - } - - @Before - public void setup() { - buffer = ByteBuffer.allocate(256); - } - - @After - public void clean() { - buffer.clear(); - } - - @Test - public void testScaleOutOfRange() { - BigDecimal input = new BigDecimal("1234.1234567890"); - buffer.mark(); - bigDecimalSerializer.serialize(input, buffer); - buffer.reset(); - BigDecimal output = bigDecimalSerializer.deserialize(buffer); - assertEquals(input.setScale(bigDecimalSerializer.type.getScale(), BigDecimal.ROUND_HALF_EVEN), output); - } - - @Test(expected = IllegalArgumentException.class) - public void testOutOfPrecision() { - BigDecimal input = new BigDecimal("66855344214907231736.4924"); - bigDecimalSerializer.serialize(input, buffer); - } - - @Test - public void testNull() { - //BigDecimal NULL - buffer.mark(); - bigDecimalSerializer.serialize(null, buffer); - buffer.reset(); - assertEquals(null, bigDecimalSerializer.deserialize(buffer)); - - //Long NULL - buffer.mark(); - longSerializer.serialize(null, buffer); - buffer.reset(); - assertEquals(null, longSerializer.deserialize(buffer)); - - //Double NULL - buffer.mark(); - doubleSerializer.serialize(null, buffer); - buffer.reset(); - assertEquals(null, doubleSerializer.deserialize(buffer)); - } - - @Test - public void testNormal() { - // Long - testNumberSerialization(longSerializer, 1024L); - testNumberSerialization(longSerializer, -1024L); - testNumberSerialization(longSerializer, 0L); - testNumberSerialization(longSerializer, Long.MAX_VALUE); - testNumberSerialization(longSerializer, Long.MIN_VALUE); - - //Double - testNumberSerialization(doubleSerializer, 1234.56d); - testNumberSerialization(doubleSerializer, -1234.56d); - testNumberSerialization(doubleSerializer, 0.0); - testNumberSerialization(doubleSerializer, Double.MAX_VALUE); - testNumberSerialization(doubleSerializer, -Double.MAX_VALUE); - testNumberSerialization(doubleSerializer, Double.MIN_VALUE); - testNumberSerialization(doubleSerializer, -Double.MAX_VALUE); - - //Bigdecimal - testNumberSerialization(bigDecimalSerializer, new BigDecimal(0)); - testNumberSerialization(bigDecimalSerializer, new BigDecimal(123456789.0987654321 * 123456789.0987654321)); - testNumberSerialization(bigDecimalSerializer, new BigDecimal(-123456789.0987654321 * 123456789.0987654321)); - } - - private <T> void testNumberSerialization(DataTypeSerializer<T> serializer, T number) { - buffer.mark(); - serializer.serialize(number, buffer); - buffer.reset(); - if (number instanceof Double) - assertEquals(((Double) number), (Double) serializer.deserialize(buffer), 0.0000001); - else - assertEquals(number, serializer.deserialize(buffer)); - } -} diff --git a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java index aa34a0f..f90a644 100644 --- a/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java +++ b/engine-mr/src/test/java/org/apache/kylin/engine/mr/steps/CubeReducerTest.java @@ -159,11 +159,9 @@ public class CubeReducerTest extends LocalFileMetadataTestCase { assertTrue(result.contains(p3)); } - private Text newValueText(BufferedMeasureCodec codec, String sum, String min, String max, int count, - int item_count) { - Object[] values = new Object[] { sum == null ? null : new BigDecimal(sum), - min == null ? null : new BigDecimal(min), max == null ? null : new BigDecimal(max), new Long(count), - new Long(item_count) }; + private Text newValueText(BufferedMeasureCodec codec, String sum, String min, String max, int count, int item_count) { + Object[] values = new Object[] { sum == null ? null : new BigDecimal(sum), // + new BigDecimal(min), new BigDecimal(max), new Long(count), new Long(item_count) }; ByteBuffer buf = codec.encode(values);