Skip to content

Commit 485867e

Browse files
committed
address comment
Signed-off-by: Lantao Jin <[email protected]>
1 parent a05c5af commit 485867e

File tree

2 files changed

+37
-14
lines changed

2 files changed

+37
-14
lines changed

core/src/main/java/org/opensearch/sql/calcite/CalciteRelNodeVisitor.java

+22-14
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public RelNode visitParse(Parse node, CalcitePlanContext context) {
237237
String pattern = (String) node.getPattern().getValue();
238238
List<String> groupCandidates =
239239
ParseUtils.getNamedGroupCandidates(parseMethod, pattern, arguments);
240-
List<RexNode> overrideFields = new ArrayList<>();
240+
List<RexNode> overridingFields = new ArrayList<>();
241241
List<RexNode> newFields =
242242
groupCandidates.stream()
243243
.map(
@@ -248,14 +248,16 @@ public RelNode visitParse(Parse node, CalcitePlanContext context) {
248248
sourceField,
249249
context.rexBuilder.makeLiteral(pattern));
250250
if (originalFieldNames.contains(group)) {
251-
overrideFields.add(context.relBuilder.field(group));
251+
overridingFields.add(context.relBuilder.field(group));
252252
}
253253
return context.relBuilder.alias(regexp, group);
254254
})
255255
.toList();
256256
context.relBuilder.projectPlus(newFields);
257-
context.relBuilder.projectExcept(overrideFields);
258-
renameForOverriding(groupCandidates, context);
257+
258+
if (!overridingFields.isEmpty()) {
259+
renameForOverriding(overridingFields, groupCandidates, context);
260+
}
259261
return context.relBuilder.peek();
260262
}
261263

@@ -283,16 +285,13 @@ public RelNode visitEval(Eval node, CalcitePlanContext context) {
283285
ImmutableList.of(v.get().id));
284286
context.popCorrelVar();
285287
} else {
286-
// Overriding the existing field if the alias has the same name with original field
287-
// name.
288-
RexNode overrideField = null;
288+
// Overriding the existing field if the alias has the same name with original field.
289289
String alias =
290290
((RexLiteral) ((RexCall) eval).getOperands().get(1)).getValueAs(String.class);
291291
if (originalFieldNames.contains(alias)) {
292-
overrideField = context.relBuilder.field(alias);
292+
RexNode toOverride = context.relBuilder.field(alias);
293293
context.relBuilder.projectPlus(eval);
294-
context.relBuilder.projectExcept(overrideField);
295-
renameForOverriding(List.of(alias), context);
294+
renameForOverriding(List.of(toOverride), List.of(alias), context);
296295
} else {
297296
context.relBuilder.projectPlus(eval);
298297
}
@@ -301,12 +300,21 @@ public RelNode visitEval(Eval node, CalcitePlanContext context) {
301300
return context.relBuilder.peek();
302301
}
303302

304-
private static void renameForOverriding(List<String> newNames, CalcitePlanContext context) {
305-
List<String> originalFieldNames = context.relBuilder.peek().getRowType().getFieldNames();
306-
int length = originalFieldNames.size();
303+
private void renameForOverriding(
304+
List<RexNode> toOverrideList,
305+
List<String> newNames,
306+
CalcitePlanContext context) {
307+
assert toOverrideList.size() == newNames.size() : "Overriding fields are not matched";
308+
// 1. drop the overriding field list, it's duplicated now. For example "age, country"
309+
context.relBuilder.projectExcept(toOverrideList);
310+
// 2. get current fields list, the "age0, country0" should include in it.
311+
List<String> currentFields = context.relBuilder.peek().getRowType().getFieldNames();
312+
int length = currentFields.size();
313+
// 3. add new names "age, country" to the end of rename list.
307314
List<String> expectedRenameFields =
308-
new ArrayList<>(originalFieldNames.subList(0, length - newNames.size()));
315+
new ArrayList<>(currentFields.subList(0, length - newNames.size()));
309316
expectedRenameFields.addAll(newNames);
317+
// 4. rename
310318
context.relBuilder.rename(expectedRenameFields);
311319
}
312320

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
* Copyright OpenSearch Contributors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.opensearch.sql.calcite.standalone;
7+
8+
import org.opensearch.sql.common.setting.Settings;
9+
10+
public class CalcitePPLParsePushdownIT extends CalcitePPLParseIT {
11+
@Override
12+
protected Settings getSettings() {
13+
return enablePushdown();
14+
}
15+
}

0 commit comments

Comments
 (0)