/
contains.ex
60 lines (48 loc) · 1.47 KB
/
contains.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
defmodule Ash.Query.Function.Contains do
@moduledoc """
Returns true if the first string contains the second.
Case insensitive strings are accounted for on either side.
contains("foo", "fo")
true
contains(%Ash.CiString{:string "foo"}, "FoO")
true
contains("foo", %Ash.CiString{:string "FOO"})
true
"""
use Ash.Query.Function, name: :contains
alias Ash.CiString
def args,
do: [
[:string, :string],
[:ci_string, :ci_string],
[:string, :ci_string],
[:ci_string, :string]
]
def evaluate(%{arguments: [nil, _]}), do: false
def evaluate(%{arguments: [_, nil]}), do: false
def evaluate(%{arguments: [%CiString{} = left, %CiString{} = right]}) do
{:known,
String.contains?(CiString.to_comparable_string(left), CiString.to_comparable_string(right))}
end
def evaluate(%{arguments: [left, %Ash.CiString{} = right]}) when is_binary(left) do
{:known,
left
|> Ash.CiString.to_comparable_string()
|> String.contains?(Ash.CiString.to_comparable_string(right))}
end
def evaluate(%{arguments: [%Ash.CiString{} = left, right]})
when is_binary(right) do
{:known,
String.contains?(
Ash.CiString.to_comparable_string(left),
Ash.CiString.to_comparable_string(right)
)}
end
def evaluate(%{arguments: [left, right]})
when is_binary(left) and is_binary(right) do
{:known, String.contains?(left, right)}
end
def evaluate(_other) do
:unknown
end
end