@@ -170,10 +170,22 @@ searchProjects caller userIdFilter (Query query) limit = do
170
170
SELECT p.id, p.owner_user_id, p.slug, p.summary, p.tags, p.private, p.created_at, p.updated_at, owner.handle
171
171
FROM to_tsquery('english', #{queryToken}) AS tokenquery, projects AS p
172
172
JOIN users AS owner ON p.owner_user_id = owner.id
173
- WHERE (tokenquery @@ p.project_text_document OR p.slug ILIKE (like_escape(#{query}) || '%'))
173
+ WHERE (tokenquery @@ p.project_text_document OR p.slug ILIKE ('%' || like_escape(#{query}) || '%'))
174
174
AND (NOT p.private OR (#{caller} IS NOT NULL AND EXISTS (SELECT FROM accessible_private_projects WHERE user_id = #{caller} AND project_id = p.id)))
175
175
AND (#{userIdFilter} IS NULL OR p.owner_user_id = #{userIdFilter})
176
- ORDER BY ts_rank_cd(p.project_text_document, tokenquery) DESC, p.slug ASC
176
+ ORDER BY
177
+ p.slug = #{query} DESC,
178
+ -- Prefer prefix matches
179
+ p.slug ILIKE (like_escape(#{query}) || '%') DESC,
180
+ -- Otherwise infix matches
181
+ p.slug ILIKE ('%' || like_escape(#{query}) || '%') DESC,
182
+ -- Prefer projects in the unison org
183
+ COALESCE(FALSE, p.owner_user_id = (SELECT unison.id FROM users unison WHERE unison.handle = 'unison')) DESC,
184
+ -- Prefer projects in the catalog
185
+ EXISTS(SELECT FROM project_categories pc WHERE pc.project_id = p.id) DESC,
186
+ ts_rank_cd(p.project_text_document, tokenquery) DESC,
187
+ -- Lastly sort by name, just so results are deterministic
188
+ p.slug ASC
177
189
LIMIT #{limit}
178
190
|]
179
191
pure (results <&> \ (project PG. :. PG. Only handle) -> (project, handle))
0 commit comments