Skip to content

Commit 1b618d3

Browse files
committed
[dingo-common, calcite, exec] Use dingo-expr lib.
1 parent 1a1e81c commit 1b618d3

File tree

445 files changed

+1466
-22096
lines changed

Some content is hidden

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

445 files changed

+1466
-22096
lines changed

config/dingo.dic

+1
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ sql
1313
sqlline
1414
sqls
1515
substr
16+
ucase
1617
unixtime

dingo-calcite/build.gradle

-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ dependencies {
3232
implementation project(':dingo-partition-api')
3333
implementation project(':dingo-codec-api')
3434
compileOnly group: 'org.immutables', name: 'value', version: 'immutables'.v()
35-
implementation project(':dingo-expr:dingo-expr-parser')
3635
implementation project(':dingo-store-api')
3736
implementation project(':dingo-verify')
3837
implementation group: 'org.apache.commons', name: 'commons-lang3', version: 'commons-lang3'.v()

dingo-calcite/src/main/java/io/dingodb/calcite/DingoSqlToRelConverter.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
import io.dingodb.calcite.rel.DingoFunctionScan;
2020
import io.dingodb.calcite.rel.DingoVector;
2121
import io.dingodb.calcite.traits.DingoConvention;
22-
import io.dingodb.calcite.traits.DingoRelStreaming;
23-
import io.dingodb.exec.fun.string.SubstringFun;
2422
import org.apache.calcite.plan.RelOptCluster;
2523
import org.apache.calcite.plan.RelOptTable;
2624
import org.apache.calcite.plan.RelTraitSet;
@@ -79,7 +77,7 @@ class DingoSqlToRelConverter extends SqlToRelConverter {
7977
if (node.getKind() == SqlKind.OTHER_FUNCTION) {
8078
SqlOperator operator = ((SqlCall) node).getOperator();
8179
// Override `substring` function to avoid complicated conversion in Calcite.
82-
if (operator.isName(SubstringFun.NAME, false)) {
80+
if (operator.isName("substring", false)) {
8381
// The same of `this.rexBuilder`.
8482
RexBuilder rb = bb.getRexBuilder();
8583
List<RexNode> operands = ((SqlCall) node).getOperandList().stream()

dingo-calcite/src/main/java/io/dingodb/calcite/DingoTable.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import java.util.Map;
4646
import java.util.stream.Collectors;
4747

48-
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
48+
@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)
4949
public class DingoTable extends AbstractTable implements TranslatableTable {
5050
@Getter
5151
@EqualsAndHashCode.Include

dingo-calcite/src/main/java/io/dingodb/calcite/fun/DingoOperatorTable.java

+39-42
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,31 @@
1919
import com.google.common.collect.HashMultimap;
2020
import com.google.common.collect.Multimap;
2121
import io.dingodb.exec.fun.AutoIncrementFun;
22-
import io.dingodb.exec.fun.DingoFunFactory;
2322
import io.dingodb.exec.fun.mysql.GlobalVariableFun;
2423
import io.dingodb.exec.fun.mysql.VersionFun;
25-
import io.dingodb.exec.fun.number.FormatFun;
26-
import io.dingodb.exec.fun.number.PowFun;
27-
import io.dingodb.exec.fun.string.ConcatFun;
28-
import io.dingodb.exec.fun.string.LTrimFun;
29-
import io.dingodb.exec.fun.string.LeftFun;
30-
import io.dingodb.exec.fun.string.LocateFun;
31-
import io.dingodb.exec.fun.string.MidFun;
32-
import io.dingodb.exec.fun.string.RTrimFun;
33-
import io.dingodb.exec.fun.string.RepeatFun;
34-
import io.dingodb.exec.fun.string.ReverseFun;
35-
import io.dingodb.exec.fun.string.RightFun;
36-
import io.dingodb.exec.fun.time.DateDiffFun;
24+
import io.dingodb.exec.fun.special.ThrowFun;
3725
import io.dingodb.exec.fun.vector.VectorCosineDistanceFun;
38-
import io.dingodb.exec.fun.vector.VectorDistanceFun;
3926
import io.dingodb.exec.fun.vector.VectorIPDistanceFun;
4027
import io.dingodb.exec.fun.vector.VectorImageFun;
4128
import io.dingodb.exec.fun.vector.VectorL2DistanceFun;
4229
import io.dingodb.exec.fun.vector.VectorTextFun;
30+
import io.dingodb.expr.runtime.op.mathematical.PowFunFactory;
31+
import io.dingodb.expr.runtime.op.string.ConcatFunFactory;
32+
import io.dingodb.expr.runtime.op.string.LTrim1FunFactory;
33+
import io.dingodb.expr.runtime.op.string.LeftFunFactory;
34+
import io.dingodb.expr.runtime.op.string.Locate2FunFactory;
35+
import io.dingodb.expr.runtime.op.string.Mid2FunFactory;
36+
import io.dingodb.expr.runtime.op.string.NumberFormatFunFactory;
37+
import io.dingodb.expr.runtime.op.string.RTrim1FunFactory;
38+
import io.dingodb.expr.runtime.op.string.RepeatFunFactory;
39+
import io.dingodb.expr.runtime.op.string.ReverseFunFactory;
40+
import io.dingodb.expr.runtime.op.string.RightFunFactory;
41+
import io.dingodb.expr.runtime.op.time.DateDiffFunFactory;
42+
import io.dingodb.expr.runtime.op.time.DateFormat1FunFactory;
43+
import io.dingodb.expr.runtime.op.time.FromUnixTimeFunFactory;
44+
import io.dingodb.expr.runtime.op.time.TimeFormat1FunFactory;
45+
import io.dingodb.expr.runtime.op.time.TimestampFormat1FunFactory;
46+
import io.dingodb.expr.runtime.op.time.UnixTimestamp1FunFactory;
4347
import lombok.extern.slf4j.Slf4j;
4448
import org.apache.calcite.sql.SqlFunction;
4549
import org.apache.calcite.sql.SqlFunctionCategory;
@@ -95,51 +99,51 @@ private void init() {
9599

96100
// number
97101
registerFunction(
98-
FormatFun.NAME,
102+
NumberFormatFunFactory.NAME,
99103
ReturnTypes.VARCHAR_2000_NULLABLE,
100104
DingoInferTypes.DECIMAL,
101105
OperandTypes.NUMERIC_NUMERIC,
102106
SqlFunctionCategory.STRING
103107
);
104108
registerFunction(
105-
PowFun.NAME,
106-
DingoReturnTypes.DECIMAL_NULLABLE,
109+
PowFunFactory.NAME,
110+
ReturnTypes.DOUBLE,
107111
DingoInferTypes.DOUBLE,
108112
OperandTypes.NUMERIC_NUMERIC,
109113
SqlFunctionCategory.STRING
110114
);
111115

112116
// string
113117
registerFunction(
114-
ConcatFun.NAME,
118+
ConcatFunFactory.NAME,
115119
ReturnTypes.VARCHAR_2000_NULLABLE,
116120
InferTypes.VARCHAR_1024,
117121
OperandTypes.STRING_STRING,
118122
SqlFunctionCategory.STRING
119123
);
120124
registerFunction(
121-
LeftFun.NAME,
125+
LeftFunFactory.NAME,
122126
ReturnTypes.VARCHAR_2000_NULLABLE,
123127
DingoInferTypes.VARCHAR1024_INTEGER,
124128
family(SqlTypeFamily.STRING, SqlTypeFamily.NUMERIC),
125129
SqlFunctionCategory.STRING
126130
);
127131
registerFunction(
128-
LocateFun.NAME,
132+
Locate2FunFactory.NAME,
129133
ReturnTypes.INTEGER_NULLABLE,
130134
InferTypes.VARCHAR_1024,
131135
OperandTypes.STRING_STRING,
132136
SqlFunctionCategory.NUMERIC
133137
);
134138
registerFunction(
135-
LTrimFun.NAME,
139+
LTrim1FunFactory.NAME,
136140
ReturnTypes.VARCHAR_2000_NULLABLE,
137141
InferTypes.VARCHAR_1024,
138142
OperandTypes.STRING,
139143
SqlFunctionCategory.STRING
140144
);
141145
registerFunction(
142-
MidFun.NAME,
146+
Mid2FunFactory.NAME,
143147
ReturnTypes.VARCHAR_2000_NULLABLE,
144148
DingoInferTypes.VARCHAR1024_INTEGER_INTEGER,
145149
OperandTypes.or(
@@ -149,28 +153,28 @@ private void init() {
149153
SqlFunctionCategory.STRING
150154
);
151155
registerFunction(
152-
RepeatFun.NAME,
156+
RepeatFunFactory.NAME,
153157
ReturnTypes.VARCHAR_2000_NULLABLE,
154158
DingoInferTypes.VARCHAR1024_INTEGER,
155159
family(SqlTypeFamily.STRING, SqlTypeFamily.NUMERIC),
156160
SqlFunctionCategory.STRING
157161
);
158162
registerFunction(
159-
ReverseFun.NAME,
163+
ReverseFunFactory.NAME,
160164
ReturnTypes.VARCHAR_2000_NULLABLE,
161165
InferTypes.VARCHAR_1024,
162166
OperandTypes.STRING,
163167
SqlFunctionCategory.STRING
164168
);
165169
registerFunction(
166-
RightFun.NAME,
170+
RightFunFactory.NAME,
167171
ReturnTypes.VARCHAR_2000_NULLABLE,
168172
DingoInferTypes.VARCHAR1024_INTEGER,
169173
family(SqlTypeFamily.STRING, SqlTypeFamily.NUMERIC),
170174
SqlFunctionCategory.STRING
171175
);
172176
registerFunction(
173-
RTrimFun.NAME,
177+
RTrim1FunFactory.NAME,
174178
ReturnTypes.VARCHAR_2000_NULLABLE,
175179
InferTypes.VARCHAR_1024,
176180
OperandTypes.STRING,
@@ -179,14 +183,14 @@ private void init() {
179183

180184
// time
181185
registerFunction(
182-
DingoFunFactory.FROM_UNIXTIME,
186+
FromUnixTimeFunFactory.NAME,
183187
ReturnTypes.TIMESTAMP,
184188
InferTypes.VARCHAR_1024,
185189
OperandTypes.NUMERIC,
186190
SqlFunctionCategory.STRING
187191
);
188192
registerFunction(
189-
DingoFunFactory.UNIX_TIMESTAMP,
193+
UnixTimestamp1FunFactory.NAME,
190194
ReturnTypes.BIGINT,
191195
DingoInferTypes.TIMESTAMP,
192196
OperandTypes.or(
@@ -197,7 +201,7 @@ private void init() {
197201
SqlFunctionCategory.NUMERIC
198202
);
199203
registerFunction(
200-
DingoFunFactory.DATE_FORMAT,
204+
DateFormat1FunFactory.NAME,
201205
ReturnTypes.VARCHAR_2000,
202206
DingoInferTypes.DATE_VARCHAR1024,
203207
// Why not `OperandTypes.family(ImmutableList.of(SqlTypeFamily.DATE, SqlTypeFamily.STRING), i -> i == 1)`?
@@ -209,7 +213,7 @@ private void init() {
209213
SqlFunctionCategory.STRING
210214
);
211215
registerFunction(
212-
DingoFunFactory.TIME_FORMAT,
216+
TimeFormat1FunFactory.NAME,
213217
ReturnTypes.VARCHAR_2000,
214218
DingoInferTypes.TIME_VARCHAR1024,
215219
OperandTypes.or(
@@ -219,7 +223,7 @@ private void init() {
219223
SqlFunctionCategory.STRING
220224
);
221225
registerFunction(
222-
DingoFunFactory.TIMESTAMP_FORMAT,
226+
TimestampFormat1FunFactory.NAME,
223227
ReturnTypes.VARCHAR_2000,
224228
DingoInferTypes.TIMESTAMP_VARCHAR1024,
225229
OperandTypes.or(
@@ -231,7 +235,7 @@ private void init() {
231235
SqlFunctionCategory.STRING
232236
);
233237
registerFunction(
234-
DateDiffFun.NAME,
238+
DateDiffFunFactory.NAME,
235239
ReturnTypes.BIGINT,
236240
DingoInferTypes.DATE_DATE,
237241
family(SqlTypeFamily.DATE, SqlTypeFamily.DATE),
@@ -240,10 +244,10 @@ private void init() {
240244

241245
// special
242246
registerFunction(
243-
DingoFunFactory.THROW,
247+
ThrowFun.NAME,
244248
ReturnTypes.VARCHAR_2000_NULLABLE,
245-
InferTypes.VARCHAR_1024,
246-
OperandTypes.STRING,
249+
null,
250+
OperandTypes.NILADIC,
247251
SqlFunctionCategory.STRING
248252
);
249253
registerFunction(
@@ -295,13 +299,6 @@ private void init() {
295299
family(SqlTypeFamily.ARRAY, SqlTypeFamily.ARRAY),
296300
SqlFunctionCategory.NUMERIC
297301
);
298-
registerFunction(
299-
VectorDistanceFun.NAME,
300-
FLOAT,
301-
DingoInferTypes.FLOAT,
302-
family(SqlTypeFamily.ARRAY, SqlTypeFamily.ARRAY),
303-
SqlFunctionCategory.NUMERIC
304-
);
305302
registerFunction(
306303
VersionFun.NAME,
307304
ReturnTypes.VARCHAR_2000,

dingo-calcite/src/main/java/io/dingodb/calcite/rule/DingoValuesJoinRule.java

+14-23
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
import io.dingodb.common.type.DingoType;
2323
import io.dingodb.common.type.DingoTypeFactory;
2424
import io.dingodb.common.util.ArrayUtils;
25-
import io.dingodb.expr.core.TypeCode;
26-
import io.dingodb.expr.parser.exception.ElementNotExists;
27-
import io.dingodb.expr.parser.exception.ExprCompileException;
28-
import io.dingodb.expr.runtime.EvalEnv;
25+
import io.dingodb.expr.runtime.ExprConfig;
2926
import org.apache.calcite.plan.RelOptRuleCall;
3027
import org.apache.calcite.plan.RelRule;
3128
import org.apache.calcite.rel.core.JoinRelType;
@@ -51,27 +48,21 @@ public void onMatch(@NonNull RelOptRuleCall call) {
5148
List<Object[]> tuples = new LinkedList<>();
5249
if (join.getJoinType() == JoinRelType.INNER) {
5350
DingoType type = DefinitionMapper.mapToDingoType(join.getRowType());
54-
EvalEnv env = CalcValueUtils.getEnv(call);
55-
try {
56-
for (Object[] v0 : value0.getTuples()) {
57-
for (Object[] v1 : value1.getTuples()) {
58-
Object[] newTuple = ArrayUtils.concat(v0, v1);
59-
Object v = CalcValueUtils.calcValue(
60-
join.getCondition(),
61-
DingoTypeFactory.scalar(TypeCode.BOOL, false),
62-
newTuple,
63-
type,
64-
env
65-
);
66-
if (v != null && (boolean) v) {
67-
tuples.add(newTuple);
68-
}
51+
ExprConfig config = CalcValueUtils.getConfig(call);
52+
for (Object[] v0 : value0.getTuples()) {
53+
for (Object[] v1 : value1.getTuples()) {
54+
Object[] newTuple = ArrayUtils.concat(v0, v1);
55+
Object v = CalcValueUtils.calcValue(
56+
join.getCondition(),
57+
DingoTypeFactory.INSTANCE.scalar("BOOL", false),
58+
newTuple,
59+
type,
60+
config
61+
);
62+
if (v != null && (boolean) v) {
63+
tuples.add(newTuple);
6964
}
7065
}
71-
} catch (ElementNotExists e) {
72-
return;
73-
} catch (ExprCompileException e) {
74-
throw new RuntimeException(e);
7566
}
7667
call.transformTo(new LogicalDingoValues(
7768
join.getCluster(),

dingo-calcite/src/main/java/io/dingodb/calcite/rule/DingoValuesReduceRule.java

+15-26
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,8 @@
2121
import io.dingodb.calcite.utils.CalcValueUtils;
2222
import io.dingodb.common.type.DingoType;
2323
import io.dingodb.common.type.DingoTypeFactory;
24-
import io.dingodb.expr.core.TypeCode;
25-
import io.dingodb.expr.parser.exception.ElementNotExists;
26-
import io.dingodb.expr.parser.exception.ExprCompileException;
27-
import io.dingodb.expr.runtime.EvalEnv;
24+
import io.dingodb.expr.runtime.ExprConfig;
25+
import io.dingodb.expr.runtime.exception.ElementNotExist;
2826
import org.apache.calcite.plan.RelOptRuleCall;
2927
import org.apache.calcite.plan.RelRule;
3028
import org.apache.calcite.rel.logical.LogicalFilter;
@@ -51,15 +49,13 @@ private static void matchProject(
5149
DingoType tupleType = DefinitionMapper.mapToDingoType(values.getRowType());
5250
DingoType rowType = DefinitionMapper.mapToDingoType(project.getRowType());
5351
List<Object[]> tuples = new LinkedList<>();
54-
EvalEnv env = CalcValueUtils.getEnv(call);
52+
ExprConfig config = CalcValueUtils.getConfig(call);
5553
try {
5654
for (Object[] tuple : values.getTuples()) {
57-
tuples.add(CalcValueUtils.calcValues(project.getProjects(), rowType, tuple, tupleType, env));
55+
tuples.add(CalcValueUtils.calcValues(project.getProjects(), rowType, tuple, tupleType, config));
5856
}
59-
} catch (ElementNotExists e) { // Means it is not a constant.
57+
} catch (ElementNotExist e) { // Means not constants.
6058
return;
61-
} catch (ExprCompileException e) {
62-
throw new RuntimeException(e);
6359
}
6460
call.transformTo(new LogicalDingoValues(
6561
project.getCluster(),
@@ -77,24 +73,17 @@ private static void matchFilter(
7773
LogicalDingoValues values = call.rel(1);
7874
DingoType tupleType = DefinitionMapper.mapToDingoType(values.getRowType());
7975
List<Object[]> tuples = new LinkedList<>();
80-
EvalEnv env = CalcValueUtils.getEnv(call);
81-
try {
82-
for (Object[] tuple : values.getTuples()) {
83-
Object v = CalcValueUtils.calcValue(
84-
filter.getCondition(),
85-
DingoTypeFactory.scalar(TypeCode.BOOL, false),
86-
tuple,
87-
tupleType,
88-
env
89-
);
90-
if (v != null && (boolean) v) {
91-
tuples.add(tuple);
92-
}
76+
for (Object[] tuple : values.getTuples()) {
77+
Object v = CalcValueUtils.calcValue(
78+
filter.getCondition(),
79+
DingoTypeFactory.INSTANCE.scalar("BOOL", false),
80+
tuple,
81+
tupleType,
82+
CalcValueUtils.getConfig(call)
83+
);
84+
if (v != null && (boolean) v) {
85+
tuples.add(tuple);
9386
}
94-
} catch (ElementNotExists e) {
95-
return;
96-
} catch (ExprCompileException e) {
97-
throw new RuntimeException(e);
9887
}
9988
call.transformTo(new LogicalDingoValues(
10089
filter.getCluster(),

0 commit comments

Comments
 (0)