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.insert.values;
19
20 import com.google.common.base.Preconditions;
21 import lombok.Getter;
22 import lombok.ToString;
23 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.ExpressionSegment;
24 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.LiteralExpressionSegment;
25 import org.apache.shardingsphere.sql.parser.sql.common.segment.dml.expr.simple.ParameterMarkerExpressionSegment;
26 import org.apache.shardingsphere.sql.parser.sql.common.util.ExpressionExtractUtils;
27
28 import java.util.ArrayList;
29 import java.util.Collection;
30 import java.util.Collections;
31 import java.util.List;
32 import java.util.Optional;
33
34
35
36
37 @Getter
38 @ToString
39 public final class InsertValueContext {
40
41 private final int parameterCount;
42
43 private final List<ExpressionSegment> valueExpressions;
44
45 private final List<ParameterMarkerExpressionSegment> parameterMarkerExpressions;
46
47 private final List<Object> parameters;
48
49 public InsertValueContext(final Collection<ExpressionSegment> assignments, final List<Object> params, final int parametersOffset) {
50 valueExpressions = getValueExpressions(assignments);
51 parameterMarkerExpressions = ExpressionExtractUtils.getParameterMarkerExpressions(assignments);
52 parameterCount = parameterMarkerExpressions.size();
53 parameters = getParameters(params, parametersOffset);
54 }
55
56 private List<ExpressionSegment> getValueExpressions(final Collection<ExpressionSegment> assignments) {
57 List<ExpressionSegment> result = new ArrayList<>(assignments.size());
58 result.addAll(assignments);
59 return result;
60 }
61
62 private List<Object> getParameters(final List<Object> params, final int paramsOffset) {
63 if (params.isEmpty() || 0 == parameterCount) {
64 return Collections.emptyList();
65 }
66 List<Object> result = new ArrayList<>(parameterCount);
67 result.addAll(params.subList(paramsOffset, paramsOffset + parameterCount));
68 return result;
69 }
70
71
72
73
74
75
76
77 public Optional<Object> getLiteralValue(final int index) {
78 ExpressionSegment valueExpression = valueExpressions.get(index);
79 if (valueExpression instanceof ParameterMarkerExpressionSegment) {
80 return Optional.ofNullable(parameters.get(getParameterIndex((ParameterMarkerExpressionSegment) valueExpression)));
81 }
82 if (valueExpression instanceof LiteralExpressionSegment) {
83 return Optional.ofNullable(((LiteralExpressionSegment) valueExpression).getLiterals());
84 }
85 return Optional.empty();
86 }
87
88 private int getParameterIndex(final ParameterMarkerExpressionSegment paramMarkerExpression) {
89 int result = parameterMarkerExpressions.indexOf(paramMarkerExpression);
90 Preconditions.checkArgument(result >= 0, "Can not get parameter index.");
91 return result;
92 }
93
94
95
96
97
98
99
100 public int getParameterIndex(final int index) {
101 ExpressionSegment valueExpression = valueExpressions.get(index);
102 return valueExpression instanceof ParameterMarkerExpressionSegment ? getParameterIndex((ParameterMarkerExpressionSegment) valueExpression) : -1;
103 }
104 }