@@ -16,6 +16,37 @@ use substrait::protobuf::{
1616 Expression , Rel ,
1717} ;
1818
19+ pub fn reference_to_op ( reference : u32 ) -> Result < Operator > {
20+ match reference {
21+ 1 => Ok ( Operator :: Eq ) ,
22+ 2 => Ok ( Operator :: NotEq ) ,
23+ 3 => Ok ( Operator :: Lt ) ,
24+ 4 => Ok ( Operator :: LtEq ) ,
25+ 5 => Ok ( Operator :: Gt ) ,
26+ 6 => Ok ( Operator :: GtEq ) ,
27+ 7 => Ok ( Operator :: Plus ) ,
28+ 8 => Ok ( Operator :: Minus ) ,
29+ 9 => Ok ( Operator :: Multiply ) ,
30+ 10 => Ok ( Operator :: Divide ) ,
31+ 11 => Ok ( Operator :: Modulo ) ,
32+ 12 => Ok ( Operator :: And ) ,
33+ 13 => Ok ( Operator :: Or ) ,
34+ 14 => Ok ( Operator :: Like ) ,
35+ 15 => Ok ( Operator :: NotLike ) ,
36+ 16 => Ok ( Operator :: IsDistinctFrom ) ,
37+ 17 => Ok ( Operator :: IsNotDistinctFrom ) ,
38+ 18 => Ok ( Operator :: RegexMatch ) ,
39+ 19 => Ok ( Operator :: RegexIMatch ) ,
40+ 20 => Ok ( Operator :: RegexNotMatch ) ,
41+ 21 => Ok ( Operator :: RegexNotIMatch ) ,
42+ 22 => Ok ( Operator :: BitwiseAnd ) ,
43+ _ => Err ( DataFusionError :: NotImplemented ( format ! (
44+ "Unsupported function_reference: {:?}" ,
45+ reference
46+ ) ) ) ,
47+ }
48+ }
49+
1950/// Convert Substrait Rel to DataFusion DataFrame
2051#[ async_recursion]
2152pub async fn from_substrait_rel (
@@ -95,19 +126,7 @@ pub async fn from_substrait_rex(e: &Expression, input: &dyn DataFrame) -> Result
95126 } ,
96127 Some ( RexType :: ScalarFunction ( f) ) => {
97128 assert ! ( f. args. len( ) == 2 ) ;
98- let op = match f. function_reference {
99- 1 => Operator :: Eq ,
100- 2 => Operator :: Lt ,
101- 3 => Operator :: LtEq ,
102- 4 => Operator :: Gt ,
103- 5 => Operator :: GtEq ,
104- _ => {
105- return Err ( DataFusionError :: NotImplemented ( format ! (
106- "Unsupported function_reference: {:?}" ,
107- f. function_reference
108- ) ) )
109- }
110- } ;
129+ let op = reference_to_op ( f. function_reference ) ?;
111130 Ok ( Arc :: new ( Expr :: BinaryExpr {
112131 left : Box :: new (
113132 from_substrait_rex ( & f. args [ 0 ] , input)
@@ -124,19 +143,37 @@ pub async fn from_substrait_rex(e: &Expression, input: &dyn DataFrame) -> Result
124143 ) ,
125144 } ) )
126145 }
127- Some ( RexType :: Literal ( lit) ) => match lit. literal_type {
146+ Some ( RexType :: Literal ( lit) ) => match & lit. literal_type {
128147 Some ( LiteralType :: I8 ( n) ) => {
129- Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int8 ( Some ( n as i8 ) ) ) ) )
148+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int8 ( Some ( * n as i8 ) ) ) ) )
130149 }
131150 Some ( LiteralType :: I16 ( n) ) => {
132- Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int16 ( Some ( n as i16 ) ) ) ) )
151+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int16 ( Some ( * n as i16 ) ) ) ) )
133152 }
134153 Some ( LiteralType :: I32 ( n) ) => {
135- Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int32 ( Some ( n as i32 ) ) ) ) )
154+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int32 ( Some ( * n as i32 ) ) ) ) )
136155 }
137156 Some ( LiteralType :: I64 ( n) ) => {
138- Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int64 ( Some ( n as i64 ) ) ) ) )
157+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Int64 ( Some ( * n as i64 ) ) ) ) )
158+ }
159+ Some ( LiteralType :: Boolean ( b) ) => {
160+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Boolean ( Some ( * b) ) ) ) )
161+ }
162+ Some ( LiteralType :: Date ( d) ) => {
163+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Date32 ( Some ( * d) ) ) ) )
164+ }
165+ Some ( LiteralType :: Fp32 ( f) ) => {
166+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Float32 ( Some ( * f) ) ) ) )
167+ }
168+ Some ( LiteralType :: Fp64 ( f) ) => {
169+ Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Float64 ( Some ( * f) ) ) ) )
139170 }
171+ Some ( LiteralType :: String ( s) ) => Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: LargeUtf8 (
172+ Some ( s. clone ( ) ) ,
173+ ) ) ) ) ,
174+ Some ( LiteralType :: Binary ( b) ) => Ok ( Arc :: new ( Expr :: Literal ( ScalarValue :: Binary ( Some (
175+ b. clone ( ) ,
176+ ) ) ) ) ) ,
140177 _ => {
141178 return Err ( DataFusionError :: NotImplemented ( format ! (
142179 "Unsupported literal_type: {:?}" ,
0 commit comments