This commit is contained in:
parent
3481b9dadf
commit
0c75776915
2 changed files with 23 additions and 6 deletions
|
|
@ -6,7 +6,16 @@ defmodule Mv.Membership.Member do
|
||||||
require Ash.Query
|
require Ash.Query
|
||||||
import Ash.Expr
|
import Ash.Expr
|
||||||
|
|
||||||
@default_fields [:first_name, :last_name, :email, :phone_number, :city, :street, :house_number, :postal_code]
|
@default_fields [
|
||||||
|
:first_name,
|
||||||
|
:last_name,
|
||||||
|
:email,
|
||||||
|
:phone_number,
|
||||||
|
:city,
|
||||||
|
:street,
|
||||||
|
:house_number,
|
||||||
|
:postal_code
|
||||||
|
]
|
||||||
|
|
||||||
postgres do
|
postgres do
|
||||||
table "members"
|
table "members"
|
||||||
|
|
@ -132,9 +141,9 @@ defmodule Mv.Membership.Member do
|
||||||
query
|
query
|
||||||
|> Ash.Query.filter(
|
|> Ash.Query.filter(
|
||||||
expr(
|
expr(
|
||||||
|
# Substring on numeric-like fields (best effort, supports middle substrings)
|
||||||
fragment("search_vector @@ websearch_to_tsquery('simple', ?)", ^q2) or
|
fragment("search_vector @@ websearch_to_tsquery('simple', ?)", ^q2) or
|
||||||
fragment("search_vector @@ plainto_tsquery('simple', ?)", ^q2) or
|
fragment("search_vector @@ plainto_tsquery('simple', ?)", ^q2) or
|
||||||
# Substring on numeric-like fields (best effort, supports middle substrings)
|
|
||||||
contains(postal_code, ^q2) or
|
contains(postal_code, ^q2) or
|
||||||
contains(house_number, ^q2) or
|
contains(house_number, ^q2) or
|
||||||
contains(phone_number, ^q2) or
|
contains(phone_number, ^q2) or
|
||||||
|
|
@ -337,7 +346,7 @@ defmodule Mv.Membership.Member do
|
||||||
query
|
query
|
||||||
else
|
else
|
||||||
args =
|
args =
|
||||||
case (opts[:fields] || opts["fields"]) do
|
case opts[:fields] || opts["fields"] do
|
||||||
nil -> %{query: q}
|
nil -> %{query: q}
|
||||||
fields -> %{query: q, fields: fields}
|
fields -> %{query: q, fields: fields}
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,10 @@ defmodule Mv.Membership.FuzzySearchTest do
|
||||||
|
|
||||||
result =
|
result =
|
||||||
Mv.Membership.Member
|
Mv.Membership.Member
|
||||||
|> Mv.Membership.Member.fuzzy_search(%{query: "john", fields: [:first_name, :last_name, :email]})
|
|> Mv.Membership.Member.fuzzy_search(%{
|
||||||
|
query: "john",
|
||||||
|
fields: [:first_name, :last_name, :email]
|
||||||
|
})
|
||||||
|> Ash.read!()
|
|> Ash.read!()
|
||||||
|
|
||||||
assert Enum.map(result, & &1.id) == [john.id, alice.id]
|
assert Enum.map(result, & &1.id) == [john.id, alice.id]
|
||||||
|
|
@ -59,7 +62,10 @@ defmodule Mv.Membership.FuzzySearchTest do
|
||||||
|
|
||||||
result =
|
result =
|
||||||
Mv.Membership.Member
|
Mv.Membership.Member
|
||||||
|> Mv.Membership.Member.fuzzy_search(%{query: "tomas", fields: [:first_name, :last_name, :email]})
|
|> Mv.Membership.Member.fuzzy_search(%{
|
||||||
|
query: "tomas",
|
||||||
|
fields: [:first_name, :last_name, :email]
|
||||||
|
})
|
||||||
|> Ash.read!()
|
|> Ash.read!()
|
||||||
|
|
||||||
ids = Enum.map(result, & &1.id)
|
ids = Enum.map(result, & &1.id)
|
||||||
|
|
@ -80,7 +86,9 @@ defmodule Mv.Membership.FuzzySearchTest do
|
||||||
|> Mv.Membership.Member.fuzzy_search(%{query: ""})
|
|> Mv.Membership.Member.fuzzy_search(%{query: ""})
|
||||||
|> Ash.read!()
|
|> Ash.read!()
|
||||||
|
|
||||||
assert Enum.sort(Enum.map(result, & &1.id)) |> Enum.uniq() |> Enum.sort()
|
assert Enum.sort(Enum.map(result, & &1.id))
|
||||||
|
|> Enum.uniq()
|
||||||
|
|> Enum.sort()
|
||||||
|> Enum.all?(fn id -> id in [a.id, b.id] end)
|
|> Enum.all?(fn id -> id in [a.id, b.id] end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue