Fact.EventStreamsByCategoryIndexer (Fact v0.2.0)

View Source

Indexes the first event of each event stream by the stream category.

Similar to the Fact.EventStreamCategoryIndexer this splits the event stream using a specified separator and returns the first segment, but behaves like the Fact.EventStreamsIndexer and only indexes the first event of each stream.

This results in creating an index file per-category, each containing the first event in for each stream in the category. It is common in systems for all instances of an Aggregate root to write to the same "category", this indexer makes it easy to find all the instances of that type (e.g. Get All Orders, Get All Customers, etc.).

Summary

Types

The id for a Fact.EventStreamsByCategoryIndexer.

Custom option values passed to the Fact.EventIndexer.index_event/3 callback function.

Custom options passed to the Fact.EventIndexer.index_event/3 callback function.

Functions

Returns a specification to start this module under a supervisor.

Extracts the stream category from the first event of each event stream.

Gets the friendly name for the indexer.

Starts the indexer process.

Types

id()

@type id() :: {Fact.EventStreamsByCategoryIndexer, nil}

The id for a Fact.EventStreamsByCategoryIndexer.

option()

@type option() :: {:separator, String.t()} | Fact.EventIndexer.indexer_option()

Custom option values passed to the Fact.EventIndexer.index_event/3 callback function.

options()

@type options() :: [option()]

Custom options passed to the Fact.EventIndexer.index_event/3 callback function.

Functions

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

index_event(schema, event, opts)

Extracts the stream category from the first event of each event stream.

Options

  • :separator - optional delimiter used to split the stream name. Defaults to "-".

Examples

iex> event = %{
...>   "event_type" => "ClutchLaid", 
...>   "event_data" => %{"turtle_id" => "t1", "clutch_id" => "c1", "eggs" => 42}, 
...>   "event_tags" => ["turtle:t1", "clutch:c1"], 
...>   "stream_id" => "turtle_mating-1234",
...>   "stream_position" => 3
...> }
iex> Fact.EventStreamsByCategoryIndexer.index_event(event, [])
nil

iex> event = %{
...>   "event_type" => "EggHatched", 
...>   "event_data" => %{"turtle_id" => "t2", "clutch_id" => "c1"}, 
...>   "event_tags" => ["turtle:t2", "clutch:c1"], 
...> }
iex> Fact.EventStreamsByCategoryIndexer.index_event(event, [])
nil

iex> event = %{
...>   "event_type" => "DatabaseCreated", 
...>   "event_data" => %{"database_id" => "RVX27QR6PFDORJZF24C4DIICSQ"}, 
...>   "stream_id" => "__fact", 
...>   "stream_position" => 1
...> }
iex> Fact.EventStreamsByCategoryIndexer.index_event(event, [])
"__fact"

indexer_name()

(since 0.1.2)
@spec indexer_name() :: String.t()

Gets the friendly name for the indexer.

This is included in the file path where index files are stored on disk.

start_link(opts \\ [])

@spec start_link([Fact.EventIndexer.option()]) :: GenServer.on_start()

Starts the indexer process.