You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@druid.apache.org by cw...@apache.org on 2020/03/31 06:43:22 UTC
[druid] branch 0.18.0 updated: [Backport]fix MAX_INTERMEDIATE_SIZE
for DoubleMeanHolder (#9568) (#9577)
This is an automated email from the ASF dual-hosted git repository.
cwylie pushed a commit to branch 0.18.0
in repository https://gitbox.apache.org/repos/asf/druid.git
The following commit(s) were added to refs/heads/0.18.0 by this push:
new b5a3f9b [Backport]fix MAX_INTERMEDIATE_SIZE for DoubleMeanHolder (#9568) (#9577)
b5a3f9b is described below
commit b5a3f9bad56113ac85eee0f8414757b8b74ce90d
Author: Himanshu <g....@gmail.com>
AuthorDate: Mon Mar 30 23:43:07 2020 -0700
[Backport]fix MAX_INTERMEDIATE_SIZE for DoubleMeanHolder (#9568) (#9577)
* 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....@abcconsulting.ru>
* remove commons-lang3 usage from DoubleMeanAggregatorFactoryTest
Co-authored-by: Stanislav Poryadnyi <37...@users.noreply.github.com>
Co-authored-by: Stanislav <S....@abcconsulting.ru>
---
.../mean/DoubleMeanAggregatorFactory.java | 8 ++-
.../query/aggregation/mean/DoubleMeanHolder.java | 33 +++++++++--
.../mean/DoubleMeanAggregatorFactoryTest.java | 65 ++++++++++++++++++++++
3 files changed, 98 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..f04150f 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
@@ -27,10 +27,11 @@ import com.google.common.primitives.Doubles;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Comparator;
+import java.util.Objects;
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 +63,36 @@ 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();
}
+ @Override
+ public boolean equals(Object o)
+ {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ DoubleMeanHolder that = (DoubleMeanHolder) o;
+ return Double.compare(that.sum, sum) == 0 &&
+ count == that.count;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return Objects.hash(sum, count);
+ }
+
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 +130,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..01dabaa
--- /dev/null
+++ b/processing/src/test/java/org/apache/druid/query/aggregation/mean/DoubleMeanAggregatorFactoryTest.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.druid.query.aggregation.mean;
+
+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.assertEquals(expectedHolder, actualHolder);
+
+ actualHolder = (DoubleMeanHolder) factory.deserialize(expectedHolder.toBytes());
+ Assert.assertEquals(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-unsubscribe@druid.apache.org
For additional commands, e-mail: commits-help@druid.apache.org