marty 1.0.17 → 1.0.18

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: ddef9c94cc142b0d56475fd47ce2d8a91bdc988e
4
- data.tar.gz: 46e3879a1402abf89018c5ac88323109d83ce905
3
+ metadata.gz: ace581b64a26ea52006a992b316d6fcbc116182a
4
+ data.tar.gz: 3b011c6884664a254934baed99a2ef959381fb79
5
5
  SHA512:
6
- metadata.gz: 7cf2b4a830eb713c974a60909d6e777eacbcbcb773f6bfa217ae00d0a87d1df17ab982c8f725be17d4e5932f723c2afa11a83a58dbc1c048b77380a1b5acfbe8
7
- data.tar.gz: 15ac135cf790bd8eb3bd8cb5f8bdda2c2930be1b62c9d880eb9e770bdc1ed0d835f6dcbf0f67cdd3ef78bea0c422e3cd50bc5a1bf58786c872b0265061d15ac4
6
+ metadata.gz: 717f673b5b71f9d4b0e1c5605cdf84e6ecb4c1e06cf508f495ea642f55c96f5edef84f13cbb79cb490cb5329856cbc0b36a344e83f993eba1ffac741a3d13a70
7
+ data.tar.gz: 1d49e5c28c8783ed3bbae741d9701b74f3ef75389f8c6c1dd0ccc59f343cfab061f3b649834fd90587273853356fd3f4c67052704e63bbdeb98193afa413bc41
@@ -88,6 +88,7 @@ SQL
88
88
  end
89
89
 
90
90
  def self.lookup_event(klass, subject_id, operation)
