Current section
16 Versions
Jump to
Current section
16 Versions
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…