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.
Files changed (303) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +10 -1
  3. data/CHANGELOG.md +186 -20
  4. data/README.md +25 -15
  5. data/db/migrations/10_setup_pg_cron.rb +1 -23
  6. data/db/migrations/15_create_streams_global_index.sql +17 -0
  7. data/db/migrations/16_populate_streams_global_index.rb +150 -0
  8. data/db/migrations/17_create_events_global_index.sql +62 -0
  9. data/db/migrations/18_populate_events_global_index.rb +124 -0
  10. data/db/migrations/19_populate_events_global_index_p2.rb +25 -0
  11. data/db/migrations/20_migrate_subscriptions_current_position.sql +19 -0
  12. data/db/migrations/21_create_partitions_stats.sql +2 -0
  13. data/db/migrations/22_drop_streams_sql_view.sql +2 -0
  14. data/db/migrations/23_adjust_partitions_indexes.sql +5 -0
  15. data/db/migrations/24_drop_legacy_events_indexes.sql +3 -0
  16. data/db/migrations/25_add_parent_partitions_info_to_partitions.sql +16 -0
  17. data/db/migrations/26_change_events_stream_revision_type.rb +35 -0
  18. data/db/migrations/27_drop_events_horizon.sql +3 -0
  19. data/db/migrations/28_create_maintenance_tasks.sql +8 -0
  20. data/db/migrations/29_create_event_markers.sql +35 -0
  21. data/db/migrations/30_improve_partitions_search_in_admin_ui.rb +24 -0
  22. data/db/migrations/31_drop_events_id_default_value.sql +1 -0
  23. data/db/migrations/32_create_parittions_triggers.sql +101 -0
  24. data/docs/AGENTS.fragment.md +696 -0
  25. data/docs/admin_ui.md +3 -1
  26. data/docs/appending_events.md +110 -49
  27. data/docs/configuration.md +69 -36
  28. data/docs/event_tracing.md +55 -0
  29. data/docs/events_and_streams.md +54 -30
  30. data/docs/how_it_works.md +57 -16
  31. data/docs/linking_events.md +2 -1
  32. data/docs/maintenance.md +14 -5
  33. data/docs/multiple_commands.md +17 -8
  34. data/docs/reading_events.md +208 -43
  35. data/docs/reading_streams.md +50 -0
  36. data/docs/replication.md +99 -0
  37. data/docs/subscriptions.md +165 -35
  38. data/docs/writing_middleware.md +25 -8
  39. data/ext/pg_eventstore_ext/extconf.rb +5 -0
  40. data/ext/pg_eventstore_ext/pg_eventstore_ext.c +74 -0
  41. data/lib/pg_eventstore/async_runner.rb +63 -0
  42. data/lib/pg_eventstore/basic_config.rb +15 -0
  43. data/lib/pg_eventstore/chunks/chunk.rb +31 -0
  44. data/lib/pg_eventstore/chunks/read_api_events_index_chunk.rb +83 -0
  45. data/lib/pg_eventstore/chunks/replica_events_index_chunk.rb +35 -0
  46. data/lib/pg_eventstore/chunks/repository.rb +73 -0
  47. data/lib/pg_eventstore/chunks/subscription_checkpoint_chunk.rb +48 -0
  48. data/lib/pg_eventstore/chunks/subscription_events_index_chunk.rb +99 -0
  49. data/lib/pg_eventstore/chunks.rb +14 -0
  50. data/lib/pg_eventstore/client.rb +163 -50
  51. data/lib/pg_eventstore/commands/append.rb +62 -43
  52. data/lib/pg_eventstore/commands/delete_event.rb +7 -8
  53. data/lib/pg_eventstore/commands/delete_stream.rb +3 -3
  54. data/lib/pg_eventstore/commands/event_modifiers/prepare_link_event.rb +9 -7
  55. data/lib/pg_eventstore/commands/event_modifiers/prepare_regular_event.rb +12 -7
  56. data/lib/pg_eventstore/commands/link_to.rb +5 -5
  57. data/lib/pg_eventstore/commands/read.rb +23 -5
  58. data/lib/pg_eventstore/commands/read_grouped.rb +46 -0
  59. data/lib/pg_eventstore/commands/read_streams.rb +18 -0
  60. data/lib/pg_eventstore/commands/read_streams_paginated.rb +56 -0
  61. data/lib/pg_eventstore/commands/regular_stream_read_paginated.rb +4 -4
  62. data/lib/pg_eventstore/commands/revision_check/current_revision.rb +51 -0
  63. data/lib/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rb +46 -0
  64. data/lib/pg_eventstore/commands/revision_check/expected_revision.rb +135 -0
  65. data/lib/pg_eventstore/commands/revision_check/stream_revision_check.rb +98 -0
  66. data/lib/pg_eventstore/commands/revision_check/stream_revision_comparison.rb +36 -0
  67. data/lib/pg_eventstore/commands/stream_revision.rb +14 -0
  68. data/lib/pg_eventstore/commands/system_stream_read_paginated.rb +4 -4
  69. data/lib/pg_eventstore/commands.rb +4 -2
  70. data/lib/pg_eventstore/config.rb +30 -9
  71. data/lib/pg_eventstore/connection.rb +21 -2
  72. data/lib/pg_eventstore/errors.rb +136 -10
  73. data/lib/pg_eventstore/event.rb +34 -2
  74. data/lib/pg_eventstore/event_deserializer.rb +5 -4
  75. data/lib/pg_eventstore/event_global_index.rb +118 -0
  76. data/lib/pg_eventstore/event_marker.rb +16 -0
  77. data/lib/pg_eventstore/event_marker_index.rb +25 -0
  78. data/lib/pg_eventstore/event_serializer.rb +6 -0
  79. data/lib/pg_eventstore/extensions/acts_as_configurable.rb +88 -0
  80. data/lib/pg_eventstore/extensions/options_defaults.rb +25 -0
  81. data/lib/pg_eventstore/extensions/options_extension.rb +2 -2
  82. data/lib/pg_eventstore/feature_marker.rb +18 -0
  83. data/lib/pg_eventstore/maintenance.rb +11 -6
  84. data/lib/pg_eventstore/middleware/event_tracing.rb +53 -0
  85. data/lib/pg_eventstore/partition.rb +6 -0
  86. data/lib/pg_eventstore/pg_connection.rb +70 -14
  87. data/lib/pg_eventstore/queries/event_marker_queries.rb +74 -0
  88. data/lib/pg_eventstore/queries/event_queries.rb +7 -93
  89. data/lib/pg_eventstore/queries/events_global_index_queries.rb +131 -0
  90. data/lib/pg_eventstore/queries/index_filtering_queries.rb +179 -0
  91. data/lib/pg_eventstore/queries/links_resolver.rb +4 -4
  92. data/lib/pg_eventstore/queries/maintenance_queries.rb +159 -42
  93. data/lib/pg_eventstore/queries/partition_queries.rb +45 -103
  94. data/lib/pg_eventstore/queries/replica_queries.rb +110 -0
  95. data/lib/pg_eventstore/queries/streams_global_index_queries.rb +163 -0
  96. data/lib/pg_eventstore/queries/transaction_queries.rb +52 -10
  97. data/lib/pg_eventstore/queries.rb +29 -1
  98. data/lib/pg_eventstore/query_builders/basic_filtering.rb +38 -5
  99. data/lib/pg_eventstore/query_builders/event_markers_filtering.rb +47 -0
  100. data/lib/pg_eventstore/query_builders/event_markers_index_filtering.rb +275 -0
  101. data/lib/pg_eventstore/query_builders/event_subscription_positions_filtering.rb +37 -0
  102. data/lib/pg_eventstore/query_builders/events_filtering.rb +15 -164
  103. data/lib/pg_eventstore/query_builders/events_global_index_filtering.rb +227 -0
  104. data/lib/pg_eventstore/query_builders/filters/collection.rb +324 -0
  105. data/lib/pg_eventstore/query_builders/filters/event_type_filter.rb +37 -0
  106. data/lib/pg_eventstore/query_builders/filters/filter_row.rb +54 -0
  107. data/lib/pg_eventstore/query_builders/filters/marker_filter.rb +20 -0
  108. data/lib/pg_eventstore/query_builders/filters/marker_filter_row.rb +49 -0
  109. data/lib/pg_eventstore/query_builders/filters/stream_filter.rb +48 -0
  110. data/lib/pg_eventstore/query_builders/index_based_events_filtering.rb +260 -0
  111. data/lib/pg_eventstore/query_builders/partitions_filtering.rb +175 -51
  112. data/lib/pg_eventstore/query_builders/read_cursor/stream_cursor.rb +122 -0
  113. data/lib/pg_eventstore/query_builders/streams_global_index_filtering.rb +83 -0
  114. data/lib/pg_eventstore/query_builders/subscription_events_filtering.rb +79 -0
  115. data/lib/pg_eventstore/query_strategy/async.rb +64 -0
  116. data/lib/pg_eventstore/query_strategy/foreground.rb +25 -0
  117. data/lib/pg_eventstore/query_strategy.rb +19 -0
  118. data/lib/pg_eventstore/raw_event.rb +46 -0
  119. data/lib/pg_eventstore/rspec/test_helpers.rb +21 -8
  120. data/lib/pg_eventstore/sql_builder.rb +87 -8
  121. data/lib/pg_eventstore/stream.rb +13 -16
  122. data/lib/pg_eventstore/stream_global_index.rb +28 -0
  123. data/lib/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rb +5 -17
  124. data/lib/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rb +36 -0
  125. data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rb +12 -0
  126. data/lib/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rb +21 -7
  127. data/lib/pg_eventstore/subscriptions/events_processor.rb +20 -18
  128. data/lib/pg_eventstore/subscriptions/events_processor_consumer/multiple.rb +63 -0
  129. data/lib/pg_eventstore/subscriptions/events_processor_consumer/replica.rb +68 -0
  130. data/lib/pg_eventstore/subscriptions/events_processor_consumer/single.rb +62 -0
  131. data/lib/pg_eventstore/subscriptions/events_processor_consumer.rb +44 -0
  132. data/lib/pg_eventstore/subscriptions/events_subscription_position_worker.rb +68 -0
  133. data/lib/pg_eventstore/subscriptions/queries/event_subscription_position_queries.rb +177 -0
  134. data/lib/pg_eventstore/subscriptions/queries/subscription_queries.rb +78 -54
  135. data/lib/pg_eventstore/subscriptions/replica_subscription_handler.rb +140 -0
  136. data/lib/pg_eventstore/subscriptions/replica_subscription_runner.rb +9 -0
  137. data/lib/pg_eventstore/subscriptions/subscription.rb +2 -1
  138. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/collection.rb +36 -0
  139. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/index_read_strategy.rb +82 -0
  140. data/lib/pg_eventstore/subscriptions/subscription_feed_strategies/replication_strategy.rb +75 -0
  141. data/lib/pg_eventstore/subscriptions/subscription_feed_strategy.rb +31 -0
  142. data/lib/pg_eventstore/subscriptions/subscription_feeder.rb +24 -0
  143. data/lib/pg_eventstore/subscriptions/subscription_handler_performance.rb +4 -2
  144. data/lib/pg_eventstore/subscriptions/subscription_runner.rb +20 -9
  145. data/lib/pg_eventstore/subscriptions/subscription_runner_commands/reset_position.rb +1 -1
  146. data/lib/pg_eventstore/subscriptions/subscription_runners_feeder.rb +9 -18
  147. data/lib/pg_eventstore/subscriptions/subscriptions_lifecycle.rb +0 -12
  148. data/lib/pg_eventstore/subscriptions/subscriptions_manager.rb +74 -14
  149. data/lib/pg_eventstore/{subscriptions/synchronized_array.rb → synchronized_array.rb} +15 -0
  150. data/lib/pg_eventstore/tasks/setup.rake +2 -2
  151. data/lib/pg_eventstore/utils.rb +31 -0
  152. data/lib/pg_eventstore/version.rb +1 -1
  153. data/lib/pg_eventstore/web/application.rb +100 -16
  154. data/lib/pg_eventstore/web/paginator/base_collection.rb +5 -1
  155. data/lib/pg_eventstore/web/paginator/event_types_collection.rb +14 -4
  156. data/lib/pg_eventstore/web/paginator/events_collection.rb +29 -33
  157. data/lib/pg_eventstore/web/paginator/helpers.rb +16 -9
  158. data/lib/pg_eventstore/web/paginator/markers_collection.rb +48 -0
  159. data/lib/pg_eventstore/web/paginator/stream_contexts_collection.rb +13 -2
  160. data/lib/pg_eventstore/web/paginator/stream_ids_collection.rb +21 -11
  161. data/lib/pg_eventstore/web/paginator/stream_names_collection.rb +18 -4
  162. data/lib/pg_eventstore/web/paginator/streams_collection.rb +95 -0
  163. data/lib/pg_eventstore/web/public/javascripts/pg_eventstore.js +49 -22
  164. data/lib/pg_eventstore/web/subscriptions/set_collection.rb +1 -1
  165. data/lib/pg_eventstore/web/subscriptions/subscriptions.rb +1 -1
  166. data/lib/pg_eventstore/web/subscriptions/with_state/set_collection.rb +1 -1
  167. data/lib/pg_eventstore/web/subscriptions/with_state/subscriptions.rb +1 -1
  168. data/lib/pg_eventstore/web/views/home/dashboard.erb +11 -9
  169. data/lib/pg_eventstore/web/views/home/partials/event_filter.erb +18 -5
  170. data/lib/pg_eventstore/web/views/home/partials/events.erb +38 -1
  171. data/lib/pg_eventstore/web/views/home/partials/markers_filter.erb +18 -0
  172. data/lib/pg_eventstore/web/views/layouts/application.erb +6 -0
  173. data/lib/pg_eventstore/web/views/streams/index.erb +110 -0
  174. data/lib/pg_eventstore/web/views/streams/partials/streams.erb +11 -0
  175. data/lib/pg_eventstore/web/views/subscriptions/index.erb +4 -1
  176. data/lib/pg_eventstore/web.rb +2 -0
  177. data/lib/pg_eventstore.rb +23 -60
  178. data/pg_eventstore.gemspec +6 -4
  179. data/sig/interfaces/_raw_events_handler.rbs +3 -0
  180. data/sig/interfaces/subscription_handler.rbs +1 -1
  181. data/sig/pg/result.rbs +9 -0
  182. data/sig/pg_eventstore/async_runner.rbs +13 -0
  183. data/sig/pg_eventstore/basic_config.rbs +9 -0
  184. data/sig/pg_eventstore/chunks/chunk.rbs +13 -0
  185. data/sig/pg_eventstore/chunks/read_api_events_index_chunk.rbs +30 -0
  186. data/sig/pg_eventstore/chunks/replica_events_index_chunk.rbs +11 -0
  187. data/sig/pg_eventstore/chunks/repository.rbs +22 -0
  188. data/sig/pg_eventstore/chunks/subscription_checkpoint_chunk.rbs +18 -0
  189. data/sig/pg_eventstore/chunks/subscription_events_index_chunk.rbs +37 -0
  190. data/sig/pg_eventstore/client.rbs +40 -42
  191. data/sig/pg_eventstore/commands/append.rbs +11 -25
  192. data/sig/pg_eventstore/commands/event_modifiers/prepare_link_event.rbs +9 -12
  193. data/sig/pg_eventstore/commands/event_modifiers/prepare_regular_event.rbs +5 -4
  194. data/sig/pg_eventstore/commands/link_to.rbs +6 -11
  195. data/sig/pg_eventstore/commands/read.rbs +2 -5
  196. data/sig/pg_eventstore/commands/read_grouped.rbs +7 -0
  197. data/sig/pg_eventstore/commands/read_streams.rbs +7 -0
  198. data/sig/pg_eventstore/commands/read_streams_paginated.rbs +16 -0
  199. data/sig/pg_eventstore/commands/regular_stream_read_paginated.rbs +9 -17
  200. data/sig/pg_eventstore/commands/revision_check/current_revision.rbs +25 -0
  201. data/sig/pg_eventstore/commands/revision_check/event_type_revisions_comparison.rbs +14 -0
  202. data/sig/pg_eventstore/commands/revision_check/expected_revision.rbs +67 -0
  203. data/sig/pg_eventstore/commands/revision_check/stream_revision_check.rbs +20 -0
  204. data/sig/pg_eventstore/commands/revision_check/stream_revision_comparison.rbs +9 -0
  205. data/sig/pg_eventstore/commands/stream_revision.rbs +7 -0
  206. data/sig/pg_eventstore/commands/system_stream_read_paginated.rbs +9 -14
  207. data/sig/pg_eventstore/config.rbs +15 -6
  208. data/sig/pg_eventstore/connection.rbs +11 -18
  209. data/sig/pg_eventstore/errors.rbs +64 -34
  210. data/sig/pg_eventstore/event.rbs +16 -2
  211. data/sig/pg_eventstore/event_deserializer.rbs +5 -10
  212. data/sig/pg_eventstore/event_global_index.rbs +60 -0
  213. data/sig/pg_eventstore/event_marker.rbs +9 -0
  214. data/sig/pg_eventstore/event_marker_index.rbs +12 -0
  215. data/sig/pg_eventstore/extensions/acts_as_configurable.rbs +29 -0
  216. data/sig/pg_eventstore/extensions/options_defaults.rbs +7 -0
  217. data/sig/pg_eventstore/feature_marker.rbs +10 -0
  218. data/sig/pg_eventstore/maintenance.rbs +12 -8
  219. data/sig/pg_eventstore/middleware/event_trace.rbs +14 -0
  220. data/sig/pg_eventstore/partition.rbs +2 -4
  221. data/sig/pg_eventstore/pg_connection.rbs +8 -0
  222. data/sig/pg_eventstore/queries/event_marker_queries.rbs +21 -0
  223. data/sig/pg_eventstore/queries/event_queries.rbs +4 -36
  224. data/sig/pg_eventstore/queries/events_global_index_queries.rbs +37 -0
  225. data/sig/pg_eventstore/queries/index_filtering_queries.rbs +50 -0
  226. data/sig/pg_eventstore/queries/links_resolver.rbs +5 -9
  227. data/sig/pg_eventstore/queries/maintenance_queries.rbs +12 -9
  228. data/sig/pg_eventstore/queries/partition_queries.rbs +32 -67
  229. data/sig/pg_eventstore/queries/replica_queries.rbs +31 -0
  230. data/sig/pg_eventstore/queries/streams_global_index_queries.rbs +39 -0
  231. data/sig/pg_eventstore/queries/transaction_queries.rbs +2 -0
  232. data/sig/pg_eventstore/queries.rbs +11 -21
  233. data/sig/pg_eventstore/query_builders/basic_filtering.rbs +10 -3
  234. data/sig/pg_eventstore/query_builders/event_markers_filtering.rbs +17 -0
  235. data/sig/pg_eventstore/query_builders/event_markers_index_filtering.rbs +69 -0
  236. data/sig/pg_eventstore/query_builders/event_subscription_positions_filtering.rbs +15 -0
  237. data/sig/pg_eventstore/query_builders/events_filtering_query.rbs +9 -51
  238. data/sig/pg_eventstore/query_builders/events_global_index_filtering.rbs +68 -0
  239. data/sig/pg_eventstore/query_builders/filters/collection.rbs +84 -0
  240. data/sig/pg_eventstore/query_builders/filters/event_type_filter.rbs +19 -0
  241. data/sig/pg_eventstore/query_builders/filters/filter_row.rbs +21 -0
  242. data/sig/pg_eventstore/query_builders/filters/marker_filter.rbs +13 -0
  243. data/sig/pg_eventstore/query_builders/filters/marker_filter_row.rbs +19 -0
  244. data/sig/pg_eventstore/query_builders/filters/stream_filter.rbs +24 -0
  245. data/sig/pg_eventstore/query_builders/index_based_events_filtering.rbs +60 -0
  246. data/sig/pg_eventstore/query_builders/partitions_filtering.rbs +29 -10
  247. data/sig/pg_eventstore/query_builders/read_cursor/stream_cursor.rbs +47 -0
  248. data/sig/pg_eventstore/query_builders/streams_global_index_filtering.rbs +27 -0
  249. data/sig/pg_eventstore/query_builders/subscription_events_filtering.rbs +26 -0
  250. data/sig/pg_eventstore/query_strategy/async.rbs +17 -0
  251. data/sig/pg_eventstore/query_strategy/foreground.rbs +11 -0
  252. data/sig/pg_eventstore/query_strategy.rbs +7 -0
  253. data/sig/pg_eventstore/raw_event.rbs +20 -0
  254. data/sig/pg_eventstore/sql_builder.rbs +32 -10
  255. data/sig/pg_eventstore/stream.rbs +10 -18
  256. data/sig/pg_eventstore/stream_global_index.rbs +14 -0
  257. data/sig/pg_eventstore/subscriptions/callback_handlers/events_processor_handlers.rbs +5 -4
  258. data/sig/pg_eventstore/subscriptions/callback_handlers/events_subscription_position_worker_handlers.rbs +9 -0
  259. data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_feeder_handlers.rbs +17 -12
  260. data/sig/pg_eventstore/subscriptions/callback_handlers/subscription_runner_handlers.rbs +17 -6
  261. data/sig/pg_eventstore/subscriptions/event_subscription_position_queries.rbs +30 -0
  262. data/sig/pg_eventstore/subscriptions/events_processor.rbs +12 -5
  263. data/sig/pg_eventstore/subscriptions/events_processor_consumer/multiple.rbs +17 -0
  264. data/sig/pg_eventstore/subscriptions/events_processor_consumer/replica.rbs +17 -0
  265. data/sig/pg_eventstore/subscriptions/events_processor_consumer/single.rbs +17 -0
  266. data/sig/pg_eventstore/subscriptions/events_processor_consumer.rbs +14 -0
  267. data/sig/pg_eventstore/subscriptions/events_subscription_position_worker.rbs +28 -0
  268. data/sig/pg_eventstore/subscriptions/queries/subscription_queries.rbs +7 -39
  269. data/sig/pg_eventstore/subscriptions/replica_subscription_handler.rbs +33 -0
  270. data/sig/pg_eventstore/subscriptions/replica_subscription_runner.rbs +4 -0
  271. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/collection.rbs +14 -0
  272. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/index_read_strategy.rbs +23 -0
  273. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy/replication_strategy.rbs +23 -0
  274. data/sig/pg_eventstore/subscriptions/subscription_feed_strategy.rbs +11 -0
  275. data/sig/pg_eventstore/subscriptions/subscription_feeder.rbs +13 -10
  276. data/sig/pg_eventstore/subscriptions/subscription_handler_performance.rbs +1 -1
  277. data/sig/pg_eventstore/subscriptions/subscription_runner.rbs +13 -2
  278. data/sig/pg_eventstore/subscriptions/subscription_runners_feeder.rbs +1 -8
  279. data/sig/pg_eventstore/subscriptions/subscriptions_lifecycle.rbs +4 -6
  280. data/sig/pg_eventstore/subscriptions/subscriptions_manager.rbs +29 -43
  281. data/sig/pg_eventstore/synchronized_array.rbs +4 -0
  282. data/sig/pg_eventstore/utils.rbs +10 -11
  283. data/sig/pg_eventstore/web/application.rbs +13 -3
  284. data/sig/pg_eventstore/web/paginator/base_collection.rbs +2 -0
  285. data/sig/pg_eventstore/web/paginator/event_types_collection.rbs +4 -0
  286. data/sig/pg_eventstore/web/paginator/events_collection.rbs +11 -11
  287. data/sig/pg_eventstore/web/paginator/helpers.rbs +6 -15
  288. data/sig/pg_eventstore/web/paginator/markers_collection.rbs +13 -0
  289. data/sig/pg_eventstore/web/paginator/stream_contexts_collection.rbs +4 -0
  290. data/sig/pg_eventstore/web/paginator/stream_names_collection.rbs +4 -0
  291. data/sig/pg_eventstore/web/paginator/streams_collection.rbs +30 -0
  292. data/sig/pg_eventstore.rbs +8 -26
  293. metadata +175 -20
  294. data/Dockerfile +0 -3
  295. data/lib/pg_eventstore/commands/all_stream_read_grouped.rb +0 -69
  296. data/lib/pg_eventstore/commands/regular_stream_read_grouped.rb +0 -31
  297. data/lib/pg_eventstore/subscriptions/queries/subscription_service_queries.rb +0 -78
  298. data/lib/pg_eventstore/web/views/home/partials/system_stream_filter.erb +0 -15
  299. data/sig/pg_eventstore/commands/all_stream_read_grouped.rbs +0 -16
  300. data/sig/pg_eventstore/commands/regular_stream_read_grouped.rbs +0 -8
  301. data/sig/pg_eventstore/subscriptions/queries/subscription_service_queries.rbs +0 -19
  302. data/sig/pg_eventstore/subscriptions/synchronized_array.rbs +0 -4
  303. /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]