91
+ update_start_and_end
91
92
  get_data("#{BASE_QUERY}
92
93
  WHERE klass = '#{klass}'
93
94
  AND subject_id = #{subject_id}
@@ -133,12 +134,72 @@ SQL
133
134
  ORDER BY end_dt desc").first
134
135
  end
135
136
 
137
+ def self.last_event_multi(klass, subject_ids_arg, operation=nil)
138
+ subject_ids = subject_ids_arg.map(&:to_i)
139
+ events = all_running.select do |pm|
140
+ pm["klass"] == klass && subject_ids.include?(pm["subject_id"]) &&
141
+ (operation.nil? || pm["enum_event_operation"] == operation)
142
+ end.group_by { |ev| ev["subject_id"] }.each_with_object({}) do
143
+ |(id, evs), h|
144
+ h[id] = evs.sort { |a, b| a["start_dt"] <=> b["start_dt"] }.first
145
+ end
146
+
147
+ running_ids = events.keys
148
+ check_fin = subject_ids - running_ids
149
+
150
+ if check_fin.present?
151
+ op_filt = "AND enum_event_operation = '#{operation}'" if operation
152
+ op_col = ", enum_event_operation" if operation
153
+
154
+ fins = get_data("SELECT klass,
155
+ subject_id,
156
+ enum_event_operation,
157
+ comment,
158
+ start_dt,
159
+ end_dt,
160
+ expire_secs,
161
+ error
162
+ FROM (SELECT klass,
163
+ subject_id,
164
+ enum_event_operation,
165
+ comment,
166
+ start_dt,
167
+ end_dt,
168
+ expire_secs,
169
+ error,
170
+ ROW_NUMBER() OVER (PARTITION BY klass,
171
+ subject_id
172
+ #{op_col}
173
+ ORDER BY end_dt DESC) rnum
174
+ FROM marty_events
175
+ WHERE klass = '#{klass}'
176
+ AND subject_id IN (#{check_fin.join(',')})
177
+ #{op_filt}
178
+ AND end_dt IS NOT NULL) sub
179
+ WHERE rnum = 1")
180
+
181
+ fins.each do |fin|
182
+ events[fin["subject_id"]] = fin
183
+ end
184
+ end
185
+ events
186
+ end
187
+
136
188
  def self.currently_running(klass, subject_id)
137
189
  all_running.select do |pm|
138
190
  pm["klass"] == klass && pm["subject_id"] == subject_id.to_i
139
191
  end.map { |e| e["enum_event_operation"] }
140
192
  end
141
193
 
194
+ def self.currently_running_multi(klass, subject_id_raw)
195
+ subject_ids = [subject_id_raw].flatten.map(&:to_i)
196
+ all_running.select do |pm|
197
+ pm["klass"] == klass && subject_ids.include?(pm["subject_id"])
198
+ end.each_with_object({}) do |e, h|
199
+ (h[e["subject_id"]] ||= []) << e["enum_event_operation"]
200
+ end
201
+ end
202
+
142
203
  def self.update_comment(hash, comment)
143
204
  hid = hash.is_a?(Hash) ? hash['id'] : hash
144
205
  e = Marty::Event.find_by_id(hid)
@@ -158,7 +219,7 @@ SQL
158
219
  end
159
220
 
160
221
  def self.update_start_and_end
161
- ActiveRecord::Base.connection.execute(UPDATE_SQL)
222
+ ActiveRecord::Base.connection.execute(UPDATE_SQL).cmd_tuples
162
223
  end
163
224
 
164
225
  def self.get_data(sql)
@@ -185,8 +246,9 @@ SQL
185
246
  time_now = Time.zone.now
186
247
  time_now_i = time_now.to_i
187
248
  time_now_s = time_now.strftime('%Y-%m-%d %H:%M:%S.%6N')
188
- if time_now_i - @all_running[:timestamp] > @poll_secs
189
- update_start_and_end
249
+ upd_count = update_start_and_end
250
+ if upd_count > 0 ||
251
+ time_now_i - @all_running[:timestamp] > @poll_secs
190
252
  @all_running[:data] = get_data(running_query(time_now_s))
191
253
  @all_running[:timestamp] = time_now_i
192
254
  end
@@ -204,8 +266,9 @@ SQL
204
266
  cutoff = Time.zone.at(@all_finished[:timestamp]).
205
267
  strftime('%Y-%m-%d %H:%M:%S.%6N')
206
268
 
207
- if time_now_i - @all_finished[:timestamp] > @poll_secs
208
- update_start_and_end
269
+ upd_count = update_start_and_end
270
+ if upd_count > 0 ||
271
+ time_now_i - @all_finished[:timestamp] > @poll_secs
209
272
  raw = get_data(
210
273
  "SELECT * FROM
211
274
  (SELECT ROW_NUMBER() OVER (PARTITION BY klass,
@@ -58,13 +58,21 @@ class Delorean::BaseModule::NodeCall
58
58
  promise.job_id = job.id
59
59
  promise.save!
60
60
 
61
- event = Marty::Event.
62
- create!(promise_id: promise.id,
63
- klass: params["p_event"]["klass"],
64
- subject_id: params["p_event"]["id"],
65
- enum_event_operation:
66
- params["p_event"]["operation"]) if
67
- params["p_event"]
61
+ evh = params["p_event"]
62
+ if evh
63
+ event, klass, subject_id, operation = evh.values_at("event", "klass",
64
+ "id", "operation")
65
+ if event
66
+ event.promise_id = promise.id
67
+ event.save!
68
+ else
69
+ event = Marty::Event.
70
+ create!(promise_id: promise.id,
71
+ klass: klass,
72
+ subject_id: subject_id,
73
+ enum_event_operation: operation)
74
+ end
75
+ end
68
76
  Marty::PromiseProxy.new(promise.id, timeout, attr)
69
77
  end
70
78
  end
@@ -106,11 +114,10 @@ class Marty::PromiseJob < Struct.new(:promise,
106
114
 
107
115
  engine = Marty::ScriptSet.new(tag).get_engine(sname)
108
116
 
109
- engine.evaluate_attrs(node, attrs, params)
110
-
111
- res = attrs.each_with_object({}) { |attr, h|
112
- h[attr] = engine.evaluate(node, attr, params)
113
- }
117
+ attrs_eval = engine.evaluate_attrs(node, attrs, params)
118
+ res = attrs.zip(attrs_eval).each_with_object({}) do |(attr, val), h|
119
+ h[attr] = val
120
+ end
114
121
 
115
122
  # log "DONE #{Process.pid} #{promise.id} #{Time.now.to_f} #{res}"
116
123
  rescue => exc
data/lib/marty/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Marty
2
- VERSION = "1.0.17"
2
+ VERSION = "1.0.18"
3
3
  end
@@ -29,6 +29,8 @@ describe Marty::Event do
29
29
  nil],
30
30
  ['testcl1', 123, @time + 4.seconds, nil,10000, 'PRICING', 'c comment',
31
31
  nil],
32
+ ['testcl1', 234, @time - 5.seconds, @time, nil, 'PRICING', 'c comment',
33
+ false],
32
34
  ['testcl2', 123, @time, nil, 2, 'AVM', 'e comment', nil],
33
35
  ['testcl2', 123, @time + 1.second, nil, 4, 'CRA', 'f comment', nil],
34
36
  ['testcl2', 123, Time.zone.parse(@old_start),
@@ -36,27 +38,27 @@ describe Marty::Event do
36
38
  ].each do
37
39
  |klass, subjid, startdt, enddt, expire, op, comment, error|
38
40
  Marty::Event.create!(klass: klass,
39
- subject_id: subjid,
40
- start_dt: startdt,
41
- end_dt: enddt,
42
- expire_secs: expire,
43
- comment: comment,
44
- enum_event_operation: op,
45
- error: error)
41
+ subject_id: subjid,
42
+ start_dt: startdt,
43
+ end_dt: enddt,
44
+ expire_secs: expire,
45
+ comment: comment,
46
+ enum_event_operation: op,
47
+ error: error)
46
48
  end
47
49
 
48
50
 
49
51
  engine = Marty::ScriptSet.new.get_engine(NAME_I)
50
52
  res = engine.background_eval("SLEEPER", {"secs" => 5}, ["a"],
51
- {klass: "testcl3",
52
- id: 987,
53
- operation: 'PRICING'})
53
+ {klass: "testcl3",
54
+ id: 987,
55
+ operation: 'PRICING'})
54
56
  res.force
55
57
  engine = Marty::ScriptSet.new.get_engine(NAME_J)
56
58
  res = engine.background_eval("FAILER", {"dummy" => "dummy"}, ["a"],
57
- {klass: "testcl3",
58
- id: 654,
59
- operation: 'PRICING'})
59
+ {klass: "testcl3",
60
+ id: 654,
61
+ operation: 'PRICING'})
60
62
  res.force rescue nil
61
63
  sleep 5
62
64
  save_clean_db(@save_file)
@@ -75,46 +77,46 @@ describe Marty::Event do
75
77
 
76
78
 
77
79
  it "reports currently running" do
78
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
79
- ['AVM', 'CRA', 'PRICING'])
80
+ expect(Marty::Event.currently_running('testcl1', 123)).
81
+ to eq(['AVM', 'CRA', 'PRICING'])
80
82
  expect(Marty::Event.currently_running('testcl2', 123)).to eq([])
81
83
  expect(Marty::Event.currently_running('testcl3', 987)).to eq([])
82
- expect(Marty::Event.last_event('testcl1', 123)).to include(
83
- {"klass"=>"testcl1",
84
- "subject_id"=>123,
85
- "enum_event_operation"=>"PRICING",
86
- "comment"=>"c comment", "expire_secs"=>10000})
87
- expect(Marty::Event.last_event('testcl2', 123)).to include(
88
- {"klass"=>"testcl2",
89
- "subject_id"=>123,
90
- "enum_event_operation"=>"PRICING",
91
- "comment"=>"old event"})
92
- expect(Marty::Event.last_event('testcl3', 987)).to include(
93
- {"klass"=>"testcl3",
94
- "subject_id"=>987,
95
- "enum_event_operation"=>"PRICING",
96
- "comment"=>nil,
97
- "expire_secs"=>nil})
84
+ expect(Marty::Event.last_event('testcl1', 123)).
85
+ to include(
86
+ {"klass"=>"testcl1",
87
+ "subject_id"=>123,
88
+ "enum_event_operation"=>"PRICING",
89
+ "comment"=>"c comment", "expire_secs"=>10000})
90
+ expect(Marty::Event.last_event('testcl2', 123)).
91
+ to include(
92
+ {"klass"=>"testcl2",
93
+ "subject_id"=>123,
94
+ "enum_event_operation"=>"PRICING",
95
+ "comment"=>"old event"})
96
+ expect(Marty::Event.last_event('testcl3', 987)).
97
+ to include(
98
+ {"klass"=>"testcl3",
99
+ "subject_id"=>987,
100
+ "enum_event_operation"=>"PRICING",
101
+ "comment"=>nil,
102
+ "expire_secs"=>nil})
98
103
 
99
104
  Timecop.freeze(@time+1.second)
100
105
  Marty::Event.clear_cache
101
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
102
- ['AVM', 'CRA', 'PRICING'])
103
- expect(Marty::Event.currently_running('testcl2', 123)).to eq(
104
- ['AVM', 'CRA'])
106
+ expect(Marty::Event.currently_running('testcl1', 123)).
107
+ to eq(['AVM', 'CRA', 'PRICING'])
108
+ expect(Marty::Event.currently_running('testcl2', 123)).to eq(['AVM', 'CRA'])
105
109
 
106
110
  Timecop.freeze(@time+3.seconds)
107
111
  Marty::Event.clear_cache
108
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
109
- ['AVM', 'CRA', 'PRICING'])
110
- expect(Marty::Event.currently_running('testcl2', 123)).to eq(
111
- ['CRA'])
112
+ expect(Marty::Event.currently_running('testcl1', 123)).
113
+ to eq(['AVM', 'CRA', 'PRICING'])
114
+ expect(Marty::Event.currently_running('testcl2', 123)).to eq(['CRA'])
112
115
 
