evt-event_source-postgres 0.13.0.0 → 0.13.1.0

Sign up to get free protection for your applications and to get access to all the features.
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