Packages
electric
1.7.2
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/dependency_layers.ex
defmodule Electric.Shapes.DependencyLayers do
def new do
[]
end
def add_dependency(layers, shape, shape_handle) do
case shape.shape_dependencies_handles do
[] ->
{:ok, add_to_first_layer(layers, shape_handle)}
dependency_handles ->
add_after_dependencies(layers, shape_handle, MapSet.new(dependency_handles))
end
end
defp add_after_dependencies([layer | rest], shape_handle, deps_to_find) do
remaining_deps = MapSet.difference(deps_to_find, layer)
if MapSet.size(remaining_deps) == 0 do
{:ok, [layer | add_to_first_layer(rest, shape_handle)]}
else
case add_after_dependencies(rest, shape_handle, remaining_deps) do
{:ok, rest_layers} -> {:ok, [layer | rest_layers]}
{:error, _} = error -> error
end
end
end
defp add_after_dependencies([], _shape_handle, deps_to_find) do
{:error, {:missing_dependencies, deps_to_find}}
end
def remove_dependency(layers, shape_handle) do
# FIXME: this assumes children are removed before parents, not sure how true this is
Enum.map(layers, &MapSet.delete(&1, shape_handle))
end
defp add_to_first_layer([], shape_handle) do
[MapSet.new([shape_handle])]
end
defp add_to_first_layer([first_layer | rest], shape_handle) do
[MapSet.put(first_layer, shape_handle) | rest]
end
def get_for_handles(layers, shape_handles) do
layers
|> Enum.map(&MapSet.intersection(&1, shape_handles))
|> Enum.reject(&(MapSet.size(&1) == 0))
end
end