Skip to content

Commit 44e138b

Browse files
committed
feat: Add RemoveInsensitiveAggregateDistinct optimizer rule
1 parent 1e76701 commit 44e138b

File tree

62 files changed

+404
-54
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+404
-54
lines changed

presto-built-in-worker-function-tools/src/main/java/com/facebook/presto/builtin/tools/WorkerFunctionUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static synchronized SqlInvokedFunction createSqlInvokedFunction(String fu
6262
jsonBasedUdfFunctionMetaData.getAggregateMetadata()
6363
.map(metadata -> new AggregationFunctionMetadata(
6464
convertApplicableTypeToVariable(metadata.getIntermediateType()),
65-
metadata.isOrderSensitive()));
65+
metadata.isOrderSensitive(), metadata.isDistinctSensitive()));
6666

6767
return new SqlInvokedFunction(
6868
qualifiedFunctionName,

presto-function-namespace-managers-common/src/main/java/com/facebook/presto/functionNamespace/AbstractSqlInvokedFunctionNamespaceManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,7 @@ protected AggregationFunctionImplementation sqlInvokedFunctionToAggregationImple
367367
typeManager.getType(aggregationMetadata.getIntermediateType()),
368368
typeManager.getType(function.getSignature().getReturnType()),
369369
aggregationMetadata.isOrderSensitive(),
370+
aggregationMetadata.isDistinctSensitive(),
370371
parameters);
371372
default:
372373
throw new IllegalStateException(format("Unknown function implementation type: %s", implementationType));

presto-hive-function-namespace/src/main/java/com/facebook/presto/hive/functions/aggregation/HiveAggregationFunctionDescription.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,21 +29,24 @@ public class HiveAggregationFunctionDescription
2929
private final Type finalType;
3030
private final boolean decomposable;
3131
private final boolean orderSensitive;
32+
private final boolean distinctSensitive;
3233

3334
public HiveAggregationFunctionDescription(
3435
QualifiedObjectName name,
3536
List<Type> parameterTypes,
3637
List<Type> intermediateTypes,
3738
Type finalType,
3839
boolean decomposable,
39-
boolean orderSensitive)
40+
boolean orderSensitive,
41+
boolean distinctSensitive)
4042
{
4143
this.name = requireNonNull(name);
4244
this.parameterTypes = requireNonNull(parameterTypes);
4345
this.intermediateTypes = requireNonNull(intermediateTypes);
4446
this.finalType = requireNonNull(finalType);
4547
this.decomposable = decomposable;
4648
this.orderSensitive = orderSensitive;
49+
this.distinctSensitive = distinctSensitive;
4750
}
4851

4952
public String getName()
@@ -75,4 +78,9 @@ public boolean isOrderSensitive()
7578
{
7679
return orderSensitive;
7780
}
81+
82+
public boolean isDistinctSensitive()
83+
{
84+
return distinctSensitive;
85+
}
7886
}

presto-hive-function-namespace/src/main/java/com/facebook/presto/hive/functions/aggregation/HiveAggregationFunctionImplementation.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@ public boolean isOrderSensitive()
107107
return aggregationFunctionDescription.isOrderSensitive();
108108
}
109109

110+
@Override
111+
public boolean isDistinctSensitive()
112+
{
113+
return aggregationFunctionDescription.isDistinctSensitive();
114+
}
115+
110116
public AggregationMetadata getAggregationMetadata()
111117
{
112118
return aggregationMetadata;

presto-hive-function-namespace/src/main/java/com/facebook/presto/hive/functions/aggregation/HiveAggregationFunctionImplementationFactory.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ public HiveAggregationFunctionImplementation create()
7676
ImmutableList.of(intermediateType),
7777
outputType,
7878
true,
79-
false);
79+
false,
80+
true);
8081

8182
HiveAccumulatorInvoker invocationContext = new HiveAccumulatorInvoker(
8283
partialEvaluatorSupplier,

presto-main-base/src/main/java/com/facebook/presto/metadata/BuiltInSpecialFunctionNamespaceManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ private AggregationFunctionImplementation sqlInvokedFunctionToAggregationImpleme
253253
typeManager.getType(aggregationMetadata.getIntermediateType()),
254254
typeManager.getType(function.getSignature().getReturnType()),
255255
aggregationMetadata.isOrderSensitive(),
256+
aggregationMetadata.isDistinctSensitive(),
256257
parameters);
257258
}
258259

