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:
|
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
|