Packages
electric
1.7.6
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.16
1.4.16-beta-1
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.14
1.1.13
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
retired
1.1.5
retired
1.1.4
retired
1.1.3
retired
1.1.2
1.1.1
1.1.0
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.15
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-beta.23
1.0.0-beta.22
1.0.0-beta.20
1.0.0-beta.19
1.0.0-beta.18
1.0.0-beta.17
1.0.0-beta.16
1.0.0-beta.15
1.0.0-beta.14
1.0.0-beta.13
1.0.0-beta.12
1.0.0-beta.11
1.0.0-beta.10
1.0.0-beta.9
1.0.0-beta.8
1.0.0-beta.7
1.0.0-beta.6
1.0.0-beta.5
1.0.0-beta.4
1.0.0-beta.3
1.0.0-beta.2
1.0.0-beta.1
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.5.2
0.4.4
Postgres sync engine. Sync little subsets of your Postgres data into local apps and services.
Current section
Files
Jump to
Current section
Files
lib/electric/shapes/where_clause.ex
defmodule Electric.Shapes.WhereClause do
alias PgInterop.Sublink
alias Electric.Replication.Eval.Runner
alias Electric.Shapes.Filter.Indexes.SubqueryIndex
@spec includes_record_result(
Electric.Replication.Eval.Expr.t() | nil,
map(),
([String.t()], term() -> boolean())
) :: {:ok, boolean()} | :error
def includes_record_result(where_clause, record, subquery_member? \\ fn _, _ -> false end)
def includes_record_result(nil = _where_clause, _record, _), do: {:ok, true}
def includes_record_result(where_clause, record, subquery_member?)
when is_function(subquery_member?, 2) do
with {:ok, refs} <- Runner.record_to_ref_values(where_clause.used_refs, record),
{:ok, evaluated} <-
Runner.execute(where_clause, refs, subquery_member?: subquery_member?) do
{:ok, not is_nil(evaluated) and evaluated != false}
else
_ -> :error
end
end
@spec includes_record?(Electric.Replication.Eval.Expr.t() | nil, map(), ([String.t()], term() ->
boolean())) ::
boolean()
def includes_record?(where_clause, record, subquery_member? \\ fn _, _ -> false end)
def includes_record?(nil = _where_clause, _record, _), do: true
def includes_record?(where_clause, record, subquery_member?)
when is_function(subquery_member?, 2) do
case includes_record_result(where_clause, record, subquery_member?) do
{:ok, included?} -> included?
:error -> false
end
end
@spec subquery_member_from_refs(map()) :: ([String.t()], term() -> boolean())
def subquery_member_from_refs(extra_refs) when is_map(extra_refs) do
fn subquery_ref, typed_value ->
typed_value
|> Sublink.member?(Map.get(extra_refs, subquery_ref, []))
end
end
@doc """
Build a subquery_member? callback that queries the SubqueryIndex.
Used for filter-side exact verification: checks whether a specific
shape currently contains a typed value for a canonical subquery ref.
"""
@spec subquery_member_from_index(SubqueryIndex.t(), term()) ::
([String.t()], term() -> boolean())
def subquery_member_from_index(index, shape_handle) do
fn subquery_ref, typed_value ->
SubqueryIndex.membership_or_fallback?(index, shape_handle, subquery_ref, typed_value)
end
end
end