Skip to content

Commit 504311c

Browse files
wt0530githubgxll
authored andcommitted
[fix][dingo-calcite] Change tableScan expression compilation from SqlExpr to RelOp
1 parent 1bb9d8c commit 504311c

File tree

12 files changed

+83
-7
lines changed

12 files changed

+83
-7
lines changed

dingo-calcite/src/main/java/io/dingodb/calcite/rel/LogicalDingoTableScan.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
import io.dingodb.calcite.fun.DingoOperatorTable;
2222
import io.dingodb.calcite.stats.StatsCache;
2323
import io.dingodb.calcite.utils.RelDataTypeUtils;
24+
import io.dingodb.calcite.visitor.RexConverter;
2425
import io.dingodb.common.type.TupleMapping;
26+
import io.dingodb.expr.rel.RelOp;
27+
import io.dingodb.expr.rel.op.RelOpBuilder;
28+
import io.dingodb.expr.runtime.expr.Expr;
2529
import io.dingodb.meta.entity.Column;
2630
import io.dingodb.meta.entity.IndexTable;
2731
import io.dingodb.meta.entity.Table;
@@ -67,6 +71,8 @@ public class LogicalDingoTableScan extends TableScan {
6771
@Getter
6872
protected final RexNode filter;
6973
@Getter
74+
protected RelOp relOp;
75+
@Getter
7076
protected TupleMapping selection;
7177
@Getter
7278
protected TupleMapping realSelection;
@@ -161,6 +167,10 @@ public LogicalDingoTableScan(
161167
// The vector distance function adapts to the corresponding function based on the table vector type
162168
// such as L2_ Distance, ip_ Distance, cosine_ Distance, etc
163169
if (filter != null) {
170+
Expr expr = RexConverter.convert(filter);
171+
relOp = RelOpBuilder.builder()
172+
.filter(expr)
173+
.build();
164174
dispatchDistanceCondition(filter, selection, dingoTable);
165175
}
166176
}

dingo-calcite/src/main/java/io/dingodb/calcite/utils/CalcValueUtils.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public static Object calcValue(
5252
etx.setTuple(tuple);
5353

5454
ExprCompiler exprCompiler = ExprCompiler.ADVANCED;
55+
exprCompiler.setProcessor(config.getProcessor());
5556

5657
try {
5758
if ((rexNode instanceof RexCall)

dingo-calcite/src/main/java/io/dingodb/calcite/visitor/function/DingoGetByIndexMergeVisitFun.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import io.dingodb.exec.operator.params.IndexMergeParam;
4444
import io.dingodb.exec.operator.params.TxnGetByIndexParam;
4545
import io.dingodb.exec.transaction.base.ITransaction;
46+
import io.dingodb.expr.rel.RelOp;
4647
import io.dingodb.meta.MetaService;
4748
import io.dingodb.meta.entity.Column;
4849
import io.dingodb.meta.entity.Table;
@@ -140,12 +141,14 @@ public static Collection<Vertex> visit(
140141
visitor.isForUpdate());
141142

142143
Vertex vertex;
144+
RelOp relOp = rel.getRelOp();
143145
if (transaction != null) {
144146
vertex = new Vertex(TXN_GET_BY_INDEX, new TxnGetByIndexParam(
145147
idxId,
146148
tableInfo.getId(),
147149
tupleMapping,
148-
SqlExprUtils.toSqlExpr(rel.getFilter()),
150+
relOp != null ? null : SqlExprUtils.toSqlExpr(rel.getFilter()),
151+
relOp,
149152
lookupKeyMapping,
150153
rel.isUnique(),
151154
indexTd,

dingo-calcite/src/main/java/io/dingodb/calcite/visitor/function/DingoGetByIndexVisitFun.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import io.dingodb.exec.operator.params.GetByIndexParam;
4242
import io.dingodb.exec.operator.params.TxnGetByIndexParam;
4343
import io.dingodb.exec.transaction.base.ITransaction;
44+
import io.dingodb.expr.rel.RelOp;
4445
import io.dingodb.meta.MetaService;
4546
import io.dingodb.meta.entity.Column;
4647
import io.dingodb.meta.entity.Table;
@@ -140,12 +141,14 @@ public static LinkedList<Vertex> visit(
140141
visitor.isForUpdate());
141142

142143
Vertex vertex;
144+
RelOp relOp = rel.getRelOp();
143145
if (transaction != null) {
144146
vertex = new Vertex(TXN_GET_BY_INDEX, new TxnGetByIndexParam(
145147
idxId,
146148
tableInfo.getId(),
147149
tupleMapping,
148-
SqlExprUtils.toSqlExpr(rel.getFilter()),
150+
relOp != null ? null : SqlExprUtils.toSqlExpr(rel.getFilter()),
151+
relOp,
149152
rel.getSelection(),
150153
rel.isUnique(),
151154
indexTd,

dingo-calcite/src/main/java/io/dingodb/calcite/visitor/function/DingoGetByKeysFun.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.dingodb.exec.operator.params.GetDistributionParam;
4141
import io.dingodb.exec.operator.params.TxnGetByKeysParam;
4242
import io.dingodb.exec.transaction.base.ITransaction;
43+
import io.dingodb.expr.rel.RelOp;
4344
import io.dingodb.meta.entity.Table;
4445
import io.dingodb.store.api.transaction.data.IsolationLevel;
4546
import io.dingodb.tso.TsoService;
@@ -100,13 +101,15 @@ public static List<Vertex> visit(
100101
distributionVertex.setId(idGenerator.getOperatorId(task.getId()));
101102
task.putVertex(distributionVertex);
102103
Vertex getVertex;
104+
RelOp relOp = rel.getRelOp();
103105
long scanTs = VisitUtils.getScanTs(transaction, visitor.getKind(), visitor.getPointTs(), visitor.isForUpdate());
104106
if (transaction != null) {
105107
TxnGetByKeysParam param = new TxnGetByKeysParam(
106108
tableInfo.getId(),
107109
td.tupleType(),
108110
td.keyMapping(),
109-
SqlExprUtils.toSqlExpr(rel.getFilter()),
111+
relOp != null ? null : SqlExprUtils.toSqlExpr(rel.getFilter()),
112+
relOp,
110113
rel.getSelection(),
111114
td,
112115
scanTs,

dingo-calcite/src/main/java/io/dingodb/calcite/visitor/function/DingoTableScanVisitFun.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import io.dingodb.exec.operator.params.PartRangeScanParam;
4343
import io.dingodb.exec.operator.params.TxnPartRangeScanParam;
4444
import io.dingodb.exec.transaction.base.ITransaction;
45+
import io.dingodb.expr.rel.RelOp;
4546
import io.dingodb.meta.entity.Table;
4647
import io.dingodb.store.api.transaction.data.IsolationLevel;
4748
import lombok.extern.slf4j.Slf4j;
@@ -121,6 +122,7 @@ private DingoTableScanVisitFun() {
121122
List<Vertex> outputs = new ArrayList<>();
122123

123124
long scanTs = VisitUtils.getScanTs(transaction, visitor.getKind(), visitor.getPointTs(), visitor.isForUpdate());
125+
RelOp relOp = rel.getRelOp();
124126
for (int i = 0; i < Optional.mapOrGet(td.getPartitions(), List::size, () -> 0); i++) {
125127
Vertex scanVertex;
126128
if (transaction != null) {
@@ -135,7 +137,8 @@ private DingoTableScanVisitFun() {
135137
td.tupleType(),
136138
td.keyMapping(),
137139
td.version,
138-
Optional.mapOrNull(filter, SqlExpr::copy),
140+
relOp != null ? null : Optional.mapOrNull(filter, SqlExpr::copy),
141+
relOp,
139142
rel.getSelection(),
140143
rel.getGroupSet() == null ? null
141144
: AggFactory.getAggKeys(rel.getGroupSet()),

dingo-client/src/main/java/io/dingodb/client/OperationServiceV2.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,7 @@ private List<Vertex> getByKey(Table td,
638638
td.keyMapping(),
639639
null,
640640
null,
641+
null,
641642
td,
642643
scanTs,
643644
transaction.getIsolationLevel(),

dingo-exec/src/main/java/io/dingodb/exec/operator/FilterProjectOperator.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.dingodb.exec.expr.SqlExpr;
2323
import io.dingodb.exec.operator.data.Context;
2424
import io.dingodb.exec.operator.params.FilterProjectParam;
25+
import io.dingodb.expr.rel.RelOp;
26+
import io.dingodb.expr.rel.op.FilterOp;
2527
import org.checkerframework.checker.nullness.qual.NonNull;
2628

2729
import java.util.Iterator;
@@ -33,6 +35,7 @@ protected Iterator<Object[]> createIterator(Context context, Object[] tuple, Ver
3335
FilterProjectParam param = vertex.getParam();
3436
Iterator<Object[]> iterator = createSourceIterator(context, tuple, vertex);
3537
SqlExpr filter = param.getFilter();
38+
RelOp relOp = param.getRelOp();
3639
TupleMapping selection = param.getSelection();
3740
if (selection != null) {
3841
iterator = Iterators.transform(iterator, selection::revMap);
@@ -47,6 +50,16 @@ protected Iterator<Object[]> createIterator(Context context, Object[] tuple, Ver
4750
}
4851
);
4952
}
53+
if (relOp != null) {
54+
iterator = Iterators.filter(
55+
iterator,
56+
t -> {
57+
vertex.incrementCnt();
58+
Object[] v = ((FilterOp) relOp).put(t);
59+
return v != null;
60+
}
61+
);
62+
}
5063
return iterator;
5164
}
5265

dingo-exec/src/main/java/io/dingodb/exec/operator/params/FilterProjectParam.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
import io.dingodb.common.type.DingoType;
2525
import io.dingodb.common.type.TupleMapping;
2626
import io.dingodb.exec.dag.Vertex;
27+
import io.dingodb.exec.expr.DingoCompileContext;
28+
import io.dingodb.exec.expr.DingoRelConfig;
2729
import io.dingodb.exec.expr.SqlExpr;
30+
import io.dingodb.expr.common.type.TupleType;
31+
import io.dingodb.expr.rel.RelOp;
2832
import lombok.Getter;
2933

3034
import static com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility.ANY;
@@ -44,10 +48,13 @@ public abstract class FilterProjectParam extends AbstractParams {
4448
public final int codecVersion;
4549
@JsonProperty("filter")
4650
public SqlExpr filter;
51+
@JsonProperty("relOp")
52+
public RelOp relOp;
4753
@JsonProperty("selection")
4854
public TupleMapping selection;
4955
@JsonProperty("keyMapping")
5056
public final TupleMapping keyMapping;
57+
public final transient DingoRelConfig config;
5158

5259
public FilterProjectParam(
5360
CommonId tableId,
@@ -57,6 +64,19 @@ public FilterProjectParam(
5764
TupleMapping selection,
5865
TupleMapping keyMapping,
5966
int codecVersion
67+
) {
68+
this(tableId, schema, schemaVersion, filter, selection, keyMapping, codecVersion, null);
69+
}
70+
71+
public FilterProjectParam(
72+
CommonId tableId,
73+
DingoType schema,
74+
int schemaVersion,
75+
SqlExpr filter,
76+
TupleMapping selection,
77+
TupleMapping keyMapping,
78+
int codecVersion,
79+
RelOp relOp
6080
) {
6181
super();
6282
this.tableId = tableId;
@@ -66,10 +86,22 @@ public FilterProjectParam(
6686
this.selection = selection;
6787
this.keyMapping = keyMapping;
6888
this.codecVersion = codecVersion;
89+
this.relOp = relOp;
90+
this.config = new DingoRelConfig();
6991
}
7092

7193
@Override
7294
public void init(Vertex vertex) {
95+
if (relOp != null) {
96+
TupleType tupleType = (TupleType) schema.getType();
97+
if (selection != null) {
98+
tupleType = (TupleType) schema.select(selection).getType();
99+
}
100+
relOp = relOp.compile(new DingoCompileContext(
101+
tupleType,
102+
(TupleType) vertex.getParasType().getType()
103+
), config);
104+
}
73105
if (filter != null) {
74106
if (selection != null) {
75107
filter.compileIn(schema.select(selection), vertex.getParasType());
@@ -85,6 +117,7 @@ public void setParas(Object[] paras) {
85117
if (filter != null) {
86118
filter.setParas(paras);
87119
}
120+
config.getEvalContext().setParas(paras);
88121
}
89122
}
90123

dingo-exec/src/main/java/io/dingodb/exec/operator/params/TxnGetByIndexParam.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.dingodb.common.type.TupleMapping;
2828
import io.dingodb.exec.dag.Vertex;
2929
import io.dingodb.exec.expr.SqlExpr;
30+
import io.dingodb.expr.rel.RelOp;
3031
import io.dingodb.meta.entity.Column;
3132
import io.dingodb.meta.entity.Table;
3233
import lombok.Getter;
@@ -65,6 +66,7 @@ public TxnGetByIndexParam(
6566
CommonId tableId,
6667
TupleMapping keyMapping,
6768
SqlExpr filter,
69+
RelOp relOp,
6870
TupleMapping selection,
6971
boolean isUnique,
7072
Table index,
@@ -74,7 +76,7 @@ public TxnGetByIndexParam(
7476
long timeout,
7577
boolean isAutoCommit
7678
) {
77-
super(tableId, table.tupleType(), table.version, filter, selection, keyMapping, table.getCodecVersion());
79+
super(tableId, table.tupleType(), table.version, filter, selection, keyMapping, table.getCodecVersion(), relOp);
7880
this.indexTableId = indexTableId;
7981
this.isLookup = isLookup;
8082
this.isUnique = isUnique;

0 commit comments

Comments
 (0)