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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0573e3a185792d80a07c24903296f5368d886d3
|
4
|
+
data.tar.gz: 05f950765f78cc0b868449bed5a2cb358e68a0cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|