diff --git a/server/src/server/user/sql.gleam b/server/src/server/user/sql.gleam index f3bcef7..9480094 100644 --- a/server/src/server/user/sql.gleam +++ b/server/src/server/user/sql.gleam @@ -177,9 +177,7 @@ select u.phone, u.is_active from user_account as u -where - to_tsvector('simple', u.full_name) - @@ websearch_to_tsquery ('simple', $1::text || ':*') --noqa +where u.full_name % $1::text limit $2; " |> pog.query diff --git a/server/src/server/user/sql/find_by_name.sql b/server/src/server/user/sql/find_by_name.sql index f3d52cc..9a11de7 100644 --- a/server/src/server/user/sql/find_by_name.sql +++ b/server/src/server/user/sql/find_by_name.sql @@ -7,7 +7,5 @@ select u.phone, u.is_active from user_account as u -where - to_tsvector('simple', u.full_name) - @@ websearch_to_tsquery ('simple', $1::text || ':*') --noqa +where u.full_name % $1::text limit $2; diff --git a/server/test/user/autocomplete_test.gleam b/server/test/user/autocomplete_test.gleam index b247efd..33f5294 100644 --- a/server/test/user/autocomplete_test.gleam +++ b/server/test/user/autocomplete_test.gleam @@ -14,9 +14,10 @@ import wisp/simulate pub fn find_by_email_test() { use ctx <- testing.with_context() let path = "/api/user/autocomplete" - let prefix = "dummy" + let value = "dummy" + let limit = "2" - let first_email = prefix <> wisp.random_string(12) + let first_email = value <> wisp.random_string(12) let assert Ok(first_dummy) = user.register( ctx:, @@ -28,7 +29,7 @@ pub fn find_by_email_test() { is_active: True, ) - let second_email = prefix <> wisp.random_string(12) + let second_email = value <> wisp.random_string(12) let assert Ok(second_dummy) = user.register( ctx:, @@ -43,8 +44,8 @@ pub fn find_by_email_test() { let query = uri.query_to_string([ #("q", "email"), - #("value", prefix), - #("limit", "2"), + #("value", value), + #("limit", limit), ]) let url = path <> "?" <> query @@ -129,12 +130,13 @@ pub fn find_by_email_invalid_query_test() { pub fn find_by_name_test() { use ctx <- testing.with_context() let path = "/api/user/autocomplete" - let first_name = "Dummy" + let value = "Dummy" + let limit = "2" let assert Ok(first_dummy) = user.register( ctx:, - user_name: first_name <> " " <> wisp.random_string(12), + user_name: value <> " " <> wisp.random_string(12), user_role: role.None, user_password: wisp.random_string(12), user_email: wisp.random_string(12) <> "@email.com", @@ -145,7 +147,7 @@ pub fn find_by_name_test() { let assert Ok(second_dummy) = user.register( ctx:, - user_name: first_name <> " " <> wisp.random_string(12), + user_name: value <> " " <> wisp.random_string(12), user_role: role.None, user_password: wisp.random_string(12), user_email: wisp.random_string(12) <> "@email.com", @@ -156,8 +158,8 @@ pub fn find_by_name_test() { let query = uri.query_to_string([ #("q", "name"), - #("value", first_name), - #("limit", "2"), + #("value", value), + #("limit", limit), ]) let url = path <> "?" <> query diff --git a/sql/create/tables.sql b/sql/create/tables.sql index 3cc12b8..41659a8 100644 --- a/sql/create/tables.sql +++ b/sql/create/tables.sql @@ -1,3 +1,6 @@ +-- extensions +create extension pg_trgm; + -- types create type user_role_enum as enum ( @@ -26,9 +29,6 @@ create table user_account ( search_email text generated always as (lower(email)) stored, - search_name tsvector generated always - as (to_tsvector('simple', full_name)) stored, - primary key (id) ); @@ -36,8 +36,7 @@ create index idx_user_account_search_email on user_account (search_email); create index idx_user_account_search_name -on user_account -using gin (search_name); +on user_account using gin (full_name gin_trgm_ops); create table crew (