nishantmonu51 commented on a change in pull request #5958: Part 2 of changes 
for SQL Compatible Null Handling
URL: https://github.com/apache/incubator-druid/pull/5958#discussion_r205571809
 
 

 ##########
 File path: 
processing/src/main/java/io/druid/query/aggregation/NullableAggregator.java
 ##########
 @@ -0,0 +1,107 @@
+/*
+ * Licensed to Metamarkets Group Inc. (Metamarkets) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. Metamarkets 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 io.druid.query.aggregation;
+
+import io.druid.guice.annotations.PublicApi;
+import io.druid.segment.BaseNullableColumnValueSelector;
+
+import javax.annotation.Nullable;
+
+/**
+ * The result of a NullableAggregator will be null if all the values to be 
aggregated are null values
+ * or no values are aggregated at all. If any of the value is non-null, the 
result would be the aggregated
+ * value of the delegate aggregator. Note that the delegate aggregator is not 
required to perform check for
+ * {@link BaseNullableColumnValueSelector#isNull()} on the selector as only 
non-null values will be passed
+ * to the delegate aggregator. This class is only used when SQL compatible 
null handling is enabled.
+ */
+@PublicApi
+public final class NullableAggregator implements Aggregator
+{
+  private final Aggregator delegate;
+  private final BaseNullableColumnValueSelector selector;
+  private boolean isNullResult = true;
+
+  public NullableAggregator(Aggregator delegate, 
BaseNullableColumnValueSelector selector)
+  {
+    this.delegate = delegate;
+    this.selector = selector;
+  }
+
+  @Override
+  public void aggregate()
+  {
+    boolean isNotNull = !selector.isNull();
+    if (isNotNull) {
+      if (isNullResult) {
+        isNullResult = false;
+      }
+      delegate.aggregate();
+    }
+  }
+
+  @Override
+  @Nullable
+  public Object get()
+  {
+    if (isNullResult) {
+      return null;
+    }
+    return delegate.get();
+  }
+
+  @Override
+  public float getFloat()
+  {
+    if (isNullResult) {
+      throw new IllegalStateException("Cannot return float for Null Value");
+    }
+    return delegate.getFloat();
+  }
+
+  @Override
+  public long getLong()
+  {
+    if (isNullResult) {
+      throw new IllegalStateException("Cannot return long for Null Value");
+    }
+    return delegate.getLong();
+  }
+
+  @Override
+  public double getDouble()
+  {
+    if (isNullResult) {
+      throw new IllegalStateException("Cannot return double for Null Value");
+    }
+    return delegate.getDouble();
+  }
+
+  @Override
+  public boolean isNull()
+  {
+    return isNullResult || delegate.isNull();
 
 Review comment:
   there can be custom aggregators that result in null even when input is not 
null. 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@druid.apache.org
For additional commands, e-mail: commits-h...@druid.apache.org

Reply via email to