1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.sql.parser.sql.common.segment.dml.item;
19
20 import lombok.Getter;
21 import lombok.Setter;
22 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
23 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.complex.ComplexExpressionSegment;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasAvailable;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.generic.AliasSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.util.SQLUtils;
27 import org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
28
29 import java.util.Optional;
30
31
32
33
34 @Getter
35 public final class ExpressionProjectionSegment implements ProjectionSegment, ComplexExpressionSegment, AliasAvailable {
36
37 private final int startIndex;
38
39 private final int stopIndex;
40
41 private final String text;
42
43 private final ExpressionSegment expr;
44
45 @Setter
46 private AliasSegment alias;
47
48 public ExpressionProjectionSegment(final int startIndex, final int stopIndex, final String text) {
49 this.startIndex = startIndex;
50 this.stopIndex = stopIndex;
51 this.text = SQLUtils.getExpressionWithoutOutsideParentheses(text);
52 expr = null;
53 }
54
55 public ExpressionProjectionSegment(final int startIndex, final int stopIndex, final String text, final ExpressionSegment expr) {
56 this.startIndex = startIndex;
57 this.stopIndex = stopIndex;
58 this.text = SQLUtils.getExpressionWithoutOutsideParentheses(text);
59 this.expr = expr;
60 }
61
62 @Override
63 public String getColumnLabel() {
64 return getAliasName().orElse(text);
65 }
66
67 @Override
68 public Optional<String> getAliasName() {
69 return null == alias ? Optional.empty() : Optional.ofNullable(alias.getIdentifier().getValue());
70 }
71
72 @Override
73 public Optional<IdentifierValue> getAlias() {
74 return Optional.ofNullable(alias).map(AliasSegment::getIdentifier);
75 }
76
77
78
79
80
81
82 public AliasSegment getAliasSegment() {
83 return alias;
84 }
85
86 @Override
87 public int getStartIndex() {
88 return null != alias && alias.getStartIndex() < startIndex ? alias.getStartIndex() : startIndex;
89 }
90
91 @Override
92 public int getStopIndex() {
93 return null != alias && alias.getStopIndex() > stopIndex ? alias.getStopIndex() : stopIndex;
94 }
95 }