presto-main-base/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxAggregationFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ else if (type.getJavaType() == boolean.class) {
163163
metadata,
164164
classLoader);
165165
return new BuiltInAggregationFunctionImplementation(getSignature().getNameSuffix(), inputTypes, ImmutableList.of(intermediateType),
166-
type, true, false, metadata, accumulatorClass, groupedAccumulatorClass);
166+
type, true, false, false, metadata, accumulatorClass, groupedAccumulatorClass);
167167
}
168168

169169
protected AccumulatorStateSerializer<?> getStateSerializer(Class<? extends AccumulatorState> stateInterface, DynamicClassLoader classLoader)

presto-main-base/src/main/java/com/facebook/presto/operator/aggregation/AbstractMinMaxNAggregationFunction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ protected BuiltInAggregationFunctionImplementation generateAggregation(Type type
117117
metadata,
118118
classLoader);
119119
return new BuiltInAggregationFunctionImplementation(getSignature().getNameSuffix(), inputTypes, ImmutableList.of(intermediateType), outputType,
120-
true, false, metadata, accumulatorClass, groupedAccumulatorClass);
120+
true, false, true, metadata, accumulatorClass, groupedAccumulatorClass);
121121
}
122122

123123
public static void input(BlockComparator comparator, Type type, MinMaxNState state, Block block, long n, int blockIndex)

presto-main-base/src/main/java/com/facebook/presto/operator/aggregation/AggregationFromAnnotationsParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ private static AggregationHeader parseHeader(AnnotatedElement aggregationDefinit
142142
parseDescription(aggregationDefinition),
143143
aggregationAnnotation.decomposable(),
144144
aggregationAnnotation.isOrderSensitive(),
145+
aggregationAnnotation.isDistinctSensitive(),
145146
aggregationAnnotation.visibility(),
146147
aggregationAnnotation.isCalledOnNullInput());
147148
}
@@ -157,6 +158,7 @@ private static List<AggregationHeader> parseHeaders(AnnotatedElement aggregation
157158
parseDescription(aggregationDefinition, toParse),
158159
aggregationAnnotation.decomposable(),
159160
aggregationAnnotation.isOrderSensitive(),
161+
aggregationAnnotation.isDistinctSensitive(),
160162
aggregationAnnotation.visibility(),
161163
aggregationAnnotation.isCalledOnNullInput()))
162164
.collect(toImmutableList());

presto-main-base/src/main/java/com/facebook/presto/operator/aggregation/AggregationHeader.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,17 @@ public class AggregationHeader
2525
private final Optional<String> description;
2626
private final boolean decomposable;
2727
private final boolean orderSensitive;
28+
private final boolean distinctSensitive;
2829
private final SqlFunctionVisibility visibility;
2930
private final boolean isCalledOnNullInput;
3031

31-
public AggregationHeader(String name, Optional<String> description, boolean decomposable, boolean orderSensitive, SqlFunctionVisibility visibility, boolean isCalledOnNullInput)
32+
public AggregationHeader(String name, Optional<String> description, boolean decomposable, boolean orderSensitive, boolean distinctSensitive, SqlFunctionVisibility visibility, boolean isCalledOnNullInput)
3233
{
3334
this.name = requireNonNull(name, "name cannot be null");
3435
this.description = requireNonNull(description, "description cannot be null");
3536
this.decomposable = decomposable;
3637
this.orderSensitive = orderSensitive;
38+
this.distinctSensitive = distinctSensitive;
3739
this.visibility = visibility;
3840
this.isCalledOnNullInput = isCalledOnNullInput;
3941
}
@@ -58,6 +60,11 @@ public boolean isOrderSensitive()
5860
return orderSensitive;
5961
}
6062

63+
public boolean isDistinctSensitive()
64+
{
65+
return distinctSensitive;
66+
}
67+
6168
public SqlFunctionVisibility getVisibility()
6269
{
6370
return visibility;

0 commit comments

Comments
 (0)