This is an automated email from the ASF dual-hosted git repository. chenyz pushed a commit to branch udsf in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit c215e63e0bedd5d80318d8e05814b40f0fcb5efc Author: Chen YZ <[email protected]> AuthorDate: Wed Nov 20 11:10:44 2024 +0800 fix it --- .../apache/iotdb/udf/ScalarFunctionExample.java | 44 ++++++++++ .../confignode/it/IoTDBConfigNodeSnapshotIT.java | 2 + .../iotdb/udf/api/relational/access/Record.java | 9 ++ .../execution/aggregation/UDAFAccumulator.java | 3 +- .../execution/config/TableConfigTaskVisitor.java | 2 +- .../config/executor/ClusterConfigTaskExecutor.java | 12 +-- .../config/metadata/ShowFunctionsTask.java | 96 +++++++++++++++++++++- .../plan/relational/sql/parser/AstBuilder.java | 5 +- .../unary/scalar/TableBuiltinScalarFunction.java | 15 ++++ .../transformation/dag/udf/UDTFExecutor.java | 3 +- .../apache/iotdb/commons/conf/IoTDBConstant.java | 11 +++ .../iotdb/commons/udf/access/RecordIterator.java | 5 ++ .../udf/builtin/UDTFEqualSizeBucketSample.java | 3 +- .../apache/iotdb/commons/udf/builtin/UDTFJexl.java | 3 +- .../apache/iotdb/commons/udf/builtin/UDTFM4.java | 6 +- .../commons/udf/service/UDFManagementService.java | 5 +- 16 files changed, 197 insertions(+), 27 deletions(-) diff --git a/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java b/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java new file mode 100644 index 00000000000..b0718a5fc20 --- /dev/null +++ b/example/udf/src/main/java/org/apache/iotdb/udf/ScalarFunctionExample.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.iotdb.udf; + +import org.apache.iotdb.udf.api.customizer.parameter.FunctionParameters; +import org.apache.iotdb.udf.api.relational.ScalarFunction; +import org.apache.iotdb.udf.api.relational.access.Record; +import org.apache.iotdb.udf.api.type.Type; + +public class ScalarFunctionExample implements ScalarFunction { + @Override + public void validate(FunctionParameters parameters) throws Exception { + if (parameters.getChildExpressionsSize() > 1) { + throw new Exception("Only one child expression is allowed"); + } + } + + @Override + public Type inferOutputType(FunctionParameters parameters) { + return parameters.getChildExpressionDataTypes().get(0); + } + + @Override + public Object evaluate(Record input) throws Exception { + return input.getObject(0); + } +} diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java index 7a9d99006a8..046f3418c0f 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/IoTDBConfigNodeSnapshotIT.java @@ -285,12 +285,14 @@ public class IoTDBConfigNodeSnapshotIT { TCreateFunctionReq createFunctionReq1 = new TCreateFunctionReq("test1", "org.apache.iotdb.udf.UDTFExample", true) + .setModel(Model.TREE) .setJarName(jarName) .setJarFile(jarFile) .setJarMD5(jarMD5); TCreateFunctionReq createFunctionReq2 = new TCreateFunctionReq("test2", "org.apache.iotdb.udf.UDTFExample", true) + .setModel(Model.TREE) .setJarName(jarName) .setJarFile(jarFile) .setJarMD5(jarMD5); diff --git a/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java b/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java index 98d3b6b80c5..e230b8bed37 100644 --- a/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java +++ b/iotdb-api/udf-api/src/main/java/org/apache/iotdb/udf/api/relational/access/Record.java @@ -104,6 +104,15 @@ public interface Record { */ String getString(int columnIndex) throws IOException; + /** + * Returns the object value at the specified column in this row. + * + * @param columnIndex index of the specified column + * @return the object value at the specified column in this row + * @throws IOException if an I/O error occurs + */ + Object getObject(int columnIndex) throws IOException; + /** * Returns the actual data type of the value at the specified column in this row. * diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java index a56d6e9bd03..a0b78cc8cd6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/aggregation/UDAFAccumulator.java @@ -199,8 +199,7 @@ public class UDAFAccumulator implements Accumulator { @Override public TSDataType getFinalType() { - return UDFDataTypeTransformer.transformToTsDataType( - configurations.getOutputDataType()); + return UDFDataTypeTransformer.transformToTsDataType(configurations.getOutputDataType()); } private void onError(String methodName, Exception e) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java index cc514c7c04f..3f74ca1b988 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java @@ -674,7 +674,7 @@ public class TableConfigTaskVisitor extends AstVisitor<IConfigTask, MPPQueryCont @Override protected IConfigTask visitShowFunctions(ShowFunctions node, MPPQueryContext context) { - context.setQueryType(QueryType.WRITE); + context.setQueryType(QueryType.READ); return new ShowFunctionsTask(Model.TABLE); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java index 82476db718a..68421b93094 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -628,8 +628,8 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { getUDFTableResp.getStatus().message, getUDFTableResp.getStatus().code)); return future; } - // convert UDFTable and buildTsBlock - ShowFunctionsTask.buildTsBlock(getUDFTableResp.getAllUDFInformation(), future); + // convert UDFTable and buildTreeModelTsBlock + ShowFunctionsTask.buildTsBlock(model, getUDFTableResp.getAllUDFInformation(), future); } catch (ClientManagerException | TException e) { future.setException(e); } @@ -803,7 +803,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { getTriggerTableResp.getStatus().message, getTriggerTableResp.getStatus().code)); return future; } - // convert triggerTable and buildTsBlock + // convert triggerTable and buildTreeModelTsBlock ShowTriggersTask.buildTsBlock(getTriggerTableResp.getAllTriggerInformation(), future); } catch (ClientManagerException | TException e) { future.setException(e); @@ -978,7 +978,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { getPipePluginTableResp.getStatus().code)); return future; } - // convert PipePluginTable and buildTsBlock + // convert PipePluginTable and buildTreeModelTsBlock ShowPipePluginsTask.buildTsBlock(getPipePluginTableResp.getAllPipePluginMeta(), future); } catch (ClientManagerException | TException e) { future.setException(e); @@ -2826,7 +2826,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { new IoTDBException(showCQResp.getStatus().message, showCQResp.getStatus().code)); return future; } - // convert cqList and buildTsBlock + // convert cqList and buildTreeModelTsBlock ShowContinuousQueriesTask.buildTsBlock(showCQResp.getCqList(), future); } catch (ClientManagerException | TException e) { future.setException(e); @@ -2893,7 +2893,7 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { new IoTDBException(showModelResp.getStatus().message, showModelResp.getStatus().code)); return future; } - // convert model info list and buildTsBlock + // convert model info list and buildTreeModelTsBlock ShowModelsTask.buildTsBlock(showModelResp.getModelInfoList(), future); } catch (ClientManagerException | TException e) { future.setException(e); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java index a0a8506d0b6..3295b20350f 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowFunctionsTask.java @@ -25,6 +25,7 @@ import org.apache.iotdb.commons.udf.UDFType; import org.apache.iotdb.commons.udf.builtin.BuiltinAggregationFunction; import org.apache.iotdb.commons.udf.builtin.BuiltinScalarFunction; import org.apache.iotdb.commons.udf.builtin.BuiltinTimeSeriesGeneratingFunction; +import org.apache.iotdb.commons.udf.utils.TableUDFUtils; import org.apache.iotdb.commons.udf.utils.TreeUDFUtils; import org.apache.iotdb.db.queryengine.common.header.ColumnHeader; import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant; @@ -33,6 +34,8 @@ import org.apache.iotdb.db.queryengine.common.header.DatasetHeaderFactory; import org.apache.iotdb.db.queryengine.plan.execution.config.ConfigTaskResult; import org.apache.iotdb.db.queryengine.plan.execution.config.IConfigTask; import org.apache.iotdb.db.queryengine.plan.execution.config.executor.IConfigTaskExecutor; +import org.apache.iotdb.db.queryengine.plan.relational.metadata.TableBuiltinAggregationFunction; +import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.TableBuiltinScalarFunction; import org.apache.iotdb.rpc.TSStatusCode; import com.google.common.util.concurrent.ListenableFuture; @@ -44,6 +47,7 @@ import org.apache.tsfile.utils.BytesUtils; import java.nio.ByteBuffer; import java.util.ArrayList; +import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.List; @@ -52,12 +56,18 @@ import java.util.stream.Collectors; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_STATE_AVAILABLE; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_STATE_UNAVAILABLE; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_AGG_FUNC; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_SCALAR; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_SCALAR_FUNC; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_TABLE_FUNC; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_BUILTIN_UDTF; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_EXTERNAL_UDAF; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_EXTERNAL_UDTF; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_NATIVE; import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_UNKNOWN; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_AGG_FUNC; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC; +import static org.apache.iotdb.commons.conf.IoTDBConstant.FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC; public class ShowFunctionsTask implements IConfigTask { @@ -69,9 +79,27 @@ public class ShowFunctionsTask implements IConfigTask { BINARY_MAP.put(FUNCTION_TYPE_EXTERNAL_UDTF, BytesUtils.valueOf(FUNCTION_TYPE_EXTERNAL_UDTF)); BINARY_MAP.put(FUNCTION_TYPE_EXTERNAL_UDAF, BytesUtils.valueOf(FUNCTION_TYPE_EXTERNAL_UDAF)); BINARY_MAP.put(FUNCTION_TYPE_BUILTIN_SCALAR, BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_SCALAR)); + + BINARY_MAP.put( + FUNCTION_TYPE_BUILTIN_SCALAR_FUNC, BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_SCALAR_FUNC)); + BINARY_MAP.put( + FUNCTION_TYPE_BUILTIN_AGG_FUNC, BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_AGG_FUNC)); + BINARY_MAP.put( + FUNCTION_TYPE_BUILTIN_TABLE_FUNC, BytesUtils.valueOf(FUNCTION_TYPE_BUILTIN_TABLE_FUNC)); + BINARY_MAP.put( + FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC, + BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC)); + BINARY_MAP.put( + FUNCTION_TYPE_USER_DEFINED_AGG_FUNC, + BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_AGG_FUNC)); + BINARY_MAP.put( + FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC, + BytesUtils.valueOf(FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC)); + BINARY_MAP.put(FUNCTION_TYPE_UNKNOWN, BytesUtils.valueOf(FUNCTION_TYPE_UNKNOWN)); BINARY_MAP.put(FUNCTION_STATE_AVAILABLE, BytesUtils.valueOf(FUNCTION_STATE_AVAILABLE)); BINARY_MAP.put(FUNCTION_STATE_UNAVAILABLE, BytesUtils.valueOf(FUNCTION_STATE_UNAVAILABLE)); + BINARY_MAP.put("", BytesUtils.valueOf("")); } @@ -87,6 +115,48 @@ public class ShowFunctionsTask implements IConfigTask { } public static void buildTsBlock( + Model model, List<ByteBuffer> allUDFInformation, SettableFuture<ConfigTaskResult> future) { + if (Model.TREE.equals(model)) { + buildTreeModelTsBlock(allUDFInformation, future); + } else { + buildTableModelTsBlock(allUDFInformation, future); + } + } + + private static void buildTableModelTsBlock( + List<ByteBuffer> allUDFInformation, SettableFuture<ConfigTaskResult> future) { + List<TSDataType> outputDataTypes = + ColumnHeaderConstant.showFunctionsColumnHeaders.stream() + .map(ColumnHeader::getColumnType) + .collect(Collectors.toList()); + TsBlockBuilder builder = new TsBlockBuilder(outputDataTypes); + List<UDFInformation> udfInformations = new ArrayList<>(); + if (allUDFInformation != null && !allUDFInformation.isEmpty()) { + for (ByteBuffer udfInformationByteBuffer : allUDFInformation) { + UDFInformation udfInformation = UDFInformation.deserialize(udfInformationByteBuffer); + udfInformations.add(udfInformation); + } + } + + udfInformations.sort(Comparator.comparing(UDFInformation::getFunctionName)); + for (UDFInformation udfInformation : udfInformations) { + appendUDFInformation(builder, udfInformation); + } + appendFunctions( + builder, + TableBuiltinScalarFunction.getNativeFunctionNames(), + BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_SCALAR_FUNC), + BINARY_MAP.get(FUNCTION_STATE_AVAILABLE)); + appendFunctions( + builder, + TableBuiltinAggregationFunction.getNativeFunctionNames(), + BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_AGG_FUNC), + BINARY_MAP.get(FUNCTION_STATE_AVAILABLE)); + DatasetHeader datasetHeader = DatasetHeaderFactory.getShowFunctionsHeader(); + future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS, builder.build(), datasetHeader)); + } + + private static void buildTreeModelTsBlock( List<ByteBuffer> allUDFInformation, SettableFuture<ConfigTaskResult> future) { List<TSDataType> outputDataTypes = ColumnHeaderConstant.showFunctionsColumnHeaders.stream() @@ -118,10 +188,25 @@ public class ShowFunctionsTask implements IConfigTask { builder.getColumnBuilder(1).writeBinary(getFunctionType(udfInformation)); builder.getColumnBuilder(2).writeBinary(BytesUtils.valueOf(udfInformation.getClassName())); builder.getColumnBuilder(3).writeBinary(getFunctionState(udfInformation)); - builder.declarePosition(); } + private static void appendFunctions( + TsBlockBuilder builder, + Collection<String> functionNames, + Binary functionType, + Binary functionState) { + final Binary className = BINARY_MAP.get(""); + for (String functionName : functionNames) { + builder.getTimeColumnBuilder().writeLong(0L); + builder.getColumnBuilder(0).writeBinary(BytesUtils.valueOf(functionName.toUpperCase())); + builder.getColumnBuilder(1).writeBinary(functionType); + builder.getColumnBuilder(2).writeBinary(className); + builder.getColumnBuilder(3).writeBinary(functionState); + builder.declarePosition(); + } + } + private static void appendBuiltInTimeSeriesGeneratingFunctions(TsBlockBuilder builder) { final Binary functionType = BINARY_MAP.get(FUNCTION_TYPE_BUILTIN_UDTF); final Binary functionState = BINARY_MAP.get(FUNCTION_STATE_AVAILABLE); @@ -175,6 +260,15 @@ public class ShowFunctionsTask implements IConfigTask { } else if (TreeUDFUtils.isUDAF(udfInformation.getFunctionName())) { return BINARY_MAP.get(FUNCTION_TYPE_EXTERNAL_UDAF); } + } else { + if (TableUDFUtils.tryGetScalarFunction(udfInformation.getFunctionName()) != null) { + return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC); + } else if (TableUDFUtils.tryGetAggregateFunction(udfInformation.getFunctionName()) + != null) { + return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_AGG_FUNC); + } else if (TableUDFUtils.tryGetTableFunction(udfInformation.getFunctionName()) != null) { + return BINARY_MAP.get(FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC); + } } } return BINARY_MAP.get(FUNCTION_TYPE_UNKNOWN); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java index c079a00439a..1a7237d4989 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/sql/parser/AstBuilder.java @@ -166,7 +166,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.util.AstUtil; import org.apache.iotdb.db.queryengine.plan.statement.StatementType; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsStatement; -import org.apache.iotdb.db.queryengine.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.queryengine.plan.statement.sys.FlushStatement; import org.apache.iotdb.db.queryengine.plan.statement.sys.SetConfigurationStatement; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.TableBuiltinScalarFunction; @@ -584,10 +583,10 @@ public class AstBuilder extends RelationalSqlBaseVisitor<Node> { final String udfName = ((Identifier) visit(ctx.udfName)).getValue(); final String className = ((Identifier) visit(ctx.className)).getValue(); if (ctx.uriClause() == null) { - return new CreateFunction(getLocation(ctx),udfName, className); + return new CreateFunction(getLocation(ctx), udfName, className); } else { String uriString = parseAndValidateURI(ctx.uriClause()); - return new CreateFunction(getLocation(ctx),udfName, className, uriString); + return new CreateFunction(getLocation(ctx), udfName, className, uriString); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java index c58182a3f27..237e4e4a793 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/TableBuiltinScalarFunction.java @@ -19,6 +19,11 @@ package org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; + public enum TableBuiltinScalarFunction { DIFF("diff"), CAST("cast"), @@ -70,4 +75,14 @@ public enum TableBuiltinScalarFunction { public String getFunctionName() { return functionName; } + + private static final Set<String> NATIVE_FUNCTION_NAMES = + new HashSet<>( + Arrays.stream(TableBuiltinScalarFunction.values()) + .map(TableBuiltinScalarFunction::getFunctionName) + .collect(Collectors.toList())); + + public static Set<String> getNativeFunctionNames() { + return NATIVE_FUNCTION_NAMES; + } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java index a9ab775360b..f93de5c1dc4 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/udf/UDTFExecutor.java @@ -80,8 +80,7 @@ public class UDTFExecutor { configurations.getAccessStrategy().getAccessStrategyType())) { outputStorage = ElasticSerializableTVList.construct( - UDFDataTypeTransformer.transformToTsDataType( - configurations.getOutputDataType()), + UDFDataTypeTransformer.transformToTsDataType(configurations.getOutputDataType()), queryId, collectorMemoryBudgetInMB, 1); diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java index b3de41b0664..cc6150f3400 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/IoTDBConstant.java @@ -178,12 +178,23 @@ public class IoTDBConstant { public static final String COLUMN_SCHEMA_TEMPLATE = "template name"; + // for tree model public static final String FUNCTION_TYPE_NATIVE = "native"; public static final String FUNCTION_TYPE_BUILTIN_SCALAR = "built-in scalar"; public static final String FUNCTION_TYPE_BUILTIN_UDAF = "built-in UDAF"; public static final String FUNCTION_TYPE_BUILTIN_UDTF = "built-in UDTF"; public static final String FUNCTION_TYPE_EXTERNAL_UDAF = "external UDAF"; public static final String FUNCTION_TYPE_EXTERNAL_UDTF = "external UDTF"; + // for table model + public static final String FUNCTION_TYPE_BUILTIN_SCALAR_FUNC = "built-in scalar function"; + public static final String FUNCTION_TYPE_BUILTIN_AGG_FUNC = "built-in aggregate function"; + public static final String FUNCTION_TYPE_BUILTIN_TABLE_FUNC = "built-in table function"; + public static final String FUNCTION_TYPE_USER_DEFINED_SCALAR_FUNC = + "user-defined scalar function"; + public static final String FUNCTION_TYPE_USER_DEFINED_AGG_FUNC = + "user-defined aggregate function"; + public static final String FUNCTION_TYPE_USER_DEFINED_TABLE_FUNC = "user-defined table function"; + // common public static final String FUNCTION_TYPE_UNKNOWN = "UNKNOWN"; public static final String FUNCTION_STATE_AVAILABLE = "AVAILABLE"; public static final String FUNCTION_STATE_UNAVAILABLE = "UNAVAILABLE"; diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java index 29f473b3c9d..49feb6d6b84 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/access/RecordIterator.java @@ -85,6 +85,11 @@ public class RecordIterator implements Iterator<Record> { return childrenColumns.get(columnIndex).getBinary(index).toString(); } + @Override + public Object getObject(int columnIndex) throws IOException { + return childrenColumns.get(columnIndex).getObject(index); + } + @Override public Type getDataType(int columnIndex) { return UDFDataTypeTransformer.transformToUDFDataType( diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java index d3492ecbe2e..306d35e110f 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFEqualSizeBucketSample.java @@ -45,8 +45,7 @@ public abstract class UDTFEqualSizeBucketSample implements UDTF { "Illegal sample proportion. proportion > 0 and proportion <= 1", proportion); dataType = - UDFDataTypeTransformer.transformToTsDataType( - validator.getParameters().getDataType(0)); + UDFDataTypeTransformer.transformToTsDataType(validator.getParameters().getDataType(0)); bucketSize = (int) (1 / proportion); } } diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java index 404ab2f26e7..d554cfe2572 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFJexl.java @@ -70,8 +70,7 @@ public class UDTFJexl implements UDTF { inputDataType = new TSDataType[inputSeriesNumber]; for (int i = 0; i < inputSeriesNumber; i++) { - inputDataType[i] = - UDFDataTypeTransformer.transformToTsDataType(parameters.getDataType(i)); + inputDataType[i] = UDFDataTypeTransformer.transformToTsDataType(parameters.getDataType(i)); } outputDataType = probeOutputDataType(); diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java index ccbb2848a01..824740b8c9b 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/UDTFM4.java @@ -94,16 +94,14 @@ public class UDTFM4 implements UDTF { } dataType = - UDFDataTypeTransformer.transformToTsDataType( - validator.getParameters().getDataType(0)); + UDFDataTypeTransformer.transformToTsDataType(validator.getParameters().getDataType(0)); } @Override public void beforeStart(UDFParameters parameters, UDTFConfigurations configurations) throws MetadataException { // set data type - configurations.setOutputDataType( - UDFDataTypeTransformer.transformToUDFDataType(dataType)); + configurations.setOutputDataType(UDFDataTypeTransformer.transformToUDFDataType(dataType)); // set access strategy if (accessStrategy == AccessStrategy.SIZE_WINDOW) { diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java index aa3e512294a..bbc7e2b436e 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/service/UDFManagementService.java @@ -224,10 +224,7 @@ public class UDFManagementService { try { return clazz.cast( - udfTable - .getFunctionClass(Model.TREE, functionName) - .getDeclaredConstructor() - .newInstance()); + udfTable.getFunctionClass(model, functionName).getDeclaredConstructor().newInstance()); } catch (InstantiationException | InvocationTargetException | NoSuchMethodException
