From 572fe57ccf473e3d680f8928dd5f6833583350cc Mon Sep 17 00:00:00 2001 From: Victor Barua Date: Thu, 25 Apr 2024 19:49:05 -0700 Subject: [PATCH] chore: update to substrait 0.48.0 (#250) feat(pojo): wire in PrecisionTimestamp and PrecisionTimestampTZ BREAKING CHANGE: ParameterizedTypeVisitor has new visit methods BREAKING CHANGE: TypeExpressionVisitor has new visit methods BREAKING CHANGE: TypeVisitor has new visit methods BREAKING CHANGE: BaseProtoTypes has new visit methods --- core/src/main/antlr/SubstraitType.g4 | 4 ++ .../substrait/function/ParameterizedType.java | 30 +++++++++++++++ .../function/ParameterizedTypeCreator.java | 14 +++++++ .../function/ParameterizedTypeVisitor.java | 14 +++++++ .../io/substrait/function/ToTypeString.java | 20 ++++++++++ .../io/substrait/function/TypeExpression.java | 30 +++++++++++++++ .../function/TypeExpressionCreator.java | 14 +++++++ .../function/TypeExpressionVisitor.java | 14 +++++++ .../io/substrait/type/StringTypeVisitor.java | 10 +++++ .../src/main/java/io/substrait/type/Type.java | 37 +++++++++++++++++++ .../java/io/substrait/type/TypeCreator.java | 18 +++++++++ .../java/io/substrait/type/TypeVisitor.java | 14 +++++++ .../io/substrait/type/parser/ParseToPojo.java | 34 +++++++++++++++++ .../type/proto/BaseProtoConverter.java | 10 +++++ .../substrait/type/proto/BaseProtoTypes.java | 12 ++++++ .../proto/ParameterizedProtoConverter.java | 34 +++++++++++++++++ .../type/proto/ProtoTypeConverter.java | 4 ++ .../proto/TypeExpressionProtoVisitor.java | 32 ++++++++++++++++ .../type/proto/TypeProtoConverter.java | 20 ++++++++++ .../IgnoreNullableAndParameters.java | 24 ++++++++++++ substrait | 2 +- 21 files changed, 390 insertions(+), 1 deletion(-) diff --git a/core/src/main/antlr/SubstraitType.g4 b/core/src/main/antlr/SubstraitType.g4 index 4202eb611..2cb158a5b 100644 --- a/core/src/main/antlr/SubstraitType.g4 +++ b/core/src/main/antlr/SubstraitType.g4 @@ -51,6 +51,8 @@ IntervalYear: I N T E R V A L '_' Y E A R; IntervalDay: I N T E R V A L '_' D A Y; UUID : U U I D; Decimal : D E C I M A L; +PrecisionTimestamp: P R E C I S I O N '_' T I M E S T A M P; +PrecisionTimestampTZ: P R E C I S I O N '_' T I M E S T A M P '_' T Z; FixedChar: F I X E D C H A R; VarChar : V A R C H A R; FixedBinary: F I X E D B I N A R Y; @@ -167,6 +169,8 @@ parameterizedType | VarChar isnull='?'? Lt len=numericParameter Gt #varChar | FixedBinary isnull='?'? Lt len=numericParameter Gt #fixedBinary | Decimal isnull='?'? Lt precision=numericParameter Comma scale=numericParameter Gt #decimal + | PrecisionTimestamp isnull='?'? Lt precision=numericParameter Gt #precisionTimestamp + | PrecisionTimestampTZ isnull='?'? Lt precision=numericParameter Gt #precisionTimestampTZ | Struct isnull='?'? Lt expr (Comma expr)* Gt #struct | NStruct isnull='?'? Lt Identifier expr (Comma Identifier expr)* Gt #nStruct | List isnull='?'? Lt expr Gt #list diff --git a/core/src/main/java/io/substrait/function/ParameterizedType.java b/core/src/main/java/io/substrait/function/ParameterizedType.java index 7b2202a27..767ad9253 100644 --- a/core/src/main/java/io/substrait/function/ParameterizedType.java +++ b/core/src/main/java/io/substrait/function/ParameterizedType.java @@ -106,6 +106,36 @@ public static ImmutableParameterizedType.Decimal.Builder builder() { } } + @Value.Immutable + abstract static class PrecisionTimestamp extends BaseParameterizedType implements NullableType { + public abstract StringLiteral precision(); + + @Override + R accept(final ParameterizedTypeVisitor parameterizedTypeVisitor) + throws E { + return parameterizedTypeVisitor.visit(this); + } + + public static ImmutableParameterizedType.PrecisionTimestamp.Builder builder() { + return ImmutableParameterizedType.PrecisionTimestamp.builder(); + } + } + + @Value.Immutable + abstract static class PrecisionTimestampTZ extends BaseParameterizedType implements NullableType { + public abstract StringLiteral precision(); + + @Override + R accept(final ParameterizedTypeVisitor parameterizedTypeVisitor) + throws E { + return parameterizedTypeVisitor.visit(this); + } + + public static ImmutableParameterizedType.PrecisionTimestampTZ.Builder builder() { + return ImmutableParameterizedType.PrecisionTimestampTZ.builder(); + } + } + @Value.Immutable abstract static class Struct extends BaseParameterizedType implements NullableType { public abstract java.util.List fields(); diff --git a/core/src/main/java/io/substrait/function/ParameterizedTypeCreator.java b/core/src/main/java/io/substrait/function/ParameterizedTypeCreator.java index 75c81945c..63db88887 100644 --- a/core/src/main/java/io/substrait/function/ParameterizedTypeCreator.java +++ b/core/src/main/java/io/substrait/function/ParameterizedTypeCreator.java @@ -49,6 +49,20 @@ public ParameterizedType decimalE(String precision, String scale) { .build(); } + public ParameterizedType precisionTimestampE(String precision) { + return ParameterizedType.PrecisionTimestamp.builder() + .nullable(nullable) + .precision(parameter(precision, false)) + .build(); + } + + public ParameterizedType precisionTimestampTZE(String precision) { + return ParameterizedType.PrecisionTimestampTZ.builder() + .nullable(nullable) + .precision(parameter(precision, false)) + .build(); + } + public ParameterizedType structE(ParameterizedType... types) { return ParameterizedType.Struct.builder().nullable(nullable).addFields(types).build(); } diff --git a/core/src/main/java/io/substrait/function/ParameterizedTypeVisitor.java b/core/src/main/java/io/substrait/function/ParameterizedTypeVisitor.java index 8f451453b..67e685cc5 100644 --- a/core/src/main/java/io/substrait/function/ParameterizedTypeVisitor.java +++ b/core/src/main/java/io/substrait/function/ParameterizedTypeVisitor.java @@ -11,6 +11,10 @@ public interface ParameterizedTypeVisitor extends TypeVi R visit(ParameterizedType.Decimal expr) throws E; + R visit(ParameterizedType.PrecisionTimestamp expr) throws E; + + R visit(ParameterizedType.PrecisionTimestampTZ expr) throws E; + R visit(ParameterizedType.Struct expr) throws E; R visit(ParameterizedType.ListType expr) throws E; @@ -46,6 +50,16 @@ public R visit(ParameterizedType.Decimal expr) throws E { throw t(); } + @Override + public R visit(ParameterizedType.PrecisionTimestamp expr) throws E { + throw t(); + } + + @Override + public R visit(ParameterizedType.PrecisionTimestampTZ expr) throws E { + throw t(); + } + @Override public R visit(ParameterizedType.Struct expr) throws E { throw t(); diff --git a/core/src/main/java/io/substrait/function/ToTypeString.java b/core/src/main/java/io/substrait/function/ToTypeString.java index 0b534c3cc..f68733cc6 100644 --- a/core/src/main/java/io/substrait/function/ToTypeString.java +++ b/core/src/main/java/io/substrait/function/ToTypeString.java @@ -115,6 +115,16 @@ public String visit(final Type.Decimal expr) { return "dec"; } + @Override + public String visit(final Type.PrecisionTimestamp expr) { + return "pts"; + } + + @Override + public String visit(final Type.PrecisionTimestampTZ expr) { + return "ptstz"; + } + @Override public String visit(final Type.Struct expr) { return "struct"; @@ -155,6 +165,16 @@ public String visit(ParameterizedType.Decimal expr) throws RuntimeException { return "dec"; } + @Override + public String visit(ParameterizedType.PrecisionTimestamp expr) throws RuntimeException { + return "pts"; + } + + @Override + public String visit(ParameterizedType.PrecisionTimestampTZ expr) throws RuntimeException { + return "ptstz"; + } + @Override public String visit(ParameterizedType.Struct expr) throws RuntimeException { return "struct"; diff --git a/core/src/main/java/io/substrait/function/TypeExpression.java b/core/src/main/java/io/substrait/function/TypeExpression.java index 41ee976ef..e9f7c5ce1 100644 --- a/core/src/main/java/io/substrait/function/TypeExpression.java +++ b/core/src/main/java/io/substrait/function/TypeExpression.java @@ -84,6 +84,36 @@ public static ImmutableTypeExpression.Decimal.Builder builder() { } } + @Value.Immutable + abstract static class PrecisionTimestamp extends BaseTypeExpression implements NullableType { + + public abstract TypeExpression precision(); + + @Override + R acceptE(final TypeExpressionVisitor visitor) throws E { + return visitor.visit(this); + } + + public static ImmutableTypeExpression.PrecisionTimestamp.Builder builder() { + return ImmutableTypeExpression.PrecisionTimestamp.builder(); + } + } + + @Value.Immutable + abstract static class PrecisionTimestampTZ extends BaseTypeExpression implements NullableType { + + public abstract TypeExpression precision(); + + @Override + R acceptE(final TypeExpressionVisitor visitor) throws E { + return visitor.visit(this); + } + + public static ImmutableTypeExpression.PrecisionTimestampTZ.Builder builder() { + return ImmutableTypeExpression.PrecisionTimestampTZ.builder(); + } + } + @Value.Immutable abstract static class Struct extends BaseTypeExpression implements NullableType { public abstract java.util.List fields(); diff --git a/core/src/main/java/io/substrait/function/TypeExpressionCreator.java b/core/src/main/java/io/substrait/function/TypeExpressionCreator.java index ce1cb5aee..5dc56584f 100644 --- a/core/src/main/java/io/substrait/function/TypeExpressionCreator.java +++ b/core/src/main/java/io/substrait/function/TypeExpressionCreator.java @@ -35,6 +35,20 @@ public TypeExpression decimalE(TypeExpression precision, TypeExpression scale) { .build(); } + public TypeExpression precisionTimestampE(TypeExpression precision) { + return TypeExpression.PrecisionTimestamp.builder() + .nullable(nullable) + .precision(precision) + .build(); + } + + public TypeExpression precisionTimestampTZE(TypeExpression precision) { + return TypeExpression.PrecisionTimestampTZ.builder() + .nullable(nullable) + .precision(precision) + .build(); + } + public TypeExpression structE(TypeExpression... types) { return TypeExpression.Struct.builder().nullable(nullable).addFields(types).build(); } diff --git a/core/src/main/java/io/substrait/function/TypeExpressionVisitor.java b/core/src/main/java/io/substrait/function/TypeExpressionVisitor.java index 72be9dd67..a30891e75 100644 --- a/core/src/main/java/io/substrait/function/TypeExpressionVisitor.java +++ b/core/src/main/java/io/substrait/function/TypeExpressionVisitor.java @@ -10,6 +10,10 @@ public interface TypeExpressionVisitor R visit(TypeExpression.Decimal expr) throws E; + R visit(TypeExpression.PrecisionTimestamp expr) throws E; + + R visit(TypeExpression.PrecisionTimestampTZ expr) throws E; + R visit(TypeExpression.Struct expr) throws E; R visit(TypeExpression.ListType expr) throws E; @@ -54,6 +58,16 @@ public R visit(TypeExpression.Decimal expr) throws E { throw t(); } + @Override + public R visit(TypeExpression.PrecisionTimestamp expr) throws E { + throw t(); + } + + @Override + public R visit(TypeExpression.PrecisionTimestampTZ expr) throws E { + throw t(); + } + @Override public R visit(TypeExpression.Struct expr) throws E { throw t(); diff --git a/core/src/main/java/io/substrait/type/StringTypeVisitor.java b/core/src/main/java/io/substrait/type/StringTypeVisitor.java index 17fa8f523..668b770cd 100644 --- a/core/src/main/java/io/substrait/type/StringTypeVisitor.java +++ b/core/src/main/java/io/substrait/type/StringTypeVisitor.java @@ -109,6 +109,16 @@ public String visit(Type.Decimal type) throws RuntimeException { return String.format("decimal<%d,%d>%s", type.precision(), type.scale(), n(type)); } + @Override + public String visit(Type.PrecisionTimestamp type) throws RuntimeException { + return String.format("precision_timestamp<%d>%s", type.precision(), n(type)); + } + + @Override + public String visit(Type.PrecisionTimestampTZ type) throws RuntimeException { + return String.format("precision_timestamp_tz<%d>%s", type.precision(), n(type)); + } + @Override public String visit(Type.Struct type) throws RuntimeException { return String.format( diff --git a/core/src/main/java/io/substrait/type/Type.java b/core/src/main/java/io/substrait/type/Type.java index d0f14c047..43d1fd60c 100644 --- a/core/src/main/java/io/substrait/type/Type.java +++ b/core/src/main/java/io/substrait/type/Type.java @@ -155,8 +155,12 @@ public R accept(final TypeVisitor typeVisitor) th } } + /** Deprecated, use {@link PrecisionTimestampTZ} instead */ @Value.Immutable + @Deprecated abstract static class TimestampTZ implements Type { + + /** Deprecated, use {@link PrecisionTimestampTZ#builder()} instead */ public static ImmutableType.TimestampTZ.Builder builder() { return ImmutableType.TimestampTZ.builder(); } @@ -167,8 +171,13 @@ public R accept(final TypeVisitor typeVisitor) th } } + /** Deprecated, use {@link PrecisionTimestamp} instead */ @Value.Immutable + @Deprecated abstract static class Timestamp implements Type { + + /** Deprecated, use {@link PrecisionTimestamp#builder()} instead */ + @Deprecated public static ImmutableType.Timestamp.Builder builder() { return ImmutableType.Timestamp.builder(); } @@ -273,6 +282,34 @@ public R accept(final TypeVisitor typeVisitor) th } } + @Value.Immutable + abstract static class PrecisionTimestamp implements Type { + public abstract int precision(); + + public static ImmutableType.PrecisionTimestamp.Builder builder() { + return ImmutableType.PrecisionTimestamp.builder(); + } + + @Override + public R accept(final TypeVisitor typeVisitor) throws E { + return typeVisitor.visit(this); + } + } + + @Value.Immutable + abstract static class PrecisionTimestampTZ implements Type { + public abstract int precision(); + + public static ImmutableType.PrecisionTimestampTZ.Builder builder() { + return ImmutableType.PrecisionTimestampTZ.builder(); + } + + @Override + public R accept(final TypeVisitor typeVisitor) throws E { + return typeVisitor.visit(this); + } + } + @Value.Immutable abstract static class Struct implements Type { public abstract java.util.List fields(); diff --git a/core/src/main/java/io/substrait/type/TypeCreator.java b/core/src/main/java/io/substrait/type/TypeCreator.java index 0a7943e13..adaedd0b1 100644 --- a/core/src/main/java/io/substrait/type/TypeCreator.java +++ b/core/src/main/java/io/substrait/type/TypeCreator.java @@ -66,6 +66,14 @@ public final Type.Struct struct(Type... types) { return Type.Struct.builder().nullable(nullable).addFields(types).build(); } + public final Type precisionTimestamp(int precision) { + return Type.PrecisionTimestamp.builder().nullable(nullable).precision(precision).build(); + } + + public final Type precisionTimestampTZ(int precision) { + return Type.PrecisionTimestampTZ.builder().nullable(nullable).precision(precision).build(); + } + public Type.Struct struct(Iterable types) { return Type.Struct.builder().nullable(nullable).addAllFields(types).build(); } @@ -215,6 +223,16 @@ public Type visit(Type.Decimal type) throws RuntimeException { return Type.Decimal.builder().from(type).nullable(nullability).build(); } + @Override + public Type visit(Type.PrecisionTimestamp type) throws RuntimeException { + return Type.PrecisionTimestamp.builder().from(type).nullable(nullability).build(); + } + + @Override + public Type visit(Type.PrecisionTimestampTZ type) throws RuntimeException { + return Type.PrecisionTimestampTZ.builder().from(type).nullable(nullability).build(); + } + @Override public Type visit(Type.Struct type) throws RuntimeException { return Type.Struct.builder().from(type).nullable(nullability).build(); diff --git a/core/src/main/java/io/substrait/type/TypeVisitor.java b/core/src/main/java/io/substrait/type/TypeVisitor.java index 4eae3362a..12316852d 100644 --- a/core/src/main/java/io/substrait/type/TypeVisitor.java +++ b/core/src/main/java/io/substrait/type/TypeVisitor.java @@ -27,6 +27,10 @@ public interface TypeVisitor { R visit(Type.Timestamp type) throws E; + R visit(Type.PrecisionTimestamp type) throws E; + + R visit(Type.PrecisionTimestampTZ type) throws E; + R visit(Type.IntervalYear type) throws E; R visit(Type.IntervalDay type) throws E; @@ -162,6 +166,16 @@ public R visit(Type.Decimal type) throws E { throw t(); } + @Override + public R visit(Type.PrecisionTimestamp type) throws E { + throw t(); + } + + @Override + public R visit(Type.PrecisionTimestampTZ type) throws E { + throw t(); + } + @Override public R visit(Type.Struct type) throws E { throw t(); diff --git a/core/src/main/java/io/substrait/type/parser/ParseToPojo.java b/core/src/main/java/io/substrait/type/parser/ParseToPojo.java index a79a2ebec..9ae85f438 100644 --- a/core/src/main/java/io/substrait/type/parser/ParseToPojo.java +++ b/core/src/main/java/io/substrait/type/parser/ParseToPojo.java @@ -237,6 +237,40 @@ public TypeExpression visitDecimal(final SubstraitTypeParser.DecimalContext ctx) return withNullE(nullable).decimalE(ctx.precision.accept(this), ctx.scale.accept(this)); } + @Override + public TypeExpression visitPrecisionTimestamp( + final SubstraitTypeParser.PrecisionTimestampContext ctx) { + boolean nullable = ctx.isnull != null; + Object precision = i(ctx.precision); + if (precision instanceof Integer p) { + return withNull(nullable).precisionTimestamp(p); + } + if (precision instanceof String s) { + checkParameterizedOrExpression(); + return withNullP(nullable).precisionTimestampE(s); + } + + checkExpression(); + return withNullE(nullable).precisionTimestampE(ctx.precision.accept(this)); + } + + @Override + public TypeExpression visitPrecisionTimestampTZ( + final SubstraitTypeParser.PrecisionTimestampTZContext ctx) { + boolean nullable = ctx.isnull != null; + Object precision = i(ctx.precision); + if (precision instanceof Integer p) { + return withNull(nullable).precisionTimestampTZ(p); + } + if (precision instanceof String s) { + checkParameterizedOrExpression(); + return withNullP(nullable).precisionTimestampTZE(s); + } + + checkExpression(); + return withNullE(nullable).precisionTimestampTZE(ctx.precision.accept(this)); + } + private Object i(SubstraitTypeParser.NumericParameterContext ctx) { TypeExpression type = ctx.accept(this); if (type instanceof TypeExpression.IntegerLiteral) { diff --git a/core/src/main/java/io/substrait/type/proto/BaseProtoConverter.java b/core/src/main/java/io/substrait/type/proto/BaseProtoConverter.java index 913bcde71..f21a03f79 100644 --- a/core/src/main/java/io/substrait/type/proto/BaseProtoConverter.java +++ b/core/src/main/java/io/substrait/type/proto/BaseProtoConverter.java @@ -124,6 +124,16 @@ public final T visit(final Type.Decimal expr) { return typeContainer(expr).decimal(expr.scale(), expr.precision()); } + @Override + public final T visit(final Type.PrecisionTimestamp expr) { + return typeContainer(expr).precisionTimestamp(expr.precision()); + } + + @Override + public final T visit(final Type.PrecisionTimestampTZ expr) { + return typeContainer(expr).precisionTimestampTZ(expr.precision()); + } + @Override public final T visit(final Type.Struct expr) { return typeContainer(expr) diff --git a/core/src/main/java/io/substrait/type/proto/BaseProtoTypes.java b/core/src/main/java/io/substrait/type/proto/BaseProtoTypes.java index 8c63a7d73..ac4c13521 100644 --- a/core/src/main/java/io/substrait/type/proto/BaseProtoTypes.java +++ b/core/src/main/java/io/substrait/type/proto/BaseProtoTypes.java @@ -81,6 +81,14 @@ public final T decimal(int scale, I precision) { return decimal(i(scale), precision); } + public final T precisionTimestamp(int precision) { + return precisionTimestamp(i(precision)); + } + + public final T precisionTimestampTZ(int precision) { + return precisionTimestampTZ(i(precision)); + } + public abstract T typeParam(String name); public abstract I integerParam(String name); @@ -91,6 +99,10 @@ public final T decimal(int scale, I precision) { public abstract T decimal(I scale, I precision); + public abstract T precisionTimestamp(I precision); + + public abstract T precisionTimestampTZ(I precision); + public final T struct(T... types) { return struct(Arrays.asList(types)); } diff --git a/core/src/main/java/io/substrait/type/proto/ParameterizedProtoConverter.java b/core/src/main/java/io/substrait/type/proto/ParameterizedProtoConverter.java index 070cf92cc..f2270b822 100644 --- a/core/src/main/java/io/substrait/type/proto/ParameterizedProtoConverter.java +++ b/core/src/main/java/io/substrait/type/proto/ParameterizedProtoConverter.java @@ -54,6 +54,18 @@ public ParameterizedType visit(io.substrait.function.ParameterizedType.Decimal e return typeContainer(expr).decimal(i(expr.precision()), i(expr.scale())); } + @Override + public ParameterizedType visit(io.substrait.function.ParameterizedType.PrecisionTimestamp expr) + throws RuntimeException { + return typeContainer(expr).precisionTimestamp(i(expr.precision())); + } + + @Override + public ParameterizedType visit(io.substrait.function.ParameterizedType.PrecisionTimestampTZ expr) + throws RuntimeException { + return typeContainer(expr).precisionTimestampTZ(i(expr.precision())); + } + @Override public ParameterizedType visit(io.substrait.function.ParameterizedType.Struct expr) throws RuntimeException { @@ -174,6 +186,24 @@ public ParameterizedType decimal( .build()); } + @Override + public ParameterizedType precisionTimestamp(ParameterizedType.IntegerOption precision) { + return wrap( + ParameterizedType.ParameterizedPrecisionTimestamp.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + + @Override + public ParameterizedType precisionTimestampTZ(ParameterizedType.IntegerOption precision) { + return wrap( + ParameterizedType.ParameterizedPrecisionTimestampTZ.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + public ParameterizedType struct(Iterable types) { return wrap( ParameterizedType.ParameterizedStruct.newBuilder() @@ -246,6 +276,10 @@ protected ParameterizedType wrap(final Object o) { return bldr.setFixedBinary(t).build(); } else if (o instanceof ParameterizedType.ParameterizedDecimal t) { return bldr.setDecimal(t).build(); + } else if (o instanceof ParameterizedType.ParameterizedPrecisionTimestamp t) { + return bldr.setPrecisionTimestamp(t).build(); + } else if (o instanceof ParameterizedType.ParameterizedPrecisionTimestampTZ t) { + return bldr.setPrecisionTimestampTz(t).build(); } else if (o instanceof ParameterizedType.ParameterizedStruct t) { return bldr.setStruct(t).build(); } else if (o instanceof ParameterizedType.ParameterizedList t) { diff --git a/core/src/main/java/io/substrait/type/proto/ProtoTypeConverter.java b/core/src/main/java/io/substrait/type/proto/ProtoTypeConverter.java index 9208970f3..a4352c463 100644 --- a/core/src/main/java/io/substrait/type/proto/ProtoTypeConverter.java +++ b/core/src/main/java/io/substrait/type/proto/ProtoTypeConverter.java @@ -42,6 +42,10 @@ public Type from(io.substrait.proto.Type type) { .fixedBinary(type.getFixedBinary().getLength()); case DECIMAL -> n(type.getDecimal().getNullability()) .decimal(type.getDecimal().getPrecision(), type.getDecimal().getScale()); + case PRECISION_TIMESTAMP -> n(type.getPrecisionTimestamp().getNullability()) + .precisionTimestamp(type.getPrecisionTimestamp().getPrecision()); + case PRECISION_TIMESTAMP_TZ -> n(type.getPrecisionTimestampTz().getNullability()) + .precisionTimestampTZ(type.getPrecisionTimestampTz().getPrecision()); case STRUCT -> n(type.getStruct().getNullability()) .struct( type.getStruct().getTypesList().stream() diff --git a/core/src/main/java/io/substrait/type/proto/TypeExpressionProtoVisitor.java b/core/src/main/java/io/substrait/type/proto/TypeExpressionProtoVisitor.java index b32d0d71d..07e5b1071 100644 --- a/core/src/main/java/io/substrait/type/proto/TypeExpressionProtoVisitor.java +++ b/core/src/main/java/io/substrait/type/proto/TypeExpressionProtoVisitor.java @@ -121,6 +121,16 @@ public DerivationExpression visit(ParameterizedType.Decimal expr) { return typeContainer(expr).decimal(expr.precision().accept(this), expr.scale().accept(this)); } + @Override + public DerivationExpression visit(ParameterizedType.PrecisionTimestamp expr) { + return typeContainer(expr).precisionTimestamp(expr.precision().accept(this)); + } + + @Override + public DerivationExpression visit(TypeExpression.PrecisionTimestampTZ expr) { + return typeContainer(expr).precisionTimestampTZ(expr.precision().accept(this)); + } + @Override public DerivationExpression visit(ParameterizedType.Struct expr) { return typeContainer(expr) @@ -235,6 +245,24 @@ public DerivationExpression decimal( .build()); } + @Override + public DerivationExpression precisionTimestamp(DerivationExpression precision) { + return wrap( + DerivationExpression.ExpressionPrecisionTimestamp.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + + @Override + public DerivationExpression precisionTimestampTZ(DerivationExpression precision) { + return wrap( + DerivationExpression.ExpressionPrecisionTimestampTZ.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + public DerivationExpression struct(Iterable types) { return wrap( DerivationExpression.ExpressionStruct.newBuilder() @@ -311,6 +339,10 @@ protected DerivationExpression wrap(final Object o) { return bldr.setFixedBinary(t).build(); } else if (o instanceof DerivationExpression.ExpressionDecimal t) { return bldr.setDecimal(t).build(); + } else if (o instanceof DerivationExpression.ExpressionPrecisionTimestamp t) { + return bldr.setPrecisionTimestamp(t).build(); + } else if (o instanceof DerivationExpression.ExpressionPrecisionTimestampTZ t) { + return bldr.setPrecisionTimestampTz(t).build(); } else if (o instanceof DerivationExpression.ExpressionStruct t) { return bldr.setStruct(t).build(); } else if (o instanceof DerivationExpression.ExpressionList t) { diff --git a/core/src/main/java/io/substrait/type/proto/TypeProtoConverter.java b/core/src/main/java/io/substrait/type/proto/TypeProtoConverter.java index ce5ffb786..e21cc158a 100644 --- a/core/src/main/java/io/substrait/type/proto/TypeProtoConverter.java +++ b/core/src/main/java/io/substrait/type/proto/TypeProtoConverter.java @@ -61,6 +61,22 @@ public Type decimal(Integer scale, Integer precision) { .build()); } + public Type precisionTimestamp(Integer precision) { + return wrap( + Type.PrecisionTimestamp.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + + public Type precisionTimestampTZ(Integer precision) { + return wrap( + Type.PrecisionTimestampTZ.newBuilder() + .setPrecision(precision) + .setNullability(nullability) + .build()); + } + public Type struct(Iterable types) { return wrap(Type.Struct.newBuilder().addAllTypes(types).setNullability(nullability).build()); } @@ -121,6 +137,10 @@ protected Type wrap(final Object o) { return bldr.setFixedBinary(t).build(); } else if (o instanceof Type.Decimal t) { return bldr.setDecimal(t).build(); + } else if (o instanceof Type.PrecisionTimestamp t) { + return bldr.setPrecisionTimestamp(t).build(); + } else if (o instanceof Type.PrecisionTimestampTZ t) { + return bldr.setPrecisionTimestampTz(t).build(); } else if (o instanceof Type.Struct t) { return bldr.setStruct(t).build(); } else if (o instanceof Type.List t) { diff --git a/isthmus/src/main/java/io/substrait/isthmus/expression/IgnoreNullableAndParameters.java b/isthmus/src/main/java/io/substrait/isthmus/expression/IgnoreNullableAndParameters.java index d9adb487d..a170268ff 100644 --- a/isthmus/src/main/java/io/substrait/isthmus/expression/IgnoreNullableAndParameters.java +++ b/isthmus/src/main/java/io/substrait/isthmus/expression/IgnoreNullableAndParameters.java @@ -121,6 +121,18 @@ public Boolean visit(Type.Decimal type) { return typeToMatch instanceof Type.Decimal || typeToMatch instanceof ParameterizedType.Decimal; } + @Override + public Boolean visit(Type.PrecisionTimestamp type) { + return typeToMatch instanceof Type.PrecisionTimestamp + || typeToMatch instanceof ParameterizedType.PrecisionTimestamp; + } + + @Override + public Boolean visit(Type.PrecisionTimestampTZ type) { + return typeToMatch instanceof Type.PrecisionTimestampTZ + || typeToMatch instanceof ParameterizedType.PrecisionTimestampTZ; + } + @Override public Boolean visit(Type.Struct type) { return typeToMatch instanceof Type.Struct || typeToMatch instanceof ParameterizedType.Struct; @@ -159,6 +171,18 @@ public Boolean visit(ParameterizedType.Decimal expr) throws RuntimeException { return typeToMatch instanceof Type.Decimal || typeToMatch instanceof ParameterizedType.Decimal; } + @Override + public Boolean visit(ParameterizedType.PrecisionTimestamp expr) throws RuntimeException { + return typeToMatch instanceof Type.PrecisionTimestamp + || typeToMatch instanceof ParameterizedType.PrecisionTimestamp; + } + + @Override + public Boolean visit(ParameterizedType.PrecisionTimestampTZ expr) throws RuntimeException { + return typeToMatch instanceof Type.PrecisionTimestampTZ + || typeToMatch instanceof ParameterizedType.PrecisionTimestampTZ; + } + @Override public Boolean visit(ParameterizedType.Struct expr) throws RuntimeException { return typeToMatch instanceof Type.Struct || typeToMatch instanceof ParameterizedType.Struct; diff --git a/substrait b/substrait index 52e81a9fe..3dc77aeca 160000 --- a/substrait +++ b/substrait @@ -1 +1 @@ -Subproject commit 52e81a9fe725881036eddaa77ae0dba8b2ad6f83 +Subproject commit 3dc77aeca820eba70ba141bf3afa5e4c5ba055b9