Packages

A toolkit for data mapping an querying Neo4j database in Elixir

Current section

Files

Jump to
seraph lib seraph repo.ex
Raw

lib/seraph/repo.ex

defmodule Seraph.Repo do
@moduledoc """
See `Seraph.Example.Repo` for common functions.
See `Seraph.Example.Repo.Node` for node-specific functions.
See `Seraph.Example.Repo.Relationship` for relationship-specific functions.
"""
@type t :: module
@type queryable :: module
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
@otp_app opts[:otp_app]
alias Seraph.{Condition, Query}
@module __MODULE__
@doc false
def child_spec(opts) do
%{
id: __MODULE__,
start: {__MODULE__, :start_link, [opts]},
type: :supervisor
}
end
@doc false
def start_link(opts \\ []) do
Seraph.Repo.Supervisor.start_link(__MODULE__, @otp_app, opts)
end
@doc false
def stop(timeout \\ 5000) do
Supervisor.stop(__MODULE__, :normal, timeout)
end
# Planner
@doc """
Execute the given statement with the given params.
Return the query result or an error.
Options:
* `with_stats` - If set to `true`, also returns the query stats
(number of created nodes, created properties, etc.)
## Example
# Without params
iex> MyRepo.query("CREATE (p:Person {name: 'Collin Chou', role: 'Seraph'}) RETURN p")
{:ok,
[
%{
"p" => %Bolt.Sips.Types.Node{
id: 1813,
labels: ["Person"],
properties: %{"name" => "Collin Chou", "role" => "Seraph"}
}
}
]}
# With params
iex(15)> MyRepo.query("MATCH (p:Person {name: $name}) RETURN p.role", %{name: "Collin Chou"})
{:ok, [%{"p.role" => "Seraph"}]}
# With :with_stats option
iex(16)> MyRepo.query("MATCH (p:Person {name: $name}) DETACH DELETE p", %{name: "Collin Chou"}, with_stats: true)
{:ok, %{results: [], stats: %{"nodes-deleted" => 1}}}
"""
@spec query(String.t(), map, Keyword.t()) ::
{:ok, [map] | %{results: [map], stats: map}} | {:error, any}
def query(statement, params \\ %{}, opts \\ []) do
Seraph.Query.Planner.query(__MODULE__, statement, params, opts)
end
@doc """
Same as `query/3` but raise i ncase of error.
"""
@spec query!(String.t(), map, Keyword.t()) :: [map] | %{results: [map], stats: map}
def query!(statement, params \\ %{}, opts \\ []) do
Seraph.Query.Planner.query!(__MODULE__, statement, params, opts)
end
@doc false
def raw_query(statement, params \\ %{}, opts \\ []) do
Seraph.Query.Planner.raw_query(__MODULE__, statement, params, opts)
end
@doc false
def raw_query!(statement, params \\ %{}, opts \\ []) do
Seraph.Query.Planner.raw_query!(__MODULE__, statement, params, opts)
end
use Seraph.Repo.Node.Repo, __MODULE__
use Seraph.Repo.Relationship.Repo, __MODULE__
end
end
end