Skip to content

Commit ca7749b

Browse files
committed
feat(qc): support parameterizing orderBy._relevance.search (#5733)
Don't parse the exact string value out of `orderBy._relevance.search` and forward it all the way to `quaint` as an opaque value. This PR also marks the field as parameterizable in the query schema and DMMF.
1 parent a6f4393 commit ca7749b

7 files changed

Lines changed: 23 additions & 11 deletions

File tree

quaint/src/ast/function/search.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use crate::prelude::*;
2-
use std::borrow::Cow;
32

43
#[derive(Debug, Clone, PartialEq)]
54
/// Holds the expressions on which to perform a full-text search
@@ -39,7 +38,7 @@ where
3938
/// Holds the expressions & query on which to perform a text-search ranking compute
4039
pub struct TextSearchRelevance<'a> {
4140
pub(crate) exprs: Vec<Expression<'a>>,
42-
pub(crate) query: Cow<'a, str>,
41+
pub(crate) query: Expression<'a>,
4342
}
4443

4544
/// Computes the relevance score of a full-text search query against some expressions.
@@ -63,7 +62,7 @@ pub struct TextSearchRelevance<'a> {
6362
pub fn text_search_relevance<'a, E, Q>(exprs: &[E], query: Q) -> super::Function<'a>
6463
where
6564
E: Clone + Into<Expression<'a>>,
66-
Q: Into<Cow<'a, str>>,
65+
Q: Into<Expression<'a>>,
6766
{
6867
let exprs: Vec<Expression> = exprs.iter().map(|c| c.clone().into()).collect();
6968
let fun = TextSearchRelevance {

quaint/src/visitor/mysql.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,8 @@ impl<'a> Visitor<'a> for Mysql<'a> {
593593

594594
let text_search = TextSearch { exprs };
595595

596-
self.visit_matches(text_search.into(), query, false)?;
596+
self.visit_expression(text_search.into())?;
597+
self.surround_with("AGAINST (", " IN BOOLEAN MODE)", |s| s.visit_expression(query))?;
597598

598599
Ok(())
599600
}

quaint/src/visitor/postgres.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ impl<'a> Visitor<'a> for Postgres<'a> {
667667
Ok(())
668668
})?;
669669
self.write(", ")?;
670-
self.surround_with("to_tsquery(", ")", |s| s.visit_parameterized(Value::text(query)))?;
670+
self.surround_with("to_tsquery(", ")", |s| s.visit_expression(query))?;
671671
self.write(")")?;
672672

673673
Ok(())

query-compiler/core/src/query_graph_builder/extractors/query_arguments.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,6 @@ fn extract_order_by_relevance(
179179
) -> QueryGraphBuilderResult<Option<OrderBy>> {
180180
let (sort_order, _) = extract_order_by_args(object.get(ordering::SORT).unwrap().clone())?;
181181
let search: PrismaValue = object.get(ordering::SEARCH).unwrap().clone().try_into()?;
182-
let search = search.into_string().unwrap();
183182
let fields: PrismaValue = object.get(ordering::FIELDS).unwrap().clone().try_into()?;
184183

185184
let fields = match fields {

query-compiler/query-builders/sql-query-builder/src/ordering.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use crate::{Context, join_utils::*, model_extensions::*};
1+
use crate::{Context, join_utils::*, model_extensions::*, value::Placeholder};
22
use itertools::Itertools;
3+
use prisma_value::{Placeholder as PrismaValuePlaceholder, PrismaValue};
34
use psl::{datamodel_connector::ConnectorCapability, reachable_only_with_capability};
45
use quaint::ast::*;
56
use query_builder::QueryArgumentsExt;
@@ -240,7 +241,8 @@ impl OrderByBuilder {
240241
.map(|sf| sf.as_column(ctx).opt_table(parent_table.clone()))
241242
.map(Expression::from)
242243
.collect();
243-
let text_search_expr = text_search_relevance(&order_by_columns, order_by.search.clone());
244+
let search_expr = prisma_value_to_search_expression(order_by.search.clone());
245+
let text_search_expr = text_search_relevance(&order_by_columns, search_expr);
244246

245247
(joins, text_search_expr.into())
246248
}
@@ -279,6 +281,16 @@ impl OrderByBuilder {
279281
}
280282
}
281283

284+
fn prisma_value_to_search_expression(pv: PrismaValue) -> Expression<'static> {
285+
match pv {
286+
PrismaValue::String(s) => Value::text(s).into(),
287+
PrismaValue::Placeholder(PrismaValuePlaceholder { name, .. }) => {
288+
Value::opaque(Placeholder::new(name), OpaqueType::Text).into()
289+
}
290+
_ => panic!("Search field should only contain String or Placeholder values"),
291+
}
292+
}
293+
282294
pub fn into_order(prisma_order: &SortOrder, nulls_order: Option<&NullsOrder>, reverse: bool) -> Order {
283295
match (prisma_order, nulls_order, reverse) {
284296
// Without NULLS order

query-compiler/query-structure/src/order_by.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use crate::{CompositeFieldRef, RelationFieldRef, ScalarFieldRef};
2+
use prisma_value::PrismaValue;
23
use std::fmt::Display;
34

45
#[derive(Clone, Copy, PartialEq, Debug, Eq, Hash)]
@@ -101,7 +102,7 @@ impl OrderBy {
101102

102103
pub fn relevance(
103104
fields: Vec<ScalarFieldRef>,
104-
search: String,
105+
search: PrismaValue,
105106
sort_order: SortOrder,
106107
path: Vec<OrderByHop>,
107108
) -> Self {
@@ -206,7 +207,7 @@ impl OrderByToManyAggregation {
206207
pub struct OrderByRelevance {
207208
pub fields: Vec<ScalarFieldRef>,
208209
pub sort_order: SortOrder,
209-
pub search: String,
210+
pub search: PrismaValue,
210211
pub path: Vec<OrderByHop>,
211212
}
212213

query-compiler/schema/src/build/input_types/objects/order_by_objects.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ fn order_by_object_type_text_search<'a>(
268268
None,
269269
),
270270
simple_input_field(ordering::SORT, InputType::Enum(sort_order_enum), None),
271-
simple_input_field(ordering::SEARCH, InputType::string(), None),
271+
simple_input_field(ordering::SEARCH, InputType::string(), None).parameterizable(),
272272
]
273273
});
274274
input_object

0 commit comments

Comments
 (0)