Skip to content

Commit 566297c

Browse files
nokiaMSgithubgxll
authored andcommitted
[feat][coding] Timestamp pushdown.
1 parent 759051e commit 566297c

File tree

4 files changed

+26
-2
lines changed

4 files changed

+26
-2
lines changed

coding/src/main/java/io/dingodb/expr/coding/ExprCoder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ public CodingFlag visitUnaryOpExpr(@NonNull UnaryOpExpr expr, OutputStream obj)
182182
Byte dstType = TypeCoder.INSTANCE.visit(expr.getType());
183183
Byte srcType = TypeCoder.INSTANCE.visit((Type) expr.getOp().getKey());
184184
if (dstType != null && srcType != null
185-
&& dstType != TypeCoder.TYPE_DATE && srcType != TypeCoder.TYPE_DATE) {
185+
&& dstType != TypeCoder.TYPE_DATE && srcType != TypeCoder.TYPE_DATE
186+
&& dstType != TypeCoder.TYPE_TIMESTAMP && srcType != TypeCoder.TYPE_TIMESTAMP) {
186187
obj.write(expr.getOp().doRangeChecking() ? CAST_C : CAST);
187188
obj.write(dstType << 4 | srcType);
188189
success = true;

coding/src/main/java/io/dingodb/expr/coding/TypeCoder.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.dingodb.expr.common.type.IntType;
2525
import io.dingodb.expr.common.type.LongType;
2626
import io.dingodb.expr.common.type.StringType;
27+
import io.dingodb.expr.common.type.TimestampType;
2728
import io.dingodb.expr.common.type.TypeVisitorBase;
2829
import lombok.AccessLevel;
2930
import lombok.RequiredArgsConstructor;
@@ -39,6 +40,7 @@ class TypeCoder extends TypeVisitorBase<Byte, Void> {
3940
public static final byte TYPE_DECIMAL = (byte) 0x06;
4041
public static final byte TYPE_STRING = (byte) 0x07;
4142
public static final byte TYPE_DATE = (byte) 0x08;
43+
public static final byte TYPE_TIMESTAMP = (byte) 0x09;
4244
static final TypeCoder INSTANCE = new TypeCoder();
4345

4446
@Override
@@ -81,4 +83,9 @@ public Byte visitStringType(@NonNull StringType type, Void obj) {
8183
public Byte visitDateType(@NonNull DateType type, Void obj) {
8284
return TYPE_DATE;
8385
}
86+
87+
@Override
88+
public Byte visitTimestampType(@NonNull TimestampType type, Void obj) {
89+
return TYPE_TIMESTAMP;
90+
}
8491
}

coding/src/main/java/io/dingodb/expr/coding/ValCoder.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.dingodb.expr.common.type.IntType;
2525
import io.dingodb.expr.common.type.LongType;
2626
import io.dingodb.expr.common.type.StringType;
27+
import io.dingodb.expr.common.type.TimestampType;
2728
import io.dingodb.expr.common.type.TypeVisitorBase;
2829
import io.dingodb.expr.runtime.expr.Val;
2930
import io.dingodb.expr.runtime.utils.CodecUtils;
@@ -35,6 +36,7 @@
3536
import java.io.OutputStream;
3637
import java.nio.charset.StandardCharsets;
3738
import java.sql.Date;
39+
import java.sql.Timestamp;
3840

3941
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
4042
class ValCoder extends TypeVisitorBase<CodingFlag, OutputStream> {
@@ -94,6 +96,20 @@ public CodingFlag visitDateType(@NonNull DateType type, OutputStream obj) {
9496
return CodingFlag.OK;
9597
}
9698

99+
@SneakyThrows
100+
@Override
101+
public CodingFlag visitTimestampType(@NonNull TimestampType type, OutputStream obj) {
102+
Timestamp value = (Timestamp) val.getValue();
103+
if (value != null) {
104+
long milliseconds = value.getTime();
105+
obj.write(CONST | TypeCoder.TYPE_TIMESTAMP);
106+
CodecUtils.encodeVarInt(obj, milliseconds);
107+
} else {
108+
obj.write(NULL | TypeCoder.TYPE_TIMESTAMP);
109+
}
110+
return CodingFlag.OK;
111+
}
112+
97113
@SneakyThrows
98114
@Override
99115
public CodingFlag visitFloatType(@NonNull FloatType type, OutputStream obj) {

0 commit comments

Comments
 (0)