evt-event_source-postgres 0.13.0.0 → 0.13.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bcc6eb15d8ed107da6ccd448e0be92c6f93d1cc7
4
- data.tar.gz: bf794d6b3d1ffe7c8f514fec02d38e7cca63645d
3
+ metadata.gz: b0573e3a185792d80a07c24903296f5368d886d3
4
+ data.tar.gz: 05f950765f78cc0b868449bed5a2cb358e68a0cc
5
5
  SHA512:
6
- metadata.gz: 22637fcf20e69a19a7b933adec20b0ffc6626abd1319507bbf68f70ba125553beed71ce1f295798e8f0aa1ef22eaff42ac4dd53173a6a54375be08880421c069
7
- data.tar.gz: 215c302408bab981a768fec5a3baf8511e3fbec22346dfbf7bcab5be31b7acd0672c322d7651d17bff1357a269d03b57c7c091b247014cced6b71282719b8242
6
+ metadata.gz: 35a37eff132a03a01c6403fbf027b3a2aee6cb722c32056448f19cb42d96d90f27c90200c68de485587d29a93c24f1fc5ff6185c9a4387d9177fbed6106e6fff
7
+ data.tar.gz: b0fbcf5896e1d7ae8ad974224edeb2c556b39ea82b307d5cfacc199ab1b69b54d3c313a2fa43c49a1999b15a39e689cdd3f0fc2abdc16ae7c4ef221492f706d5
@@ -17,4 +17,6 @@ require 'event_source/postgres/write'
17
17
 
18
18
  require 'event_source/postgres/get/select_statement'
19
19
  require 'event_source/postgres/get'
20
+ require 'event_source/postgres/get/last/select_statement'
21
+ require 'event_source/postgres/get/last'
20
22
  require 'event_source/postgres/read'
