pg_eventstore 2.0.0 → 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 +10 -1
- data/CHANGELOG.md +186 -20
- data/README.md +25 -15
- data/db/migrations/10_setup_pg_cron.rb +1 -23
- 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/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 +17 -8
- 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/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/client.rb +163 -50
- 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 +9 -7
- data/lib/pg_eventstore/commands/event_modifiers/prepare_regular_event.rb +12 -7
- data/lib/pg_eventstore/commands/link_to.rb +5 -5
- 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 +21 -2
- data/lib/pg_eventstore/errors.rb +136 -10
- data/lib/pg_eventstore/event.rb +34 -2
- 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 +2 -2
- 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 +7 -93
- 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 +4 -4
- data/lib/pg_eventstore/queries/maintenance_queries.rb +159 -42
- data/lib/pg_eventstore/queries/partition_queries.rb +45 -103
- 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 +52 -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 +13 -16
- data/lib/pg_eventstore/stream_global_index.rb +28 -0
- 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 +12 -0
- data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rb +21 -7
- data/lib/pg_eventstore/subscriptions/events_processor.rb +20 -18
- 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_queries.rb +78 -54
- 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 +2 -1
- 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 +24 -0
- data/lib/pg_eventstore/subscriptions/subscription_handler_performance.rb +4 -2
- data/lib/pg_eventstore/subscriptions/subscription_runner.rb +20 -9
- data/lib/pg_eventstore/subscriptions/subscription_runner_commands/reset_position.rb +1 -1
- data/lib/pg_eventstore/subscriptions/subscription_runners_feeder.rb +9 -18
- data/lib/pg_eventstore/subscriptions/subscriptions_lifecycle.rb +0 -12
- data/lib/pg_eventstore/subscriptions/subscriptions_manager.rb +74 -14
- data/lib/pg_eventstore/{subscriptions/synchronized_array.rb → synchronized_array.rb} +15 -0
- data/lib/pg_eventstore/tasks/setup.rake +2 -2
- data/lib/pg_eventstore/utils.rb +31 -0
- data/lib/pg_eventstore/version.rb +1 -1
- data/lib/pg_eventstore/web/application.rb +100 -16
- 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 +16 -9
- 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/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 +23 -60
- 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 +40 -42
- 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/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 +16 -2
- 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/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 +4 -36
- 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 +5 -9
- 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 +2 -0
- 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 +17 -6
- 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 +7 -39
- 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 -2
- data/sig/pg_eventstore/subscriptions/subscription_runners_feeder.rbs +1 -8
- 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 +10 -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 +175 -20
- data/Dockerfile +0 -3
- 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/subscription_service_queries.rb +0 -78
- 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/subscription_service_queries.rbs +0 -19
- data/sig/pg_eventstore/subscriptions/synchronized_array.rbs +0 -4
- /data/sig/interfaces/{_raw_event_handler.rbs → raw_event_handler.rbs} +0 -0
|
@@ -98,15 +98,9 @@ $(function(){
|
|
|
98
98
|
$streamIdSelect.on('change.select2', removeDeleteBtn);
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
let initSystemStreamFilterAutocomplete = function($filter){
|
|
102
|
-
let $streamNameSelect = $filter.find('select');
|
|
103
|
-
$streamNameSelect.select2({
|
|
104
|
-
allowClear: true
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
|
|
108
101
|
let initEventTypeFilterAutocomplete = function($filter) {
|
|
109
|
-
let $eventTypeSelect = $filter.find('select');
|
|
102
|
+
let $eventTypeSelect = $filter.find('select.type-filter');
|
|
103
|
+
let $eventMarkersSelect = $filter.find('select.event-markers-filter');
|
|
110
104
|
$eventTypeSelect.select2({
|
|
111
105
|
ajax: {
|
|
112
106
|
url: $eventTypeSelect.data('url'),
|
|
@@ -123,6 +117,42 @@ $(function(){
|
|
|
123
117
|
templateSelection: templateSelection,
|
|
124
118
|
templateResult: templateResult,
|
|
125
119
|
});
|
|
120
|
+
$eventMarkersSelect.select2({
|
|
121
|
+
ajax: {
|
|
122
|
+
url: $eventMarkersSelect.data('url'),
|
|
123
|
+
processResults: function(data, params){
|
|
124
|
+
params.starting_id = data.pagination.starting_id;
|
|
125
|
+
data.results.forEach(function(contextAttrs){
|
|
126
|
+
contextAttrs.id = contextAttrs.name;
|
|
127
|
+
contextAttrs.text = contextAttrs.name;
|
|
128
|
+
});
|
|
129
|
+
return data;
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
allowClear: true,
|
|
133
|
+
templateSelection: templateSelection,
|
|
134
|
+
templateResult: templateResult,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let initMarkersFilterAutocomplete = function($filter) {
|
|
139
|
+
let $markersSelect = $filter.find('select.markers-filter');
|
|
140
|
+
$markersSelect.select2({
|
|
141
|
+
ajax: {
|
|
142
|
+
url: $markersSelect.data('url'),
|
|
143
|
+
processResults: function(data, params){
|
|
144
|
+
params.starting_id = data.pagination.starting_id;
|
|
145
|
+
data.results.forEach(function(contextAttrs){
|
|
146
|
+
contextAttrs.id = contextAttrs.name;
|
|
147
|
+
contextAttrs.text = contextAttrs.name;
|
|
148
|
+
});
|
|
149
|
+
return data;
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
allowClear: true,
|
|
153
|
+
templateSelection: templateSelection,
|
|
154
|
+
templateResult: templateResult,
|
|
155
|
+
});
|
|
126
156
|
}
|
|
127
157
|
|
|
128
158
|
// Per page drop down
|
|
@@ -133,10 +163,10 @@ $(function(){
|
|
|
133
163
|
let $filtersForm = $('#filters-form');
|
|
134
164
|
// Stream filter template
|
|
135
165
|
let streamFilterTmpl = $('#stream-filter-tmpl').text();
|
|
136
|
-
// System stream filter template
|
|
137
|
-
let systemStreamFilterTmpl = $('#system-stream-filter-tmpl').text();
|
|
138
166
|
// Event type filter template
|
|
139
167
|
let eventFilterTmpl = $('#event-type-filter-tmpl').text();
|
|
168
|
+
// Markers filter template
|
|
169
|
+
let markersFilterTmpl = $('#markers-filter-tmpl').text();
|
|
140
170
|
|
|
141
171
|
// Remove filter button
|
|
142
172
|
$filtersForm.on('click', '.remove-filter', function(){
|
|
@@ -148,19 +178,16 @@ $(function(){
|
|
|
148
178
|
$filtersForm.find('.stream-filters').append(streamFilterTmpl.replace(/%NUM%/g, filtersNum));
|
|
149
179
|
initStreamFilterAutocomplete($filtersForm.find('.stream-filters').children().last());
|
|
150
180
|
});
|
|
151
|
-
// "Add system stream filter" button
|
|
152
|
-
$filtersForm.on('click', '.add-system-stream-filter', function(){
|
|
153
|
-
if($filtersForm.find('.system-stream-filter').children().length > 0)
|
|
154
|
-
return;
|
|
155
|
-
|
|
156
|
-
$filtersForm.find('.system-stream-filter').append(systemStreamFilterTmpl);
|
|
157
|
-
initSystemStreamFilterAutocomplete($filtersForm.find('.system-stream-filter').children().last());
|
|
158
|
-
});
|
|
159
181
|
// "Add event type filter" button
|
|
160
182
|
$filtersForm.on('click', '.add-event-filter', function(){
|
|
161
183
|
$filtersForm.find('.event-filters').append(eventFilterTmpl);
|
|
162
184
|
initEventTypeFilterAutocomplete($filtersForm.find('.event-filters').children().last());
|
|
163
185
|
});
|
|
186
|
+
// "Add markers filter" button
|
|
187
|
+
$filtersForm.on('click', '.add-markers-filter', function(){
|
|
188
|
+
$filtersForm.find('.markers-filter').append(markersFilterTmpl);
|
|
189
|
+
initMarkersFilterAutocomplete($filtersForm.find('div.markers-filter').children().last());
|
|
190
|
+
});
|
|
164
191
|
|
|
165
192
|
// Because zero-byte character can't be rendered into HTML properly - loop through each option, marked as containing
|
|
166
193
|
// zero-byte value and assign zero-byte value explicitly. This must be done before we initialize select2 plugin.
|
|
@@ -171,14 +198,14 @@ $(function(){
|
|
|
171
198
|
$filtersForm.find('.stream-filters').children().each(function(){
|
|
172
199
|
initStreamFilterAutocomplete($(this));
|
|
173
200
|
});
|
|
174
|
-
// Init select2 for system stream filter which were initially rendered
|
|
175
|
-
$filtersForm.find('.system-stream-filter').children().each(function(){
|
|
176
|
-
initSystemStreamFilterAutocomplete($(this));
|
|
177
|
-
});
|
|
178
201
|
// Init select2 for event type filters which were initially rendered
|
|
179
202
|
$filtersForm.find('.event-filters').children().each(function(){
|
|
180
203
|
initEventTypeFilterAutocomplete($(this));
|
|
181
204
|
});
|
|
205
|
+
// Init select2 for markers filter which was initially rendered
|
|
206
|
+
$filtersForm.find('.markers-filter').children().each(function(){
|
|
207
|
+
initMarkersFilterAutocomplete($(this));
|
|
208
|
+
});
|
|
182
209
|
|
|
183
210
|
// Automatically refresh events list every two seconds
|
|
184
211
|
let autoRefreshInterval;
|
|
@@ -23,7 +23,7 @@ module PgEventstore
|
|
|
23
23
|
|
|
24
24
|
# @return [PgEventstore::SubscriptionQueries]
|
|
25
25
|
def subscription_queries
|
|
26
|
-
SubscriptionQueries.new(connection)
|
|
26
|
+
SubscriptionQueries.new(connection, QueryStrategy::Foreground.new(connection))
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
# @return [PgEventstore::SubscriptionsSetQueries]
|
|
@@ -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:, **@config[name].options_hash) : Config.new(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
|
|
@@ -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
|