Skip to content

Commit 11665e0

Browse files
fix: fix fragment processing broken (#64)
1 parent c651836 commit 11665e0

File tree

2 files changed

+27
-4
lines changed

2 files changed

+27
-4
lines changed

lib/functions/fragment.ex

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ defmodule AshPostgres.Functions.Fragment do
2020
def new([fragment | rest]) do
2121
split = split_fragment(fragment)
2222

23-
if Enum.count(split, &(&1 == "")) != length(rest) do
23+
if Enum.count(split, &(&1 == :slot)) != length(rest) do
2424
{:error,
2525
"fragment(...) expects extra arguments in the same amount of question marks in string. " <>
26-
"It received #{Enum.count(split, &(&1 == ""))} extra argument(s) but expected #{
26+
"It received #{Enum.count(split, &(&1 == :slot))} extra argument(s) but expected #{
2727
length(rest)
2828
}"}
2929
else
@@ -33,7 +33,7 @@ defmodule AshPostgres.Functions.Fragment do
3333

3434
defp merge_fragment([], []), do: []
3535

36-
defp merge_fragment(["" | rest], [arg | rest_args]) do
36+
defp merge_fragment([:slot | rest], [arg | rest_args]) do
3737
[{:expr, arg} | merge_fragment(rest, rest_args)]
3838
end
3939

@@ -47,7 +47,7 @@ defmodule AshPostgres.Functions.Fragment do
4747
do: [consumed]
4848

4949
defp split_fragment(<<??, rest::binary>>, consumed),
50-
do: [consumed | split_fragment(rest, "")]
50+
do: [consumed, :slot | split_fragment(rest, "")]
5151

5252
defp split_fragment(<<?\\, ??, rest::binary>>, consumed),
5353
do: split_fragment(rest, consumed <> <<??>>)

test/filter_test.exs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,4 +386,27 @@ defmodule AshPostgres.FilterTest do
386386
assert [] = results
387387
end
388388
end
389+
390+
describe "fragments" do
391+
test "double replacement works" do
392+
post =
393+
Post
394+
|> Ash.Changeset.new(%{title: "match", score: 4})
395+
|> Api.create!()
396+
397+
Post
398+
|> Ash.Changeset.new(%{title: "non_match", score: 2})
399+
|> Api.create!()
400+
401+
assert [%{title: "match"}] =
402+
Post
403+
|> Ash.Query.filter(fragment("? = ?", title, ^post.title))
404+
|> Api.read!()
405+
406+
assert [] =
407+
Post
408+
|> Ash.Query.filter(fragment("? = ?", title, "nope"))
409+
|> Api.read!()
410+
end
411+
end
389412
end

0 commit comments

Comments
 (0)