Skip to content

Commit 2f4b960

Browse files
committed
Test var arg function resolve such as concat
Signed-off-by: Chen Dai <[email protected]>
1 parent 6a90fe6 commit 2f4b960

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

core/src/main/java/org/opensearch/sql/expression/function/BuiltinFunctionRepository.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static org.opensearch.sql.ast.expression.Cast.getCastFunctionName;
99
import static org.opensearch.sql.ast.expression.Cast.isCastFunction;
10+
import static org.opensearch.sql.data.type.ExprCoreType.ARRAY;
1011

1112
import com.google.common.annotations.VisibleForTesting;
1213
import java.util.ArrayList;
@@ -179,7 +180,9 @@ private FunctionBuilder getFunctionBuilder(
179180
List<ExprType> sourceTypes = functionSignature.getParamTypeList();
180181
List<ExprType> targetTypes = resolvedSignature.getKey().getParamTypeList();
181182
FunctionBuilder funcBuilder = resolvedSignature.getValue();
182-
if (isCastFunction(functionName) || sourceTypes.equals(targetTypes)) {
183+
if (isCastFunction(functionName)
184+
|| isVarArgFunction(targetTypes)
185+
|| sourceTypes.equals(targetTypes)) {
183186
return funcBuilder;
184187
}
185188
return castArguments(sourceTypes,
@@ -230,4 +233,8 @@ private Function<FunctionProperties, Expression> cast(Expression arg, ExprType t
230233
return functionProperties -> (Expression) compile(functionProperties,
231234
castFunctionName, List.of(arg));
232235
}
236+
237+
private boolean isVarArgFunction(List<ExprType> argTypes) {
238+
return argTypes.size() == 1 && argTypes.get(0) == ARRAY;
239+
}
233240
}

core/src/main/java/org/opensearch/sql/expression/function/FunctionSignature.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package org.opensearch.sql.expression.function;
77

8+
import static org.opensearch.sql.data.type.ExprCoreType.ARRAY;
9+
810
import java.util.List;
911
import java.util.stream.Collectors;
1012
import lombok.EqualsAndHashCode;
@@ -37,6 +39,11 @@ public int match(FunctionSignature functionSignature) {
3739
List<ExprType> functionTypeList = functionSignature.getParamTypeList();
3840
if (!functionName.equals(functionSignature.getFunctionName())
3941
|| paramTypeList.size() != functionTypeList.size()) {
42+
43+
// TODO: improve to support regular and array type mixed, ex. func(int,string,array)
44+
if (functionTypeList.size() == 1 && functionTypeList.get(0) == ARRAY) {
45+
return EXACTLY_MATCH;
46+
}
4047
return NOT_MATCH;
4148
}
4249

core/src/main/java/org/opensearch/sql/expression/text/TextFunction.java

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,30 @@
66

77
package org.opensearch.sql.expression.text;
88

9+
import static org.opensearch.sql.data.type.ExprCoreType.ARRAY;
910
import static org.opensearch.sql.data.type.ExprCoreType.INTEGER;
1011
import static org.opensearch.sql.data.type.ExprCoreType.STRING;
1112
import static org.opensearch.sql.expression.function.FunctionDSL.define;
1213
import static org.opensearch.sql.expression.function.FunctionDSL.impl;
1314
import static org.opensearch.sql.expression.function.FunctionDSL.nullMissingHandling;
1415

16+
import java.util.Collections;
17+
import java.util.stream.Collectors;
1518
import lombok.experimental.UtilityClass;
19+
import org.apache.commons.lang3.tuple.Pair;
20+
import org.opensearch.sql.data.model.ExprCollectionValue;
1621
import org.opensearch.sql.data.model.ExprIntegerValue;
1722
import org.opensearch.sql.data.model.ExprStringValue;
1823
import org.opensearch.sql.data.model.ExprValue;
24+
import org.opensearch.sql.data.type.ExprType;
25+
import org.opensearch.sql.expression.Expression;
26+
import org.opensearch.sql.expression.FunctionExpression;
27+
import org.opensearch.sql.expression.env.Environment;
1928
import org.opensearch.sql.expression.function.BuiltinFunctionName;
2029
import org.opensearch.sql.expression.function.BuiltinFunctionRepository;
2130
import org.opensearch.sql.expression.function.DefaultFunctionResolver;
2231
import org.opensearch.sql.expression.function.FunctionName;
32+
import org.opensearch.sql.expression.function.FunctionSignature;
2333
import org.opensearch.sql.expression.function.SerializableBiFunction;
2434
import org.opensearch.sql.expression.function.SerializableTriFunction;
2535

@@ -148,9 +158,26 @@ private DefaultFunctionResolver upper() {
148158
* (STRING, STRING) -> STRING
149159
*/
150160
private DefaultFunctionResolver concat() {
151-
return define(BuiltinFunctionName.CONCAT.getName(),
152-
impl(nullMissingHandling((str1, str2) ->
153-
new ExprStringValue(str1.stringValue() + str2.stringValue())), STRING, STRING, STRING));
161+
FunctionName concatFuncName = BuiltinFunctionName.CONCAT.getName();
162+
return define(concatFuncName, funcName ->
163+
Pair.of(
164+
new FunctionSignature(concatFuncName, Collections.singletonList(ARRAY)),
165+
(funcProp, args) -> new FunctionExpression(funcName, args) {
166+
@Override
167+
public ExprValue valueOf(Environment<Expression, ExprValue> valueEnv) {
168+
return new ExprStringValue(
169+
args.stream()
170+
.map(arg -> arg.valueOf(valueEnv))
171+
.map(argVal -> String.valueOf(argVal.value()))
172+
.collect(Collectors.joining()));
173+
}
174+
175+
@Override
176+
public ExprType type() {
177+
return STRING;
178+
}
179+
}
180+
));
154181
}
155182

156183
/**

0 commit comments

Comments
 (0)