This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch NewDataTypeSupport in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9e648fff9d0cde50f7f57ff60847d1a6f7d794f0 Author: JackieTien97 <[email protected]> AuthorDate: Thu Jun 27 20:56:32 2024 +0800 support new data type --- .../load/subscriber/NodeStatisticsChangeEvent.java | 31 ----------------- .../relational/ColumnTransformerBuilder.java | 39 +++++++++++----------- .../relational/analyzer/ExpressionAnalyzer.java | 8 ++--- .../predicate/ConvertPredicateToFilterVisitor.java | 8 +++++ .../plan/relational/metadata/ColumnSchema.java | 12 +++++++ .../relational/metadata/TableMetadataImpl.java | 33 ++++++++++-------- .../plan/relational/planner/LogicalPlanner.java | 27 ++------------- .../plan/relational/type/InternalTypeManager.java | 16 +++++++++ .../binary/CompareBinaryColumnTransformer.java | 4 ++- .../ternary/CompareTernaryColumnTransformer.java | 9 ++--- .../dag/column/unary/InColumnTransformer.java | 5 +++ .../dag/column/unary/RegularColumnTransformer.java | 5 +-- .../scalar/CastFunctionColumnTransformer.java | 38 +++++++++++++++++++++ 13 files changed, 134 insertions(+), 101 deletions(-) diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java index fc20b510bed..11da0dc2998 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/subscriber/NodeStatisticsChangeEvent.java @@ -21,15 +21,6 @@ package org.apache.iotdb.confignode.manager.load.subscriber; import org.apache.iotdb.confignode.manager.load.cache.node.NodeStatistics; -import org.apache.tsfile.read.common.type.BinaryType; -import org.apache.tsfile.read.common.type.BooleanType; -import org.apache.tsfile.read.common.type.DoubleType; -import org.apache.tsfile.read.common.type.FloatType; -import org.apache.tsfile.read.common.type.IntType; -import org.apache.tsfile.read.common.type.LongType; -import org.apache.tsfile.read.common.type.Type; -import org.apache.tsfile.read.common.type.TypeEnum; -import org.apache.tsfile.read.common.type.UnknownType; import org.apache.tsfile.utils.Pair; import java.util.Map; @@ -48,26 +39,4 @@ public class NodeStatisticsChangeEvent { public Map<Integer, Pair<NodeStatistics, NodeStatistics>> getDifferentNodeStatisticsMap() { return differentNodeStatisticsMap; } - - public static Type getType(TypeEnum typeEnum) { - switch (typeEnum) { - case INT32: - return IntType.getInstance(); - case INT64: - return LongType.getInstance(); - case FLOAT: - return FloatType.getInstance(); - case DOUBLE: - return DoubleType.getInstance(); - case BOOLEAN: - return BooleanType.getInstance(); - case TEXT: - return BinaryType.getInstance(); - case UNKNOWN: - return UnknownType.getInstance(); - default: - throw new UnsupportedOperationException( - String.format("Invalid TypeEnum for TypeFactory: %s", typeEnum)); - } - } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java index c5c656c07ab..c003fabd2bc 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java @@ -116,10 +116,10 @@ import static com.google.common.base.Preconditions.checkArgument; import static org.apache.iotdb.db.queryengine.plan.relational.analyzer.predicate.PredicatePushIntoMetadataChecker.isStringLiteral; import static org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager.getTSDataType; import static org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignatureTranslator.toTypeSignature; -import static org.apache.tsfile.read.common.type.BinaryType.TEXT; import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN; import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE; import static org.apache.tsfile.read.common.type.LongType.INT64; +import static org.apache.tsfile.read.common.type.StringType.STRING; import static org.apache.tsfile.utils.RegexUtils.compileRegex; import static org.apache.tsfile.utils.RegexUtils.parseLikePatternToRegex; @@ -298,7 +298,7 @@ public class ColumnTransformerBuilder e -> { ConstantColumnTransformer columnTransformer = new ConstantColumnTransformer( - TEXT, + STRING, new BinaryColumn( 1, Optional.empty(), @@ -424,7 +424,7 @@ public class ColumnTransformerBuilder e -> { ConstantColumnTransformer columnTransformer = new ConstantColumnTransformer( - TEXT, + STRING, new BinaryColumn( 1, Optional.empty(), @@ -459,7 +459,7 @@ public class ColumnTransformerBuilder e -> { ConstantColumnTransformer columnTransformer = new ConstantColumnTransformer( - TEXT, + STRING, new BinaryColumn( 1, Optional.empty(), @@ -528,57 +528,56 @@ public class ColumnTransformerBuilder return new RoundFunctionColumnTransformer( DOUBLE, this.process(children.get(0), context), places); } else if (BuiltinScalarFunction.REPLACE.getFunctionName().equalsIgnoreCase(functionName)) { + ColumnTransformer first = this.process(children.get(0), context); if (children.size() == 2) { if (isStringLiteral(children.get(1))) { return new ReplaceFunctionColumnTransformer( - TEXT, - this.process(children.get(0), context), - ((StringLiteral) children.get(1)).getValue(), - ""); + first.getType(), first, ((StringLiteral) children.get(1)).getValue(), ""); } else { return new Replace2ColumnTransformer( - TEXT, this.process(children.get(0), context), this.process(children.get(1), context)); + first.getType(), first, this.process(children.get(1), context)); } } else { // size == 3 if (isStringLiteral(children.get(1)) && isStringLiteral(children.get(2))) { return new ReplaceFunctionColumnTransformer( - TEXT, - this.process(children.get(0), context), + first.getType(), + first, ((StringLiteral) children.get(1)).getValue(), ((StringLiteral) children.get(2)).getValue()); } else { return new Replace3ColumnTransformer( - TEXT, - this.process(children.get(0), context), + first.getType(), + first, this.process(children.get(1), context), this.process(children.get(2), context)); } } } else if (BuiltinScalarFunction.SUBSTRING.getFunctionName().equalsIgnoreCase(functionName)) { + ColumnTransformer first = this.process(children.get(0), context); if (children.size() == 2) { if (isLongLiteral(children.get(1))) { return new SubStringFunctionColumnTransformer( - TEXT, - this.process(children.get(0), context), + first.getType(), + first, (int) ((LongLiteral) children.get(1)).getParsedValue(), Integer.MAX_VALUE); } else { return new SubString2ColumnTransformer( - TEXT, this.process(children.get(0), context), this.process(children.get(1), context)); + first.getType(), first, this.process(children.get(1), context)); } } else { // size == 3 if (isLongLiteral(children.get(1)) && isLongLiteral(children.get(2))) { return new SubStringFunctionColumnTransformer( - TEXT, - this.process(children.get(0), context), + first.getType(), + first, (int) ((LongLiteral) children.get(1)).getParsedValue(), (int) ((LongLiteral) children.get(2)).getParsedValue()); } else { return new SubString3ColumnTransformer( - TEXT, - this.process(children.get(0), context), + first.getType(), + first, this.process(children.get(1), context), this.process(children.get(2), context)); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java index f5969d4e40d..27cae5a407c 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/ExpressionAnalyzer.java @@ -105,12 +105,12 @@ import static java.util.Collections.unmodifiableSet; import static java.util.Objects.requireNonNull; import static org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DereferenceExpression.isQualifiedAllFieldsReference; import static org.apache.iotdb.db.queryengine.plan.relational.type.TypeSignatureTranslator.toTypeSignature; -import static org.apache.tsfile.read.common.type.BinaryType.TEXT; import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN; import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE; import static org.apache.tsfile.read.common.type.FloatType.FLOAT; import static org.apache.tsfile.read.common.type.IntType.INT32; import static org.apache.tsfile.read.common.type.LongType.INT64; +import static org.apache.tsfile.read.common.type.StringType.STRING; import static org.apache.tsfile.read.common.type.UnknownType.UNKNOWN; public class ExpressionAnalyzer { @@ -682,7 +682,7 @@ public class ExpressionAnalyzer { @Override protected Type visitStringLiteral( StringLiteral node, StackableAstVisitorContext<Context> context) { - return setExpressionType(node, TEXT); + return setExpressionType(node, STRING); } @Override @@ -799,12 +799,12 @@ public class ExpressionAnalyzer { @Override protected Type visitCurrentDatabase( CurrentDatabase node, StackableAstVisitorContext<Context> context) { - return setExpressionType(node, TEXT); + return setExpressionType(node, STRING); } @Override protected Type visitCurrentUser(CurrentUser node, StackableAstVisitorContext<Context> context) { - return setExpressionType(node, TEXT); + return setExpressionType(node, STRING); } @Override diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java index 434785863f0..3c520aae3f7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/predicate/ConvertPredicateToFilterVisitor.java @@ -23,6 +23,7 @@ import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; import org.apache.iotdb.db.queryengine.plan.relational.metadata.ColumnSchema; import org.apache.iotdb.db.queryengine.plan.relational.planner.Symbol; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BetweenPredicate; +import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BinaryLiteral; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BooleanLiteral; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ComparisonExpression; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DoubleLiteral; @@ -164,7 +165,10 @@ public class ConvertPredicateToFilterVisitor case BOOLEAN: return (T) Boolean.valueOf(getBooleanValue(value)); case TEXT: + case STRING: return (T) new Binary(getStringValue(value), TSFileConfig.STRING_CHARSET); + case BLOB: + return (T) new Binary(getBlobValue(value)); default: throw new UnsupportedOperationException( String.format("Unsupported data type %s", dataType)); @@ -333,6 +337,10 @@ public class ConvertPredicateToFilterVisitor return ((StringLiteral) expression).getValue(); } + public static byte[] getBlobValue(Expression expression) { + return ((BinaryLiteral) expression).getValue(); + } + public static class Context { private final Map<String, Integer> measuremrntsMap; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java index bb460c61423..36afc7d1461 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/ColumnSchema.java @@ -22,9 +22,13 @@ package org.apache.iotdb.db.queryengine.plan.relational.metadata; import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory; import org.apache.tsfile.read.common.type.BinaryType; +import org.apache.tsfile.read.common.type.BlobType; import org.apache.tsfile.read.common.type.BooleanType; +import org.apache.tsfile.read.common.type.DateType; import org.apache.tsfile.read.common.type.DoubleType; import org.apache.tsfile.read.common.type.FloatType; +import org.apache.tsfile.read.common.type.StringType; +import org.apache.tsfile.read.common.type.TimestampType; import org.apache.tsfile.read.common.type.Type; import org.apache.tsfile.read.common.type.TypeEnum; import org.apache.tsfile.read.common.type.UnknownType; @@ -138,6 +142,14 @@ public class ColumnSchema { return DoubleType.DOUBLE; case TEXT: return BinaryType.TEXT; + case STRING: + return StringType.STRING; + case BLOB: + return BlobType.BLOB; + case TIMESTAMP: + return TimestampType.TIMESTAMP; + case DATE: + return DateType.DATE; default: return UnknownType.UNKNOWN; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java index 16a1d2df8ee..f3b46fced97 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java @@ -44,6 +44,7 @@ import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; import org.apache.iotdb.db.utils.constant.SqlConstant; import org.apache.tsfile.file.metadata.IDeviceID; +import org.apache.tsfile.read.common.type.StringType; import org.apache.tsfile.read.common.type.Type; import org.apache.tsfile.read.common.type.TypeFactory; @@ -164,19 +165,19 @@ public class TableMetadataImpl implements Metadata { return DOUBLE; } else if (BuiltinScalarFunction.REPLACE.getFunctionName().equalsIgnoreCase(functionName)) { - if (!isTwoTextType(argumentTypes) && !isThreeTextType(argumentTypes)) { + if (!isTwoCharType(argumentTypes) && !isThreeCharType(argumentTypes)) { throw new SemanticException( "Scalar function: " + functionName.toLowerCase(Locale.ENGLISH) + " only supports text data type."); } - return TEXT; + return argumentTypes.get(0); } else if (BuiltinScalarFunction.SUBSTRING.getFunctionName().equalsIgnoreCase(functionName)) { if (!(argumentTypes.size() == 2 - && TEXT.equals(argumentTypes.get(0)) + && isCharType(argumentTypes.get(0)) && isNumericType(argumentTypes.get(1))) && !(argumentTypes.size() == 3 - && TEXT.equals(argumentTypes.get(0)) + && isCharType(argumentTypes.get(0)) && isNumericType(argumentTypes.get(1)) && isNumericType(argumentTypes.get(2)))) { throw new SemanticException( @@ -184,7 +185,7 @@ public class TableMetadataImpl implements Metadata { + functionName.toLowerCase(Locale.ENGLISH) + " only supports text data type."); } - return TEXT; + return argumentTypes.get(0); } // builtin aggregation function @@ -368,21 +369,25 @@ public class TableMetadataImpl implements Metadata { return argumentTypes.size() == 1 && BOOLEAN.equals(argumentTypes.get(0)); } - public static boolean isOneTextType(List<? extends Type> argumentTypes) { - return argumentTypes.size() == 1 && TEXT.equals(argumentTypes.get(0)); + public static boolean isOneCharType(List<? extends Type> argumentTypes) { + return argumentTypes.size() == 1 && isCharType(argumentTypes.get(0)); } - public static boolean isTwoTextType(List<? extends Type> argumentTypes) { + public static boolean isTwoCharType(List<? extends Type> argumentTypes) { return argumentTypes.size() == 2 - && TEXT.equals(argumentTypes.get(0)) - && TEXT.equals(argumentTypes.get(1)); + && isCharType(argumentTypes.get(0)) + && isCharType(argumentTypes.get(1)); } - public static boolean isThreeTextType(List<? extends Type> argumentTypes) { + public static boolean isThreeCharType(List<? extends Type> argumentTypes) { return argumentTypes.size() == 3 - && TEXT.equals(argumentTypes.get(0)) - && TEXT.equals(argumentTypes.get(1)) - && TEXT.equals(argumentTypes.get(2)); + && isCharType(argumentTypes.get(0)) + && isCharType(argumentTypes.get(1)) + && isCharType(argumentTypes.get(2)); + } + + public static boolean isCharType(Type type) { + return TEXT.equals(type) || StringType.STRING.equals(type); } public static boolean isNumericType(Type type) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java index 987afe90162..76d76fd000a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/LogicalPlanner.java @@ -50,9 +50,6 @@ import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.type.Type; -import org.apache.tsfile.write.UnSupportedDataTypeException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,6 +59,7 @@ import java.util.List; import static java.util.Objects.requireNonNull; import static org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING; +import static org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager.getTSDataType; public class LogicalPlanner { private static final Logger LOG = LoggerFactory.getLogger(LogicalPlanner.class); @@ -140,8 +138,7 @@ public class LogicalPlanner { outputs.add(symbol); if (!TIMESTAMP_EXPRESSION_STRING.equalsIgnoreCase(name)) { - columnHeaders.add( - new ColumnHeader(symbol.getName(), transferTypeToTsDataType(field.getType()))); + columnHeaders.add(new ColumnHeader(symbol.getName(), getTSDataType(field.getType()))); } columnNumber++; @@ -169,26 +166,6 @@ public class LogicalPlanner { return new RelationPlanner(analysis, symbolAllocator, context, sessionInfo, ImmutableMap.of()); } - public TSDataType transferTypeToTsDataType(Type type) { - switch (type.getTypeEnum()) { - case INT32: - return TSDataType.INT32; - case INT64: - return TSDataType.INT64; - case BOOLEAN: - return TSDataType.BOOLEAN; - case FLOAT: - return TSDataType.FLOAT; - case DOUBLE: - return TSDataType.DOUBLE; - case TEXT: - return TSDataType.TEXT; - default: - throw new UnSupportedDataTypeException( - String.format("Cannot transfer type: %s to TSDataType.", type.getTypeEnum())); - } - } - private enum Stage { CREATED, OPTIMIZED, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java index 26315889460..72defb5155e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/type/InternalTypeManager.java @@ -28,11 +28,15 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import static org.apache.tsfile.read.common.type.BinaryType.TEXT; +import static org.apache.tsfile.read.common.type.BlobType.BLOB; import static org.apache.tsfile.read.common.type.BooleanType.BOOLEAN; +import static org.apache.tsfile.read.common.type.DateType.DATE; import static org.apache.tsfile.read.common.type.DoubleType.DOUBLE; import static org.apache.tsfile.read.common.type.FloatType.FLOAT; import static org.apache.tsfile.read.common.type.IntType.INT32; import static org.apache.tsfile.read.common.type.LongType.INT64; +import static org.apache.tsfile.read.common.type.StringType.STRING; +import static org.apache.tsfile.read.common.type.TimestampType.TIMESTAMP; public class InternalTypeManager implements TypeManager { @@ -45,6 +49,10 @@ public class InternalTypeManager implements TypeManager { types.put(new TypeSignature(TypeEnum.INT32.name().toLowerCase(Locale.ENGLISH)), INT32); types.put(new TypeSignature(TypeEnum.BOOLEAN.name().toLowerCase(Locale.ENGLISH)), BOOLEAN); types.put(new TypeSignature(TypeEnum.TEXT.name().toLowerCase(Locale.ENGLISH)), TEXT); + types.put(new TypeSignature(TypeEnum.STRING.name().toLowerCase(Locale.ENGLISH)), STRING); + types.put(new TypeSignature(TypeEnum.BLOB.name().toLowerCase(Locale.ENGLISH)), BLOB); + types.put(new TypeSignature(TypeEnum.DATE.name().toLowerCase(Locale.ENGLISH)), DATE); + types.put(new TypeSignature(TypeEnum.TIMESTAMP.name().toLowerCase(Locale.ENGLISH)), TIMESTAMP); } @Override @@ -83,6 +91,14 @@ public class InternalTypeManager implements TypeManager { return TSDataType.BOOLEAN; case UNKNOWN: return TSDataType.UNKNOWN; + case DATE: + return TSDataType.DATE; + case TIMESTAMP: + return TSDataType.TIMESTAMP; + case BLOB: + return TSDataType.BLOB; + case STRING: + return TSDataType.STRING; default: throw new IllegalArgumentException(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java index 2ff1fd3daa9..17c4abe41e7 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareBinaryColumnTransformer.java @@ -28,6 +28,8 @@ import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn; import org.apache.tsfile.read.common.type.Type; import org.apache.tsfile.read.common.type.TypeEnum; +import static org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType; + public abstract class CompareBinaryColumnTransformer extends BinaryColumnTransformer { protected CompareBinaryColumnTransformer( @@ -49,7 +51,7 @@ public abstract class CompareBinaryColumnTransformer extends BinaryColumnTransfo if (!leftColumn.isNull(i) && !rightColumn.isNull(i)) { boolean flag = false; // compare binary type - if (TypeEnum.TEXT.equals(leftTransformer.getType().getTypeEnum())) { + if (isCharType(leftTransformer.getType())) { flag = transform( TransformUtils.compare( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java index f4401c37a2a..86ab67d5cd1 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/CompareTernaryColumnTransformer.java @@ -22,7 +22,8 @@ package org.apache.iotdb.db.queryengine.transformation.dag.column.ternary; import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer; import org.apache.tsfile.read.common.type.Type; -import org.apache.tsfile.read.common.type.TypeEnum; + +import static org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType; public abstract class CompareTernaryColumnTransformer extends TernaryColumnTransformer { protected CompareTernaryColumnTransformer( @@ -38,9 +39,9 @@ public abstract class CompareTernaryColumnTransformer extends TernaryColumnTrans if (firstColumnTransformer.isReturnTypeNumeric() && secondColumnTransformer.isReturnTypeNumeric() && thirdColumnTransformer.isReturnTypeNumeric() - || firstColumnTransformer.typeEquals(TypeEnum.TEXT) - && secondColumnTransformer.typeEquals(TypeEnum.TEXT) - && thirdColumnTransformer.typeEquals(TypeEnum.TEXT)) { + || isCharType(firstColumnTransformer.getType()) + && isCharType(secondColumnTransformer.getType()) + && isCharType(thirdColumnTransformer.getType())) { return; } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java index 0ff3625ffd9..cdc639143ea 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/InColumnTransformer.java @@ -80,9 +80,11 @@ public class InColumnTransformer extends UnaryColumnTransformer { if (!column.isNull(i)) { switch (childType) { case INT32: + case DATE: returnType.writeBoolean(columnBuilder, satisfy.of(column.getInt(i))); break; case INT64: + case TIMESTAMP: returnType.writeBoolean(columnBuilder, satisfy.of(column.getLong(i))); break; case FLOAT: @@ -94,6 +96,7 @@ public class InColumnTransformer extends UnaryColumnTransformer { case BOOLEAN: returnType.writeBoolean(columnBuilder, satisfy.of(column.getBoolean(i))); break; + case STRING: case TEXT: returnType.writeBoolean( columnBuilder, @@ -125,6 +128,7 @@ public class InColumnTransformer extends UnaryColumnTransformer { } break; case INT64: + case TIMESTAMP: longSet = new HashSet<>(); for (String value : values) { try { @@ -161,6 +165,7 @@ public class InColumnTransformer extends UnaryColumnTransformer { } break; case TEXT: + case STRING: stringSet = values; break; default: diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java index 5c86d9def0e..9f06b456190 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/RegularColumnTransformer.java @@ -25,10 +25,11 @@ import org.apache.tsfile.block.column.Column; import org.apache.tsfile.block.column.ColumnBuilder; import org.apache.tsfile.common.conf.TSFileConfig; import org.apache.tsfile.read.common.type.Type; -import org.apache.tsfile.read.common.type.TypeEnum; import java.util.regex.Pattern; +import static org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType; + public class RegularColumnTransformer extends UnaryColumnTransformer { private final Pattern pattern; @@ -59,7 +60,7 @@ public class RegularColumnTransformer extends UnaryColumnTransformer { @Override protected void checkType() { - if (!childColumnTransformer.typeEquals(TypeEnum.TEXT)) { + if (!isCharType(childColumnTransformer.getType())) { throw new UnsupportedOperationException( "Unsupported Type: " + childColumnTransformer.getType().getTypeEnum()); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java index b123975cc68..7ef2b156935 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/CastFunctionColumnTransformer.java @@ -47,9 +47,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { if (!column.isNull(i)) { switch (sourceType) { case INT32: + case DATE: cast(columnBuilder, childType.getInt(column, i)); break; case INT64: + case TIMESTAMP: cast(columnBuilder, childType.getLong(column, i)); break; case FLOAT: @@ -62,6 +64,8 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { cast(columnBuilder, childType.getBoolean(column, i)); break; case TEXT: + case STRING: + case BLOB: cast(columnBuilder, childType.getBinary(column, i)); break; default: @@ -79,9 +83,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { private void cast(ColumnBuilder columnBuilder, int value) { switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, value); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, value); break; case FLOAT: @@ -94,8 +100,12 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, value != 0); break; case TEXT: + case STRING: returnType.writeBinary(columnBuilder, BytesUtils.valueOf(String.valueOf(value))); break; + case BLOB: + returnType.writeBinary(columnBuilder, new Binary(BytesUtils.intToBytes(value))); + break; default: throw new UnsupportedOperationException(String.format(ERROR_MSG, returnType.getTypeEnum())); } @@ -104,9 +114,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { private void cast(ColumnBuilder columnBuilder, long value) { switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, (CastFunctionHelper.castLongToInt(value))); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, value); break; case FLOAT: @@ -119,8 +131,12 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, value != 0L); break; case TEXT: + case STRING: returnType.writeBinary(columnBuilder, BytesUtils.valueOf(String.valueOf(value))); break; + case BLOB: + returnType.writeBinary(columnBuilder, new Binary(BytesUtils.longToBytes(value))); + break; default: throw new UnsupportedOperationException(String.format(ERROR_MSG, returnType.getTypeEnum())); } @@ -129,9 +145,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { private void cast(ColumnBuilder columnBuilder, float value) { switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, CastFunctionHelper.castFloatToInt(value)); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, CastFunctionHelper.castFloatToLong(value)); break; case FLOAT: @@ -144,8 +162,12 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, value != 0.0f); break; case TEXT: + case STRING: returnType.writeBinary(columnBuilder, BytesUtils.valueOf(String.valueOf(value))); break; + case BLOB: + returnType.writeBinary(columnBuilder, new Binary(BytesUtils.floatToBytes(value))); + break; default: throw new UnsupportedOperationException(String.format(ERROR_MSG, returnType.getTypeEnum())); } @@ -154,9 +176,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { private void cast(ColumnBuilder columnBuilder, double value) { switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, CastFunctionHelper.castDoubleToInt(value)); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, CastFunctionHelper.castDoubleToLong(value)); break; case FLOAT: @@ -169,8 +193,12 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, value != 0.0); break; case TEXT: + case STRING: returnType.writeBinary(columnBuilder, BytesUtils.valueOf(String.valueOf(value))); break; + case BLOB: + returnType.writeBinary(columnBuilder, new Binary(BytesUtils.doubleToBytes(value))); + break; default: throw new UnsupportedOperationException(String.format(ERROR_MSG, returnType.getTypeEnum())); } @@ -179,9 +207,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { private void cast(ColumnBuilder columnBuilder, boolean value) { switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, value ? 1 : 0); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, value ? 1L : 0); break; case FLOAT: @@ -194,8 +224,12 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, value); break; case TEXT: + case STRING: returnType.writeBinary(columnBuilder, BytesUtils.valueOf(String.valueOf(value))); break; + case BLOB: + returnType.writeBinary(columnBuilder, new Binary(BytesUtils.boolToBytes(value))); + break; default: throw new UnsupportedOperationException(String.format(ERROR_MSG, returnType.getTypeEnum())); } @@ -205,9 +239,11 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { String stringValue = value.getStringValue(TSFileConfig.STRING_CHARSET); switch (returnType.getTypeEnum()) { case INT32: + case DATE: returnType.writeInt(columnBuilder, Integer.parseInt(stringValue)); break; case INT64: + case TIMESTAMP: returnType.writeLong(columnBuilder, Long.parseLong(stringValue)); break; case FLOAT: @@ -220,6 +256,8 @@ public class CastFunctionColumnTransformer extends UnaryColumnTransformer { returnType.writeBoolean(columnBuilder, CastFunctionHelper.castTextToBoolean(stringValue)); break; case TEXT: + case STRING: + case BLOB: returnType.writeBinary(columnBuilder, value); break; default:
