Current section

16 Versions

Jump to

Compare versions

6 files changed
+99 additions
-52 deletions
  @@ -120,7 +120,7 @@ The package can be installed as:
120 120
121 121 ```elixir
122 122 def deps do
123 - [{:xarango, "~> 0.4.1"}]
123 + [{:xarango, "~> 0.5.1"}]
124 124 end
125 125 ```
  @@ -28,4 +28,4 @@
28 28 {<<"name">>,<<"httpoison">>},
29 29 {<<"optional">>,false},
30 30 {<<"requirement">>,<<"> 0.0.0">>}]]}.
31 - {<<"version">>,<<"0.5.0">>}.
31 + {<<"version">>,<<"0.5.1">>}.
  @@ -37,7 +37,7 @@ defmodule Xarango.Domain.Document do
37 37 end
38 38 def list(params) do
39 39 SimpleQuery.by_example(%SimpleQuery{example: params, collection: _collection().name}, _database())
40 - |> Enum.map(&struct(__MODULE__, doc: &1))
40 + |> to_document
41 41 end
42 42 def replace(document, data) do
43 43 %{ document.doc | _data: data }
  @@ -55,20 +55,29 @@ defmodule Xarango.Domain.Document do
55 55 document.doc
56 56 |> Document.destroy(_database())
57 57 end
58 - def fetch(document, field) do
59 - value = document.doc._data
60 - |> Map.get(field)
61 - {:ok, value}
62 - end
63 -
64 - defp to_document(data) do
65 - struct(__MODULE__, doc: data)
66 - end
58 +
67 59 def search(field, value) do
68 60 %Xarango.Query{query: "FOR doc IN FULLTEXT(#{_collection().name}, \"#{field}\", \"prefix:#{value}\") RETURN doc", batchSize: 3}
69 61 |> Xarango.Query.query(_database())
70 62 |> Map.get(:result)
63 + |> to_document
71 64 end
65 +
66 + def fetch(document, field) do
67 + case field do
68 + :id -> {:ok, document.doc._id}
69 + "id" -> {:ok, document.doc._id}
70 + value -> {:ok, get_in(document.doc._data, List.wrap(field))}
71 + end
72 + end
73 +
74 + defp to_document(docs) when is_list(docs) do
75 + docs |> Enum.map(&to_document(&1))
76 + end
77 + defp to_document(doc) do
78 + struct(__MODULE__, doc: doc)
79 + end
80 +
72 81 end
73 82 end
  @@ -6,6 +6,7 @@ defmodule Xarango.Transaction do
6 6 alias Xarango.Transaction
7 7 alias Xarango.Edge
8 8 alias Xarango.Vertex
9 + alias Xarango.Util
9 10 use Xarango.URI, prefix: "transaction"
10 11
11 12 def begin(), do: %Transaction{}
  @@ -103,17 +104,13 @@ defmodule Xarango.Transaction do
103 104 end
104 105 def get(transaction, from, relationship, to) when is_atom(to) do
105 106 {edge, return_type} = cond do
106 - is_module(to) -> {%Edge{_from: vertex_id(from)}, {to, :_to}}
107 - is_module(from) -> {%Edge{_to: vertex_id(to)}, {from, :_from}}
107 + Util.is_module(to) -> {%Edge{_from: vertex_id(from)}, {to, :_to}}
108 + Util.is_module(from) -> {%Edge{_to: vertex_id(to)}, {from, :_from}}
108 109 end
109 110 action = "db.#{relationship}.byExample(#{jsify(edge)}).toArray()"
110 111 merge(transaction, %Transaction{action: action, collections: %{read: [relationship]}, return: return_type})
111 112 end
112 113
113 - defp is_module(val) do
114 - Atom.to_string(val) =~ ~r/^[A-Z]\w*(\.[A-Z]\w*)*$/
115 - end
116 -
117 114 defp vertex_id(identifier) do
118 115 case identifier do
119 116 %{vertex: vertex} -> vertex._id
  @@ -129,42 +126,12 @@ defmodule Xarango.Transaction do
