Skip to content

Commit 9b42618

Browse files
committed
construct a list out of the values, to pass to 'pyarrow.compute.Expression.isin'
1 parent 134b784 commit 9b42618

1 file changed

Lines changed: 12 additions & 11 deletions

File tree

src/duckdb_py/arrow/pyarrow_filter_pushdown.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,15 @@ py::object GetScalar(Value &constant, const string &timezone_config, const Arrow
160160
}
161161
}
162162

163+
static py::list TransformInList(const InFilter &in) {
164+
py::list res;
165+
ClientProperties default_properties;
166+
for (auto &val : in.values) {
167+
res.append(PythonObject::FromValue(val, val.type(), default_properties));
168+
}
169+
return res;
170+
}
171+
163172
py::object TransformFilterRecursive(TableFilter &filter, vector<string> column_ref, const string &timezone_config,
164173
const ArrowType &type) {
165174
auto &import_cache = *DuckDBPyConnection::ImportCache();
@@ -282,17 +291,9 @@ py::object TransformFilterRecursive(TableFilter &filter, vector<string> column_r
282291
}
283292
case TableFilterType::IN_FILTER: {
284293
auto &in_filter = filter.Cast<InFilter>();
285-
ConjunctionOrFilter or_filter;
286-
value_set_t unique_values;
287-
for (const auto &value : in_filter.values) {
288-
if (unique_values.find(value) == unique_values.end()) {
289-
unique_values.insert(value);
290-
}
291-
}
292-
for (const auto &value : unique_values) {
293-
or_filter.child_filters.push_back(make_uniq<ConstantFilter>(ExpressionType::COMPARE_EQUAL, value));
294-
}
295-
return TransformFilterRecursive(or_filter, column_ref, timezone_config, type);
294+
auto constant_field = field(py::tuple(py::cast(column_ref)));
295+
auto in_list = TransformInList(in_filter);
296+
return constant_field.attr("isin")(std::move(in_list));
296297
}
297298
case TableFilterType::DYNAMIC_FILTER: {
298299
//! Ignore dynamic filters for now, not necessary for correctness

0 commit comments

Comments
 (0)