@@ -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+
163172py::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