@@ -27,7 +27,7 @@ module PgEventstore
27
27
 
28
28
  # @return [PgEventstore::SubscriptionQueries]
29
29
  def subscription_queries
30
- SubscriptionQueries.new(connection)
30
+ SubscriptionQueries.new(connection, QueryStrategy::Foreground.new(connection))
31
31
  end
32
32
  end
33
33
  end
@@ -26,7 +26,7 @@ module PgEventstore
26
26
 
27
27
  # @return [PgEventstore::SubscriptionQueries]
28
28
  def subscription_queries
29
- SubscriptionQueries.new(connection)
29
+ SubscriptionQueries.new(connection, QueryStrategy::Foreground.new(connection))
30
30
  end
31
31
  end
32
32
  end
@@ -30,7 +30,7 @@ module PgEventstore
30
30
 
31
31
  # @return [PgEventstore::SubscriptionQueries]
32
32
  def subscription_queries
33
- SubscriptionQueries.new(connection)
33
+ SubscriptionQueries.new(connection, QueryStrategy::Foreground.new(connection))
34
34
  end
35
35
  end
36
36
  end
@@ -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-11">
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 event_type %>
6
- <% if event_type == PgEventstore::Web::Application::EMPTY_STRING_SIGN %>
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 event_type %>" selected><%= h event_type %></option>
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>
@@ -59,6 +59,12 @@
59
59
  Events lookup
60
60
  </a>
61
61
  </li>
62
+ <li>
63
+ <a href="<%= url('/streams') %>">
64
+ <i class="fa fa-search-plus"></i>
65
+ Streams list
66
+ </a>
67
+ </li>
62
68
  <li>
63
69
  <a href="<%= url('/subscriptions') %>">
64
70
  <i class="fa fa-pencil-square-o"></i>
@@ -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">&times;</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>Performance</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>
@@ -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
- # @return [Symbol]
26
- DEFAULT_CONFIG = :default
41
+ extend Extensions::ActsAsConfigurable
27
42
 
28
- class << self
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
- # @return [void]
116
- def init_variables
117
- @config = { DEFAULT_CONFIG => Config.new(name: DEFAULT_CONFIG) }
118
- @connection = {}
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
@@ -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.2'
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").reject do |f|
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', '~> 2.4'
39
- spec.add_dependency 'pg', '~> 1.5'
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
@@ -0,0 +1,3 @@
1
+ interface _RawEventsHandler
2
+ def call: (Array[Hash[String, untyped]] events) -> void
3
+ end