jihoonson 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_r204931100
########## 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() Review comment: Looks like this is the reason: > The default implementation always return false to enable smooth backward compatibility, re-implement if your aggregator is nullable. I would say it would be fine to make a breaking change for an `ExtensionPoint` in our major releases, but it's up to you. Do you have a rough plan to change this in the future? ---------------------------------------------------------------- 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: dev-unsubscr...@druid.apache.org For additional commands, e-mail: dev-h...@druid.apache.org