| 132 | } |
| 133 | |
| 134 | JoinTreeConstructor::IntermediateResult JoinTreeConstructor::constructNodeScan( |
| 135 | std::shared_ptr<Expression> expr) { |
| 136 | auto& node = expr->constCast<NodeExpression>(); |
| 137 | auto nodeIdx = queryGraph.getQueryNodeIdx(node.getUniqueName()); |
| 138 | auto emptySubgraph = SubqueryGraph(queryGraph); |
| 139 | auto newSubgraph = SubqueryGraph(queryGraph); |
| 140 | newSubgraph.addQueryNode(nodeIdx); |
| 141 | auto extraInfo = std::make_unique<ExtraScanTreeNodeInfo>(); |
| 142 | // See Planner::planBaseTableScans for how we plan unnest correlated subqueries. |
| 143 | if (planningInfo.subqueryType == SubqueryPlanningType::UNNEST_CORRELATED && |
| 144 | planningInfo.containsCorrExpr(*node.getInternalID())) { |
| 145 | extraInfo->nodeInfo = std::make_unique<NodeRelScanInfo>(expr, expression_vector{}); |
| 146 | ; |
| 147 | auto treeNode = |
| 148 | std::make_shared<JoinTreeNode>(TreeNodeType::NODE_SCAN, std::move(extraInfo)); |
| 149 | return {treeNode, newSubgraph}; |
| 150 | } |
| 151 | auto properties = propertyCollection.getProperties(*expr); |
| 152 | auto predicates = |
| 153 | Planner::getNewlyMatchedExprs(emptySubgraph, newSubgraph, queryGraphPredicates); |
| 154 | auto nodeScanInfo = std::make_unique<NodeRelScanInfo>(expr, properties); |
| 155 | nodeScanInfo->predicates = predicates; |
| 156 | extraInfo->nodeInfo = std::move(nodeScanInfo); |
| 157 | auto treeNode = std::make_shared<JoinTreeNode>(TreeNodeType::NODE_SCAN, std::move(extraInfo)); |
| 158 | return {treeNode, newSubgraph}; |
| 159 | } |
| 160 | |
| 161 | JoinTreeConstructor::IntermediateResult JoinTreeConstructor::constructRelScan( |
| 162 | std::shared_ptr<binder::Expression> expr) { |
nothing calls this directly
no test coverage detected