search with parameters

This commit is contained in:
Priec
2026-06-22 21:01:02 +02:00
parent 3b9c2f7d64
commit 1ecfac2ad6
7 changed files with 424 additions and 97 deletions

View File

@@ -37,7 +37,11 @@ impl Entity {
/// `f_unaccent`, so diacritics never matter. Results are ranked by full-text
/// rank, then trigram closeness of the name, then recency. An empty/blank
/// query returns nothing — callers fall back to the plain listing.
pub async fn search<C: ConnectionTrait>(db: &C, query: &str) -> Result<Vec<Model>, DbErr> {
pub async fn search<C: ConnectionTrait>(
db: &C,
query: &str,
limit: u64,
) -> Result<Vec<Model>, DbErr> {
let q = query.trim();
if q.is_empty() {
return Ok(Vec::new());
@@ -45,7 +49,7 @@ impl Entity {
// Only the model's own columns are selected; the generated `search_vector`
// is left out so the row maps cleanly back onto `Model`. `$1` is reused
// for every occurrence of the query term.
// for every occurrence of the query term; `$2` caps the result set.
let sql = r#"
SELECT p.created_at, p.updated_at, p.id, p.name, p.slug, p.description,
p.currency, p.view_count, p.published, p.published_at, p.category_id
@@ -60,14 +64,14 @@ impl Entity {
ts_rank(p.search_vector, websearch_to_tsquery('sk_unaccent', $1)) DESC,
word_similarity(f_unaccent($1), f_unaccent(p.name)) DESC,
p.published_at DESC NULLS LAST
LIMIT 60
LIMIT $2
"#;
Entity::find()
.from_raw_sql(Statement::from_sql_and_values(
db.get_database_backend(),
sql,
[q.into()],
[q.into(), (limit as i64).into()],
))
.all(db)
.await