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