This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch ty/TableModelGrammar
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/ty/TableModelGrammar by this
push:
new 0bef1d93f86 Support new data type in table branch
0bef1d93f86 is described below
commit 0bef1d93f865d1c7b0dc65b3ccc0bb3b2fb42077
Author: Jackie Tien <[email protected]>
AuthorDate: Fri Jun 28 10:35:17 2024 +0800
Support new data type in table branch
---
.../load/subscriber/NodeStatisticsChangeEvent.java | 31 ------------
.../relational/ColumnTransformerBuilder.java | 55 +++++++++++++---------
.../relational/analyzer/ExpressionAnalyzer.java | 43 +++++++----------
.../predicate/ConvertPredicateToFilterVisitor.java | 8 ++++
.../plan/relational/metadata/ColumnSchema.java | 12 +++++
.../relational/metadata/TableMetadataImpl.java | 35 ++++++++------
.../plan/relational/planner/LogicalPlanner.java | 27 +----------
.../plan/relational/type/InternalTypeManager.java | 16 +++++++
.../dag/column/CaseWhenThenColumnTransformer.java | 13 ++---
.../dag/column/ColumnTransformer.java | 8 ++--
.../binary/CompareBinaryColumnTransformer.java | 4 +-
.../binary/CompareEqualToColumnTransformer.java | 12 ++---
.../binary/CompareNonEqualColumnTransformer.java | 12 ++---
.../column/ternary/BetweenColumnTransformer.java | 5 +-
.../ternary/CompareTernaryColumnTransformer.java | 9 ++--
.../dag/column/unary/InColumnTransformer.java | 8 ++++
.../dag/column/unary/RegularColumnTransformer.java | 5 +-
.../scalar/CastFunctionColumnTransformer.java | 38 +++++++++++++++
.../execution/operator/OperatorMemoryTest.java | 19 +++-----
.../plan/relational/analyzer/TestMatadata.java | 42 ++---------------
20 files changed, 201 insertions(+), 201 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..d95391632e7 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,11 @@ 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.BlobType.BLOB;
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;
@@ -287,7 +288,20 @@ public class ColumnTransformerBuilder
@Override
protected ColumnTransformer visitBinaryLiteral(BinaryLiteral node, Context
context) {
- throw new UnsupportedOperationException();
+ ColumnTransformer res =
+ context.cache.computeIfAbsent(
+ node,
+ e -> {
+ ConstantColumnTransformer columnTransformer =
+ new ConstantColumnTransformer(
+ BLOB,
+ new BinaryColumn(
+ 1, Optional.empty(), new Binary[] {new
Binary(node.getValue())}));
+ context.leafList.add(columnTransformer);
+ return columnTransformer;
+ });
+ res.addReferenceCount();
+ return res;
}
@Override
@@ -298,7 +312,7 @@ public class ColumnTransformerBuilder
e -> {
ConstantColumnTransformer columnTransformer =
new ConstantColumnTransformer(
- TEXT,
+ STRING,
new BinaryColumn(
1,
Optional.empty(),
@@ -424,7 +438,7 @@ public class ColumnTransformerBuilder
e -> {
ConstantColumnTransformer columnTransformer =
new ConstantColumnTransformer(
- TEXT,
+ STRING,
new BinaryColumn(
1,
Optional.empty(),
@@ -459,7 +473,7 @@ public class ColumnTransformerBuilder
e -> {
ConstantColumnTransformer columnTransformer =
new ConstantColumnTransformer(
- TEXT,
+ STRING,
new BinaryColumn(
1,
Optional.empty(),
@@ -528,57 +542,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..ac712bbf8c1 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
@@ -79,7 +79,6 @@ import com.google.common.collect.HashMultimap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.Multimap;
-import org.apache.tsfile.read.common.type.BinaryType;
import org.apache.tsfile.read.common.type.RowType;
import org.apache.tsfile.read.common.type.Type;
import org.apache.tsfile.read.common.type.UnknownType;
@@ -87,6 +86,7 @@ import org.apache.tsfile.read.common.type.UnknownType;
import javax.annotation.Nullable;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
@@ -103,14 +103,17 @@ import static java.lang.String.format;
import static java.util.Collections.unmodifiableMap;
import static java.util.Collections.unmodifiableSet;
import static java.util.Objects.requireNonNull;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isNumericType;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
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.BlobType.BLOB;
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 {
@@ -651,27 +654,27 @@ public class ExpressionAnalyzer {
protected Type visitLikePredicate(
LikePredicate node, StackableAstVisitorContext<Context> context) {
Type valueType = process(node.getValue(), context);
- if (!(valueType instanceof BinaryType)) {
+ if (!isCharType(valueType)) {
throw new SemanticException(
String.format(
- "Left side of LIKE expression must evaluate to a BinaryType
(actual: %s)",
+ "Left side of LIKE expression must evaluate to TEXT or STRING
Type (actual: %s)",
valueType));
}
Type patternType = process(node.getPattern(), context);
- if (!(patternType instanceof BinaryType)) {
+ if (!isCharType(patternType)) {
throw new SemanticException(
String.format(
- "Pattern for LIKE expression must evaluate to a BinaryType
(actual: %s)",
+ "Pattern for LIKE expression must evaluate to TEXT or STRING
Type (actual: %s)",
patternType));
}
if (node.getEscape().isPresent()) {
Expression escape = node.getEscape().get();
Type escapeType = process(escape, context);
- if (!(escapeType instanceof BinaryType)) {
+ if (!isCharType(escapeType)) {
throw new SemanticException(
String.format(
- "Escape for LIKE expression must evaluate to a BinaryType
(actual: %s)",
+ "Escape for LIKE expression must evaluate to TEXT or STRING
Type (actual: %s)",
escapeType));
}
}
@@ -682,13 +685,13 @@ public class ExpressionAnalyzer {
@Override
protected Type visitStringLiteral(
StringLiteral node, StackableAstVisitorContext<Context> context) {
- return setExpressionType(node, TEXT);
+ return setExpressionType(node, STRING);
}
@Override
protected Type visitBinaryLiteral(
BinaryLiteral node, StackableAstVisitorContext<Context> context) {
- throw new SemanticException("BinaryLiteral is not supported yet.");
+ return setExpressionType(node, BLOB);
}
@Override
@@ -799,12 +802,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
@@ -1171,7 +1174,7 @@ public class ExpressionAnalyzer {
if (superType == UNKNOWN) {
superType = type;
} else {
- if (!superType.equals(type)) {
+ if (!isTwoTypeComparable(Arrays.asList(superType, type))) {
throw new SemanticException(
String.format(
"%s must be the same type or coercible to a common type.
Cannot find common type between %s and %s, all types (without duplicates): %s",
@@ -1479,22 +1482,10 @@ public class ExpressionAnalyzer {
});
}
- public static boolean isNumericType(Type type) {
- return type.equals(INT32) || type.equals(INT64) || type.equals(FLOAT) ||
type.equals(DOUBLE);
- }
-
private static boolean isExactNumericWithScaleZero(Type type) {
return type.equals(INT32) || type.equals(INT64);
}
- public static boolean isStringType(Type type) {
- return isCharacterStringType(type);
- }
-
- public static boolean isCharacterStringType(Type type) {
- return type instanceof BinaryType;
- }
-
public static class LabelPrefixedReference {
private final String label;
private final Optional<Identifier> column;
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..dcc5f671687 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) {
@@ -400,6 +405,6 @@ public class TableMetadataImpl implements Metadata {
}
// Boolean type and Binary Type can not be compared with other types
- return isNumericType(left) && isNumericType(right);
+ return (isNumericType(left) && isNumericType(right)) || (isCharType(left)
&& isCharType(right));
}
}
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/CaseWhenThenColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
index 68910f2aa4b..ea1ba432fa2 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/CaseWhenThenColumnTransformer.java
@@ -22,12 +22,13 @@ package
org.apache.iotdb.db.queryengine.transformation.dag.column;
import org.apache.commons.lang3.Validate;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
-import org.apache.tsfile.read.common.type.BinaryType;
+import org.apache.tsfile.read.common.type.AbstractIntType;
+import org.apache.tsfile.read.common.type.AbstractLongType;
+import org.apache.tsfile.read.common.type.AbstractVarcharType;
+import org.apache.tsfile.read.common.type.BlobType;
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.utils.Pair;
@@ -66,15 +67,15 @@ public class CaseWhenThenColumnTransformer extends
ColumnTransformer {
ColumnTransformer childTransformer, Column column, int index,
ColumnBuilder builder) {
if (returnType instanceof BooleanType) {
builder.writeBoolean(childTransformer.getType().getBoolean(column,
index));
- } else if (returnType instanceof IntType) {
+ } else if (returnType instanceof AbstractIntType) {
builder.writeInt(childTransformer.getType().getInt(column, index));
- } else if (returnType instanceof LongType) {
+ } else if (returnType instanceof AbstractLongType) {
builder.writeLong(childTransformer.getType().getLong(column, index));
} else if (returnType instanceof FloatType) {
builder.writeFloat(childTransformer.getType().getFloat(column, index));
} else if (returnType instanceof DoubleType) {
builder.writeDouble(childTransformer.getType().getDouble(column, index));
- } else if (returnType instanceof BinaryType) {
+ } else if (returnType instanceof AbstractVarcharType || returnType
instanceof BlobType) {
builder.writeBinary(childTransformer.getType().getBinary(column, index));
} else {
throw new UnsupportedOperationException("Unsupported Type");
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
index 922e95e85f6..cc8a8ba11fd 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ColumnTransformer.java
@@ -25,6 +25,8 @@ import org.apache.tsfile.block.column.Column;
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.isNumericType;
+
public abstract class ColumnTransformer {
protected final Type returnType;
@@ -69,11 +71,7 @@ public abstract class ColumnTransformer {
if (returnType == null) {
return true;
}
- TypeEnum typeEnum = returnType.getTypeEnum();
- return typeEnum.equals(TypeEnum.INT32)
- || typeEnum.equals(TypeEnum.INT64)
- || typeEnum.equals(TypeEnum.FLOAT)
- || typeEnum.equals(TypeEnum.DOUBLE);
+ return isNumericType(returnType);
}
/**
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/binary/CompareEqualToColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
index 76715d42829..f777180e9f0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareEqualToColumnTransformer.java
@@ -23,6 +23,10 @@ import
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
import org.apache.tsfile.read.common.type.Type;
+import java.util.Arrays;
+
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
+
public class CompareEqualToColumnTransformer extends
CompareBinaryColumnTransformer {
public CompareEqualToColumnTransformer(
Type returnType, ColumnTransformer leftTransformer, ColumnTransformer
rightTransformer) {
@@ -31,12 +35,8 @@ public class CompareEqualToColumnTransformer extends
CompareBinaryColumnTransfor
@Override
protected final void checkType() {
- if (typeEquals(leftTransformer, rightTransformer)) {
- return;
- }
-
- // Boolean type and Binary Type can not be compared with other types
- if (!leftTransformer.isReturnTypeNumeric() ||
!rightTransformer.isReturnTypeNumeric()) {
+ if (!isTwoTypeComparable(
+ Arrays.asList(leftTransformer.getType(), rightTransformer.getType())))
{
throw new UnsupportedOperationException("Unsupported Type");
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
index b4c4a297809..9f0cd152ebe 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/CompareNonEqualColumnTransformer.java
@@ -23,6 +23,10 @@ import
org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransform
import org.apache.tsfile.read.common.type.Type;
+import java.util.Arrays;
+
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
+
public class CompareNonEqualColumnTransformer extends
CompareBinaryColumnTransformer {
public CompareNonEqualColumnTransformer(
Type returnType, ColumnTransformer leftTransformer, ColumnTransformer
rightTransformer) {
@@ -31,12 +35,8 @@ public class CompareNonEqualColumnTransformer extends
CompareBinaryColumnTransfo
@Override
protected final void checkType() {
- if (typeEquals(leftTransformer, rightTransformer)) {
- return;
- }
-
- // Boolean type and Binary Type can not be compared with other types
- if (!leftTransformer.isReturnTypeNumeric() ||
!rightTransformer.isReturnTypeNumeric()) {
+ if (!isTwoTypeComparable(
+ Arrays.asList(leftTransformer.getType(), rightTransformer.getType())))
{
throw new UnsupportedOperationException("Unsupported Type");
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
index eb77148edd9..889c742b895 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/BetweenColumnTransformer.java
@@ -24,9 +24,10 @@ import
org.apache.iotdb.db.queryengine.transformation.dag.util.TransformUtils;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
-import org.apache.tsfile.read.common.type.BinaryType;
import org.apache.tsfile.read.common.type.Type;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isCharType;
+
public class BetweenColumnTransformer extends CompareTernaryColumnTransformer {
private final boolean isNotBetween;
@@ -50,7 +51,7 @@ public class BetweenColumnTransformer extends
CompareTernaryColumnTransformer {
for (int i = 0; i < positionCount; i++) {
if (!firstColumn.isNull(i) && !secondColumn.isNull(i) &&
!thirdColumn.isNull(i)) {
boolean flag;
- if (firstColumnTransformer.getType() instanceof BinaryType) {
+ if (isCharType(firstColumnTransformer.getType())) {
flag =
((TransformUtils.compare(
firstColumnTransformer.getType().getBinary(firstColumn, i),
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..d7e32db83e4 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:
@@ -175,6 +180,7 @@ public class InColumnTransformer extends
UnaryColumnTransformer {
String errorMsg = "\"%s\" cannot be cast to [%s]";
switch (childType) {
case INT32:
+ case DATE:
intSet = new HashSet<>();
for (Literal value : values) {
try {
@@ -185,6 +191,7 @@ public class InColumnTransformer extends
UnaryColumnTransformer {
}
break;
case INT64:
+ case TIMESTAMP:
longSet = new HashSet<>();
for (Literal value : values) {
try {
@@ -221,6 +228,7 @@ public class InColumnTransformer extends
UnaryColumnTransformer {
}
break;
case TEXT:
+ case STRING:
stringSet = new HashSet<>();
for (Literal value : values) {
stringSet.add(((StringLiteral) value).getValue());
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:
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
index 4a7a271e64a..4f9316dc5bd 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/OperatorMemoryTest.java
@@ -98,8 +98,6 @@ import org.apache.tsfile.read.common.block.column.IntColumn;
import org.apache.tsfile.read.common.block.column.LongColumn;
import org.apache.tsfile.read.common.block.column.TimeColumn;
import org.apache.tsfile.read.common.type.BooleanType;
-import org.apache.tsfile.read.common.type.LongType;
-import org.apache.tsfile.read.common.type.TypeEnum;
import org.apache.tsfile.utils.TimeDuration;
import org.apache.tsfile.write.schema.MeasurementSchema;
import org.junit.Test;
@@ -117,6 +115,7 @@ import java.util.concurrent.ExecutorService;
import static
org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext.createFragmentInstanceContext;
import static
org.apache.iotdb.db.queryengine.execution.operator.AggregationUtil.initTimeRangeIterator;
import static
org.apache.iotdb.db.queryengine.execution.operator.process.last.LastQueryMergeOperator.MAP_NODE_RETRAINED_SIZE;
+import static org.apache.tsfile.read.common.type.LongType.INT64;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
@@ -628,24 +627,20 @@ public class OperatorMemoryTest {
Mockito.when(child.calculateMaxPeekMemory()).thenReturn(2048L);
Mockito.when(child.calculateMaxReturnSize()).thenReturn(1024L);
Mockito.when(child.calculateRetainedSizeAfterCallingNext()).thenReturn(512L);
- BooleanType booleanType = Mockito.mock(BooleanType.class);
- Mockito.when(booleanType.getTypeEnum()).thenReturn(TypeEnum.BOOLEAN);
- LongType longType = Mockito.mock(LongType.class);
- Mockito.when(longType.getTypeEnum()).thenReturn(TypeEnum.INT64);
ColumnTransformer filterColumnTransformer =
new CompareLessEqualColumnTransformer(
- booleanType,
- new TimeColumnTransformer(longType),
- new ConstantColumnTransformer(longType,
Mockito.mock(IntColumn.class)));
+ BooleanType.BOOLEAN,
+ new TimeColumnTransformer(INT64),
+ new ConstantColumnTransformer(INT64,
Mockito.mock(IntColumn.class)));
List<TSDataType> filterOutputTypes = new ArrayList<>();
filterOutputTypes.add(TSDataType.INT32);
filterOutputTypes.add(TSDataType.INT64);
List<ColumnTransformer> projectColumnTransformers = new ArrayList<>();
projectColumnTransformers.add(
new ArithmeticAdditionColumnTransformer(
- booleanType,
- new TimeColumnTransformer(longType),
- new ConstantColumnTransformer(longType,
Mockito.mock(IntColumn.class))));
+ BooleanType.BOOLEAN,
+ new TimeColumnTransformer(INT64),
+ new ConstantColumnTransformer(INT64,
Mockito.mock(IntColumn.class))));
FilterAndProjectOperator operator =
new FilterAndProjectOperator(
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
index 55fbeacb86c..faa5509c9c2 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/TestMatadata.java
@@ -54,11 +54,11 @@ import java.util.Map;
import java.util.Optional;
import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.getFunctionType;
-import static org.apache.tsfile.read.common.type.BinaryType.TEXT;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isOneNumericType;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoNumericType;
+import static
org.apache.iotdb.db.queryengine.plan.relational.metadata.TableMetadataImpl.isTwoTypeComparable;
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;
public class TestMatadata implements Metadata {
@@ -241,42 +241,6 @@ public class TestMatadata implements Metadata {
return DATA_PARTITION;
}
- public static boolean isTwoNumericType(List<? extends Type> argumentTypes) {
- return argumentTypes.size() == 2
- && isNumericType(argumentTypes.get(0))
- && isNumericType(argumentTypes.get(1));
- }
-
- public static boolean isOneNumericType(List<? extends Type> argumentTypes) {
- return argumentTypes.size() == 1 && isNumericType(argumentTypes.get(0));
- }
-
- public static boolean isOneBooleanType(List<? extends Type> argumentTypes) {
- 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 isNumericType(Type type) {
- return DOUBLE.equals(type) || FLOAT.equals(type) || INT32.equals(type) ||
INT64.equals(type);
- }
-
- public static boolean isTwoTypeComparable(List<? extends Type>
argumentTypes) {
- if (argumentTypes.size() != 2) {
- return false;
- }
- Type left = argumentTypes.get(0);
- Type right = argumentTypes.get(1);
- if (left.equals(right)) {
- return true;
- }
-
- // Boolean type and Binary Type can not be compared with other types
- return isNumericType(left) && isNumericType(right);
- }
-
private static final DataPartition DATA_PARTITION =
MockTablePartition.constructDataPartition();
private static final SchemaPartition SCHEMA_PARTITION =
MockTablePartition.constructSchemaPartition();