diff --git a/lib/functions/fragment.ex b/lib/functions/fragment.ex index 75f05622..5ec0a07b 100644 --- a/lib/functions/fragment.ex +++ b/lib/functions/fragment.ex @@ -20,10 +20,10 @@ defmodule AshPostgres.Functions.Fragment do def new([fragment | rest]) do split = split_fragment(fragment) - if Enum.count(split, &(&1 == "")) != length(rest) do + if Enum.count(split, &(&1 == :slot)) != length(rest) do {:error, "fragment(...) expects extra arguments in the same amount of question marks in string. " <> - "It received #{Enum.count(split, &(&1 == ""))} extra argument(s) but expected #{ + "It received #{Enum.count(split, &(&1 == :slot))} extra argument(s) but expected #{ length(rest) }"} else @@ -33,7 +33,7 @@ defmodule AshPostgres.Functions.Fragment do defp merge_fragment([], []), do: [] - defp merge_fragment(["" | rest], [arg | rest_args]) do + defp merge_fragment([:slot | rest], [arg | rest_args]) do [{:expr, arg} | merge_fragment(rest, rest_args)] end @@ -47,7 +47,7 @@ defmodule AshPostgres.Functions.Fragment do do: [consumed] defp split_fragment(<>, consumed), - do: [consumed | split_fragment(rest, "")] + do: [consumed, :slot | split_fragment(rest, "")] defp split_fragment(<>, consumed), do: split_fragment(rest, consumed <> <>) diff --git a/test/filter_test.exs b/test/filter_test.exs index 7035ca96..9dd0f47b 100644 --- a/test/filter_test.exs +++ b/test/filter_test.exs @@ -386,4 +386,27 @@ defmodule AshPostgres.FilterTest do assert [] = results end end + + describe "fragments" do + test "double replacement works" do + post = + Post + |> Ash.Changeset.new(%{title: "match", score: 4}) + |> Api.create!() + + Post + |> Ash.Changeset.new(%{title: "non_match", score: 2}) + |> Api.create!() + + assert [%{title: "match"}] = + Post + |> Ash.Query.filter(fragment("? = ?", title, ^post.title)) + |> Api.read!() + + assert [] = + Post + |> Ash.Query.filter(fragment("? = ?", title, "nope")) + |> Api.read!() + end + end end