Skip to content

Commit b386c41

Browse files
committed
rebase
1 parent 0345fc1 commit b386c41

File tree

6 files changed

+32
-0
lines changed

6 files changed

+32
-0
lines changed

src/binder/bind/ddl/bound_create_table_info.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ BoundCreateTableInfo BoundCreateTableInfo::deserialize(Deserializer& deserialize
3131
deserializer.deserializeValue(hasParent);
3232
switch (type) {
3333
case TableType::NODE:
34+
case TableType::EXTERNAL_NODE:
3435
case TableType::REL: {
3536
extraInfo = BoundExtraCreateTableInfo::deserialize(deserializer, type);
3637
} break;
@@ -62,6 +63,9 @@ std::unique_ptr<BoundExtraCreateTableInfo> BoundExtraCreateTableInfo::deserializ
6263
case TableType::NODE: {
6364
info = BoundExtraCreateNodeTableInfo::deserialize(deserializer);
6465
} break;
66+
case TableType::EXTERNAL_NODE: {
67+
info = BoundExtraCreateExternalNodeTableInfo::deserialize(deserializer);
68+
} break;
6569
case TableType::REL: {
6670
info = BoundExtraCreateRelTableInfo::deserialize(deserializer);
6771
} break;

src/include/function/table/bind_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ struct TableFuncBindData {
2626
virtual ~TableFuncBindData() = default;
2727

2828
common::idx_t getNumColumns() const { return columnTypes.size(); }
29+
bool hasColumnSkips() const { return !columnSkips.empty(); }
2930
void setColumnSkips(std::vector<bool> skips) { columnSkips = std::move(skips); }
3031
KUZU_API std::vector<bool> getColumnSkips() const;
3132

src/include/planner/planner.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class PropertyExprCollection {
5050
public:
5151
void addProperties(const std::string& patternName,
5252
std::shared_ptr<binder::Expression> property);
53+
bool contains(const binder::Expression& pattern, const std::string propertyName) const;
5354
binder::expression_vector getProperties(const binder::Expression& pattern) const;
5455
binder::expression_vector getProperties() const;
5556

src/optimizer/projection_push_down_optimizer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,12 @@ void ProjectionPushDownOptimizer::visitCopyFrom(LogicalOperator* op) {
233233

234234
void ProjectionPushDownOptimizer::visitTableFunctionCall(LogicalOperator* op) {
235235
auto& tableFunctionCall = op->cast<LogicalTableFunctionCall>();
236+
// We have an interesting problem here. By default, we scan from external sources, columns are
237+
// bound as variables. So in projection push down, we check "variablesInUse".
238+
// When try to execute cypher over external sources directly, TODO: fnish
239+
if (tableFunctionCall.getBindData()->hasColumnSkips()) {
240+
return;
241+
}
236242
std::vector<bool> columnSkips;
237243
for (auto& column : tableFunctionCall.getColumns()) {
238244
columnSkips.push_back(!variablesInUse.contains(column));

src/planner/plan/append_scan_node_table.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "binder/expression/property_expression.h"
22
#include "planner/operator/scan/logical_scan_node_table.h"
33
#include "planner/operator/logical_hash_join.h"
4+
#include "planner/operator/logical_table_function_call.h"
45
#include "planner/planner.h"
56
#include "main/client_context.h"
67
#include "catalog/catalog_entry/external_node_table_catalog_entry.h"
@@ -44,6 +45,12 @@ void Planner::appendScanNodeTable(const Expression& expr, const expression_vecto
4445
auto bindData = scanFunc.bindFunc(clientContext, &bindInput);
4546
auto scanInfo = BoundTableScanSourceInfo(scanFunc, std::move(bindData), node.getPropertyExprs());
4647
appendTableFunctionCall(scanInfo, plan);
48+
auto& tableFunctionCall = plan.getLastOperator()->cast<LogicalTableFunctionCall>();
49+
std::vector<bool> columnSkips;
50+
for (auto i =0u; i < entry->getNumProperties(); ++i) {
51+
columnSkips.push_back(!propertyExprCollection.contains(expr, entry->getProperty(i).getName()));
52+
}
53+
tableFunctionCall.setColumnSkips(columnSkips);
4754
// Join external table with internal table.
4855
auto joinCondition = std::make_pair(pkExpr, pkExpr);
4956
std::vector<binder::expression_pair> joinConditions;

src/planner/planner.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "binder/bound_explain.h"
44
#include "main/client_context.h"
5+
#include "binder/expression/property_expression.h"
56

67
using namespace kuzu::binder;
78
using namespace kuzu::catalog;
@@ -11,6 +12,18 @@ using namespace kuzu::storage;
1112
namespace kuzu {
1213
namespace planner {
1314

15+
bool PropertyExprCollection::contains(const Expression& pattern, const std::string propertyName) const {
16+
if (!patternNameToProperties.contains(pattern.getUniqueName())) {
17+
return false;
18+
}
19+
for (auto& expr : patternNameToProperties.at(pattern.getUniqueName())) {
20+
if (expr->constCast<PropertyExpression>().getPropertyName() == propertyName) {
21+
return true;
22+
}
23+
}
24+
return false;
25+
}
26+
1427
expression_vector PropertyExprCollection::getProperties(const Expression& pattern) const {
1528
if (!patternNameToProperties.contains(pattern.getUniqueName())) {
1629
return binder::expression_vector{};

0 commit comments

Comments
 (0)