Skip to content

Commit 251611e

Browse files
committed
feat(qc): support hasSome/hasEvery parameterization (#5736)
Implement `ScalarListCondition::ContainsEvery` and `ScalarListCondition::ContainsSome` support for placeholders in `sql-query-builder` and mark `hasSome`/`hasEvery` as parameterizable in the DMMF.
1 parent ba8b033 commit 251611e

3 files changed

Lines changed: 19 additions & 7 deletions

File tree

query-compiler/core/src/query_graph_builder/extractors/filters/scalar.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,9 @@ impl<'a> ScalarFilterParser<'a> {
535535
))),
536536
}
537537
}
538+
539+
ParsedInputValue::Single(PrismaValue::Placeholder(p)) => Ok(ConditionListValue::Placeholder(p)),
540+
538541
_ => {
539542
let vals: Vec<PrismaValue> = input.try_into()?;
540543

query-compiler/query-builders/sql-query-builder/src/filter/visitor.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -598,12 +598,13 @@ impl FilterVisitorExt for FilterVisitor {
598598
ScalarListCondition::ContainsSome(ConditionListValue::FieldRef(field_ref)) => {
599599
comparable.compare_raw("&&", field_ref.aliased_col(alias, ctx))
600600
}
601-
// TODO: Implement placeholder support for scalar list filters (follow-up work)
602-
ScalarListCondition::ContainsEvery(ConditionListValue::Placeholder(_)) => {
603-
unimplemented!("Placeholder support for hasSome/hasEvery not yet implemented")
601+
ScalarListCondition::ContainsEvery(ConditionListValue::Placeholder(placeholder)) => {
602+
let param: Expression = field.value(placeholder.into(), ctx).into();
603+
comparable.compare_raw("@>", param)
604604
}
605-
ScalarListCondition::ContainsSome(ConditionListValue::Placeholder(_)) => {
606-
unimplemented!("Placeholder support for hasSome/hasEvery not yet implemented")
605+
ScalarListCondition::ContainsSome(ConditionListValue::Placeholder(placeholder)) => {
606+
let param: Expression = field.value(placeholder.into(), ctx).into();
607+
comparable.compare_raw("&&", param)
607608
}
608609
ScalarListCondition::IsEmpty(true) => comparable.compare_raw("=", ValueType::Array(Some(vec![])).raw()),
609610
ScalarListCondition::IsEmpty(false) => comparable.compare_raw("<>", ValueType::Array(Some(vec![])).raw()),

query-compiler/schema/src/build/input_types/fields/field_filter_types.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,16 @@ fn scalar_list_filter_type(ctx: &'_ QuerySchema, sf: ScalarFieldRef) -> InputObj
197197
);
198198

199199
let mapped_list_type_with_field_ref_input = mapped_list_type.with_field_ref_input();
200-
fields.push(input_field(filters::HAS_EVERY, mapped_list_type_with_field_ref_input.clone(), None).optional());
201-
fields.push(input_field(filters::HAS_SOME, mapped_list_type_with_field_ref_input, None).optional());
200+
fields.push(
201+
input_field(filters::HAS_EVERY, mapped_list_type_with_field_ref_input.clone(), None)
202+
.optional()
203+
.parameterizable(),
204+
);
205+
fields.push(
206+
input_field(filters::HAS_SOME, mapped_list_type_with_field_ref_input, None)
207+
.optional()
208+
.parameterizable(),
209+
);
202210
fields.push(simple_input_field(filters::IS_EMPTY, InputType::boolean(), None).optional());
203211
fields
204212
});

0 commit comments

Comments
 (0)