Current section
14 Versions
Jump to
Current section
14 Versions
Compare versions
5
files changed
+61
additions
-27
deletions
| @@ -12,7 +12,7 @@ This adapter leverages the use of [Ravix](https://github.com/YgorCastor/ravix) a | |
| 12 12 | Add Ravix Ecto to your mix.exs dependencies |
| 13 13 | |
| 14 14 | ```elixir |
| 15 | - {:ravix_ecto, "~> 0.3.0"} |
| 15 | + {:ravix_ecto, "~> 0.3.1"} |
| 16 16 | ``` |
| 17 17 | |
| 18 18 | ## Example |
| @@ -33,4 +33,4 @@ | |
| 33 33 | {<<"optional">>,false}, |
| 34 34 | {<<"repository">>,<<"hexpm">>}, |
| 35 35 | {<<"requirement">>,<<"~> 2.3">>}]]}. |
| 36 | - {<<"version">>,<<"0.3.0">>}. |
| 36 | + {<<"version">>,<<"0.3.1">>}. |
| @@ -34,31 +34,31 @@ defmodule Ravix.Ecto.Parser.QueryParser do | |
| 34 34 | end |
| 35 35 | |
| 36 36 | def insert( |
| 37 | - %{source: coll, schema: schema, prefix: prefix}, |
| 38 | - [[_ | _] | _] = docs, |
| 39 | - {:nothing, [], conflict_targets}, |
| 40 | - returning, |
| 37 | + %{source: _coll, schema: _schema, prefix: _prefix}, |
| 38 | + [[_ | _] | _] = _docs, |
| 39 | + {:nothing, [], _conflict_targets}, |
| 40 | + _returning, |
| 41 41 | _opts |
| 42 42 | ) do |
| 43 43 | raise ArgumentError, "The RavenDB Adapter does not support conflict targets yet" |
| 44 44 | end |
| 45 45 | |
| 46 46 | def insert( |
| 47 | - %{source: coll, schema: schema, prefix: prefix}, |
| 48 | - fields, |
| 49 | - {:nothing, [], conflict_targets}, |
| 50 | - returning, |
| 47 | + %{source: _coll, schema: _schema, prefix: _prefix}, |
| 48 | + _fields, |
| 49 | + {:nothing, [], _conflict_targets}, |
| 50 | + _returning, |
| 51 51 | _opts |
| 52 52 | ) do |
| 53 53 | raise ArgumentError, "The RavenDB Adapter does not support conflict targets yet" |
| 54 54 | end |
| 55 55 | |
| 56 56 | def insert( |
| 57 | - %{schema: schema, source: coll, prefix: prefix}, |
| 58 | - [[_ | _] | _] = docs, |
| 59 | - {[_ | _] = replace_fields, _, conflict_targets}, |
| 60 | - returning, |
| 61 | - opts |
| 57 | + %{schema: _schema, source: _coll, prefix: _prefix}, |
| 58 | + [[_ | _] | _] = _docs, |
| 59 | + {[_ | _] = _replace_fields, _, _conflict_targets}, |
| 60 | + _returning, |
| 61 | + _opts |
| 62 62 | ) do |
| 63 63 | raise ArgumentError, "The RavenDB Adapter does not support conflict targets yet" |
| 64 64 | end |
| @@ -84,10 +84,10 @@ defmodule Ravix.Ecto.Parser.QueryParser do | |
| 84 84 | end |
| 85 85 | |
| 86 86 | def insert( |
| 87 | - %{source: coll, prefix: prefix}, |
| 88 | - fields, |
| 89 | - {%Ecto.Query{} = query, values, conflict_targets}, |
| 90 | - returning, |
| 87 | + %{source: _coll, prefix: _prefix}, |
| 88 | + _fields, |
| 89 | + {%Ecto.Query{} = _query, _values, _conflict_targets}, |
| 90 | + _returning, |
| 91 91 | _opts |
| 92 92 | ) do |
| 93 93 | raise ArgumentError, "The RavenDB Adapter does not support conflict targets yet" |
| @@ -130,7 +130,7 @@ defmodule Ravix.Ecto.Parser.QueryParser do | |
| 130 130 | defp cast_document(nil, fields, coll) do |
| 131 131 | check_params!(fields) |
| 132 132 | |
| 133 | - Enum.into(fields, %{"@metadata": %{"@collection": coll}}) |
| 133 | + Enum.into(parse_metadata(fields, coll), %{}) |
| 134 134 | end |
| 135 135 | |
| 136 136 | defp cast_document(schema, fields, coll) do |
| @@ -140,9 +140,26 @@ defmodule Ravix.Ecto.Parser.QueryParser do | |
| 140 140 | struct(schema, %{}) |
| 141 141 | |> Map.from_struct() |
| 142 142 | |> Map.drop([:__meta__]) |
| 143 | - |> Map.put(:"@metadata", %{"@collection": coll}) |
| 144 143 | |
| 145 | - Enum.into(fields, schema) |
| 144 | + Enum.into(parse_metadata(fields, coll), schema) |
| 145 | + end |
| 146 | + |
| 147 | + defp parse_metadata(fields, collection) do |
| 148 | + {_, updated_fields} = |
| 149 | + Keyword.get_and_update(fields, :"@metadata", fn value -> |
| 150 | + case value do |
| 151 | + nil -> |
| 152 | + {nil, %{"@collection" => collection}} |
| 153 | + |
| 154 | + metadata -> |
| 155 | + { |
| 156 | + metadata, |
| 157 | + metadata |> Map.put("@collection", collection) |
| 158 | + } |
| 159 | + end |
| 160 | + end) |
| 161 | + |
| 162 | + updated_fields |
| 146 163 | end |
| 147 164 | |
| 148 165 | def delete_all(ecto_query, params) do |
| @@ -288,6 +305,7 @@ defmodule Ravix.Ecto.Parser.QueryParser do | |
| 288 305 | |> RavenQuery.select( |
| 289 306 | projections |
| 290 307 | |> Map.filter(fn {_key, value} -> value end) |
| 308 | + |> Map.drop([:"@metadata"]) |
| 291 309 | |> Map.keys() |
| 292 310 | ) |
| @@ -6,6 +6,12 @@ defmodule Ravix.Ecto.Executor do | |
| 6 6 | |
| 7 7 | import Ravix.RQL.Query |
| 8 8 | |
| 9 | + @metadata_updateable_fields [ |
| 10 | + "@change-vector", |
| 11 | + "@collection", |
| 12 | + "@expires" |
| 13 | + ] |
| 14 | + |
| 9 15 | def insert(%{repo: repo}, document, pk), |
| 10 16 | do: insert(Keyword.get(repo.config, :store), document, pk) |
| 11 17 | |
| @@ -42,10 +48,7 @@ defmodule Ravix.Ecto.Executor do | |
| 42 48 | result <- RavixSession.load(session_id, id) |
| 43 49 | document_to_update <- filter_results(result["Results"], filters) |
| 44 50 | |
| 45 | - updated_document = |
| 46 | - Enum.reduce(fields, document_to_update, fn {field, value}, document -> |
| 47 | - put_in(document[Atom.to_string(field)], value) |
| 48 | - end) |
| 51 | + updated_document = Enum.reduce(fields, document_to_update, &parse_update_field/2) |
| 49 52 | |
| 50 53 | _ <- |
| 51 54 | RavixSession.store( |
| @@ -62,6 +65,19 @@ defmodule Ravix.Ecto.Executor do | |
| 62 65 | end |
| 63 66 | end |
| 64 67 | |
| 68 | + defp parse_update_field({:"@metadata", value}, document) do |
| 69 | + updated_metadata = |
| 70 | + document["@metadata"] |
| 71 | + |> Map.take(@metadata_updateable_fields) |
| 72 | + |> Map.merge(Map.take(value, @metadata_updateable_fields)) |
| 73 | + |
| 74 | + put_in(document["@metadata"], updated_metadata) |
| 75 | + end |
| 76 | + |
| 77 | + defp parse_update_field({field, value}, document) do |
| 78 | + put_in(document[Atom.to_string(field)], value) |
| 79 | + end |
| 80 | + |
| 65 81 | def delete_one(%{repo: repo}, filters, pk), |
| 66 82 | do: exec_delete_one(Keyword.get(repo.config, :store), filters, pk) |
| @@ -4,7 +4,7 @@ defmodule RavixEcto.MixProject do | |
| 4 4 | def project do |
| 5 5 | [ |
| 6 6 | app: :ravix_ecto, |
| 7 | - version: "0.3.0", |
| 7 | + version: "0.3.1", |
| 8 8 | elixir: "~> 1.13", |
| 9 9 | start_permanent: Mix.env() == :prod, |
| 10 10 | deps: deps(), |