1#include "duckdb/optimizer/join_order/join_node.hpp"
2
3#include "duckdb/common/limits.hpp"
4#include "duckdb/planner/expression/list.hpp"
5#include "duckdb/planner/operator/list.hpp"
6
7namespace duckdb {
8
9JoinNode::JoinNode(JoinRelationSet &set, const double base_cardinality)
10 : set(set), info(nullptr), has_filter(false), left(nullptr), right(nullptr), base_cardinality(base_cardinality) {
11 estimated_props = make_uniq<EstimatedProperties>(args: base_cardinality, args: 0);
12}
13
14JoinNode::JoinNode(JoinRelationSet &set, optional_ptr<NeighborInfo> info, JoinNode &left, JoinNode &right,
15 const double base_cardinality, double cost)
16 : set(set), info(info), has_filter(false), left(&left), right(&right), base_cardinality(base_cardinality) {
17 estimated_props = make_uniq<EstimatedProperties>(args: base_cardinality, args&: cost);
18}
19
20unique_ptr<EstimatedProperties> EstimatedProperties::Copy() {
21 auto result = make_uniq<EstimatedProperties>(args&: cardinality, args&: cost);
22 return result;
23}
24
25double JoinNode::GetCost() {
26 return estimated_props->GetCost();
27}
28
29void JoinNode::SetCost(double cost) {
30 estimated_props->SetCost(cost);
31}
32
33double JoinNode::GetBaseTableCardinality() {
34 if (set.count > 1) {
35 throw InvalidInputException("Cannot call get base table cardinality on intermediate join node");
36 }
37 return base_cardinality;
38}
39
40void JoinNode::SetBaseTableCardinality(double base_card) {
41 base_cardinality = base_card;
42}
43
44void JoinNode::SetEstimatedCardinality(double estimated_card) {
45 estimated_props->SetCardinality(estimated_card);
46}
47
48string JoinNode::ToString() {
49 string result = "-------------------------------\n";
50 result += set.ToString() + "\n";
51 result += "card = " + to_string(val: GetCardinality<double>()) + "\n";
52 bool is_cartesian = false;
53 if (left && right) {
54 is_cartesian = (GetCardinality<double>() == left->GetCardinality<double>() * right->GetCardinality<double>());
55 }
56 result += "cartesian = " + to_string(val: is_cartesian) + "\n";
57 result += "cost = " + to_string(val: estimated_props->GetCost()) + "\n";
58 result += "left = \n";
59 if (left) {
60 result += left->ToString();
61 }
62 result += "right = \n";
63 if (right) {
64 result += right->ToString();
65 }
66 return result;
67}
68} // namespace duckdb
69