11package io .substrait .isthmus .expression ;
22
3- import com .google .common .collect .BiMap ;
4- import com .google .common .collect .HashBiMap ;
53import io .substrait .expression .EnumArg ;
64import io .substrait .extension .DefaultExtensionCatalog ;
75import io .substrait .extension .SimpleExtension ;
6+ import io .substrait .extension .SimpleExtension .Argument ;
7+ import java .util .HashMap ;
8+ import java .util .List ;
9+ import java .util .Map ;
10+ import java .util .Objects ;
811import java .util .Optional ;
912import java .util .function .Supplier ;
1013import org .apache .calcite .avatica .util .TimeUnitRange ;
2528 */
2629public class EnumConverter {
2730
28- private static final BiMap < Class <? extends Enum >, ArgAnchor > calciteEnumMap = HashBiMap . create ();
31+ private static final Map < ArgAnchor , Class <? extends Enum <?>>> calciteEnumMap = new HashMap <> ();
2932
3033 static {
34+ // deprecated {@link io.substrait.type.Type.Timestamp}
3135 calciteEnumMap .put (
32- TimeUnitRange .class ,
33- argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_ts" , 0 ));
36+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_ts" , 0 ),
37+ TimeUnitRange .class );
38+ // deprecated {@link io.substrait.type.Type.TimestampTZ}
39+ calciteEnumMap .put (
40+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_tstz_str" , 0 ),
41+ TimeUnitRange .class );
42+
43+ calciteEnumMap .put (
44+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_pts" , 0 ),
45+ TimeUnitRange .class );
46+ calciteEnumMap .put (
47+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_ptstz_str" , 0 ),
48+ TimeUnitRange .class );
49+ calciteEnumMap .put (
50+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_date" , 0 ),
51+ TimeUnitRange .class );
52+ calciteEnumMap .put (
53+ argAnchor (DefaultExtensionCatalog .FUNCTIONS_DATETIME , "extract:req_time" , 0 ),
54+ TimeUnitRange .class );
3455 }
3556
36- private static Optional <Enum > constructValue (
37- Class <? extends Enum > cls , Supplier <Optional <String >> option ) {
57+ private static Optional <Enum <?> > constructValue (
58+ Class <? extends Enum <?> > cls , Supplier <Optional <String >> option ) {
3859 if (cls .isAssignableFrom (TimeUnitRange .class )) {
3960 return option .get ().map (TimeUnitRange ::valueOf );
4061 } else {
@@ -44,8 +65,9 @@ private static Optional<Enum> constructValue(
4465
4566 static Optional <RexLiteral > toRex (
4667 RexBuilder rexBuilder , SimpleExtension .Function fnDef , int argIdx , EnumArg e ) {
47- var aAnch = argAnchor (fnDef , argIdx );
48- var v = Optional .ofNullable (calciteEnumMap .inverse ().getOrDefault (aAnch , null ));
68+ ArgAnchor aAnch = argAnchor (fnDef , argIdx );
69+ Optional <Class <? extends Enum <?>>> v =
70+ Optional .ofNullable (calciteEnumMap .getOrDefault (aAnch , null ));
4971
5072 Supplier <Optional <String >> sOptionVal =
5173 () -> {
@@ -66,11 +88,11 @@ private static Optional<SimpleExtension.EnumArgument> findEnumArg(
6688 return Optional .empty ();
6789 } else {
6890
69- var args = function .args ();
91+ List < Argument > args = function .args ();
7092 if (args .size () <= enumAnchor .argIdx ) {
7193 return Optional .empty ();
7294 }
73- var arg = args .get (enumAnchor .argIdx );
95+ Argument arg = args .get (enumAnchor .argIdx );
7496 if (arg instanceof SimpleExtension .EnumArgument ea ) {
7597 return Optional .of (ea );
7698 } else {
@@ -79,17 +101,15 @@ private static Optional<SimpleExtension.EnumArgument> findEnumArg(
79101 }
80102 }
81103
82- static Optional <EnumArg > fromRex (SimpleExtension .Function function , RexLiteral literal ) {
104+ static Optional <EnumArg > fromRex (
105+ SimpleExtension .Function function , RexLiteral literal , int argIdx ) {
83106 return switch (literal .getType ().getSqlTypeName ()) {
84107 case SYMBOL -> {
85108 Object v = literal .getValue ();
86109 if (!literal .isNull () && (v instanceof Enum )) {
87- Enum value = (Enum ) v ;
88- Optional <ArgAnchor > enumAnchor =
89- Optional .ofNullable (calciteEnumMap .getOrDefault (value .getClass (), null ));
90- yield enumAnchor
91- .flatMap (en -> findEnumArg (function , en ))
92- .map (ea -> EnumArg .of (ea , value .name ()));
110+ Enum <?> value = (Enum <?>) v ;
111+ ArgAnchor enumAnchor = argAnchor (function , argIdx );
112+ yield findEnumArg (function , enumAnchor ).map (ea -> EnumArg .of (ea , value .name ()));
93113 } else {
94114 yield Optional .empty ();
95115 }
@@ -98,8 +118,8 @@ static Optional<EnumArg> fromRex(SimpleExtension.Function function, RexLiteral l
98118 };
99119 }
100120
101- static boolean canConvert (Enum value ) {
102- return value != null && calciteEnumMap .containsKey (value .getClass ());
121+ static boolean canConvert (Enum <?> value ) {
122+ return value != null && calciteEnumMap .containsValue (value .getClass ());
103123 }
104124
105125 static boolean isEnumValue (RexNode value ) {
@@ -116,6 +136,23 @@ public ArgAnchor(final SimpleExtension.FunctionAnchor fn, final int argIdx) {
116136 this .fn = fn ;
117137 this .argIdx = argIdx ;
118138 }
139+
140+ @ Override
141+ public int hashCode () {
142+ return Objects .hash (fn , argIdx );
143+ }
144+
145+ @ Override
146+ public boolean equals (Object obj ) {
147+ if (this == obj ) {
148+ return true ;
149+ }
150+ if (!(obj instanceof ArgAnchor )) {
151+ return false ;
152+ }
153+ ArgAnchor other = (ArgAnchor ) obj ;
154+ return Objects .equals (fn , other .fn ) && argIdx == other .argIdx ;
155+ }
119156 }
120157
121158 private static ArgAnchor argAnchor (String fnNS , String fnSig , int argIdx ) {
0 commit comments