pg_eventstore 1.13.4 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +11 -2
- data/CHANGELOG.md +195 -16
- data/README.md +33 -10
- data/db/migrations/10_setup_pg_cron.rb +1 -0
- data/db/migrations/11_add_events_link_global_position.sql +1 -0
- data/db/migrations/12_migrate_legacy_links.rb +83 -0
- data/db/migrations/13_remove_events_link_id.sql +6 -0
- data/db/migrations/14_remove_ids_events_id_index.sql +1 -0
- data/db/migrations/15_create_streams_global_index.sql +17 -0
- data/db/migrations/16_populate_streams_global_index.rb +150 -0
- data/db/migrations/17_create_events_global_index.sql +62 -0
- data/db/migrations/18_populate_events_global_index.rb +124 -0
- data/db/migrations/19_populate_events_global_index_p2.rb +25 -0
- data/db/migrations/20_migrate_subscriptions_current_position.sql +19 -0
- data/db/migrations/21_create_partitions_stats.sql +2 -0
- data/db/migrations/22_drop_streams_sql_view.sql +2 -0
- data/db/migrations/23_adjust_partitions_indexes.sql +5 -0
- data/db/migrations/24_drop_legacy_events_indexes.sql +3 -0
- data/db/migrations/25_add_parent_partitions_info_to_partitions.sql +16 -0
- data/db/migrations/26_change_events_stream_revision_type.rb +35 -0
- data/db/migrations/27_drop_events_horizon.sql +3 -0
- data/db/migrations/28_create_maintenance_tasks.sql +8 -0
- data/db/migrations/29_create_event_markers.sql +35 -0
- data/db/migrations/30_improve_partitions_search_in_admin_ui.rb +24 -0
- data/db/migrations/31_drop_events_id_default_value.sql +1 -0
- data/db/migrations/32_create_parittions_triggers.sql +101 -0
- data/db/migrations/9_create_events_horizon.sql +21 -0
- data/docs/AGENTS.fragment.md +696 -0
- data/docs/admin_ui.md +3 -1
- data/docs/appending_events.md +110 -49
- data/docs/configuration.md +69 -36
- data/docs/event_tracing.md +55 -0
- data/docs/events_and_streams.md +54 -30
- data/docs/how_it_works.md +57 -16
- data/docs/linking_events.md +2 -1
- data/docs/maintenance.md +14 -5
- data/docs/multiple_commands.md +30 -6
- data/docs/reading_events.md +208 -43
- data/docs/reading_streams.md +50 -0
- data/docs/replication.md +99 -0
- data/docs/subscriptions.md +165 -35
- data/docs/writing_middleware.md +25 -8
- data/ext/pg_eventstore_ext/extconf.rb +5 -0
- data/ext/pg_eventstore_ext/pg_eventstore_ext.c +74 -0
- data/lib/pg_eventstore/async_runner.rb +63 -0
- data/lib/pg_eventstore/basic_config.rb +15 -0
- data/lib/pg_eventstore/callbacks.rb +7 -5
- data/lib/pg_eventstore/chunks/chunk.rb +31 -0
- data/lib/pg_eventstore/chunks/read_api_events_index_chunk.rb +83 -0
- data/lib/pg_eventstore/chunks/replica_events_index_chunk.rb +35 -0
- data/lib/pg_eventstore/chunks/repository.rb +73 -0
- data/lib/pg_eventstore/chunks/subscription_checkpoint_chunk.rb +48 -0
- data/lib/pg_eventstore/chunks/subscription_events_index_chunk.rb +99 -0
- data/lib/pg_eventstore/chunks.rb +14 -0
- data/lib/pg_eventstore/cli/try_to_delete_subscriptions_set.rb +2 -2
- data/lib/pg_eventstore/client.rb +167 -52
- data/lib/pg_eventstore/commands/append.rb +62 -43
- data/lib/pg_eventstore/commands/delete_event.rb +7 -8
- data/lib/pg_eventstore/commands/delete_stream.rb +3 -3
- data/lib/pg_eventstore/commands/event_modifiers/prepare_link_event.rb +11 -6
- data/lib/pg_eventstore/commands/event_modifiers/prepare_regular_event.rb +12 -7
- data/lib/pg_eventstore/commands/link_to.rb +9 -9
- data/lib/pg_eventstore/commands/multiple.rb +2 -2
- data/lib/pg_eventstore/commands/read.rb +23 -5
- data/lib/pg_eventstore/commands/read_grouped.rb +46 -0
- data/lib/pg_eventstore/commands/read_streams.rb +18 -0
- data/lib/pg_eventstore/commands/read_streams_paginated.rb +56 -0
- data/lib/pg_eventstore/commands/regular_stream_read_paginated.rb +4 -4
- data/lib/pg_eventstore/commands/revision_check/current_revision.rb +51 -0
- data/lib/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rb +46 -0
- data/lib/pg_eventstore/commands/revision_check/expected_revision.rb +135 -0
- data/lib/pg_eventstore/commands/revision_check/stream_revision_check.rb +98 -0
- data/lib/pg_eventstore/commands/revision_check/stream_revision_comparison.rb +36 -0
- data/lib/pg_eventstore/commands/stream_revision.rb +14 -0
- data/lib/pg_eventstore/commands/system_stream_read_paginated.rb +4 -4
- data/lib/pg_eventstore/commands.rb +4 -2
- data/lib/pg_eventstore/config.rb +30 -9
- data/lib/pg_eventstore/connection.rb +22 -37
- data/lib/pg_eventstore/errors.rb +137 -11
- data/lib/pg_eventstore/event.rb +39 -7
- data/lib/pg_eventstore/event_deserializer.rb +5 -4
- data/lib/pg_eventstore/event_global_index.rb +118 -0
- data/lib/pg_eventstore/event_marker.rb +16 -0
- data/lib/pg_eventstore/event_marker_index.rb +25 -0
- data/lib/pg_eventstore/event_serializer.rb +6 -0
- data/lib/pg_eventstore/extensions/acts_as_configurable.rb +88 -0
- data/lib/pg_eventstore/extensions/options_defaults.rb +25 -0
- data/lib/pg_eventstore/extensions/options_extension.rb +42 -13
- data/lib/pg_eventstore/feature_marker.rb +18 -0
- data/lib/pg_eventstore/maintenance.rb +11 -6
- data/lib/pg_eventstore/middleware/event_tracing.rb +53 -0
- data/lib/pg_eventstore/partition.rb +6 -0
- data/lib/pg_eventstore/pg_connection.rb +70 -14
- data/lib/pg_eventstore/queries/event_marker_queries.rb +74 -0
- data/lib/pg_eventstore/queries/event_queries.rb +9 -95
- data/lib/pg_eventstore/queries/events_global_index_queries.rb +131 -0
- data/lib/pg_eventstore/queries/index_filtering_queries.rb +179 -0
- data/lib/pg_eventstore/queries/links_resolver.rb +10 -7
- data/lib/pg_eventstore/queries/maintenance_queries.rb +159 -42
- data/lib/pg_eventstore/queries/partition_queries.rb +46 -104
- data/lib/pg_eventstore/queries/replica_queries.rb +110 -0
- data/lib/pg_eventstore/queries/streams_global_index_queries.rb +163 -0
- data/lib/pg_eventstore/queries/transaction_queries.rb +58 -10
- data/lib/pg_eventstore/queries.rb +29 -1
- data/lib/pg_eventstore/query_builders/basic_filtering.rb +38 -5
- data/lib/pg_eventstore/query_builders/event_markers_filtering.rb +47 -0
- data/lib/pg_eventstore/query_builders/event_markers_index_filtering.rb +275 -0
- data/lib/pg_eventstore/query_builders/event_subscription_positions_filtering.rb +37 -0
- data/lib/pg_eventstore/query_builders/events_filtering.rb +15 -164
- data/lib/pg_eventstore/query_builders/events_global_index_filtering.rb +227 -0
- data/lib/pg_eventstore/query_builders/filters/collection.rb +324 -0
- data/lib/pg_eventstore/query_builders/filters/event_type_filter.rb +37 -0
- data/lib/pg_eventstore/query_builders/filters/filter_row.rb +54 -0
- data/lib/pg_eventstore/query_builders/filters/marker_filter.rb +20 -0
- data/lib/pg_eventstore/query_builders/filters/marker_filter_row.rb +49 -0
- data/lib/pg_eventstore/query_builders/filters/stream_filter.rb +48 -0
- data/lib/pg_eventstore/query_builders/index_based_events_filtering.rb +260 -0
- data/lib/pg_eventstore/query_builders/partitions_filtering.rb +175 -51
- data/lib/pg_eventstore/query_builders/read_cursor/stream_cursor.rb +122 -0
- data/lib/pg_eventstore/query_builders/streams_global_index_filtering.rb +83 -0
- data/lib/pg_eventstore/query_builders/subscription_events_filtering.rb +79 -0
- data/lib/pg_eventstore/query_strategy/async.rb +64 -0
- data/lib/pg_eventstore/query_strategy/foreground.rb +25 -0
- data/lib/pg_eventstore/query_strategy.rb +19 -0
- data/lib/pg_eventstore/raw_event.rb +46 -0
- data/lib/pg_eventstore/rspec/test_helpers.rb +21 -8
- data/lib/pg_eventstore/sql_builder.rb +87 -8
- data/lib/pg_eventstore/stream.rb +14 -17
- data/lib/pg_eventstore/stream_global_index.rb +28 -0
- data/lib/pg_eventstore/subscriptions/basic_runner.rb +4 -4
- data/lib/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rb +5 -17
- data/lib/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rb +36 -0
- data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rb +13 -1
- data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rb +19 -14
- data/lib/pg_eventstore/subscriptions/events_processor.rb +21 -19
- data/lib/pg_eventstore/subscriptions/events_processor_consumer/multiple.rb +63 -0
- data/lib/pg_eventstore/subscriptions/events_processor_consumer/replica.rb +68 -0
- data/lib/pg_eventstore/subscriptions/events_processor_consumer/single.rb +62 -0
- data/lib/pg_eventstore/subscriptions/events_processor_consumer.rb +44 -0
- data/lib/pg_eventstore/subscriptions/events_subscription_position_worker.rb +68 -0
- data/lib/pg_eventstore/subscriptions/queries/event_subscription_position_queries.rb +177 -0
- data/lib/pg_eventstore/subscriptions/queries/subscription_command_queries.rb +5 -5
- data/lib/pg_eventstore/subscriptions/queries/subscription_queries.rb +80 -56
- data/lib/pg_eventstore/subscriptions/queries/subscriptions_set_command_queries.rb +2 -2
- data/lib/pg_eventstore/subscriptions/queries/subscriptions_set_queries.rb +1 -1
- data/lib/pg_eventstore/subscriptions/replica_subscription_handler.rb +140 -0
- data/lib/pg_eventstore/subscriptions/replica_subscription_runner.rb +9 -0
- data/lib/pg_eventstore/subscriptions/subscription.rb +9 -7
- data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/collection.rb +36 -0
- data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/index_read_strategy.rb +82 -0
- data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/replication_strategy.rb +75 -0
- data/lib/pg_eventstore/subscriptions/subscription_feed_strategy.rb +31 -0
- data/lib/pg_eventstore/subscriptions/subscription_feeder.rb +26 -2
- data/lib/pg_eventstore/subscriptions/subscription_handler_performance.rb +5 -5
- data/lib/pg_eventstore/subscriptions/subscription_runner.rb +20 -22
- data/lib/pg_eventstore/subscriptions/subscription_runner_commands/reset_position.rb +1 -1
- data/lib/pg_eventstore/subscriptions/subscription_runners_feeder.rb +10 -11
- data/lib/pg_eventstore/subscriptions/subscriptions_lifecycle.rb +0 -12
- data/lib/pg_eventstore/subscriptions/subscriptions_manager.rb +84 -29
- data/lib/pg_eventstore/{subscriptions/synchronized_array.rb → synchronized_array.rb} +15 -0
- data/lib/pg_eventstore/tasks/setup.rake +32 -33
- data/lib/pg_eventstore/utils.rb +39 -0
- data/lib/pg_eventstore/version.rb +1 -1
- data/lib/pg_eventstore/web/application.rb +104 -20
- data/lib/pg_eventstore/web/paginator/base_collection.rb +5 -1
- data/lib/pg_eventstore/web/paginator/event_types_collection.rb +14 -4
- data/lib/pg_eventstore/web/paginator/events_collection.rb +29 -33
- data/lib/pg_eventstore/web/paginator/helpers.rb +19 -12
- data/lib/pg_eventstore/web/paginator/markers_collection.rb +48 -0
- data/lib/pg_eventstore/web/paginator/stream_contexts_collection.rb +13 -2
- data/lib/pg_eventstore/web/paginator/stream_ids_collection.rb +21 -11
- data/lib/pg_eventstore/web/paginator/stream_names_collection.rb +18 -4
- data/lib/pg_eventstore/web/paginator/streams_collection.rb +95 -0
- data/lib/pg_eventstore/web/public/javascripts/pg_eventstore.js +49 -22
- data/lib/pg_eventstore/web/subscriptions/helpers.rb +2 -2
- data/lib/pg_eventstore/web/subscriptions/set_collection.rb +1 -1
- data/lib/pg_eventstore/web/subscriptions/subscriptions.rb +1 -1
- data/lib/pg_eventstore/web/subscriptions/with_state/set_collection.rb +1 -1
- data/lib/pg_eventstore/web/subscriptions/with_state/subscriptions.rb +1 -1
- data/lib/pg_eventstore/web/views/home/dashboard.erb +11 -9
- data/lib/pg_eventstore/web/views/home/partials/event_filter.erb +18 -5
- data/lib/pg_eventstore/web/views/home/partials/events.erb +38 -1
- data/lib/pg_eventstore/web/views/home/partials/markers_filter.erb +18 -0
- data/lib/pg_eventstore/web/views/layouts/application.erb +6 -0
- data/lib/pg_eventstore/web/views/streams/index.erb +110 -0
- data/lib/pg_eventstore/web/views/streams/partials/streams.erb +11 -0
- data/lib/pg_eventstore/web/views/subscriptions/index.erb +4 -1
- data/lib/pg_eventstore/web.rb +2 -0
- data/lib/pg_eventstore.rb +26 -63
- data/pg_eventstore.gemspec +6 -4
- data/sig/interfaces/_raw_events_handler.rbs +3 -0
- data/sig/interfaces/subscription_handler.rbs +1 -1
- data/sig/pg/result.rbs +9 -0
- data/sig/pg_eventstore/async_runner.rbs +13 -0
- data/sig/pg_eventstore/basic_config.rbs +9 -0
- data/sig/pg_eventstore/chunks/chunk.rbs +13 -0
- data/sig/pg_eventstore/chunks/read_api_events_index_chunk.rbs +30 -0
- data/sig/pg_eventstore/chunks/replica_events_index_chunk.rbs +11 -0
- data/sig/pg_eventstore/chunks/repository.rbs +22 -0
- data/sig/pg_eventstore/chunks/subscription_checkpoint_chunk.rbs +18 -0
- data/sig/pg_eventstore/chunks/subscription_events_index_chunk.rbs +37 -0
- data/sig/pg_eventstore/client.rbs +41 -43
- data/sig/pg_eventstore/commands/append.rbs +11 -25
- data/sig/pg_eventstore/commands/event_modifiers/prepare_link_event.rbs +9 -12
- data/sig/pg_eventstore/commands/event_modifiers/prepare_regular_event.rbs +5 -4
- data/sig/pg_eventstore/commands/link_to.rbs +6 -11
- data/sig/pg_eventstore/commands/multiple.rbs +1 -1
- data/sig/pg_eventstore/commands/read.rbs +2 -5
- data/sig/pg_eventstore/commands/read_grouped.rbs +7 -0
- data/sig/pg_eventstore/commands/read_streams.rbs +7 -0
- data/sig/pg_eventstore/commands/read_streams_paginated.rbs +16 -0
- data/sig/pg_eventstore/commands/regular_stream_read_paginated.rbs +9 -17
- data/sig/pg_eventstore/commands/revision_check/current_revision.rbs +25 -0
- data/sig/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rbs +14 -0
- data/sig/pg_eventstore/commands/revision_check/expected_revision.rbs +67 -0
- data/sig/pg_eventstore/commands/revision_check/stream_revision_check.rbs +20 -0
- data/sig/pg_eventstore/commands/revision_check/stream_revision_comparison.rbs +9 -0
- data/sig/pg_eventstore/commands/stream_revision.rbs +7 -0
- data/sig/pg_eventstore/commands/system_stream_read_paginated.rbs +9 -14
- data/sig/pg_eventstore/config.rbs +15 -6
- data/sig/pg_eventstore/connection.rbs +11 -18
- data/sig/pg_eventstore/errors.rbs +64 -34
- data/sig/pg_eventstore/event.rbs +20 -6
- data/sig/pg_eventstore/event_deserializer.rbs +5 -10
- data/sig/pg_eventstore/event_global_index.rbs +60 -0
- data/sig/pg_eventstore/event_marker.rbs +9 -0
- data/sig/pg_eventstore/event_marker_index.rbs +12 -0
- data/sig/pg_eventstore/extensions/acts_as_configurable.rbs +29 -0
- data/sig/pg_eventstore/extensions/options_defaults.rbs +7 -0
- data/sig/pg_eventstore/extensions/options_extension.rbs +9 -1
- data/sig/pg_eventstore/feature_marker.rbs +10 -0
- data/sig/pg_eventstore/maintenance.rbs +12 -8
- data/sig/pg_eventstore/middleware/event_trace.rbs +14 -0
- data/sig/pg_eventstore/partition.rbs +2 -4
- data/sig/pg_eventstore/pg_connection.rbs +8 -0
- data/sig/pg_eventstore/queries/event_marker_queries.rbs +21 -0
- data/sig/pg_eventstore/queries/event_queries.rbs +6 -38
- data/sig/pg_eventstore/queries/events_global_index_queries.rbs +37 -0
- data/sig/pg_eventstore/queries/index_filtering_queries.rbs +50 -0
- data/sig/pg_eventstore/queries/links_resolver.rbs +7 -11
- data/sig/pg_eventstore/queries/maintenance_queries.rbs +12 -9
- data/sig/pg_eventstore/queries/partition_queries.rbs +32 -67
- data/sig/pg_eventstore/queries/replica_queries.rbs +31 -0
- data/sig/pg_eventstore/queries/streams_global_index_queries.rbs +39 -0
- data/sig/pg_eventstore/queries/transaction_queries.rbs +4 -2
- data/sig/pg_eventstore/queries.rbs +11 -21
- data/sig/pg_eventstore/query_builders/basic_filtering.rbs +10 -3
- data/sig/pg_eventstore/query_builders/event_markers_filtering.rbs +17 -0
- data/sig/pg_eventstore/query_builders/event_markers_index_filtering.rbs +69 -0
- data/sig/pg_eventstore/query_builders/event_subscription_positions_filtering.rbs +15 -0
- data/sig/pg_eventstore/query_builders/events_filtering_query.rbs +9 -51
- data/sig/pg_eventstore/query_builders/events_global_index_filtering.rbs +68 -0
- data/sig/pg_eventstore/query_builders/filters/collection.rbs +84 -0
- data/sig/pg_eventstore/query_builders/filters/event_type_filter.rbs +19 -0
- data/sig/pg_eventstore/query_builders/filters/filter_row.rbs +21 -0
- data/sig/pg_eventstore/query_builders/filters/marker_filter.rbs +13 -0
- data/sig/pg_eventstore/query_builders/filters/marker_filter_row.rbs +19 -0
- data/sig/pg_eventstore/query_builders/filters/stream_filter.rbs +24 -0
- data/sig/pg_eventstore/query_builders/index_based_events_filtering.rbs +60 -0
- data/sig/pg_eventstore/query_builders/partitions_filtering.rbs +29 -10
- data/sig/pg_eventstore/query_builders/read_cursor/stream_cursor.rbs +47 -0
- data/sig/pg_eventstore/query_builders/streams_global_index_filtering.rbs +27 -0
- data/sig/pg_eventstore/query_builders/subscription_events_filtering.rbs +26 -0
- data/sig/pg_eventstore/query_strategy/async.rbs +17 -0
- data/sig/pg_eventstore/query_strategy/foreground.rbs +11 -0
- data/sig/pg_eventstore/query_strategy.rbs +7 -0
- data/sig/pg_eventstore/raw_event.rbs +20 -0
- data/sig/pg_eventstore/sql_builder.rbs +32 -10
- data/sig/pg_eventstore/stream.rbs +10 -18
- data/sig/pg_eventstore/stream_global_index.rbs +14 -0
- data/sig/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rbs +5 -4
- data/sig/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rbs +9 -0
- data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rbs +17 -12
- data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rbs +16 -8
- data/sig/pg_eventstore/subscriptions/event_subscription_position_queries.rbs +30 -0
- data/sig/pg_eventstore/subscriptions/events_processor.rbs +12 -5
- data/sig/pg_eventstore/subscriptions/events_processor_consumer/multiple.rbs +17 -0
- data/sig/pg_eventstore/subscriptions/events_processor_consumer/replica.rbs +17 -0
- data/sig/pg_eventstore/subscriptions/events_processor_consumer/single.rbs +17 -0
- data/sig/pg_eventstore/subscriptions/events_processor_consumer.rbs +14 -0
- data/sig/pg_eventstore/subscriptions/events_subscription_position_worker.rbs +28 -0
- data/sig/pg_eventstore/subscriptions/queries/subscription_queries.rbs +18 -50
- data/sig/pg_eventstore/subscriptions/replica_subscription_handler.rbs +33 -0
- data/sig/pg_eventstore/subscriptions/replica_subscription_runner.rbs +4 -0
- data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/collection.rbs +14 -0
- data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/index_read_strategy.rbs +23 -0
- data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/replication_strategy.rbs +23 -0
- data/sig/pg_eventstore/subscriptions/subscription_feed_strategy.rbs +11 -0
- data/sig/pg_eventstore/subscriptions/subscription_feeder.rbs +13 -10
- data/sig/pg_eventstore/subscriptions/subscription_handler_performance.rbs +1 -1
- data/sig/pg_eventstore/subscriptions/subscription_runner.rbs +13 -5
- data/sig/pg_eventstore/subscriptions/subscription_runners_feeder.rbs +5 -5
- data/sig/pg_eventstore/subscriptions/subscriptions_lifecycle.rbs +4 -6
- data/sig/pg_eventstore/subscriptions/subscriptions_manager.rbs +29 -43
- data/sig/pg_eventstore/synchronized_array.rbs +4 -0
- data/sig/pg_eventstore/utils.rbs +18 -11
- data/sig/pg_eventstore/web/application.rbs +13 -3
- data/sig/pg_eventstore/web/paginator/base_collection.rbs +2 -0
- data/sig/pg_eventstore/web/paginator/event_types_collection.rbs +4 -0
- data/sig/pg_eventstore/web/paginator/events_collection.rbs +11 -11
- data/sig/pg_eventstore/web/paginator/helpers.rbs +6 -15
- data/sig/pg_eventstore/web/paginator/markers_collection.rbs +13 -0
- data/sig/pg_eventstore/web/paginator/stream_contexts_collection.rbs +4 -0
- data/sig/pg_eventstore/web/paginator/stream_names_collection.rbs +4 -0
- data/sig/pg_eventstore/web/paginator/streams_collection.rbs +30 -0
- data/sig/pg_eventstore.rbs +8 -26
- metadata +181 -21
- data/lib/pg_eventstore/commands/all_stream_read_grouped.rb +0 -69
- data/lib/pg_eventstore/commands/regular_stream_read_grouped.rb +0 -31
- data/lib/pg_eventstore/subscriptions/queries/service_queries.rb +0 -73
- data/lib/pg_eventstore/subscriptions/subscription_position_evaluation.rb +0 -195
- data/lib/pg_eventstore/web/views/home/partials/system_stream_filter.erb +0 -15
- data/sig/pg_eventstore/commands/all_stream_read_grouped.rbs +0 -16
- data/sig/pg_eventstore/commands/regular_stream_read_grouped.rbs +0 -8
- data/sig/pg_eventstore/subscriptions/queries/service_queries.rbs +0 -15
- data/sig/pg_eventstore/subscriptions/subscription_position_evaluation.rbs +0 -53
- data/sig/pg_eventstore/subscriptions/synchronized_array.rbs +0 -4
- /data/sig/interfaces/{_raw_event_handler.rbs → raw_event_handler.rbs} +0 -0
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module PgEventstore
|
|
4
|
-
# When subscription pulls events at the edge of the events list and several events arrives concurrently - there is a
|
|
5
|
-
# chance some events will never be picked. Example:
|
|
6
|
-
# - event1 has been assigned global_position#9
|
|
7
|
-
# - event2 has been assigned global_position#10
|
|
8
|
-
# - event1 and event2 are currently in concurrent transactions, but those transactions does not block each other
|
|
9
|
-
# - transaction holding event2 commits first
|
|
10
|
-
# - a subscription picks event2 and sets next position to 11
|
|
11
|
-
# - transaction holding event1 commits
|
|
12
|
-
# Illustration:
|
|
13
|
-
# Time → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → → →
|
|
14
|
-
#
|
|
15
|
-
# T1: BEGIN
|
|
16
|
-
# INSERT INTO events(...);
|
|
17
|
-
# --------------------global_position#9------------------->
|
|
18
|
-
# COMMIT
|
|
19
|
-
# T2: BEGIN
|
|
20
|
-
# INSERT INTO events(...);
|
|
21
|
-
# --------------global_position#10-------->
|
|
22
|
-
# COMMIT
|
|
23
|
-
# Query events: SELECT * FROM event WHERE global_position >= 8
|
|
24
|
-
# --------------Picks #8, #10, but never #9-------->
|
|
25
|
-
#
|
|
26
|
-
# To solve this problem we can:
|
|
27
|
-
# 1. pause events fetching for the subscription
|
|
28
|
-
# 2. fetch latest global position that matches subscription's filter
|
|
29
|
-
# 3. wait for all currently running transactions that affects on the subscription to finish
|
|
30
|
-
# 4. unpause events fetching and use this position as a right hand limiter, because we can now confidently say there
|
|
31
|
-
# are no uncommited events that would be lost otherwise
|
|
32
|
-
# This class is responsible for the step 2 and step 3, and persists the last safe position to be used in step 4.
|
|
33
|
-
# @!visibility private
|
|
34
|
-
class SubscriptionPositionEvaluation
|
|
35
|
-
# Determines how often to check the list of currently running transactions
|
|
36
|
-
# @return [Float]
|
|
37
|
-
TRANSACTIONS_STATUS_REFRESH_INTERVAL = 0.05 # seconds
|
|
38
|
-
private_constant :TRANSACTIONS_STATUS_REFRESH_INTERVAL
|
|
39
|
-
|
|
40
|
-
# @param config_name [Symbol]
|
|
41
|
-
# @param filter_options [Hash]
|
|
42
|
-
def initialize(config_name:, filter_options:)
|
|
43
|
-
@config_name = config_name
|
|
44
|
-
@stream_filters = QueryBuilders::PartitionsFiltering.extract_streams_filter(filter: filter_options)
|
|
45
|
-
@event_type_filters = QueryBuilders::PartitionsFiltering.extract_event_types_filter(filter: filter_options)
|
|
46
|
-
@position_to_evaluate = nil
|
|
47
|
-
@position_is_safe = nil
|
|
48
|
-
@last_safe_position = nil
|
|
49
|
-
@runner = nil
|
|
50
|
-
@relation_ids_cache = {}
|
|
51
|
-
@mutex = Mutex.new
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# @param position_to_evaluate [Integer]
|
|
55
|
-
# @return [self]
|
|
56
|
-
def evaluate(position_to_evaluate)
|
|
57
|
-
unless self.position_to_evaluate == position_to_evaluate
|
|
58
|
-
stop_evaluation
|
|
59
|
-
self.position_to_evaluate = position_to_evaluate
|
|
60
|
-
calculate_safe_position
|
|
61
|
-
end
|
|
62
|
-
self
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# @return [Boolean]
|
|
66
|
-
def safe?
|
|
67
|
-
@mutex.synchronize { @position_is_safe } || false
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# @return [Integer, nil]
|
|
71
|
-
def last_safe_position
|
|
72
|
-
@mutex.synchronize { @last_safe_position }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# @return [Thread, nil] a runner who is being stopped if any
|
|
76
|
-
def stop_evaluation
|
|
77
|
-
_stop_evaluation(@runner)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
private
|
|
81
|
-
|
|
82
|
-
# @param runner [Thread, nil]
|
|
83
|
-
# @return [Thread, nil]
|
|
84
|
-
def _stop_evaluation(runner)
|
|
85
|
-
runner&.exit
|
|
86
|
-
self.position_is_safe = nil
|
|
87
|
-
self.last_safe_position = nil
|
|
88
|
-
self.position_to_evaluate = nil
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
# @return [Integer, nil]
|
|
92
|
-
def position_to_evaluate
|
|
93
|
-
@mutex.synchronize { @position_to_evaluate }
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# @return [Boolean, nil]
|
|
97
|
-
def position_is_safe
|
|
98
|
-
@mutex.synchronize { @position_is_safe }
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# @param val [Integer, nil]
|
|
102
|
-
# @return [Integer, nil]
|
|
103
|
-
def last_safe_position=(val)
|
|
104
|
-
@mutex.synchronize { @last_safe_position = val }
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# @param val [Integer, nil]
|
|
108
|
-
# @return [Integer, nil]
|
|
109
|
-
def position_to_evaluate=(val)
|
|
110
|
-
@mutex.synchronize { @position_to_evaluate = val }
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# @param val [Boolean, nil]
|
|
114
|
-
# @return [Boolean, nil]
|
|
115
|
-
def position_is_safe=(val)
|
|
116
|
-
@mutex.synchronize { @position_is_safe = val }
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# @return [Array<String>]
|
|
120
|
-
def affected_tables
|
|
121
|
-
if @stream_filters.empty? && @event_type_filters.empty?
|
|
122
|
-
[Event::PRIMARY_TABLE_NAME]
|
|
123
|
-
else
|
|
124
|
-
partition_queries.partitions(@stream_filters, @event_type_filters, scope: :auto).map(&:table_name)
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
# @return [void]
|
|
129
|
-
def calculate_safe_position
|
|
130
|
-
@runner = Thread.new do
|
|
131
|
-
tables_to_track = affected_tables
|
|
132
|
-
update_relation_ids_cache(tables_to_track)
|
|
133
|
-
safe_position = service_queries.max_global_position(tables_to_track)
|
|
134
|
-
trx_ids = transaction_queries.transaction do
|
|
135
|
-
service_queries.relation_transaction_ids(@relation_ids_cache.values)
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
loop do
|
|
139
|
-
transactions_in_progress = service_queries.transactions_in_progress?(
|
|
140
|
-
relation_ids: @relation_ids_cache.values, transaction_ids: trx_ids
|
|
141
|
-
)
|
|
142
|
-
break unless transactions_in_progress
|
|
143
|
-
|
|
144
|
-
sleep TRANSACTIONS_STATUS_REFRESH_INTERVAL
|
|
145
|
-
end
|
|
146
|
-
@mutex.synchronize do
|
|
147
|
-
if safe_position >= @position_to_evaluate
|
|
148
|
-
# We progressed forward. New position can be persisted
|
|
149
|
-
@last_safe_position = safe_position
|
|
150
|
-
@position_is_safe = true
|
|
151
|
-
else
|
|
152
|
-
# safe_position is less than the current position to fetch the events from. This means that no new events
|
|
153
|
-
# are present at this point. We will need to re-evaluate the safe position during next attempts. Until that
|
|
154
|
-
# we can't progress.
|
|
155
|
-
@position_to_evaluate = nil
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
rescue
|
|
159
|
-
# Clean up the state immediately in case of error
|
|
160
|
-
_stop_evaluation(nil)
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
# @param tables_to_track [Array<String>]
|
|
165
|
-
# @return [void]
|
|
166
|
-
def update_relation_ids_cache(tables_to_track)
|
|
167
|
-
missing_relation_ids = tables_to_track - @relation_ids_cache.keys
|
|
168
|
-
deleted_relations = @relation_ids_cache.keys - tables_to_track
|
|
169
|
-
@relation_ids_cache = @relation_ids_cache.except(*deleted_relations)
|
|
170
|
-
return if missing_relation_ids.empty?
|
|
171
|
-
|
|
172
|
-
@relation_ids_cache.merge!(service_queries.relation_ids_by_names(missing_relation_ids))
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
# @return [PgEventstore::PartitionQueries]
|
|
176
|
-
def partition_queries
|
|
177
|
-
PartitionQueries.new(connection)
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
# @return [PgEventstore::TransactionQueries]
|
|
181
|
-
def transaction_queries
|
|
182
|
-
TransactionQueries.new(connection)
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
# @return [PgEventstore::ServiceQueries]
|
|
186
|
-
def service_queries
|
|
187
|
-
ServiceQueries.new(connection)
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
# @return [PgEventstore::Connection]
|
|
191
|
-
def connection
|
|
192
|
-
PgEventstore.connection(@config_name)
|
|
193
|
-
end
|
|
194
|
-
end
|
|
195
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
<div class="form-row align-items-center">
|
|
2
|
-
<div class="col-3">
|
|
3
|
-
<select name="filter[system_stream]" class="form-control mb-2" data-placeholder="Select system stream" autocomplete="off">
|
|
4
|
-
<option></option>
|
|
5
|
-
<% PgEventstore::Stream::KNOWN_SYSTEM_STREAMS.each do |stream_name| %>
|
|
6
|
-
<option value="<%= stream_name %>" <% if stream == stream_name %> selected <% end %>><%= stream_name %></option>
|
|
7
|
-
<% end %>
|
|
8
|
-
</select>
|
|
9
|
-
</div>
|
|
10
|
-
<div class="col-1">
|
|
11
|
-
<a class="btn btn-default remove-filter" href="javascript: void(0);">
|
|
12
|
-
<i class="fa fa-minus-circle"></i>
|
|
13
|
-
</a>
|
|
14
|
-
</div>
|
|
15
|
-
</div>
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
module PgEventstore
|
|
2
|
-
module Commands
|
|
3
|
-
class AllStreamReadGrouped < AbstractCommand
|
|
4
|
-
|
|
5
|
-
def call: (Stream stream, ?options: ::Hash[untyped, untyped]) -> Array[Event]
|
|
6
|
-
|
|
7
|
-
private
|
|
8
|
-
|
|
9
|
-
def build_filter_options_for_partitions: (Partition partition, Hash[untyped, untyped] options) -> Hash[untyped, untyped]
|
|
10
|
-
|
|
11
|
-
def build_filter_options_for_streams: (Partition partition, Array[String] stream_ids, Hash[untyped, untyped] options) -> Array[Hash[untyped, untyped]]
|
|
12
|
-
|
|
13
|
-
def group_stream_ids: (Hash[untyped, untyped] options) -> Hash[untyped, untyped]
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
module PgEventstore
|
|
2
|
-
class ServiceQueries
|
|
3
|
-
@connection: Connection
|
|
4
|
-
|
|
5
|
-
def initialize: (Connection connection) -> void
|
|
6
|
-
|
|
7
|
-
def max_global_position: (Array[String] table_names) -> Integer
|
|
8
|
-
|
|
9
|
-
def relation_ids_by_names: (Array[String] table_names) -> Hash[String, Integer]
|
|
10
|
-
|
|
11
|
-
def relation_transaction_ids: (Array[Integer] relation_oids) -> Array[String]
|
|
12
|
-
|
|
13
|
-
def transactions_in_progress?: (relation_ids: Array[Integer], transaction_ids: Array[String]) -> bool
|
|
14
|
-
end
|
|
15
|
-
end
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
module PgEventstore
|
|
2
|
-
class SubscriptionPositionEvaluation
|
|
3
|
-
TRANSACTIONS_STATUS_REFRESH_INTERVAL: Float
|
|
4
|
-
|
|
5
|
-
@config_name: Symbol
|
|
6
|
-
@event_type_filters: Array[String]
|
|
7
|
-
@last_safe_position: Integer?
|
|
8
|
-
@mutex: Mutex
|
|
9
|
-
@position_is_safe: bool?
|
|
10
|
-
@position_to_evaluate: Integer?
|
|
11
|
-
@relation_ids_cache: Hash[String, Integer]
|
|
12
|
-
@runner: Thread?
|
|
13
|
-
@stream_filters: Array[Hash[untyped, untyped]]
|
|
14
|
-
|
|
15
|
-
def initialize: (config_name: Symbol, filter_options: Hash[untyped, untyped]) -> void
|
|
16
|
-
|
|
17
|
-
def evaluate: (Integer position_to_evaluate) -> self
|
|
18
|
-
|
|
19
|
-
def last_safe_position: -> Integer?
|
|
20
|
-
|
|
21
|
-
def safe?: -> bool
|
|
22
|
-
|
|
23
|
-
def stop_evaluation: -> void
|
|
24
|
-
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
def _stop_evaluation: (Thread? runner)-> void
|
|
28
|
-
|
|
29
|
-
def affected_tables: -> Array[String]
|
|
30
|
-
|
|
31
|
-
def calculate_safe_position: -> void
|
|
32
|
-
|
|
33
|
-
def connection: -> Connection
|
|
34
|
-
|
|
35
|
-
def last_safe_position=: (Integer? val) -> Integer?
|
|
36
|
-
|
|
37
|
-
def partition_queries: -> PartitionQueries
|
|
38
|
-
|
|
39
|
-
def position_is_safe: -> bool?
|
|
40
|
-
|
|
41
|
-
def position_is_safe=: (bool? val) -> bool?
|
|
42
|
-
|
|
43
|
-
def position_to_evaluate: -> Integer?
|
|
44
|
-
|
|
45
|
-
def position_to_evaluate=: (Integer? val) -> Integer?
|
|
46
|
-
|
|
47
|
-
def service_queries: -> ServiceQueries
|
|
48
|
-
|
|
49
|
-
def transaction_queries: -> TransactionQueries
|
|
50
|
-
|
|
51
|
-
def update_relation_ids_cache: (Array[String] tables_to_track) -> void
|
|
52
|
-
end
|
|
53
|
-
end
|
|
File without changes
|