mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix: add support for spaces in search & enable searching by display name in templates (#19552)
## Summary In this pull request we're updating search to support queries with spaces in addition to the `field:value` pattern that is currently supported. Additionally templates search now defaults to `display_name` (since `display_name` is optional the search will fallback to `name`) when searching without the `field:value` pattern Closes: https://github.com/coder/coder/issues/14384 ### Downsides with searching on `name` and `display_name` Because the `name` field cannot include spaces, we end up in a situation where including a space in the query will result in no results since the query searches on both `name` AND `display_name`. In the following example, we can see the results of searching by both `name` and `display_name` on these templates: | Name | Display Name | | ------ | ------------- | | docker | Docker Template | | faketemplate | A Fake Template | | azure | Fake Azure Template | | anotherfake | Another Fake Template | | azurefake | Another Fake Fake Azure Template | https://github.com/user-attachments/assets/b0e0793e-e77d-46bc-9a42-d7cf4f8bd910 ### Proposal: Search on `display_name` by default and allow for `name` using the `field:value` pattern If we remove `name` from the default template search, we're now able to search with spaces on template `display_names`. Since `display_names` are what users see in the templates list they might expect the search to work this way. Below is an example of `name` being removed from the default template search. https://github.com/user-attachments/assets/9aba5911-4960-4384-befb-08ea1acaa3ab With this approach users would still be able to search on template names by specifying `exact_name:foo`. ### Testing Added additional test cases to ensure spaces were handled as expected in combination with `field:value` patterns.
This commit is contained in:
@@ -30,12 +30,30 @@ WHERE
|
||||
LOWER(t.name) = LOWER(@exact_name)
|
||||
ELSE true
|
||||
END
|
||||
-- Filter by exact display name
|
||||
AND CASE
|
||||
WHEN @exact_display_name :: text != '' THEN
|
||||
LOWER(t.display_name) = LOWER(@exact_display_name)
|
||||
ELSE true
|
||||
END
|
||||
-- Filter by name, matching on substring
|
||||
AND CASE
|
||||
WHEN @fuzzy_name :: text != '' THEN
|
||||
lower(t.name) ILIKE '%' || lower(@fuzzy_name) || '%'
|
||||
ELSE true
|
||||
END
|
||||
-- Filter by display_name, matching on substring (fallback to name if display_name is empty)
|
||||
AND CASE
|
||||
WHEN @fuzzy_display_name :: text != '' THEN
|
||||
CASE
|
||||
WHEN t.display_name IS NOT NULL AND t.display_name != '' THEN
|
||||
lower(t.display_name) ILIKE '%' || lower(@fuzzy_display_name) || '%'
|
||||
ELSE
|
||||
-- Remove spaces if present since 't.name' cannot have any spaces
|
||||
lower(t.name) ILIKE '%' || REPLACE(lower(@fuzzy_display_name), ' ', '') || '%'
|
||||
END
|
||||
ELSE true
|
||||
END
|
||||
-- Filter by ids
|
||||
AND CASE
|
||||
WHEN array_length(@ids :: uuid[], 1) > 0 THEN
|
||||
|
||||
Reference in New Issue
Block a user