@@ -25,16 +25,19 @@ class DuckDBToSubstrait {
25
25
plan.Clear ();
26
26
}
27
27
// ! Serializes the substrait plan to a string
28
- string SerializeToString ();
29
- string SerializeToJson ();
28
+ string SerializeToString () const ;
29
+ string SerializeToJson () const ;
30
30
31
31
private:
32
32
// ! Transform DuckDB Plan to Substrait Plan
33
33
void TransformPlan (LogicalOperator &dop);
34
34
// ! Registers a function
35
35
uint64_t RegisterFunction (const std::string &name, vector<::substrait::Type> &args_types);
36
36
// ! Creates a reference to a table column
37
- void CreateFieldRef (substrait::Expression *expr, uint64_t col_idx);
37
+ static void CreateFieldRef (substrait::Expression *expr, uint64_t col_idx);
38
+ // ! In case of struct types we might we do DFS to get all names
39
+ static vector<string> DepthFirstNames (const LogicalType &type);
40
+ static void DepthFirstNamesRecurse (vector<string> &names, const LogicalType &type);
38
41
39
42
// ! Transforms Relation Root
40
43
substrait::RelRoot *TransformRootOp (LogicalOperator &dop);
@@ -54,36 +57,36 @@ class DuckDBToSubstrait {
54
57
substrait::Rel *TransformDistinct (LogicalOperator &dop);
55
58
substrait::Rel *TransformExcept (LogicalOperator &dop);
56
59
substrait::Rel *TransformIntersect (LogicalOperator &dop);
57
- substrait::Rel *TransformDummyScan ();
60
+ static substrait::Rel *TransformDummyScan ();
58
61
// ! Methods to transform different LogicalGet Types (e.g., Table, Parquet)
59
62
// ! To Substrait;
60
- void TransformTableScanToSubstrait (LogicalGet &dget, substrait::ReadRel *sget);
63
+ void TransformTableScanToSubstrait (LogicalGet &dget, substrait::ReadRel *sget) const ;
61
64
void TransformParquetScanToSubstrait (LogicalGet &dget, substrait::ReadRel *sget, BindInfo &bind_info,
62
- FunctionData &bind_data);
65
+ const FunctionData &bind_data) const ;
63
66
64
67
// ! Methods to transform DuckDBConstants to Substrait Expressions
65
- void TransformConstant (Value &dval, substrait::Expression &sexpr);
66
- void TransformInteger (Value &dval, substrait::Expression &sexpr);
67
- void TransformDouble (Value &dval, substrait::Expression &sexpr);
68
- void TransformBigInt (Value &dval, substrait::Expression &sexpr);
69
- void TransformDate (Value &dval, substrait::Expression &sexpr);
70
- void TransformVarchar (Value &dval, substrait::Expression &sexpr);
71
- void TransformBoolean (Value &dval, substrait::Expression &sexpr);
72
- void TransformDecimal (Value &dval, substrait::Expression &sexpr);
73
- void TransformHugeInt (Value &dval, substrait::Expression &sexpr);
74
- void TransformSmallInt (Value &dval, substrait::Expression &sexpr);
75
- void TransformFloat (Value &dval, substrait::Expression &sexpr);
76
- void TransformTime (Value &dval, substrait::Expression &sexpr);
77
- void TransformInterval (Value &dval, substrait::Expression &sexpr);
78
- void TransformTimestamp (Value &dval, substrait::Expression &sexpr);
79
- void TransformEnum (Value &dval, substrait::Expression &sexpr);
68
+ static void TransformConstant (const Value &dval, substrait::Expression &sexpr);
69
+ static void TransformInteger (const Value &dval, substrait::Expression &sexpr);
70
+ static void TransformDouble (const Value &dval, substrait::Expression &sexpr);
71
+ static void TransformBigInt (const Value &dval, substrait::Expression &sexpr);
72
+ static void TransformDate (const Value &dval, substrait::Expression &sexpr);
73
+ static void TransformVarchar (const Value &dval, substrait::Expression &sexpr);
74
+ static void TransformBoolean (const Value &dval, substrait::Expression &sexpr);
75
+ static void TransformDecimal (const Value &dval, substrait::Expression &sexpr);
76
+ static void TransformHugeInt (const Value &dval, substrait::Expression &sexpr);
77
+ static void TransformSmallInt (const Value &dval, substrait::Expression &sexpr);
78
+ static void TransformFloat (const Value &dval, substrait::Expression &sexpr);
79
+ static void TransformTime (const Value &dval, substrait::Expression &sexpr);
80
+ static void TransformInterval (const Value &dval, substrait::Expression &sexpr);
81
+ static void TransformTimestamp (const Value &dval, substrait::Expression &sexpr);
82
+ static void TransformEnum (const Value &dval, substrait::Expression &sexpr);
80
83
81
84
// ! Methods to transform a DuckDB Expression to a Substrait Expression
82
85
void TransformExpr (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset = 0 );
83
- void TransformBoundRefExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
86
+ static void TransformBoundRefExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
84
87
void TransformCastExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
85
88
void TransformFunctionExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
86
- void TransformConstantExpression (Expression &dexpr, substrait::Expression &sexpr);
89
+ static void TransformConstantExpression (Expression &dexpr, substrait::Expression &sexpr);
87
90
void TransformComparisonExpression (Expression &dexpr, substrait::Expression &sexpr);
88
91
void TransformConjunctionExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
89
92
void TransformNotNullExpression (Expression &dexpr, substrait::Expression &sexpr, uint64_t col_offset);
@@ -93,31 +96,32 @@ class DuckDBToSubstrait {
93
96
void TransformInExpression (Expression &dexpr, substrait::Expression &sexpr);
94
97
95
98
// ! Transforms a DuckDB Logical Type into a Substrait Type
96
- :: substrait::Type DuckToSubstraitType (const LogicalType &type, BaseStatistics *column_statistics = nullptr ,
97
- bool not_null = false );
99
+ static substrait::Type DuckToSubstraitType (const LogicalType &type, BaseStatistics *column_statistics = nullptr ,
100
+ bool not_null = false );
98
101
99
102
// ! Methods to transform DuckDB Filters to Substrait Expression
100
103
substrait::Expression *TransformFilter (uint64_t col_idx, LogicalType &column_type, TableFilter &dfilter,
101
104
LogicalType &return_type);
102
- substrait::Expression *TransformIsNotNullFilter (uint64_t col_idx, LogicalType &column_type, TableFilter &dfilter ,
103
- LogicalType &return_type);
105
+ substrait::Expression *TransformIsNotNullFilter (uint64_t col_idx, const LogicalType &column_type,
106
+ TableFilter &dfilter, const LogicalType &return_type);
104
107
substrait::Expression *TransformConjuctionAndFilter (uint64_t col_idx, LogicalType &column_type,
105
108
TableFilter &dfilter, LogicalType &return_type);
106
- substrait::Expression *TransformConstantComparisonFilter (uint64_t col_idx, LogicalType &column_type,
107
- TableFilter &dfilter, LogicalType &return_type);
109
+ substrait::Expression *TransformConstantComparisonFilter (uint64_t col_idx, const LogicalType &column_type,
110
+ TableFilter &dfilter, const LogicalType &return_type);
108
111
109
112
// ! Transforms DuckDB Join Conditions to Substrait Expression
110
- substrait::Expression *TransformJoinCond (JoinCondition &dcond, uint64_t left_ncol);
113
+ substrait::Expression *TransformJoinCond (const JoinCondition &dcond, uint64_t left_ncol);
111
114
// ! Transforms DuckDB Sort Order to Substrait Sort Order
112
- void TransformOrder (BoundOrderByNode &dordf, substrait::SortField &sordf);
115
+ void TransformOrder (const BoundOrderByNode &dordf, substrait::SortField &sordf);
113
116
114
- void AllocateFunctionArgument (substrait::Expression_ScalarFunction *scalar_fun, substrait::Expression *value);
117
+ static void AllocateFunctionArgument (substrait::Expression_ScalarFunction *scalar_fun,
118
+ substrait::Expression *value);
115
119
static std::string &RemapFunctionName (std::string &function_name);
116
- bool IsExtractFunction (const string &function_name) const ;
120
+ static bool IsExtractFunction (const string &function_name);
117
121
118
122
// ! Creates a Conjunction
119
123
template <typename T, typename FUNC>
120
- substrait::Expression *CreateConjunction (T &source, FUNC f) {
124
+ substrait::Expression *CreateConjunction (T &source, const FUNC f) {
121
125
substrait::Expression *res = nullptr ;
122
126
for (auto &ele : source) {
123
127
auto child_expression = f (ele);
0 commit comments