Current section
Files
Jump to
Current section
Files
lib/subaru/query/builder.ex
defmodule Subaru.Query.Builder do
@moduledoc """
A pipe-friendly DSL for building `Subaru.Query` structs.
This module is intended to be used via the alias `Q`.
"""
alias Subaru.Query
@doc """
Starts a query from a set of vertices.
"""
def v(schema, filters \\ []) do
%Query{source: {schema, filters}}
end
@doc """
Adds a step to traverse outgoing edges of the given type.
"""
def out(%Query{} = query, etype) when is_atom(etype) do
%{query | steps: query.steps ++ [{:out, etype}]}
end
@doc """
Adds a step to traverse incoming edges of the given type.
"""
def unquote(:in)(%Query{} = query, etype) when is_atom(etype) do
%{query | steps: query.steps ++ [{:in, etype}]}
end
@doc """
Adds a step to filter results.
"""
def filter(%Query{} = query, fun) when is_function(fun, 1) do
%{query | steps: query.steps ++ [{:filter, fun}]}
end
@doc """
Limits the number of results.
"""
def limit(%Query{} = query, n) when is_integer(n) do
%Query{query | limit: n}
end
def v(plan_or_graph, label_or_module, opts)
when is_struct(plan_or_graph, Query) or is_map(plan_or_graph) do
v(label_or_module, opts)
end
end