You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2024/06/27 12:56:46 UTC
(iotdb) branch NewDataTypeSupport created (now 9e648fff9d0)
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a change to branch NewDataTypeSupport
in repository https://gitbox.apache.org/repos/asf/iotdb.git
at 9e648fff9d0 support new data type
This branch includes the following new commits:
new 9e648fff9d0 support new data type
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(iotdb) 01/01: support new data type
Posted by ja...@apache.org.
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 <ja...@gmail.com>
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: