Skip to content

Commit

Permalink
chore: handled ? operator for jsonb
Browse files Browse the repository at this point in the history
  • Loading branch information
dorianmercatante committed Dec 22, 2023
1 parent 037eb44 commit 5b81de1
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 15 deletions.
33 changes: 19 additions & 14 deletions lib/arke_postgres/query.ex
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ defmodule ArkePostgres.Query do
add_condition_to_clause(condition, clause, logic)
else
condition =
filter_query_by_operator(column, value, operator) |> handle_negate_condition(negate)
filter_query_by_operator(parameter, column, value, operator) |> handle_negate_condition(negate)

add_condition_to_clause(condition, clause, logic)
end
Expand Down Expand Up @@ -293,9 +293,13 @@ defmodule ArkePostgres.Query do

defp get_table_column(%{id: id} = _parameter), do: dynamic([q], fragment("?", field(q, ^id)))

defp get_arke_column(%{id: id, arke_id: :string, data: %{multiple: true}} = _parameter),
do: dynamic([q], fragment("(? -> ? ->> 'value')::jsonb", field(q, :data), ^Atom.to_string(id)))

defp get_arke_column(%{id: id, arke_id: :string} = _parameter),
do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id)))


defp get_arke_column(%{id: id, arke_id: :atom} = _parameter),
do: dynamic([q], fragment("(? -> ? ->> 'value')::text", field(q, :data), ^Atom.to_string(id)))

Expand Down Expand Up @@ -443,32 +447,33 @@ defmodule ArkePostgres.Query do
fragment("? IS NULL AND (data \\? ?)", ^column, ^Atom.to_string(id))
)

defp filter_query_by_operator(column, value, :eq), do: dynamic([q], ^column == ^value)
defp filter_query_by_operator(%{arke_id: :string, data: %{multiple: true}}, column, value, :eq), do: dynamic([q], fragment("jsonb_exists(?, ?)", ^column, ^value))
defp filter_query_by_operator(parameter, column, value, :eq), do: dynamic([q], ^column == ^value)

defp filter_query_by_operator(column, value, :contains),
defp filter_query_by_operator(parameter, column, value, :contains),
do: dynamic([q], like(^column, fragment("?", ^("%" <> value <> "%"))))

defp filter_query_by_operator(column, value, :icontains),
defp filter_query_by_operator(parameter, column, value, :icontains),
do: dynamic([q], ilike(^column, fragment("?", ^("%" <> value <> "%"))))

defp filter_query_by_operator(column, value, :endswith),
defp filter_query_by_operator(parameter, column, value, :endswith),
do: dynamic([q], like(^column, fragment("?", ^("%" <> value))))

defp filter_query_by_operator(column, value, :iendswith),
defp filter_query_by_operator(parameter, column, value, :iendswith),
do: dynamic([q], ilike(^column, fragment("?", ^("%" <> value))))

defp filter_query_by_operator(column, value, :startswith),
defp filter_query_by_operator(parameter, column, value, :startswith),
do: dynamic([q], like(^column, fragment("?", ^(value <> "%"))))

defp filter_query_by_operator(column, value, :istartswith),
defp filter_query_by_operator(parameter, column, value, :istartswith),
do: dynamic([q], ilike(^column, fragment("?", ^(value <> "%"))))

defp filter_query_by_operator(column, value, :lte), do: dynamic([q], ^column <= ^value)
defp filter_query_by_operator(column, value, :lt), do: dynamic([q], ^column < ^value)
defp filter_query_by_operator(column, value, :gt), do: dynamic([q], ^column > ^value)
defp filter_query_by_operator(column, value, :gte), do: dynamic([q], ^column >= ^value)
defp filter_query_by_operator(column, value, :in), do: dynamic([q], ^column in ^value)
defp filter_query_by_operator(column, value, _), do: dynamic([q], ^column == ^value)
defp filter_query_by_operator(parameter, column, value, :lte), do: dynamic([q], ^column <= ^value)
defp filter_query_by_operator(parameter, column, value, :lt), do: dynamic([q], ^column < ^value)
defp filter_query_by_operator(parameter, column, value, :gt), do: dynamic([q], ^column > ^value)
defp filter_query_by_operator(parameter, column, value, :gte), do: dynamic([q], ^column >= ^value)
defp filter_query_by_operator(parameter, column, value, :in), do: dynamic([q], ^column in ^value)
defp filter_query_by_operator(parameter, column, value, _), do: dynamic([q], ^column == ^value)

# defp filter_query_by_operator(query, key, value, "between"), do: from q in query, where: column_table(q, ^key) == ^value

Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
defmodule ArkePostgres.MixProject do
use Mix.Project

@version "0.2.10"
@version "0.2.11"
@scm_url "https://github.com/arkemishub/arke-postgres"
@site_url "https://arkehub.com"

Expand Down

0 comments on commit 5b81de1

Please sign in to comment.