Module: EventStoreRuby::Postgres::InsertBuilder

Defined in:
lib/eventstore_ruby/postgres/insert.rb

Class Method Summary collapse

Class Method Details

.build_cte_insert_query(filter, expected_max_seq) ⇒ Object

Returns [sql, params]



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/eventstore_ruby/postgres/insert.rb', line 7

def build_cte_insert_query(filter, expected_max_seq)
  version_sql, version_params = QueryBuilder.build_context_version_query(filter)
  context_param_count = version_params.length
  event_types_param = context_param_count + 1
  payloads_param = context_param_count + 2

  sql = <<~SQL
    WITH context AS (
      SELECT MAX(sequence_number) AS max_seq
      FROM events
      WHERE #{version_sql}
    )
    INSERT INTO events (event_type, payload)
    SELECT unnest($#{event_types_param}::text[]), unnest($#{payloads_param}::jsonb[])
    FROM context
    WHERE COALESCE(max_seq, 0) = #{expected_max_seq}
    RETURNING *
  SQL

  [sql, version_params]
end