1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.infra.binder.context.segment.select.projection.impl;
19
20 import lombok.EqualsAndHashCode;
21 import lombok.Getter;
22 import lombok.RequiredArgsConstructor;
23 import lombok.Setter;
24 import lombok.ToString;
25 import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
26 import org.apache.shardingsphere.infra.binder.context.segment.select.projection.DerivedColumn;
27 import org.apache.shardingsphere.infra.binder.context.segment.select.projection.Projection;
28 import org.apache.shardingsphere.infra.binder.context.segment.select.projection.extractor.ProjectionIdentifierExtractEngine;
29 import org.apache.shardingsphere.sql.parser.statement.core.enums.AggregationType;
30 import org.apache.shardingsphere.sql.parser.statement.core.segment.dml.item.AggregationProjectionSegment;
31 import org.apache.shardingsphere.sql.parser.statement.core.value.identifier.IdentifierValue;
32
33 import java.util.ArrayList;
34 import java.util.List;
35 import java.util.Optional;
36
37
38
39
40 @RequiredArgsConstructor
41 @Getter
42 @EqualsAndHashCode
43 @ToString
44 public class AggregationProjection implements Projection {
45
46 private final AggregationType type;
47
48 private final AggregationProjectionSegment aggregationSegment;
49
50 private final IdentifierValue alias;
51
52 private final DatabaseType databaseType;
53
54 private final String separator;
55
56 private final List<AggregationProjection> derivedAggregationProjections = new ArrayList<>(2);
57
58 @Setter
59 private int index = -1;
60
61 public AggregationProjection(final AggregationType type, final AggregationProjectionSegment aggregationSegment, final IdentifierValue alias, final DatabaseType databaseType) {
62 this.type = type;
63 this.aggregationSegment = aggregationSegment;
64 this.alias = alias;
65 this.databaseType = databaseType;
66 separator = null;
67 }
68
69
70
71
72
73
74 public Optional<String> getSeparator() {
75 return Optional.ofNullable(separator);
76 }
77
78 @Override
79 public String getColumnName() {
80 return getColumnLabel();
81 }
82
83 @Override
84 public String getColumnLabel() {
85 ProjectionIdentifierExtractEngine extractEngine = new ProjectionIdentifierExtractEngine(databaseType);
86 return getAlias().isPresent() && !DerivedColumn.isDerivedColumnName(getAlias().get().getValueWithQuoteCharacters())
87 ? extractEngine.getIdentifierValue(getAlias().get())
88 : extractEngine.getColumnNameFromFunction(type.name(), aggregationSegment.getExpression());
89 }
90
91 @Override
92 public String getExpression() {
93 return aggregationSegment.getExpression();
94 }
95
96 @Override
97 public final Optional<IdentifierValue> getAlias() {
98 return Optional.ofNullable(alias);
99 }
100 }