diff --git a/lib/membership/member.ex b/lib/membership/member.ex index 9f4f2f5..34f7357 100644 --- a/lib/membership/member.ex +++ b/lib/membership/member.ex @@ -6,7 +6,16 @@ defmodule Mv.Membership.Member do require Ash.Query 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 table "members" @@ -132,9 +141,9 @@ defmodule Mv.Membership.Member do query |> Ash.Query.filter( expr( + # Substring on numeric-like fields (best effort, supports middle substrings) fragment("search_vector @@ websearch_to_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(house_number, ^q2) or contains(phone_number, ^q2) or @@ -337,7 +346,7 @@ defmodule Mv.Membership.Member do query else args = - case (opts[:fields] || opts["fields"]) do + case opts[:fields] || opts["fields"] do nil -> %{query: q} fields -> %{query: q, fields: fields} end diff --git a/test/membership/fuzzy_search_test.exs b/test/membership/fuzzy_search_test.exs index 4506492..5e47631 100644 --- a/test/membership/fuzzy_search_test.exs +++ b/test/membership/fuzzy_search_test.exs @@ -29,7 +29,10 @@ defmodule Mv.Membership.FuzzySearchTest do result = 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!() assert Enum.map(result, & &1.id) == [john.id, alice.id] @@ -59,7 +62,10 @@ defmodule Mv.Membership.FuzzySearchTest do result = 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!() ids = Enum.map(result, & &1.id) @@ -80,7 +86,9 @@ defmodule Mv.Membership.FuzzySearchTest do |> Mv.Membership.Member.fuzzy_search(%{query: ""}) |> 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) end