@@ -0,0 +1,111 @@
1
+ module EventSource
2
+ module Postgres
3
+ class Get
4
+ class Last
5
+ include EventSource::Get
6
+
7
+ dependency :session, Session
8
+
9
+ def self.build(session: nil)
10
+ new.tap do |instance|
11
+ instance.configure(session: session)
12
+ end
13
+ end
14
+
15
+ def self.configure(receiver, attr_name: nil, session: nil)
16
+ attr_name ||= :get
17
+ instance = build(session: session)
18
+ receiver.public_send "#{attr_name}=", instance
19
+ end
20
+
21
+ def configure(session: nil)
22
+ Session.configure self, session: session
23
+ end
24
+
25
+ def self.call(stream_name, session: nil)
26
+ instance = build(session: session)
27
+ instance.(stream_name)
28
+ end
29
+
30
+ def call(stream_name)
31
+ logger.trace { "Getting last event data (Stream Name: #{stream_name})" }
32
+
33
+ record = get_record(stream_name)
34
+
35
+ return nil if record.nil?
36
+
37
+ event = convert(record)
38
+
39
+ logger.info { "Finished getting event data (Stream Name: #{stream_name})" }
40
+ logger.info(tags: [:data, :event_data]) { event.pretty_inspect }
41
+
42
+ event
43
+ end
44
+
45
+ def get_record(stream_name)
46
+ logger.trace { "Getting last record (Stream: #{stream_name})" }
47
+
48
+ select_statement = SelectStatement.build(stream_name)
49
+
50
+ records = session.execute(select_statement.sql)
51
+
52
+ logger.debug { "Finished getting record (Stream: #{stream_name})" }
53
+
54
+ return nil if records.ntuples == 0
55
+
56
+ records[0]
57
+ end
58
+
59
+ def convert(record)
60
+ logger.trace { "Converting record to event data" }
61
+
62
+ record['data'] = Deserialize.data(record['data'])
63
+ record['metadata'] = Deserialize.metadata(record['metadata'])
64
+ record['time'] = Time.utc_coerced(record['time'])
65
+
66
+ event = EventData::Read.build(record)
67
+
68
+ logger.debug { "Converted record to event data" }
69
+
70
+ event
71
+ end
72
+
73
+ def __convert(records)
74
+ logger.trace { "Converting records to event data (Records Count: #{records.ntuples})" }
75
+
76
+ events = records.map do |record|
77
+ record['data'] = Deserialize.data(record['data'])
78
+ record['metadata'] = Deserialize.metadata(record['metadata'])
79
+ record['time'] = Time.utc_coerced(record['time'])
80
+
81
+ EventData::Read.build record
82
+
83
+ break
84
+ end
85
+
86
+ logger.debug { "Converted records to event data (Event Data Count: #{events.length})" }
87
+
88
+ events
89
+ end
90
+
91
+ module Deserialize
92
+ def self.data(serialized_data)
93
+ return nil if serialized_data.nil?
94
+ Transform::Read.(serialized_data, EventData::Hash, :json)
95
+ end
96
+
97
+ def self.metadata(serialized_metadata)
98
+ return nil if serialized_metadata.nil?
99
+ Transform::Read.(serialized_metadata, EventData::Hash, :json)
100
+ end
101
+ end
102
+
103
+ module Time
104
+ def self.utc_coerced(local_time)
105
+ Clock::UTC.coerce(local_time)
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,52 @@
1
+ module EventSource
2
+ module Postgres
3
+ class Get
4
+ class Last
5
+ class SelectStatement
6
+ include Log::Dependency
7
+
8
+ initializer :stream
9
+
10
+ def stream_name
11
+ stream.name
12
+ end
13
+
14
+ def self.build(stream_name)
15
+ stream = Stream.new(stream_name)
16
+ new(stream)
17
+ end
18
+
19
+ def sql
20
+ logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name})" }
21
+
22
+ statement = <<-SQL
23
+ SELECT
24
+ id::varchar,
25
+ stream_name::varchar,
26
+ position::int,
27
+ type::varchar,
28
+ global_position::bigint,
29
+ data::varchar,
30
+ metadata::varchar,
31
+ time::timestamp
32
+ FROM
33
+ events
34
+ WHERE
35
+ stream_name = '#{stream_name}'
36
+ ORDER BY
37
+ position DESC
38
+ LIMIT
39
+ 1
40
+ ;
41
+ SQL
42
+
43
+ logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name})" }
44
+ logger.debug(tags: [:data, :sql]) { "Statement: #{statement}" }
45
+
46
+ statement
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -28,7 +28,7 @@ module EventSource
28
28
  end
29
29
 
30
30
  def sql
31
- logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type}, Position: #{position}, Batch Size: #{batch_size})" }
31
+ logger.trace(tag: :sql) { "Composing select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type.inspect}, Position: #{position}, Batch Size: #{batch_size})" }
32
32
 
33
33
  statement = <<-SQL
34
34
  SELECT
@@ -52,7 +52,7 @@ module EventSource
52
52
  ;
53
53
  SQL
54
54
 
55
- logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type}, Position: #{position}, Batch Size: #{batch_size})" }
55
+ logger.debug(tag: :sql) { "Composed select statement (Stream: #{stream_name}, Category: #{stream.category?}, Type: #{stream_type.inspect}, Position: #{position}, Batch Size: #{batch_size})" }
56
56
  logger.debug(tags: [:data, :sql]) { "Statement: #{statement}" }
57
57
 
58
58
  statement
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: evt-event_source-postgres
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0.0
4
+ version: 0.13.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - The Eventide Project
@@ -109,6 +109,8 @@ files:
109
109
  - lib/event_source/postgres/controls/stream.rb
110
110
  - lib/event_source/postgres/controls/stream_name.rb
111
111
  - lib/event_source/postgres/get.rb
112
+ - lib/event_source/postgres/get/last.rb
113
+ - lib/event_source/postgres/get/last/select_statement.rb
112
114
  - lib/event_source/postgres/get/select_statement.rb
113
115
  - lib/event_source/postgres/log.rb
114
116
  - lib/event_source/postgres/put.rb