129 126 end
130 127 end
131 128
132 - defp jsify(map) when is_map(map) do
133 - Xarango.Util.do_encode(map)
134 - |> Enum.reduce([], fn {key, value}, js ->
135 - js ++ ["#{key}: #{jsify(value)}"]
136 - end)
137 - |> Enum.intersperse(", ")
138 - |> List.to_string
139 - |> wrap("{", "}")
140 - end
141 - defp jsify(list) when is_list(list) do
142 - list
143 - |> Enum.reduce([], fn value, js ->
144 - js ++ [jsify(value)]
145 - end)
146 - |> Enum.intersperse(", ")
147 - |> List.to_string
148 - |> wrap("[", "]")
149 - end
150 - defp jsify(value) when is_binary(value), do: wrap(value, "\"", "\"")
151 - defp jsify(nil), do: "null"
152 - defp jsify(value) when is_atom(value) do
153 - cond do
154 - is_module(value) -> Xarango.Util.name_from(value)
155 - true -> Atom.to_string(value)
156 - end
157 - end
158 - defp jsify(value), do: value
129 + def jsify(value), do: Util.to_javascript(value)
159 130
160 131 defp fnwrap(js, params\\[]) do
161 - wrap(js, "function(#{Enum.join(params, ",")}){", "}")
132 + Util.wrap(js, "function(#{Enum.join(params, ",")}){", "}")
162 133 end
163 134
164 - defp wrap(nil, _, _), do: ""
165 - defp wrap("", _, _), do: ""
166 - defp wrap(js, left, right), do: left <> js <> right
167 -
168 135 defp merge(transaction, addition) do
169 136 Map.from_struct(transaction)
170 137 |> update_in([:action], &(&1 ++ List.wrap(addition.action)))
  @@ -191,7 +158,7 @@ defmodule Xarango.Transaction do
191 158 end
192 159 defp to_result(data, {return_type, param}, database) do
193 160 cond do
194 - is_module(return_type) ->
161 + Util.is_module(return_type) ->
195 162 vertex = Vertex.vertex(%Vertex{_id: Map.get(data, param)}, database)
196 163 to_result(%{vertex: vertex}, return_type, database)
197 164 is_atom(return_type) ->
  @@ -79,5 +79,76 @@ defmodule Xarango.Util do
79 79 def do_error(msg) do
80 80 raise Xarango.Error, message: msg
81 81 end
82 +
83 + def to_json(items) when is_list(items) do
84 + items
85 + |> Enum.map(&to_resource(&1))
86 + |> Poison.encode!
87 + end
88 +
89 + def to_json(item) do
90 + to_resource(item)
91 + |> Poison.encode!
92 + end
93 +
94 + def to_resource(resources) when is_list(resources) do
95 + resources |> Enum.map(&to_resource(&1))
96 + end
97 +
98 + def to_resource(%{vertex: vertex}) do
99 + vertex |> to_resource
100 + end
101 +
102 + def to_resource(%{doc: document}) do
103 + document |> to_resource
104 + end
82 105
106 + def to_resource(%{_data: data, _id: id}) do
107 + data
108 + |> Map.merge(%{id: id})
109 + end
110 +
111 + def to_javascript(value) do
112 + jsify(value)
113 + end
114 +
115 + defp jsify(map) when is_map(map) do
116 + Xarango.Util.do_encode(map)
117 + |> Enum.reduce([], fn {key, value}, js ->
118 + js ++ ["#{key}: #{jsify(value)}"]
119 + end)
120 + |> Enum.intersperse(", ")
121 + |> List.to_string
122 + |> wrap("{", "}")
123 + end
124 + defp jsify(list) when is_list(list) do
125 + list
126 + |> Enum.reduce([], fn value, js ->
127 + js ++ [jsify(value)]
128 + end)
129 + |> Enum.intersperse(", ")
130 + |> List.to_string
131 + |> wrap("[", "]")
132 + end
133 + defp jsify(value) when is_binary(value), do: wrap(value, "\"", "\"")
134 + defp jsify(nil), do: "null"
135 + defp jsify(value) when is_atom(value) do
136 + cond do
137 + is_module(value) -> Xarango.Util.name_from(value)
138 + true -> Atom.to_string(value)
139 + end
140 + end
141 + defp jsify(value), do: value
142 +
143 +
144 + def wrap(nil, _, _), do: ""
145 + def wrap("", _, _), do: ""
146 + def wrap(js, left, right), do: left <> js <> right
147 +
148 + def is_module(val) do
149 + Atom.to_string(val) =~ ~r/^[A-Z]\w*(\.[A-Z]\w*)*$/
150 + end
151 +
152 +
153 +
83 154 end
Loading more files…