Current section

14 Versions

Jump to

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(),