Skip to content

Commit f838694

Browse files
committed
Review
1 parent 36da95c commit f838694

9 files changed

Lines changed: 96 additions & 96 deletions

File tree

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/expressions/ExplodeExpression.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,10 @@
5656
* A table function expression that “explodes” a repeated field into a stream of its values.
5757
*
5858
* <p>In the {@code WITH ORDINALITY} variant, it also generates 1-based ordinals of the field values. In this case it
59-
* produces a struct with fields {@code {_element, _ordinal}} instead of the bare element.
59+
* produces a struct with two anonymous fields—the element and the ordinal—instead of the bare element.
6060
*/
6161
@API(API.Status.EXPERIMENTAL)
6262
public class ExplodeExpression extends AbstractRelationalExpressionWithoutChildren implements InternalPlannerGraphRewritable {
63-
public static final String ELEMENT_FIELD_NAME = "_element";
64-
public static final String ORDINAL_FIELD_NAME = "_ordinal";
65-
6663
@Nonnull
6764
private final Value collectionValue;
6865

@@ -104,15 +101,15 @@ public Type getElementType() {
104101
}
105102

106103
/**
107-
* Returns the type of the explode result. For the {@code WITH ORDINALITY} variant, builds the
108-
* struct result type {@code {_element: elementType, _ordinal: INT}}.
104+
* Returns the type of the explode result. For the {@code WITH ORDINALITY} variant, builds an anonymous-field
105+
* struct result type holding the element and the 1-based ordinal.
109106
*/
110107
@Nonnull
111108
public static Type explodeResultType(@Nonnull final Type elementType, boolean withOrdinality) {
112109
if (withOrdinality) {
113110
return Type.Record.fromFields(ImmutableList.of(
114-
Type.Record.Field.of(elementType, Optional.of(ELEMENT_FIELD_NAME)),
115-
Type.Record.Field.of(Type.primitiveType(Type.TypeCode.INT, false), Optional.of(ORDINAL_FIELD_NAME))));
111+
Type.Record.Field.of(elementType, Optional.empty()),
112+
Type.Record.Field.of(Type.primitiveType(Type.TypeCode.INT, false), Optional.empty())));
116113
} else {
117114
return elementType;
118115
}
@@ -169,12 +166,12 @@ public boolean equalsWithoutChildren(@Nonnull RelationalExpression otherExpressi
169166
if (this == otherExpression) {
170167
return true;
171168
}
172-
if (!(otherExpression instanceof final ExplodeExpression otherExplodeExpression)) {
173-
return false;
169+
if (otherExpression instanceof final ExplodeExpression other) {
170+
return collectionValue.semanticEquals(other.getCollectionValue(), equivalencesMap) &&
171+
isWithOrdinality() == other.isWithOrdinality() &&
172+
semanticEqualsForResults(otherExpression, equivalencesMap);
174173
}
175-
return collectionValue.semanticEquals(otherExplodeExpression.getCollectionValue(), equivalencesMap) &&
176-
withOrdinality == otherExplodeExpression.withOrdinality &&
177-
semanticEqualsForResults(otherExpression, equivalencesMap);
174+
return false;
178175
}
179176

180177
@Override
@@ -239,8 +236,8 @@ public PlannerGraph rewriteInternalPlannerGraph(@Nonnull final List<? extends Pl
239236
@Override
240237
public String toString() {
241238
return withOrdinality
242-
? collectionValue + " WITH ORDINALITY"
243-
: collectionValue.toString();
239+
? collectionValue + " WITH ORDINALITY"
240+
: collectionValue.toString();
244241
}
245242

246243
public static ExplodeExpression explodeField(@Nonnull final Quantifier.ForEach baseQuantifier,

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/cascades/properties/DerivationsProperty.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
import com.apple.foundationdb.record.query.plan.cascades.ExpressionProperty;
3333
import com.apple.foundationdb.record.query.plan.cascades.Reference;
3434
import com.apple.foundationdb.record.query.plan.cascades.Quantifier;
35-
import com.apple.foundationdb.record.query.plan.cascades.expressions.ExplodeExpression;
3635
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpressionVisitor;
3736
import com.apple.foundationdb.record.query.plan.cascades.TreeLike;
3837
import com.apple.foundationdb.record.query.plan.cascades.expressions.RelationalExpression;
@@ -348,10 +347,8 @@ public Derivations visitExplodePlan(@Nonnull final RecordQueryExplodePlan explod
348347
if (explodePlan.isWithOrdinality()) {
349348
final Type ordinalType = Type.primitiveType(Type.TypeCode.INT, false);
350349
representative = RecordConstructorValue.ofColumns(List.of(
351-
Column.of(Type.Record.Field.of(elementType, Optional.of(ExplodeExpression.ELEMENT_FIELD_NAME)),
352-
first),
353-
Column.of(Type.Record.Field.of(ordinalType, Optional.of(ExplodeExpression.ORDINAL_FIELD_NAME)),
354-
new ThrowsValue(ordinalType))));
350+
Column.of(Type.Record.Field.of(elementType, Optional.empty()), first),
351+
Column.of(Type.Record.Field.of(ordinalType, Optional.empty()), new ThrowsValue(ordinalType))));
355352
} else {
356353
representative = first;
357354
}

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/plans/RecordQueryExplodePlan.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@
7575
* value to Java type {@code List<?>}, and then produces one {@link QueryResult} datum per array element.
7676
*
7777
* <p>In the {@code WITH ORDINALITY} variant, {@code EXPLODE} also generates ordinals of the array elements. In this
78-
* case the plan produces a {@link DynamicMessage} struct with fields {@code {_element, _ordinal}} instead of
79-
* the bare element. The ordinals are 1-based per the SQL standard (Foundation, Section 4.10.2).
78+
* case the plan produces a {@link DynamicMessage} struct with two anonymous fields (the element and the ordinal)
79+
* instead of the bare element. The ordinals are 1-based per the SQL standard (Foundation, Section 4.10.2).
8080
*
8181
* @see RecordQueryFlatMapPlan
8282
*/
@@ -85,7 +85,7 @@ public class RecordQueryExplodePlan extends AbstractRelationalExpressionWithoutC
8585
private static final ObjectPlanHash BASE_HASH = new ObjectPlanHash("Record-Query-Explode-Plan");
8686

8787
/**
88-
* The collection value. Must evaluate to a {@code List<?>}.
88+
* The collection value. Must evaluate to an array type.
8989
*/
9090
@Nonnull
9191
private final Value collectionValue;
@@ -145,7 +145,7 @@ public <M extends Message> RecordCursor<QueryResult> executePlan(@Nonnull final
145145
.skipThenLimit(executeProperties.getSkip(), executeProperties.getReturnedRowLimit());
146146
}
147147

148-
// In the WITH ORDINALITY case, produce a struct {_element, _ordinal} per list element, with 1-based ordinals.
148+
// In the WITH ORDINALITY case, produce a struct (element, ordinal) per list element, with 1-based ordinals.
149149
final Type elementType = getElementType();
150150
final var resultType = (Type.Record) getExplodeResultType();
151151
final TypeRepository typeRepository = context.getTypeRepository();
@@ -256,7 +256,10 @@ public Value getResultValue() {
256256
@Nonnull
257257
@Override
258258
public Set<Type> getDynamicTypes() {
259-
return collectionValue.getDynamicTypes();
259+
return ImmutableSet.<Type>builder()
260+
.addAll(collectionValue.getDynamicTypes())
261+
.addAll(getResultValue().getDynamicTypes())
262+
.build();
260263
}
261264

262265
@Nonnull
@@ -276,9 +279,8 @@ public boolean equalsWithoutChildren(@Nonnull RelationalExpression otherExpressi
276279
return false;
277280
}
278281
final var otherExplodePlan = (RecordQueryExplodePlan)otherExpression;
279-
280282
return collectionValue.semanticEquals(otherExplodePlan.getCollectionValue(), equivalencesMap) &&
281-
withOrdinality == otherExplodePlan.withOrdinality &&
283+
isWithOrdinality() == otherExplodePlan.isWithOrdinality() &&
282284
semanticEqualsForResults(otherExpression, equivalencesMap);
283285
}
284286

fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/query/plan/plans/RecordQueryFlatMapPlan.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@
6666
* A {@code FLATMAP} plan node. {@code FLATMAP} implements correlated lateral joins by executing an inner plan for each
6767
* row produced by a “driving” outer plan and combining the results. The inner plan may reference the outer row via
6868
* correlation. The outer and inner rows are combined by applying the {@link #resultValue} expression.
69-
*
70-
* <p>{@code FLATMAP} and {@code EXPLODE} are the runtime backbone of array unnesting. For example, for a simple
71-
* unnesting query {@code SELECT … FROM T, T.ARR AS A}, the outer plan scans {@code T} and the inner plan explodes the
72-
* array {@code T.ARR}.
73-
*
74-
* @see RecordQueryExplodePlan
7569
*/
7670
@API(API.Status.INTERNAL)
7771
public class RecordQueryFlatMapPlan extends AbstractRelationalExpressionWithChildren implements RecordQueryPlanWithChildren, ExplainPlannerGraphRewritable, InternalPlannerGraphRewritable {

fdb-record-layer-core/src/test/java/com/apple/foundationdb/record/query/plan/plans/ExplodePlanTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,8 +287,8 @@ void derivationsPreserveCollectionCorrelation() {
287287
}
288288

289289
/**
290-
* Verify that {@link ExplodeExpression#getDynamicTypes()} registers the synthesized {@code {_element, _ordinal}}
291-
* struct as a dynamic type in the WITH ORDINALITY variant.
290+
* Verify that {@link ExplodeExpression#getDynamicTypes()} registers the synthesized (element, ordinal) struct as
291+
* a dynamic type in the WITH ORDINALITY variant.
292292
*/
293293
@Test
294294
void dynamicTypesIncludeOrdinalityStruct() {

fdb-relational-core/src/main/java/com/apple/foundationdb/relational/recordlayer/query/LogicalOperator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ private static LogicalOperator generateCorrelatedFieldAccess(@Nonnull Expression
317317

318318
final ImmutableList.Builder<Expression> attributesBuilder = ImmutableList.builder();
319319
if (atAlias.isPresent()) {
320-
// With AT, the `ExplodeExpression` produces a struct {_element, _ordinal}. Use `FieldValue` accessors.
320+
// With AT, the `ExplodeExpression` produces a struct (element, ordinal). Use `FieldValue` accessors.
321321
final Type elementType = explode.getElementType();
322322
attributesBuilder.add(new Expression(alias, DataTypeUtils.toRelationalType(elementType),
323323
FieldValue.ofOrdinalNumber(flowedObjectValue, 0)));
-793 Bytes
Binary file not shown.

yaml-tests/src/test/resources/array-join-at.metrics.yaml

Lines changed: 45 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,19 @@ array-join-at:
44
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 AS q1 RETURN (q0.id AS
55
id, q1 AS val) }
66
task_count: 160
7-
task_total_time_ms: 67
7+
task_total_time_ms: 51
88
transform_count: 47
9-
transform_time_ms: 51
9+
transform_time_ms: 38
1010
transform_yield_count: 13
1111
insert_time_ms: 0
1212
insert_new_count: 15
1313
insert_reused_count: 0
1414
- query: EXPLAIN SELECT "id", "val", "at" FROM T1, T1."arr1" AS "val" AT "at"
1515
ref: array-join-at.yamsql:56
1616
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q1
17-
RETURN (q0.id AS id, q1._element AS val, q1._ordinal AS at) }
17+
RETURN (q0.id AS id, q1._0 AS val, q1._1 AS at) }
1818
task_count: 160
19-
task_total_time_ms: 15
19+
task_total_time_ms: 13
2020
transform_count: 47
2121
transform_time_ms: 6
2222
transform_yield_count: 13
@@ -26,11 +26,11 @@ array-join-at:
2626
- query: EXPLAIN SELECT "id", "at" FROM T1, T1."arr1" AT "at"
2727
ref: array-join-at.yamsql:93
2828
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q1
29-
RETURN (q0.id AS id, q1._ordinal AS at) }
29+
RETURN (q0.id AS id, q1._1 AS at) }
3030
task_count: 160
3131
task_total_time_ms: 12
3232
transform_count: 47
33-
transform_time_ms: 4
33+
transform_time_ms: 5
3434
transform_yield_count: 13
3535
insert_time_ms: 0
3636
insert_new_count: 15
@@ -40,12 +40,11 @@ array-join-at:
4040
AT "at"
4141
ref: array-join-at.yamsql:104
4242
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q1
43-
RETURN (q0.id + @c17 - @c17 AS id, q1._ordinal AS at, q1._element AS val)
44-
}
43+
RETURN (q0.id + @c17 - @c17 AS id, q1._1 AS at, q1._0 AS val) }
4544
task_count: 188
4645
task_total_time_ms: 13
4746
transform_count: 51
48-
transform_time_ms: 6
47+
transform_time_ms: 5
4948
transform_yield_count: 15
5049
insert_time_ms: 0
5150
insert_new_count: 21
@@ -55,24 +54,24 @@ array-join-at:
5554
ref: array-join-at.yamsql:115
5655
explain: EXPLODE array((@c11 AS id, array(@c14) AS arr), (@c19 AS id, array(@c22,
5756
@c24, @c26) AS arr)) | FLATMAP q0 -> { EXPLODE q0.arr WITH ORDINALITY AS q1
58-
RETURN (q0.id AS id, q1._element AS val, q1._ordinal AS at) }
57+
RETURN (q0.id AS id, q1._0 AS val, q1._1 AS at) }
5958
task_count: 238
60-
task_total_time_ms: 15
59+
task_total_time_ms: 16
6160
transform_count: 71
62-
transform_time_ms: 4
61+
transform_time_ms: 5
6362
transform_yield_count: 14
64-
insert_time_ms: 1
63+
insert_time_ms: 0
6564
insert_new_count: 24
6665
insert_reused_count: 0
6766
- query: EXPLAIN SELECT "id", "at" + 10 AS "at_plus_10" FROM T1, T1."arr1" AS "val"
6867
AT "at"
6968
ref: array-join-at.yamsql:140
7069
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q1
71-
RETURN (q0.id AS id, q1._ordinal + @c5 AS at_plus_10) }
70+
RETURN (q0.id AS id, q1._1 + @c5 AS at_plus_10) }
7271
task_count: 160
73-
task_total_time_ms: 7
72+
task_total_time_ms: 5
7473
transform_count: 47
75-
transform_time_ms: 3
74+
transform_time_ms: 2
7675
transform_yield_count: 13
7776
insert_time_ms: 0
7877
insert_new_count: 15
@@ -81,26 +80,26 @@ array-join-at:
8180
WHERE "val" > 201
8281
ref: array-join-at.yamsql:150
8382
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1_nn WITH ORDINALITY |
84-
FILTER _._element GREATER_THAN promote(@c19 AS INT) AS q1 RETURN (q0.id AS
85-
id, q1._element AS val, q1._ordinal AS at) }
83+
FILTER _._0 GREATER_THAN promote(@c19 AS INT) AS q1 RETURN (q0.id AS id, q1._0
84+
AS val, q1._1 AS at) }
8685
task_count: 253
87-
task_total_time_ms: 18
86+
task_total_time_ms: 15
8887
transform_count: 83
8988
transform_time_ms: 5
9089
transform_yield_count: 17
91-
insert_time_ms: 2
90+
insert_time_ms: 1
9291
insert_new_count: 27
9392
insert_reused_count: 1
9493
- query: EXPLAIN SELECT "id", "val", "at" FROM T1, T1."arr1_nn" AS "val" AT "at"
9594
WHERE "at" + 1 = 3
9695
ref: array-join-at.yamsql:158
9796
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1_nn WITH ORDINALITY |
98-
FILTER _._ordinal + @c19 EQUALS promote(@c21 AS INT) AS q1 RETURN (q0.id AS
99-
id, q1._element AS val, q1._ordinal AS at) }
97+
FILTER _._1 + @c19 EQUALS promote(@c21 AS INT) AS q1 RETURN (q0.id AS id,
98+
q1._0 AS val, q1._1 AS at) }
10099
task_count: 253
101100
task_total_time_ms: 12
102101
transform_count: 83
103-
transform_time_ms: 6
102+
transform_time_ms: 5
104103
transform_yield_count: 17
105104
insert_time_ms: 1
106105
insert_new_count: 27
@@ -110,10 +109,10 @@ array-join-at:
110109
ref: array-join-at.yamsql:172
111110
explain: SCAN([IS T2]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY | FLATMAP
112111
q1 -> { EXPLODE q0.arr2 WITH ORDINALITY AS q2 RETURN (q1 AS _0, q2 AS _1)
113-
} AS q3 RETURN (q0.id AS id, q3._0._ordinal AS at1, q3._0._element AS val1,
114-
q3._1._ordinal AS at2, q3._1._element AS val2) }
112+
} AS q3 RETURN (q0.id AS id, q3._0._1 AS at1, q3._0._0 AS val1, q3._1._1 AS
113+
at2, q3._1._0 AS val2) }
115114
task_count: 253
116-
task_total_time_ms: 11
115+
task_total_time_ms: 10
117116
transform_count: 89
118117
transform_time_ms: 5
119118
transform_yield_count: 18
@@ -125,12 +124,12 @@ array-join-at:
125124
ref: array-join-at.yamsql:183
126125
explain: SCAN([IS T2]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY | FLATMAP
127126
q1 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q2 RETURN (q1 AS _0, q2 AS _1)
128-
} AS q3 RETURN (q0.id AS id, q3._0._element AS val1, q3._0._ordinal AS at1,
129-
q3._1._element AS val2, q3._1._ordinal AS at2) }
127+
} AS q3 RETURN (q0.id AS id, q3._0._0 AS val1, q3._0._1 AS at1, q3._1._0 AS
128+
val2, q3._1._1 AS at2) }
130129
task_count: 242
131-
task_total_time_ms: 8
130+
task_total_time_ms: 7
132131
transform_count: 88
133-
transform_time_ms: 4
132+
transform_time_ms: 3
134133
transform_yield_count: 17
135134
insert_time_ms: 0
136135
insert_new_count: 25
@@ -139,10 +138,10 @@ array-join-at:
139138
FROM T1, T1."arr1" AS "arr1_val" AT "at"
140139
ref: array-join-at.yamsql:202
141140
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY AS q1
142-
RETURN (q0.id AS id, q1._ordinal AS at, q1._element AS arr1_val, q0.arr1_nn[q1._ordinal>
143-
AS arr1_nn_val) }
141+
RETURN (q0.id AS id, q1._1 AS at, q1._0 AS arr1_val, q0.arr1_nn[q1._1> AS
142+
arr1_nn_val) }
144143
task_count: 160
145-
task_total_time_ms: 4
144+
task_total_time_ms: 5
146145
transform_count: 47
147146
transform_time_ms: 2
148147
transform_yield_count: 13
@@ -155,23 +154,23 @@ array-join-at:
155154
ref: array-join-at.yamsql:219
156155
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1 WITH ORDINALITY | FLATMAP
157156
q1 -> { SCAN([IS T1, EQUALS q0.id]) | FLATMAP q2 -> { EXPLODE q2.arr1_nn WITH
158-
ORDINALITY | FILTER _._element EQUALS q1._element AS q3 RETURN q3 } AS q3
159-
RETURN (q3 AS _0, q1 AS _1) } AS q5 RETURN (q0.id AS id, q5._1._ordinal AS
160-
at, q5._1._element AS val, q5._0._element AS val2) }
157+
ORDINALITY | FILTER _._0 EQUALS q1._0 AS q3 RETURN q3 } AS q3 RETURN (q3 AS
158+
_0, q1 AS _1) } AS q5 RETURN (q0.id AS id, q5._1._1 AS at, q5._1._0 AS val,
159+
q5._0._0 AS val2) }
161160
task_count: 6364
162-
task_total_time_ms: 298
161+
task_total_time_ms: 272
163162
transform_count: 3065
164-
transform_time_ms: 106
163+
transform_time_ms: 102
165164
transform_yield_count: 295
166-
insert_time_ms: 43
165+
insert_time_ms: 37
167166
insert_new_count: 757
168167
insert_reused_count: 133
169168
- query: EXPLAIN SELECT T2."id", "val1", "at1", "val2" FROM T2, T2."arr1" AS "val1"
170169
AT "at1", T2."arr2" AS "val2"
171170
ref: array-join-at.yamsql:258
172171
explain: SCAN([IS T2]) | FLATMAP q0 -> { EXPLODE q0.arr2 | FLATMAP q1 -> { EXPLODE
173172
q0.arr1 WITH ORDINALITY AS q2 RETURN (q2 AS _0, q1 AS _1) } AS q3 RETURN (q0.id
174-
AS id, q3._0._element AS val1, q3._0._ordinal AS at1, q3._1 AS val2) }
173+
AS id, q3._0._0 AS val1, q3._0._1 AS at1, q3._1 AS val2) }
175174
task_count: 253
176175
task_total_time_ms: 4
177176
transform_count: 89
@@ -185,11 +184,11 @@ array-join-at:
185184
ref: array-join-at.yamsql:298
186185
explain: '[IN arrayDistinct(promote(@c21 AS ARRAY(LONG)))] | INJOIN q0 -> { SCAN([IS
187186
T1, EQUALS q0]) | FLATMAP q1 -> { EXPLODE q1.arr1_nn WITH ORDINALITY AS q2
188-
RETURN (q1.id AS id, q2._element AS val, q2._ordinal AS at) } }'
187+
RETURN (q1.id AS id, q2._0 AS val, q2._1 AS at) } }'
189188
task_count: 1164
190-
task_total_time_ms: 26
189+
task_total_time_ms: 31
191190
transform_count: 453
192-
transform_time_ms: 11
191+
transform_time_ms: 14
193192
transform_yield_count: 68
194193
insert_time_ms: 2
195194
insert_new_count: 140
@@ -198,12 +197,12 @@ array-join-at:
198197
WHERE "at" IN (1, 2)
199198
ref: array-join-at.yamsql:310
200199
explain: SCAN([IS T1]) | FLATMAP q0 -> { EXPLODE q0.arr1_nn WITH ORDINALITY |
201-
FILTER _._ordinal IN @c19 AS q1 RETURN (q0.id AS id, q1._element AS val, q1._ordinal
202-
AS at) }
200+
FILTER _._1 IN @c19 AS q1 RETURN (q0.id AS id, q1._0 AS val, q1._1 AS at)
201+
}
203202
task_count: 1058
204203
task_total_time_ms: 15
205204
transform_count: 422
206-
transform_time_ms: 5
205+
transform_time_ms: 6
207206
transform_yield_count: 52
208207
insert_time_ms: 1
209208
insert_new_count: 115

0 commit comments

Comments
 (0)