Electric.Shapes.Filter (electric v1.6.2)

Copy Markdown View Source

Responsible for knowing which shapes are affected by a change.

affected_shapes(filter, change) will return a set of IDs for the shapes that are affected by the change considering all the shapes that have been added to the filter using add_shape/3.

The Filter module keeps track of what tables are referenced by the shapes and changes and delegates the table specific logic to the Filter.WhereCondition module.

Data is stored in ETS tables (outside the process heap) to avoid GC pressure with large numbers of shapes.

Summary

Functions

Add a shape for the filter to track.

Returns the shape IDs for all shapes that have been added to the filter that are affected by the given change.

Get a shape by its ID. Used internally for where clause evaluation.

Returns true when ShapeLogCollector can route the shape through any of its indexes instead of relying exclusively on other_shapes scans.

Remove a shape from the filter.

Get the subquery index. Used by consumers to seed/update membership.

Types

shape_id()

@type shape_id() :: any()

t()

@type t() :: %Electric.Shapes.Filter{
  eq_index_table: term(),
  incl_index_table: term(),
  shapes_table: term(),
  subquery_index: term(),
  tables_table: term(),
  where_cond_table: term()
}

Functions

active_shapes(filter)

@spec active_shapes(t()) :: [shape_id()]

add_shape(filter, shape_id, shape)

@spec add_shape(t(), shape_id(), Electric.Shapes.Shape.t()) :: t()

Add a shape for the filter to track.

The shape_id can be any term you like to identify the shape. Whatever you use will be returned by affected_shapes/2 when the shape is affected by a change.

affected_shapes(filter, change)

Returns the shape IDs for all shapes that have been added to the filter that are affected by the given change.

get_shape(filter, shape_id)

Get a shape by its ID. Used internally for where clause evaluation.

has_shape?(filter, shape_handle)

@spec has_shape?(t(), shape_id()) :: boolean()

indexed_shape?(shape)

@spec indexed_shape?(Electric.Shapes.Shape.t()) :: boolean()

Returns true when ShapeLogCollector can route the shape through any of its indexes instead of relying exclusively on other_shapes scans.

new(opts \\ [])

@spec new(keyword()) :: t()

remove_shape(filter, shape_id)

@spec remove_shape(t(), shape_id()) :: t()

Remove a shape from the filter.

subquery_index(filter)

Get the subquery index. Used by consumers to seed/update membership.