113
116
  Timecop.freeze(@time+6.seconds)
114
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
115
- ['AVM', 'CRA', 'PRICING'])
116
- expect(Marty::Event.currently_running('testcl2', 123)).to eq(
117
- [])
117
+ expect(Marty::Event.currently_running('testcl1', 123)).
118
+ to eq(['AVM', 'CRA', 'PRICING'])
119
+ expect(Marty::Event.currently_running('testcl2', 123)).to eq([])
118
120
  Timecop.return
119
121
 
120
122
  end
@@ -142,7 +144,7 @@ describe Marty::Event do
142
144
  expect(ev4.end_dt).not_to be_nil
143
145
  expect(ev4.error).to be_truthy
144
146
 
145
- expect(af.count).to eq(3)
147
+ expect(af.count).to eq(4)
146
148
  expect(af).to include(['testcl3', 987])
147
149
  expect(af).to include(['testcl2', 123])
148
150
  expect(af[['testcl3', 987]]).to include('PRICING')
@@ -150,13 +152,16 @@ describe Marty::Event do
150
152
  expect(af[['testcl2', 123]]).to include('PRICING')
151
153
  expect(af[['testcl2', 123]]['PRICING']).to eq(@old_end)
152
154
 
153
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
154
- ['AVM', 'CRA', 'PRICING'])
155
+ expect(Marty::Event.currently_running('testcl1', 123)).
156
+ to eq(['AVM', 'CRA', 'PRICING'])
155
157
  expect(Marty::Event.op_is_running?('testcl1', 123, 'AVM')).to be_truthy
