Skip to content

Commit 2fcd327

Browse files
committed
better
1 parent 9af9fd6 commit 2fcd327

File tree

1 file changed

+45
-41
lines changed

1 file changed

+45
-41
lines changed

vortex-duckdb/cpp/table_function.cpp

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -272,31 +272,31 @@ struct CTableFunctionInfo final : TableFunctionInfo {
272272
struct CTableBindData final : TableFunctionData {
273273
CTableBindData(
274274
unique_ptr<CTableFunctionInfo> info_p,
275-
const vector<string>& column_names,
276275
Session&& session,
277-
DataSource&& data_source)
276+
DataSource&& data_source,
277+
const vector<string>& column_names)
278278
: info(std::move(info_p))
279-
, column_names(column_names)
280279
, session(std::move(session))
281-
, data_source(std::move(data_source)) {}
280+
, data_source(std::move(data_source))
281+
, column_names(column_names) {}
282282

283283
~CTableBindData() override = default;
284284

285285
unique_ptr<FunctionData> Copy() const override {
286286
return make_uniq<CTableBindData>(
287287
make_uniq<CTableFunctionInfo>(info->vtab),
288-
column_names,
289288
Session{session},
290-
DataSource{data_source});
289+
DataSource{data_source},
290+
column_names);
291291
}
292292

293293
unique_ptr<CTableFunctionInfo> info; // TODO remove
294294

295-
// precomputed from data_source using vx_struct_fields_field_name, see c_bind()
296-
vector<string> column_names;
297-
298295
Session session;
299296
DataSource data_source;
297+
298+
vector<string> column_names;
299+
vector<const vx_expression*> filters;
300300
};
301301

302302
struct CTableGlobalData final : GlobalTableFunctionState {
@@ -368,12 +368,12 @@ unique_ptr<FunctionData> c_bind(
368368
auto& vtab = info.table_function.function_info->Cast<CTableFunctionInfo>().vtab;
369369
return make_uniq<CTableBindData>(
370370
make_uniq<CTableFunctionInfo>(vtab),
371-
names,
372371
std::move(session),
373-
std::move(data_source));
372+
std::move(data_source),
373+
names);
374374
}
375375

376-
const vx_expression* projection(
376+
const vx_expression* make_projection(
377377
const vector<column_t>& column_ids,
378378
const vector<idx_t>& projection_ids,
379379
const vector<string>& column_names
@@ -417,6 +417,16 @@ const vx_expression* projection(
417417
return expr;
418418
}
419419

420+
const vx_expression* make_filter(
421+
optional_ptr<TableFilterSet> table_filters,
422+
const vector<column_t>& column_ids,
423+
const vector<string>& column_names,
424+
const vector<const vx_expression*>& additional_filters,
425+
const vx_dtype* dtype
426+
) {
427+
return nullptr;
428+
}
429+
420430
unique_ptr<GlobalTableFunctionState> c_init_global(ClientContext &, TableFunctionInitInput &input) {
421431
const auto &bind = input.bind_data->Cast<CTableBindData>();
422432

@@ -425,9 +435,16 @@ unique_ptr<GlobalTableFunctionState> c_init_global(ClientContext &, TableFunctio
425435
.idx_len = 0,
426436
.include = VX_S_INCLUDE_ALL,
427437
};
438+
439+
const vx_dtype* dtype = vx_data_source_dtype(bind.data_source.handle());
440+
const vx_expression* projection = make_projection(
441+
input.column_ids, input.projection_ids, bind.column_names);
442+
const vx_expression* filter = make_filter(input.filters,
443+
input.column_ids, bind.column_names, bind.filters, dtype);
444+
428445
vx_scan_options options = {
429-
.projection = projection(input.column_ids, input.projection_ids, bind.column_names),
430-
.filter = nullptr,
446+
.projection = projection,
447+
.filter = filter,
431448
.row_range_begin = 0,
432449
.row_range_end = 0,
433450
.selection = selection,
@@ -446,10 +463,10 @@ unique_ptr<LocalTableFunctionState> c_init_local(ExecutionContext &,
446463
}
447464

448465
void c_function(ClientContext &context, TableFunctionInput &input, DataChunk &output) {
449-
Scan& scan = input.global_state->Cast<CTableGlobalData>().scan;
466+
auto& global_state = input.global_state->Cast<CTableGlobalData>();
450467
auto& batch_id = input.local_state->Cast<CTableLocalData>().batch_id;
451468

452-
auto next_partition = scan.next_partition();
469+
auto next_partition = global_state.scan.next_partition();
453470
if (!next_partition) return;
454471
Partition partition = std::move(*next_partition);
455472

@@ -466,30 +483,17 @@ void c_function(ClientContext &context, TableFunctionInput &input, DataChunk &ou
466483
}
467484
}
468485

469-
//void c_pushdown_complex_filter(ClientContext & /*context*/,
470-
// LogicalGet & /*get*/,
471-
// FunctionData *bind_data,
472-
// vector<unique_ptr<Expression>> &filters) {
473-
// if (filters.empty()) {
474-
// return;
475-
// }
476-
//
477-
// auto &bind = bind_data->Cast<CTableBindData>();
478-
//
479-
// for (auto iter = filters.begin(); iter != filters.end();) {
480-
// duckdb_vx_error error_out = nullptr;
481-
// auto pushed =
482-
// bind.info->vtab.pushdown_complex_filter(bind_data->Cast<CTableBindData>().ffi_data->DataPtr(),
483-
// reinterpret_cast<duckdb_vx_expr>(iter->get()),
484-
// &error_out);
485-
// if (error_out) {
486-
// throw BinderException(IntoErrString(error_out));
487-
// }
488-
//
489-
// // If the pushdown complex filter returns true, we can remove the filter from the list.
490-
// iter = pushed ? filters.erase(iter) : std::next(iter);
491-
// }
492-
//}
486+
const vx_expression* from_filter(const Expression& filter) {
487+
return nullptr;
488+
}
489+
490+
void c_pushdown_complex_filter(ClientContext &, LogicalGet &, FunctionData *bind_data, vector<unique_ptr<Expression>> &filters) {
491+
auto &bind = bind_data->Cast<CTableBindData>();
492+
// We don't erase filters, see Nick's comment in datasource.rs
493+
for (auto iter = filters.begin(); iter != filters.end(); ++iter) {
494+
bind.filters.emplace_back(from_filter(**iter));
495+
}
496+
}
493497

494498
unique_ptr<NodeStatistics> c_cardinality(ClientContext &, const FunctionData *bind_data) {
495499
auto stats = make_uniq<NodeStatistics>();
@@ -537,7 +541,7 @@ extern "C" duckdb_state duckdb_vx_tfunc_register(
537541
auto db = wrapper->database->instance;
538542
auto tf = TableFunction(vtab->name, {}, c_function, c_bind, c_init_global, c_init_local);
539543

540-
//tf.pushdown_complex_filter = c_pushdown_complex_filter;
544+
tf.pushdown_complex_filter = c_pushdown_complex_filter;
541545

542546
//tf.projection_pushdown = vtab->projection_pushdown;
543547
//tf.filter_pushdown = vtab->filter_pushdown;

0 commit comments

Comments
 (0)