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,12 +1,12 @@
|
|
|
1
1
|
<script type="text/html" id="stream-filter-tmpl">
|
|
2
2
|
<%= erb :'home/partials/stream_filter', { layout: false }, { stream: {} } %>
|
|
3
3
|
</script>
|
|
4
|
-
<script type="text/html" id="system-stream-filter-tmpl">
|
|
5
|
-
<%= erb :'home/partials/system_stream_filter', { layout: false }, { stream: nil } %>
|
|
6
|
-
</script>
|
|
7
4
|
<script type="text/html" id="event-type-filter-tmpl">
|
|
8
5
|
<%= erb :'home/partials/event_filter', { layout: false }, { event_type: '' } %>
|
|
9
6
|
</script>
|
|
7
|
+
<script type="text/html" id="markers-filter-tmpl">
|
|
8
|
+
<%= erb :'home/partials/markers_filter', { layout: false }, { markers: [] } %>
|
|
9
|
+
</script>
|
|
10
10
|
|
|
11
11
|
<div class="right_col" role="main">
|
|
12
12
|
<div class="">
|
|
@@ -30,11 +30,6 @@
|
|
|
30
30
|
<form id="filters-form" action="<%= url('/') %>" method="GET" data-parsley-validate class="form-horizontal form-label-left">
|
|
31
31
|
<input type="hidden" name="per_page" value="<%= params[:per_page].to_i %>">
|
|
32
32
|
<input type="hidden" name="resolve_link_tos" value="<%= resolve_link_tos? %>">
|
|
33
|
-
<div class="system-stream-filter">
|
|
34
|
-
<% if system_stream %>
|
|
35
|
-
<%= erb :'home/partials/system_stream_filter', { layout: false }, { stream: system_stream } %>
|
|
36
|
-
<% end %>
|
|
37
|
-
</div>
|
|
38
33
|
<div class="stream-filters">
|
|
39
34
|
<% streams_filter&.each do |attrs| %>
|
|
40
35
|
<%= erb :'home/partials/stream_filter', { layout: false }, { stream: attrs } %>
|
|
@@ -45,6 +40,11 @@
|
|
|
45
40
|
<%= erb :'home/partials/event_filter', { layout: false }, { event_type: event_type } %>
|
|
46
41
|
<% end %>
|
|
47
42
|
</div>
|
|
43
|
+
<div class="markers-filter">
|
|
44
|
+
<% if markers_filter.any? %>
|
|
45
|
+
<%= erb :'home/partials/markers_filter', { layout: false }, { markers: markers_filter } %>
|
|
46
|
+
<% end %>
|
|
47
|
+
</div>
|
|
48
48
|
<div class="ln_solid"></div>
|
|
49
49
|
<div class="item form-group">
|
|
50
50
|
<div class="col-md-6 col-sm-6 offset-md-5">
|
|
@@ -58,6 +58,7 @@
|
|
|
58
58
|
<a class="dropdown-item add-stream-filter" href="javascript: void(0)">Add stream filter</a>
|
|
59
59
|
<a class="dropdown-item add-system-stream-filter" href="javascript: void(0)">Add system stream filter</a>
|
|
60
60
|
<a class="dropdown-item add-event-filter" href="javascript: void(0)">Add event filter</a>
|
|
61
|
+
<a class="dropdown-item add-markers-filter" href="javascript: void(0)">Add markers filter</a>
|
|
61
62
|
</div>
|
|
62
63
|
</div>
|
|
63
64
|
</div>
|
|
@@ -143,6 +144,7 @@
|
|
|
143
144
|
<a href="<%= sort_url('asc') %>"><i class="fa fa-sort-asc"></i></a>
|
|
144
145
|
<% end %>
|
|
145
146
|
</th>
|
|
147
|
+
<th>Subscription position</th>
|
|
146
148
|
<th>Stream revision</th>
|
|
147
149
|
<th>Context</th>
|
|
148
150
|
<th>Stream name</th>
|
|
@@ -154,7 +156,7 @@
|
|
|
154
156
|
</tr>
|
|
155
157
|
</thead>
|
|
156
158
|
<tbody>
|
|
157
|
-
<%= erb :'home/partials/events', { layout: false }, { events: @collection.collection } %>
|
|
159
|
+
<%= erb :'home/partials/events', { layout: false }, { events: @collection.collection, gp_to_sp_map: @gp_to_sp_map } %>
|
|
158
160
|
</tbody>
|
|
159
161
|
</table>
|
|
160
162
|
</div>
|
|
@@ -1,12 +1,25 @@
|
|
|
1
|
+
<% type = event_type.is_a?(Hash) ? event_type[:type] : event_type %>
|
|
2
|
+
<% markers = event_type.is_a?(Hash) ? event_type[:markers] : [] %>
|
|
1
3
|
<div class="form-row align-items-center">
|
|
2
|
-
<div class="col-
|
|
3
|
-
<select name="filter[events][]" class="form-control mb-2" data-placeholder="Event type" data-url="<%= url('/event_types_filtering') %>" autocomplete="off">
|
|
4
|
+
<div class="col-5">
|
|
5
|
+
<select name="filter[events][][type]" class="form-control mb-2 type-filter" data-placeholder="Event type" data-url="<%= url('/event_types_filtering') %>" autocomplete="off">
|
|
4
6
|
<option></option>
|
|
5
|
-
<% if
|
|
6
|
-
<% if
|
|
7
|
+
<% if type %>
|
|
8
|
+
<% if type == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
|
|
7
9
|
<option class="zero-byte-val" selected></option>
|
|
8
10
|
<% else %>
|
|
9
|
-
<option value="<%= h
|
|
11
|
+
<option value="<%= h type %>" selected><%= h type %></option>
|
|
12
|
+
<% end %>
|
|
13
|
+
<% end %>
|
|
14
|
+
</select>
|
|
15
|
+
</div>
|
|
16
|
+
<div class="col-5">
|
|
17
|
+
<select name="filter[events][][markers][]" class="form-control mb-2 event-markers-filter" data-placeholder="Event markers" data-url="<%= url('/markers_filtering') %>" autocomplete="off" multiple>
|
|
18
|
+
<% markers.each do |marker| %>
|
|
19
|
+
<% if marker == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
|
|
20
|
+
<option class="zero-byte-val" selected></option>
|
|
21
|
+
<% else %>
|
|
22
|
+
<option value="<%= h marker %>" selected><%= h marker %></option>
|
|
10
23
|
<% end %>
|
|
11
24
|
<% end %>
|
|
12
25
|
</select>
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
<% events.each do |event| %>
|
|
2
2
|
<tr>
|
|
3
3
|
<td><%= event.global_position %></td>
|
|
4
|
+
<td class="subscription-position">
|
|
5
|
+
<% if gp_to_sp_map[event.global_position] %>
|
|
6
|
+
<%= gp_to_sp_map[event.global_position] %>
|
|
7
|
+
<% else %>
|
|
8
|
+
<i>Not yet assigned</i>
|
|
9
|
+
<% end %>
|
|
10
|
+
</td>
|
|
4
11
|
<td><%= event.stream_revision %></td>
|
|
5
12
|
<td><%= empty_characters_fallback(h event.stream.context) %></td>
|
|
6
13
|
<td><%= empty_characters_fallback(h event.stream.stream_name) %></td>
|
|
7
14
|
<td>
|
|
8
|
-
<a href="<%= stream_path(event) %>"><%= empty_characters_fallback(h event.stream.stream_id) %></a>
|
|
15
|
+
<a href="<%= stream_path(event.stream) %>"><%= empty_characters_fallback(h event.stream.stream_id) %></a>
|
|
9
16
|
<a role="button" href="#" data-title="Copy stream definition." class="copy-to-clipboard"
|
|
10
17
|
data-clipboard-content="<%= h "PgEventstore::Stream.new(context: #{event.stream.context.inspect}, stream_name: #{event.stream.stream_name.inspect}, stream_id: #{event.stream.stream_id.inspect})" %>">
|
|
11
18
|
<i class="fa fa-clipboard"></i>
|
|
@@ -37,6 +44,36 @@
|
|
|
37
44
|
<pre><%= h JSON.pretty_generate(event.data) %></pre>
|
|
38
45
|
<strong>Metadata:</strong>
|
|
39
46
|
<pre><%= h JSON.pretty_generate(event.metadata) %></pre>
|
|
47
|
+
<strong>Markers:</strong>
|
|
48
|
+
<% if event.markers.any? || event.feature_markers.any? %>
|
|
49
|
+
<br>
|
|
50
|
+
<i>Total markers: <%= event.markers.size + event.feature_markers.size %>. List is scrollable</i>
|
|
51
|
+
<div style="max-height: 200px; overflow: scroll">
|
|
52
|
+
<% if event.feature_markers.any? %>
|
|
53
|
+
Feature markers
|
|
54
|
+
<ul>
|
|
55
|
+
<% event.feature_markers.each do |feature_marker| %>
|
|
56
|
+
<li>
|
|
57
|
+
<%= "#{h feature_marker.description}:" if feature_marker.description %>
|
|
58
|
+
<a href="<%= event_marker_path(feature_marker.marker) %>">
|
|
59
|
+
<%= empty_characters_fallback(h feature_marker.marker) %>
|
|
60
|
+
</a>
|
|
61
|
+
</li>
|
|
62
|
+
<% end %>
|
|
63
|
+
</ul>
|
|
64
|
+
<% end %>
|
|
65
|
+
<% if event.markers.any? %>
|
|
66
|
+
Event markers
|
|
67
|
+
<ul>
|
|
68
|
+
<% event.markers.each do |marker| %>
|
|
69
|
+
<li> <a href="<%= event_marker_path(marker) %>"><%= empty_characters_fallback(h marker) %></a> </li>
|
|
70
|
+
<% end %>
|
|
71
|
+
</ul>
|
|
72
|
+
<% end %>
|
|
73
|
+
</div>
|
|
74
|
+
<% else %>
|
|
75
|
+
<i>No markers assigned</i>
|
|
76
|
+
<% end %>
|
|
40
77
|
</td>
|
|
41
78
|
</tr>
|
|
42
79
|
<% end %>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<div class="form-row align-items-center">
|
|
2
|
+
<div class="col-11">
|
|
3
|
+
<select name="filter[markers][]" class="form-control mb-2 markers-filter" data-placeholder="Event markers" data-url="<%= url('/markers_filtering') %>" autocomplete="off" multiple>
|
|
4
|
+
<% markers.each do |marker| %>
|
|
5
|
+
<% if marker == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
|
|
6
|
+
<option class="zero-byte-val" selected></option>
|
|
7
|
+
<% else %>
|
|
8
|
+
<option value="<%= h marker %>" selected><%= h marker %></option>
|
|
9
|
+
<% end %>
|
|
10
|
+
<% end %>
|
|
11
|
+
</select>
|
|
12
|
+
</div>
|
|
13
|
+
<div class="col-1">
|
|
14
|
+
<a class="btn btn-default remove-filter" href="javascript: void(0);">
|
|
15
|
+
<i class="fa fa-minus-circle"></i>
|
|
16
|
+
</a>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
<div class="right_col" role="main">
|
|
2
|
+
<div class="">
|
|
3
|
+
<div class="page-title">
|
|
4
|
+
<div class="title_left">
|
|
5
|
+
<h3>Streams list</h3>
|
|
6
|
+
</div>
|
|
7
|
+
</div>
|
|
8
|
+
|
|
9
|
+
<div class="clearfix"></div>
|
|
10
|
+
|
|
11
|
+
<div class="row">
|
|
12
|
+
<div class="col-md-12 col-sm-12">
|
|
13
|
+
<div class="x_panel">
|
|
14
|
+
<div class="x_title">
|
|
15
|
+
<div class="row">
|
|
16
|
+
<div class="col-md-3 col-sm-12">
|
|
17
|
+
<h2>
|
|
18
|
+
Streams
|
|
19
|
+
<small id="total-count"><%= total_count(@collection.total_count) %></small>
|
|
20
|
+
</h2>
|
|
21
|
+
<div class="clearfix"></div>
|
|
22
|
+
</div>
|
|
23
|
+
<div class="col-md-6 col-sm-12">
|
|
24
|
+
<form class="form-horizontal form-label-left float-md-right">
|
|
25
|
+
<div class="form-group float-md-right">
|
|
26
|
+
<label class="control-label text-nowrap float-left mr-2" for="per_page_select">Per page</label>
|
|
27
|
+
<select class="page-link text-dark float-left" name="per_page" id="per_page_select">
|
|
28
|
+
<% PgEventstore::Web::Paginator::StreamsCollection::PER_PAGE.keys.each do |per_page| %>
|
|
29
|
+
<option <%= 'selected="selected"' if params[:per_page] == per_page %> data-url="<%= per_page_url(per_page) %>">
|
|
30
|
+
<%= per_page %>
|
|
31
|
+
</option>
|
|
32
|
+
<% end %>
|
|
33
|
+
</select>
|
|
34
|
+
<button type="submit" class="d-none"></button>
|
|
35
|
+
</div>
|
|
36
|
+
</form>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="col-md-3 col-sm-12">
|
|
39
|
+
<nav aria-label="Page navigation">
|
|
40
|
+
<ul class="pagination justify-content-md-end" id="pagination">
|
|
41
|
+
<%= erb :'home/partials/pagination_links', { layout: false }, { collection: @collection } %>
|
|
42
|
+
</ul>
|
|
43
|
+
</nav>
|
|
44
|
+
<div class="clearfix"></div>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="clearfix"></div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="x_content table-responsive">
|
|
50
|
+
<table class="table table-hover" id="events-table">
|
|
51
|
+
<thead>
|
|
52
|
+
<tr>
|
|
53
|
+
<th>
|
|
54
|
+
Starting position
|
|
55
|
+
<% if params[:order] == 'asc' %>
|
|
56
|
+
<a href="<%= sort_url('desc') %>"><i class="fa fa-sort-desc"></i></a>
|
|
57
|
+
<% else %>
|
|
58
|
+
<a href="<%= sort_url('asc') %>"><i class="fa fa-sort-asc"></i></a>
|
|
59
|
+
<% end %>
|
|
60
|
+
</th>
|
|
61
|
+
<th>Context</th>
|
|
62
|
+
<th>Stream name</th>
|
|
63
|
+
<th>Stream ID</th>
|
|
64
|
+
<th>Stream revision</th>
|
|
65
|
+
</tr>
|
|
66
|
+
</thead>
|
|
67
|
+
<tbody>
|
|
68
|
+
<%= erb :'streams/partials/streams', { layout: false }, { streams: @collection.collection } %>
|
|
69
|
+
</tbody>
|
|
70
|
+
</table>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
<div class="clearfix"></div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<div class="modal fade" id="delete-event-modal" tabindex="-1" role="dialog" aria-labelledby="delete-event-modal" aria-hidden="true">
|
|
81
|
+
<div class="modal-dialog modal-dialog-centered" role="document">
|
|
82
|
+
<div class="modal-content">
|
|
83
|
+
<div class="modal-header">
|
|
84
|
+
<h5 class="modal-title">Delete Event</h5>
|
|
85
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
86
|
+
<span aria-hidden="true">×</span>
|
|
87
|
+
</button>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="modal-body font-weight-bold text-break">
|
|
90
|
+
<h5>
|
|
91
|
+
You are about to delete Event on global position <span class="global-position-text"></span>. This action is irreversible. Continue?
|
|
92
|
+
</h5>
|
|
93
|
+
|
|
94
|
+
<form id="delete-event-form" data-parsley-validate="" class="form-horizontal form-label-left" novalidate="" method="POST">
|
|
95
|
+
<input type="hidden" name="data[force]" value="false">
|
|
96
|
+
<div class="checkbox">
|
|
97
|
+
<label>
|
|
98
|
+
<input type="checkbox" id="force-delete" name="data[force]" autocomplete="off" value="true">
|
|
99
|
+
Ignore limitations(see <a class="text-info" href="https://github.com/yousty/pg_eventstore/blob/main/docs/maintenance.md#deleting-an-event-in-a-large-stream" target="_blank" rel="noreferrer,nofollow">docs</a>).
|
|
100
|
+
</label>
|
|
101
|
+
</div>
|
|
102
|
+
</form>
|
|
103
|
+
</div>
|
|
104
|
+
<div class="modal-footer">
|
|
105
|
+
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
|
106
|
+
<button type="submit" class="btn btn-danger" form="delete-event-form">Delete</button>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<% streams.each do |stream| %>
|
|
2
|
+
<tr>
|
|
3
|
+
<td><%= stream.starting_position %></td>
|
|
4
|
+
<td><%= empty_characters_fallback(h stream.context) %></td>
|
|
5
|
+
<td><%= empty_characters_fallback(h stream.stream_name) %></td>
|
|
6
|
+
<td>
|
|
7
|
+
<a href="<%= stream_path(stream) %>" target="_blank"><%= empty_characters_fallback(h stream.stream_id) %></a>
|
|
8
|
+
</td>
|
|
9
|
+
<td><%= stream.stream_revision %></td>
|
|
10
|
+
</tr>
|
|
11
|
+
<% end %>
|
|
@@ -139,7 +139,10 @@
|
|
|
139
139
|
<th>Pull interval</th>
|
|
140
140
|
<th>Last event arrived at</th>
|
|
141
141
|
<th>State</th>
|
|
142
|
-
<th>
|
|
142
|
+
<th>
|
|
143
|
+
Performance
|
|
144
|
+
<i class="fa fa-question-circle" data-toggle="tooltip" title="Subscription handler performance"></i>
|
|
145
|
+
</th>
|
|
143
146
|
<th>Restarts count</th>
|
|
144
147
|
<th>Max restarts number</th>
|
|
145
148
|
<th>Time between restarts</th>
|
data/lib/pg_eventstore/web.rb
CHANGED
|
@@ -5,10 +5,12 @@ require 'sinatra/base'
|
|
|
5
5
|
require_relative 'web/paginator/helpers'
|
|
6
6
|
require_relative 'web/paginator/base_collection'
|
|
7
7
|
require_relative 'web/paginator/events_collection'
|
|
8
|
+
require_relative 'web/paginator/streams_collection'
|
|
8
9
|
require_relative 'web/paginator/stream_contexts_collection'
|
|
9
10
|
require_relative 'web/paginator/stream_names_collection'
|
|
10
11
|
require_relative 'web/paginator/stream_ids_collection'
|
|
11
12
|
require_relative 'web/paginator/event_types_collection'
|
|
13
|
+
require_relative 'web/paginator/markers_collection'
|
|
12
14
|
require_relative 'web/subscriptions/set_collection'
|
|
13
15
|
require_relative 'web/subscriptions/subscriptions'
|
|
14
16
|
require_relative 'web/subscriptions/subscriptions_set'
|
data/lib/pg_eventstore.rb
CHANGED
|
@@ -1,17 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'securerandom'
|
|
3
4
|
require_relative 'pg_eventstore/version'
|
|
4
5
|
require_relative 'pg_eventstore/utils'
|
|
5
6
|
require_relative 'pg_eventstore/callbacks'
|
|
6
7
|
require_relative 'pg_eventstore/extensions/options_extension'
|
|
8
|
+
require_relative 'pg_eventstore/extensions/options_defaults'
|
|
7
9
|
require_relative 'pg_eventstore/extensions/callbacks_extension'
|
|
8
10
|
require_relative 'pg_eventstore/extensions/callback_handlers_extension'
|
|
9
11
|
require_relative 'pg_eventstore/extensions/using_connection_extension'
|
|
10
12
|
require_relative 'pg_eventstore/event_class_resolver'
|
|
13
|
+
require_relative 'pg_eventstore/basic_config'
|
|
11
14
|
require_relative 'pg_eventstore/config'
|
|
12
15
|
require_relative 'pg_eventstore/partition'
|
|
13
16
|
require_relative 'pg_eventstore/event'
|
|
17
|
+
require_relative 'pg_eventstore/raw_event'
|
|
14
18
|
require_relative 'pg_eventstore/stream'
|
|
19
|
+
require_relative 'pg_eventstore/event_global_index'
|
|
20
|
+
require_relative 'pg_eventstore/stream_global_index'
|
|
21
|
+
require_relative 'pg_eventstore/event_marker_index'
|
|
22
|
+
require_relative 'pg_eventstore/event_marker'
|
|
23
|
+
require_relative 'pg_eventstore/feature_marker'
|
|
15
24
|
require_relative 'pg_eventstore/commands'
|
|
16
25
|
require_relative 'pg_eventstore/queries'
|
|
17
26
|
require_relative 'pg_eventstore/client'
|
|
@@ -19,68 +28,24 @@ require_relative 'pg_eventstore/maintenance'
|
|
|
19
28
|
require_relative 'pg_eventstore/connection'
|
|
20
29
|
require_relative 'pg_eventstore/errors'
|
|
21
30
|
require_relative 'pg_eventstore/middleware'
|
|
31
|
+
require_relative 'pg_eventstore/middleware/event_tracing'
|
|
32
|
+
require_relative 'pg_eventstore/synchronized_array'
|
|
33
|
+
require_relative 'pg_eventstore/chunks'
|
|
22
34
|
require_relative 'pg_eventstore/subscriptions/subscriptions_manager'
|
|
35
|
+
require_relative 'pg_eventstore/extensions/acts_as_configurable'
|
|
36
|
+
require_relative 'pg_eventstore/async_runner'
|
|
37
|
+
require_relative 'pg_eventstore/query_strategy'
|
|
38
|
+
require_relative 'pg_eventstore_ext'
|
|
23
39
|
|
|
24
40
|
module PgEventstore
|
|
25
|
-
|
|
26
|
-
DEFAULT_CONFIG = :default
|
|
41
|
+
extend Extensions::ActsAsConfigurable
|
|
27
42
|
|
|
28
|
-
|
|
29
|
-
# @!attribute mutex
|
|
30
|
-
# @return [Thread::Mutex]
|
|
31
|
-
attr_reader :mutex
|
|
32
|
-
private :mutex
|
|
43
|
+
acts_as_configurable(config_class: Config)
|
|
33
44
|
|
|
45
|
+
class << self
|
|
34
46
|
# @return [Logger, nil]
|
|
35
47
|
attr_accessor :logger
|
|
36
48
|
|
|
37
|
-
# Creates a Config if not exists and yields it to the given block.
|
|
38
|
-
# @param name [Symbol] a name to assign to a config
|
|
39
|
-
# @return [Object] a result of the given block
|
|
40
|
-
def configure(name: DEFAULT_CONFIG)
|
|
41
|
-
mutex.synchronize do
|
|
42
|
-
@config[name] = @config[name] ? Config.new(name: name, **@config[name].options_hash) : Config.new(name: name)
|
|
43
|
-
connection_config_was = @config[name].connection_options
|
|
44
|
-
|
|
45
|
-
yield(@config[name]).tap do
|
|
46
|
-
@config[name].freeze
|
|
47
|
-
next if connection_config_was == @config[name].connection_options
|
|
48
|
-
|
|
49
|
-
# Reset the connection if user decided to reconfigure connection's options
|
|
50
|
-
@connection.delete(name)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
# @return [Array<Symbol>]
|
|
56
|
-
def available_configs
|
|
57
|
-
@config.keys
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# @param name [Symbol]
|
|
61
|
-
# @return [PgEventstore::Config]
|
|
62
|
-
def config(name = DEFAULT_CONFIG)
|
|
63
|
-
return @config[name] if @config[name]
|
|
64
|
-
|
|
65
|
-
error_message = <<~TEXT
|
|
66
|
-
Could not find #{name.inspect} config. You can define it like this:
|
|
67
|
-
PgEventstore.configure(name: #{name.inspect}) do |config|
|
|
68
|
-
# your config goes here
|
|
69
|
-
end
|
|
70
|
-
TEXT
|
|
71
|
-
raise error_message
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Look ups and returns a Connection, based on the given config. If not exists - it creates one. This operation is a
|
|
75
|
-
# thread-safe
|
|
76
|
-
# @param name [Symbol]
|
|
77
|
-
# @return [PgEventstore::Connection]
|
|
78
|
-
def connection(name = DEFAULT_CONFIG)
|
|
79
|
-
mutex.synchronize do
|
|
80
|
-
@connection[name] ||= Connection.new(**config(name).connection_options)
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
|
|
84
49
|
# @param config_name [Symbol]
|
|
85
50
|
# @param subscription_set [String]
|
|
86
51
|
# @param max_retries [Integer, nil] max number of retries of failed SubscriptionsSet
|
|
@@ -92,9 +57,9 @@ module PgEventstore
|
|
|
92
57
|
SubscriptionsManager.new(
|
|
93
58
|
config: config(config_name),
|
|
94
59
|
set_name: subscription_set,
|
|
95
|
-
max_retries
|
|
96
|
-
retries_interval
|
|
97
|
-
force_lock:
|
|
60
|
+
max_retries:,
|
|
61
|
+
retries_interval:,
|
|
62
|
+
force_lock:
|
|
98
63
|
)
|
|
99
64
|
end
|
|
100
65
|
|
|
@@ -112,12 +77,10 @@ module PgEventstore
|
|
|
112
77
|
|
|
113
78
|
private
|
|
114
79
|
|
|
115
|
-
# @
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
@mutex = Thread::Mutex.new
|
|
80
|
+
# @param config [Config]
|
|
81
|
+
# @return [Hash]
|
|
82
|
+
def connection_options(config)
|
|
83
|
+
{ uri: config.pg_uri, pool_size: config.connection_pool_size, pool_timeout: config.connection_pool_timeout }
|
|
120
84
|
end
|
|
121
85
|
end
|
|
122
|
-
init_variables
|
|
123
86
|
end
|
data/pg_eventstore.gemspec
CHANGED
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.description = 'EventStore implementation using PostgreSQL'
|
|
13
13
|
spec.homepage = 'https://github.com/yousty/pg_eventstore'
|
|
14
14
|
spec.license = 'MIT'
|
|
15
|
-
spec.required_ruby_version = '>= 3.
|
|
15
|
+
spec.required_ruby_version = '>= 3.3'
|
|
16
16
|
|
|
17
17
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
18
18
|
|
|
@@ -27,15 +27,17 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
bin/ test/ spec/ features/ .git .circleci appveyor Gemfile .ruby-version .ruby-gemset .rspec docker-compose.yml
|
|
28
28
|
Rakefile benchmark/ .yardopts db/structure.sql config.ru docs/images/
|
|
29
29
|
]
|
|
30
|
-
`git ls-files -z`.split("\x0")
|
|
30
|
+
files = `git ls-files -z`.split("\x0") + Dir['ext/**/*.{c,rb}']
|
|
31
|
+
files.uniq.reject do |f|
|
|
31
32
|
(File.expand_path(f) == __FILE__) || f.start_with?(*paths_to_exclude) || File.extname(f) == '.map'
|
|
32
33
|
end
|
|
33
34
|
end
|
|
34
35
|
spec.bindir = 'exe'
|
|
35
36
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
37
|
+
spec.extensions = ['ext/pg_eventstore_ext/extconf.rb']
|
|
36
38
|
spec.require_paths = ['lib']
|
|
37
39
|
|
|
38
|
-
spec.add_dependency 'connection_pool', '
|
|
39
|
-
spec.add_dependency 'pg', '~> 1
|
|
40
|
+
spec.add_dependency 'connection_pool', '>= 2.5.4', '< 4'
|
|
41
|
+
spec.add_dependency 'pg', '~> 1'
|
|
40
42
|
spec.add_dependency 'sinatra', '>= 3', '< 5'
|
|
41
43
|
end
|
data/sig/pg/result.rbs
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module PgEventstore
|
|
2
|
+
module Chunks
|
|
3
|
+
class ReadApiEventsIndexChunk
|
|
4
|
+
include Chunk[EventGlobalIndex::ReadApiRepr, Hash[String, untyped]]
|
|
5
|
+
|
|
6
|
+
MAX_PARTITIONS_TO_RESOLVE_PER_CALL: Integer
|
|
7
|
+
|
|
8
|
+
@connection: Connection
|
|
9
|
+
@raw_events: Array[Hash[String, untyped]]
|
|
10
|
+
@idx_direction: Symbol
|
|
11
|
+
@indexes: Array[EventGlobalIndex::ReadApiRepr]
|
|
12
|
+
@query_strategy: QueryStrategy
|
|
13
|
+
@resolve_link_tos: bool
|
|
14
|
+
@resolved: bool
|
|
15
|
+
|
|
16
|
+
def initialize: (Array[EventGlobalIndex::ReadApiRepr] indexes, Connection connection,
|
|
17
|
+
QueryStrategy query_strategy, bool resolve_link_tos) -> void
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def detect_direction: (EventGlobalIndex::ReadApiRepr? idx1, EventGlobalIndex::ReadApiRepr? idx2) -> Symbol
|
|
22
|
+
|
|
23
|
+
def events_global_index_queries: -> EventsGlobalIndexQueries
|
|
24
|
+
|
|
25
|
+
def resolve_indexes: -> void
|
|
26
|
+
|
|
27
|
+
def resolved?: -> bool
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
module PgEventstore
|
|
2
|
+
module Chunks
|
|
3
|
+
class ReplicaEventsIndexChunk
|
|
4
|
+
include Chunk[EventGlobalIndex::SubscriptionRepr, EventGlobalIndex::SubscriptionRepr]
|
|
5
|
+
|
|
6
|
+
@indexes: Array[EventGlobalIndex::SubscriptionRepr]
|
|
7
|
+
|
|
8
|
+
def initialize: (Array[EventGlobalIndex::SubscriptionRepr] indexes) -> void
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module PgEventstore
|
|
2
|
+
module Chunks
|
|
3
|
+
class Repository
|
|
4
|
+
include MonitorMixin
|
|
5
|
+
|
|
6
|
+
@chunks: SynchronizedArray[Chunk[untyped, untyped]]
|
|
7
|
+
|
|
8
|
+
def add_chunk: (Chunk[untyped, untyped] chunk, ?condition: MonitorMixin::ConditionVariable?) -> void
|
|
9
|
+
|
|
10
|
+
def clear: -> void
|
|
11
|
+
|
|
12
|
+
def consume_all: -> untyped
|
|
13
|
+
|
|
14
|
+
def empty?: -> bool
|
|
15
|
+
|
|
16
|
+
def size: -> Integer
|
|
17
|
+
|
|
18
|
+
def wait_and_consume: (entities_num: Integer?, timeout: Float | Integer,
|
|
19
|
+
condition: MonitorMixin::ConditionVariable) -> Array[untyped]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module PgEventstore
|
|
2
|
+
module Chunks
|
|
3
|
+
class SubscriptionCheckpointChunk
|
|
4
|
+
class Checkpoint
|
|
5
|
+
include Extensions::OptionsExtension
|
|
6
|
+
include Extensions::OptionsDefaults
|
|
7
|
+
|
|
8
|
+
attr_reader subscription_position: Integer
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
include Chunk[Checkpoint, Checkpoint]
|
|
12
|
+
|
|
13
|
+
@checkpoint_event: Checkpoint?
|
|
14
|
+
|
|
15
|
+
def initialize: (Integer position) -> void
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|