156
158
  Marty::Event.finish_event('testcl1', 123, 'AVM', false, 'wassup')
157
159
  Marty::Event.clear_cache
158
- expect(Marty::Event.currently_running('testcl1', 123)).to eq(
159
- ['CRA', 'PRICING'])
160
+ expect(Marty::Event.currently_running('testcl1', 123)).
161
+ to eq(['CRA', 'PRICING'])
162
+ expect(Marty::Event.currently_running_multi('testcl1', [123])).
163
+ to eq({123 => ['CRA', 'PRICING']})
164
+
160
165
  expect(Marty::Event.op_is_running?('testcl1', 123, 'AVM')).to be_falsey
161
166
  expect(Marty::Event.op_is_running?('testcl1', 123, 'CRA')).to be_truthy
162
167
 
@@ -175,9 +180,22 @@ describe Marty::Event do
175
180
  expect(Marty::Event.pretty_op(ev.first)).to eq('Avm')
176
181
  ev = Marty::Event.lookup_event('testcl1', 123, 'PRICING').first
177
182
  expect(Marty::Event.pretty_op(ev)).to eq('Pricing')
183
+ evs = Marty::Event.last_event_multi('testcl1', [123, 234])
184
+ expect(evs[123]).to include({"klass"=>"testcl1",
185
+ "subject_id"=>123,
186
+ "enum_event_operation"=>"CRA",
187
+ "comment"=>"b comment",
188
+ "expire_secs"=>nil,
189
+ "error"=>nil})
190
+ expect(evs[234]).to include({"klass"=>"testcl1",
191
+ "subject_id"=>234,
192
+ "enum_event_operation"=>"PRICING",
193
+ "comment"=>"c comment",
194
+ "expire_secs"=>nil,
195
+ "error"=>"f"})
178
196
 
179
197
  af = Marty::Event.all_finished
180
- expect(af.count).to eq(4)
198
+ expect(af.count).to eq(5)
181
199
  expect(af[['testcl3', 987]]).to include('PRICING')
182
200
  expect(af[['testcl1', 123]]).to include('AVM')
183
201
  expect(af[['testcl1', 123]]['AVM']).to start_with(@date_string)
@@ -191,7 +209,7 @@ describe Marty::Event do
191
209
  "the comment") }.
192
210
  to raise_error(%r!AVM is already running for testcl/1234!)
193
211
  expect {Marty::Event.create_event('testcl', 2345, 'AVM', Time.zone.now, 600,
194
- "the comment") }.not_to raise_error
212
+ "the comment") }.not_to raise_error
195
213
  expect {Marty::Event.finish_event('testcl', 1234, 'AVM', false,
196
214
  "new comment") }.
197
215
  not_to raise_error
@@ -209,7 +227,7 @@ describe Marty::Event do
209
227
  to raise_error(%r!PG::.*invalid input value for enum.*"AMV"!)
210
228
  Marty::Event.clear_cache
211
229
  af = Marty::Event.all_finished
212
- expect(af.count).to eq(5)
230
+ expect(af.count).to eq(6)
213
231
  expect(af).to include(['testcl', 1234])
214
232
  expect(af).to include(['testcl', 2345])
215
233
  expect(af[['testcl', 1234]]).to include('AVM')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marty
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.17
4
+ version: 1.0.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arman Bostani
@@ -14,7 +14,7 @@ authors:
14
14
  autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
- date: 2016-12-29 00:00:00.000000000 Z
17
+ date: 2017-01-10 00:00:00.000000000 Z
18
18
  dependencies:
19
19
  - !ruby/object:Gem::Dependency
20
20
  name: pg