This is an automated email from the ASF dual-hosted git repository. himanshug pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/master by this push: new 9081b5f fix MAX_INTERMEDIATE_SIZE for DoubleMeanHolder (#9568) 9081b5f is described below commit 9081b5f25c3d79e634ccc039a7d53e90cf43926d Author: Stanislav Poryadnyi <37914083+ap0s...@users.noreply.github.com> AuthorDate: Sat Mar 28 08:26:31 2020 +0300 fix MAX_INTERMEDIATE_SIZE for DoubleMeanHolder (#9568) * fix MAX_INTERMEDIATE_SIZE for DoubleMeanHolder * byte[] type handling in deserialize and finalizeComputation for DoubleMeanAggregatorFactory * DoubleMeanAggregatorFactory tests: Max Intermediate Size, Deserialize, finalizeComputation * moved byte[] check to first position Co-authored-by: Stanislav <s.poryad...@abcconsulting.ru> --- .../mean/DoubleMeanAggregatorFactory.java | 8 ++- .../query/aggregation/mean/DoubleMeanHolder.java | 12 ++-- .../mean/DoubleMeanAggregatorFactoryTest.java | 66 ++++++++++++++++++++++ 3 files changed, 78 insertions(+), 8 deletions(-) diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java index 5ed87be..d1da4d3 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactory.java @@ -148,7 +148,9 @@ public class DoubleMeanAggregatorFactory extends AggregatorFactory @Override public Object deserialize(Object object) { - if (object instanceof String) { + if (object instanceof byte[]) { + return DoubleMeanHolder.fromBytes((byte[]) object); + } else if (object instanceof String) { return DoubleMeanHolder.fromBytes(StringUtils.decodeBase64(StringUtils.toUtf8((String) object))); } else if (object instanceof DoubleMeanHolder) { return object; @@ -161,7 +163,9 @@ public class DoubleMeanAggregatorFactory extends AggregatorFactory @Override public Object finalizeComputation(@Nullable Object object) { - if (object instanceof DoubleMeanHolder) { + if (object instanceof byte[]) { + return DoubleMeanHolder.fromBytes((byte[]) object).mean(); + } else if (object instanceof DoubleMeanHolder) { return ((DoubleMeanHolder) object).mean(); } else if (object == null) { return null; diff --git a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanHolder.java b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanHolder.java index f42c993..06aac1a 100644 --- a/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanHolder.java +++ b/processing/src/main/java/org/apache/druid/query/aggregation/mean/DoubleMeanHolder.java @@ -30,7 +30,7 @@ import java.util.Comparator; public class DoubleMeanHolder { - public static final int MAX_INTERMEDIATE_SIZE = Long.SIZE + Double.SIZE; + public static final int MAX_INTERMEDIATE_SIZE = Long.BYTES + Double.BYTES; public static final Comparator<DoubleMeanHolder> COMPARATOR = (o1, o2) -> Doubles.compare(o1.mean(), o2.mean()); private double sum; @@ -62,16 +62,16 @@ public class DoubleMeanHolder public byte[] toBytes() { - ByteBuffer buf = ByteBuffer.allocate(Double.SIZE + Long.SIZE); + ByteBuffer buf = ByteBuffer.allocate(Double.BYTES + Long.BYTES); buf.putDouble(0, sum); - buf.putLong(Double.SIZE, count); + buf.putLong(Double.BYTES, count); return buf.array(); } public static DoubleMeanHolder fromBytes(byte[] data) { ByteBuffer buf = ByteBuffer.wrap(data); - return new DoubleMeanHolder(buf.getDouble(0), buf.getLong(Double.SIZE)); + return new DoubleMeanHolder(buf.getDouble(0), buf.getLong(Double.BYTES)); } public static void init(ByteBuffer buf, int position) @@ -109,12 +109,12 @@ public class DoubleMeanHolder private static void writeCount(ByteBuffer buf, int position, long count) { - buf.putLong(position + Double.SIZE, count); + buf.putLong(position + Double.BYTES, count); } private static long getCount(ByteBuffer buf, int position) { - return buf.getLong(position + Double.SIZE); + return buf.getLong(position + Double.BYTES); } public static class Serializer extends JsonSerializer<DoubleMeanHolder> diff --git a/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactoryTest.java b/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactoryTest.java new file mode 100644 index 0000000..0e49363 --- /dev/null +++ b/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactoryTest.java @@ -0,0 +1,66 @@ +/* + * 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.druid.query.aggregation.mean; + +import org.apache.commons.lang3.builder.EqualsBuilder; +import org.junit.Assert; +import org.junit.Test; + +public class DoubleMeanAggregatorFactoryTest +{ + @Test + public void testMaxIntermediateSize() + { + DoubleMeanAggregatorFactory factory = new DoubleMeanAggregatorFactory("name", "fieldName"); + Assert.assertEquals(Double.BYTES + Long.BYTES, factory.getMaxIntermediateSize()); + Assert.assertEquals(Double.BYTES + Long.BYTES, factory.getMaxIntermediateSizeWithNulls()); + } + + @Test + public void testDeserialyze() + { + DoubleMeanAggregatorFactory factory = new DoubleMeanAggregatorFactory("name", "fieldName"); + DoubleMeanHolder expectedHolder = new DoubleMeanHolder(50.0, 10L); + + DoubleMeanHolder actualHolder = (DoubleMeanHolder) factory.deserialize(expectedHolder); + Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedHolder, actualHolder)); + + actualHolder = (DoubleMeanHolder) factory.deserialize(expectedHolder.toBytes()); + Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedHolder, actualHolder)); + } + + @Test + public void testFinalizeComputation() + { + DoubleMeanAggregatorFactory factory = new DoubleMeanAggregatorFactory("name", "fieldName"); + double sum = 50.0; + long count = 10L; + double expecterMean = sum / count; + DoubleMeanHolder holder = new DoubleMeanHolder(sum, count); + + double actualMean = (Double) factory.finalizeComputation(holder); + Assert.assertEquals("", expecterMean, actualMean, 1e-6); + + actualMean = (Double) factory.finalizeComputation(holder.toBytes()); + Assert.assertEquals("", expecterMean, actualMean, 1e-6); + + Assert.assertNull(factory.finalizeComputation(null)); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org For additional commands, e-mail: commits-h...@druid.apache.org