16
16
#include " google/protobuf/util/json_util.h"
17
17
#include " substrait/plan.pb.h"
18
18
19
- #include " substrait_relations.hpp"
20
- #include " duckdb/common/helper.hpp"
21
19
#include " duckdb/main/table_description.hpp"
20
+
22
21
#include " duckdb/catalog/catalog_entry/table_catalog_entry.hpp"
22
+ #include " duckdb/common/helper.hpp"
23
+
24
+ #include " duckdb/main/relation.hpp"
25
+ #include " duckdb/main/relation/table_relation.hpp"
26
+ #include " duckdb/main/relation/table_function_relation.hpp"
27
+ #include " duckdb/main/relation/value_relation.hpp"
28
+ #include " duckdb/main/relation/view_relation.hpp"
29
+ #include " duckdb/main/relation/aggregate_relation.hpp"
30
+ #include " duckdb/main/relation/cross_product_relation.hpp"
31
+ #include " duckdb/main/relation/filter_relation.hpp"
32
+ #include " duckdb/main/relation/join_relation.hpp"
33
+ #include " duckdb/main/relation/limit_relation.hpp"
34
+ #include " duckdb/main/relation/order_relation.hpp"
35
+ #include " duckdb/main/relation/projection_relation.hpp"
36
+ #include " duckdb/main/relation/setop_relation.hpp"
23
37
24
38
namespace duckdb {
25
39
const std::unordered_map<std::string, std::string> SubstraitToDuckDB::function_names_remap = {
@@ -61,8 +75,8 @@ string SubstraitToDuckDB::RemoveExtension(const string &function_name) {
61
75
return name;
62
76
}
63
77
64
-
65
- SubstraitToDuckDB::SubstraitToDuckDB (shared_ptr<ClientContext> &context_p, const string &serialized, bool json): context(context_p) {
78
+ SubstraitToDuckDB::SubstraitToDuckDB (shared_ptr<ClientContext> &context_p, const string &serialized, bool json)
79
+ : context(context_p) {
66
80
if (!json) {
67
81
if (!plan.ParseFromString (serialized)) {
68
82
throw std::runtime_error (" Was not possible to convert binary into Substrait plan" );
@@ -437,28 +451,28 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformJoinOp(const substrait::Rel &so
437
451
throw InternalException (" Unsupported join type" );
438
452
}
439
453
unique_ptr<ParsedExpression> join_condition = TransformExpr (sjoin.expression ());
440
- return make_shared_ptr<SubstraitJoinRelation >(TransformOp (sjoin.left ())->Alias (" left" ),
454
+ return make_shared_ptr<JoinRelation >(TransformOp (sjoin.left ())->Alias (" left" ),
441
455
TransformOp (sjoin.right ())->Alias (" right" ), std::move (join_condition),
442
456
djointype);
443
457
}
444
458
445
459
shared_ptr<Relation> SubstraitToDuckDB::TransformCrossProductOp (const substrait::Rel &sop) {
446
460
auto &sub_cross = sop.cross ();
447
461
448
- return make_shared_ptr<SubstraitCrossProductRelation >(TransformOp (sub_cross.left ())->Alias (" left" ),
462
+ return make_shared_ptr<CrossProductRelation >(TransformOp (sub_cross.left ())->Alias (" left" ),
449
463
TransformOp (sub_cross.right ())->Alias (" right" ));
450
464
}
451
465
452
466
shared_ptr<Relation> SubstraitToDuckDB::TransformFetchOp (const substrait::Rel &sop) {
453
467
auto &slimit = sop.fetch ();
454
468
idx_t limit = slimit.count () == -1 ? NumericLimits<idx_t >::Maximum () : slimit.count ();
455
469
idx_t offset = slimit.offset ();
456
- return make_shared_ptr<SubstraitLimitRelation >(TransformOp (slimit.input ()), limit, offset);
470
+ return make_shared_ptr<LimitRelation >(TransformOp (slimit.input ()), limit, offset);
457
471
}
458
472
459
473
shared_ptr<Relation> SubstraitToDuckDB::TransformFilterOp (const substrait::Rel &sop) {
460
474
auto &sfilter = sop.filter ();
461
- return make_shared_ptr<SubstraitFilterRelation >(TransformOp (sfilter.input ()), TransformExpr (sfilter.condition ()));
475
+ return make_shared_ptr<FilterRelation >(TransformOp (sfilter.input ()), TransformExpr (sfilter.condition ()));
462
476
}
463
477
464
478
shared_ptr<Relation> SubstraitToDuckDB::TransformProjectOp (const substrait::Rel &sop) {
@@ -471,7 +485,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformProjectOp(const substrait::Rel
471
485
for (size_t i = 0 ; i < expressions.size (); i++) {
472
486
mock_aliases.push_back (" expr_" + to_string (i));
473
487
}
474
- return make_shared_ptr<SubstraitProjectionRelation >(TransformOp (sop.project ().input ()), std::move (expressions),
488
+ return make_shared_ptr<ProjectionRelation >(TransformOp (sop.project ().input ()), std::move (expressions),
475
489
std::move (mock_aliases));
476
490
}
477
491
@@ -503,16 +517,16 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformAggregateOp(const substrait::Re
503
517
nullptr , nullptr , is_distinct));
504
518
}
505
519
506
- return make_shared_ptr<SubstraitAggregateRelation >(TransformOp (sop.aggregate ().input ()), std::move (expressions),
520
+ return make_shared_ptr<AggregateRelation >(TransformOp (sop.aggregate ().input ()), std::move (expressions),
507
521
std::move (groups));
508
522
}
509
- unique_ptr<TableDescription> TableInfo (ClientContext& context, const string &schema_name, const string &table_name) {
523
+ unique_ptr<TableDescription> TableInfo (ClientContext & context, const string &schema_name, const string &table_name) {
510
524
unique_ptr<TableDescription> result;
511
525
// obtain the table info
512
526
auto table = Catalog::GetEntry<TableCatalogEntry>(context, INVALID_CATALOG, schema_name, table_name,
513
- OnEntryNotFound::RETURN_NULL);
527
+ OnEntryNotFound::RETURN_NULL);
514
528
if (!table) {
515
- return {};
529
+ return {};
516
530
}
517
531
// write the table info to the result
518
532
result = make_uniq<TableDescription>();
@@ -531,13 +545,13 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformReadOp(const substrait::Rel &so
531
545
auto table_name = sget.named_table ().names (0 );
532
546
// If we can't find a table with that name, let's try a view.
533
547
try {
534
- auto table_info =TableInfo (*context, DEFAULT_SCHEMA, table_name);
548
+ auto table_info = TableInfo (*context, DEFAULT_SCHEMA, table_name);
535
549
if (!table_info) {
536
550
throw CatalogException (" Table '%s' does not exist!" , table_name);
537
551
}
538
- return make_shared_ptr<SubstraitTableRelation >(context, std::move (table_info));
552
+ return make_shared_ptr<TableRelation >(context, std::move (table_info), false );
539
553
} catch (...) {
540
- scan = make_shared_ptr<SubstraitViewRelation >(context, DEFAULT_SCHEMA, table_name);
554
+ scan = make_shared_ptr<ViewRelation >(context, DEFAULT_SCHEMA, table_name, false );
541
555
}
542
556
} else if (sget.has_local_files ()) {
543
557
vector<Value> parquet_files;
@@ -558,9 +572,11 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformReadOp(const substrait::Rel &so
558
572
}
559
573
string name = " parquet_" + StringUtil::GenerateRandomName ();
560
574
named_parameter_map_t named_parameters ({{" binary_as_string" , Value::BOOLEAN (false )}});
561
- // auto scan_rel = make_shared_ptr<SubstraitTableFunctionRelation>(context, "parquet_scan", {Value::LIST(parquet_files)}, named_parameters);
562
- // auto rel = static_cast<Relation*>(scan_rel.get());
563
- // scan = rel->Alias(name);
575
+ vector<Value> parameters {Value::LIST (parquet_files)};
576
+ auto scan_rel = make_shared_ptr<TableFunctionRelation>(context, " parquet_scan" , parameters,
577
+ std::move (named_parameters), nullptr , true , false );
578
+ auto rel = static_cast <Relation *>(scan_rel.get ());
579
+ scan = rel->Alias (name);
564
580
} else if (sget.has_virtual_table ()) {
565
581
// We need to handle a virtual table as a LogicalExpressionGet
566
582
auto literal_values = sget.virtual_table ().values ();
@@ -574,13 +590,13 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformReadOp(const substrait::Rel &so
574
590
expression_rows.emplace_back (expression_row);
575
591
}
576
592
vector<string> column_names;
577
- scan = make_shared_ptr<SubstraitValueRelation >(context, expression_rows, column_names, " values" );
593
+ scan = make_shared_ptr<ValueRelation >(context, expression_rows, column_names, " values" , false );
578
594
} else {
579
595
throw NotImplementedException (" Unsupported type of read operator for substrait" );
580
596
}
581
597
582
598
if (sget.has_filter ()) {
583
- scan = make_shared_ptr<SubstraitFilterRelation >(std::move (scan), TransformExpr (sget.filter ()));
599
+ scan = make_shared_ptr<FilterRelation >(std::move (scan), TransformExpr (sget.filter ()));
584
600
}
585
601
586
602
if (sget.has_projection ()) {
@@ -593,7 +609,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformReadOp(const substrait::Rel &so
593
609
// TODO make sure nothing else is in there
594
610
expressions.push_back (make_uniq<PositionalReferenceExpression>(sproj.field () + 1 ));
595
611
}
596
- scan = make_shared_ptr<SubstraitProjectionRelation >(std::move (scan), std::move (expressions), std::move (aliases));
612
+ scan = make_shared_ptr<ProjectionRelation >(std::move (scan), std::move (expressions), std::move (aliases));
597
613
}
598
614
599
615
return scan;
@@ -604,7 +620,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformSortOp(const substrait::Rel &so
604
620
for (auto &sordf : sop.sort ().sorts ()) {
605
621
order_nodes.push_back (TransformOrder (sordf));
606
622
}
607
- return make_shared_ptr<SubstraitOrderRelation >(TransformOp (sop.sort ().input ()), std::move (order_nodes));
623
+ return make_shared_ptr<OrderRelation >(TransformOp (sop.sort ().input ()), std::move (order_nodes));
608
624
}
609
625
610
626
static SetOperationType TransformSetOperationType (substrait::SetRel_SetOp setop) {
@@ -638,7 +654,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformSetOp(const substrait::Rel &sop
638
654
auto lhs = TransformOp (inputs[0 ]);
639
655
auto rhs = TransformOp (inputs[1 ]);
640
656
641
- return make_shared_ptr<SubstraitSetOpRelation >(std::move (lhs), std::move (rhs), type);
657
+ return make_shared_ptr<SetOpRelation >(std::move (lhs), std::move (rhs), type);
642
658
}
643
659
644
660
shared_ptr<Relation> SubstraitToDuckDB::TransformOp (const substrait::Rel &sop) {
@@ -687,11 +703,11 @@ Relation *GetProjection(Relation &relation) {
687
703
case RelationType::PROJECTION_RELATION:
688
704
return &relation;
689
705
case RelationType::LIMIT_RELATION:
690
- return GetProjection (*relation.Cast <SubstraitLimitRelation >().child );
706
+ return GetProjection (*relation.Cast <LimitRelation >().child );
691
707
case RelationType::ORDER_RELATION:
692
- return GetProjection (*relation.Cast <SubstraitOrderRelation >().child );
708
+ return GetProjection (*relation.Cast <OrderRelation >().child );
693
709
case RelationType::SET_OPERATION_RELATION:
694
- return GetProjection (*relation.Cast <SubstraitSetOpRelation >().right );
710
+ return GetProjection (*relation.Cast <SetOpRelation >().right );
695
711
default :
696
712
return nullptr ;
697
713
}
@@ -705,7 +721,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformRootOp(const substrait::RelRoot
705
721
auto child = TransformOp (sop.input ());
706
722
auto first_projection_or_table = GetProjection (*child);
707
723
if (first_projection_or_table) {
708
- vector<ColumnDefinition> *column_definitions = &first_projection_or_table->Cast <SubstraitProjectionRelation >().columns ;
724
+ vector<ColumnDefinition> *column_definitions = &first_projection_or_table->Cast <ProjectionRelation >().columns ;
709
725
int32_t i = 0 ;
710
726
for (auto &column : *column_definitions) {
711
727
aliases.push_back (column_names[i++]);
@@ -720,7 +736,7 @@ shared_ptr<Relation> SubstraitToDuckDB::TransformRootOp(const substrait::RelRoot
720
736
}
721
737
}
722
738
723
- return make_shared_ptr<SubstraitProjectionRelation >(child, std::move (expressions), aliases);
739
+ return make_shared_ptr<ProjectionRelation >(child, std::move (expressions), aliases);
724
740
}
725
741
726
742
shared_ptr<Relation> SubstraitToDuckDB::TransformPlan () {
0 commit comments