norikra 0.0.1-java → 0.0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/norikra +2 -2
- data/lib/norikra/engine.rb +27 -7
- data/lib/norikra/query.rb +11 -10
- data/lib/norikra/typedef.rb +23 -1
- data/lib/norikra/typedef_manager.rb +14 -0
- data/lib/norikra/version.rb +1 -1
- data/norikra.gemspec +1 -1
- data/spec/fieldset_spec.rb +17 -1
- data/spec/query_spec.rb +2 -2
- data/spec/typedef_manager_spec.rb +18 -0
- data/spec/typedef_spec.rb +24 -0
- metadata +4 -6
data/bin/norikra
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'pathname'
|
4
|
-
|
5
|
-
$LOAD_PATH.unshift
|
4
|
+
libs = ['lib', 'esper'].map{|p| Pathname.new(__FILE__).dirname.join('..', p).expand_path}
|
5
|
+
$LOAD_PATH.unshift(*libs.map(&:to_s))
|
6
6
|
|
7
7
|
require 'norikra/cli'
|
8
8
|
Norikra::CLI.start
|
data/lib/norikra/engine.rb
CHANGED
@@ -51,8 +51,8 @@ module Norikra
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def register(query)
|
54
|
-
unless @targets.include?(query.
|
55
|
-
open(query.
|
54
|
+
unless @targets.include?(query.targets.first)
|
55
|
+
open(query.targets.first) # open as lazy defined target
|
56
56
|
end
|
57
57
|
register_query(query)
|
58
58
|
end
|
@@ -146,9 +146,10 @@ module Norikra
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def register_query(query)
|
149
|
-
|
149
|
+
#TODO: support JOINs
|
150
|
+
target = query.targets.first
|
150
151
|
@mutex.synchronize do
|
151
|
-
if @typedef_manager.lazy?(target) ||
|
152
|
+
if @typedef_manager.lazy?(target) || !@typedef_manager.fields_defined?(target, query.fields)
|
152
153
|
@waiting_queries[target] ||= []
|
153
154
|
@waiting_queries[target].push(query)
|
154
155
|
else
|
@@ -156,6 +157,14 @@ module Norikra
|
|
156
157
|
@typedef_manager.bind_fieldset(target, :query, query_fieldset)
|
157
158
|
register_fieldset_actually(target, query_fieldset, :query)
|
158
159
|
register_query_actually(target, query_fieldset.event_type_name, query)
|
160
|
+
|
161
|
+
# replace registered data fieldsets with new fieldset inherits this query fieldset
|
162
|
+
@typedef_manager.supersets(target, query_fieldset).each do |set|
|
163
|
+
rebound = set.rebind
|
164
|
+
register_fieldset_actually(target, rebound, :data, true) # replacing
|
165
|
+
@typedef_manager.replace_fieldset(target, set, rebound)
|
166
|
+
remove_fieldset_actually(target, set, :data)
|
167
|
+
end
|
159
168
|
end
|
160
169
|
@queries.push(query)
|
161
170
|
end
|
@@ -201,8 +210,8 @@ module Norikra
|
|
201
210
|
end
|
202
211
|
|
203
212
|
# this method should be protected with @mutex lock
|
204
|
-
def register_fieldset_actually(target, fieldset, level)
|
205
|
-
return if @registered_fieldsets[target][level][fieldset.summary]
|
213
|
+
def register_fieldset_actually(target, fieldset, level, replace=false)
|
214
|
+
return if level == :data && @registered_fieldsets[target][level][fieldset.summary] && !replace
|
206
215
|
|
207
216
|
# Map Supertype (target) and Subtype (typedef name, like TARGET_TypeDefName)
|
208
217
|
# http://esper.codehaus.org/esper-4.9.0/doc/reference/en-US/html/event_representation.html#eventrep-map-supertype
|
@@ -223,9 +232,20 @@ module Norikra
|
|
223
232
|
@config.addEventType(fieldset.event_type_name, fieldset.definition, subset_names.to_java(:string))
|
224
233
|
#TODO: debug log
|
225
234
|
#p "addEventType target:#{target}, level:data, eventType:#{fieldset.event_type_name}, inherit:#{subset_names.join(',')}"
|
235
|
+
|
236
|
+
@registered_fieldsets[target][level][fieldset.summary] = fieldset
|
226
237
|
end
|
227
|
-
@registered_fieldsets[target][level][fieldset.summary] = fieldset
|
228
238
|
nil
|
229
239
|
end
|
240
|
+
|
241
|
+
# this method should be protected with @mutex lock as same as register
|
242
|
+
def remove_fieldset_actually(target, fieldset, level)
|
243
|
+
return if level == :base || level == :query
|
244
|
+
|
245
|
+
# DON'T check @registered_fieldsets[target][level][fieldset.summary]
|
246
|
+
# removed fieldset should be already replaced with register_fieldset_actually w/ replace flag
|
247
|
+
#TODO: debug log
|
248
|
+
@config.removeEventType(fieldset.event_type_name, true)
|
249
|
+
end
|
230
250
|
end
|
231
251
|
end
|
data/lib/norikra/query.rb
CHANGED
@@ -12,7 +12,7 @@ module Norikra
|
|
12
12
|
@name = param[:name]
|
13
13
|
@expression = param[:expression]
|
14
14
|
@ast = nil
|
15
|
-
@
|
15
|
+
@targets = nil
|
16
16
|
@fields = nil
|
17
17
|
end
|
18
18
|
|
@@ -21,29 +21,30 @@ module Norikra
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def dup_with_stream_name(actual_name)
|
24
|
-
|
24
|
+
first_target = self.targets.first
|
25
25
|
query = self.dup
|
26
|
-
query.expression = self.expression.gsub(/(\s[Ff][Rr][Oo][Mm]\s+)#{
|
27
|
-
if query.
|
26
|
+
query.expression = self.expression.gsub(/(\s[Ff][Rr][Oo][Mm]\s+)#{first_target}(\.|\s)/, '\1' + actual_name + '\2')
|
27
|
+
if query.targets.first != actual_name
|
28
28
|
raise RuntimeError, 'failed to replace query target into stream name:' + self.expression
|
29
29
|
end
|
30
30
|
query
|
31
31
|
end
|
32
32
|
|
33
33
|
def to_hash
|
34
|
-
{'name' => @name, 'expression' => @expression, '
|
34
|
+
{'name' => @name, 'expression' => @expression, 'targets' => self.targets}
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
38
|
-
return @
|
39
|
-
#TODO:
|
40
|
-
@
|
41
|
-
@
|
37
|
+
def targets
|
38
|
+
return @targets if @targets
|
39
|
+
#TODO: test with JOINs.
|
40
|
+
@targets = self.ast.find('STREAM_EXPR').find('EVENT_FILTER_EXPR').children.map(&:name)
|
41
|
+
@targets
|
42
42
|
end
|
43
43
|
|
44
44
|
def fields
|
45
45
|
return @fields if @fields
|
46
46
|
#TODO: this code doesn't care JOINs.
|
47
|
+
### fields -> {'target_name' => fields} ?
|
47
48
|
|
48
49
|
# Norikra::Query.new(
|
49
50
|
# :name => 'hoge',
|
data/lib/norikra/typedef.rb
CHANGED
@@ -144,10 +144,14 @@ module Norikra
|
|
144
144
|
when :query then 'q_'
|
145
145
|
else 'e_'
|
146
146
|
end
|
147
|
-
@event_type_name = prefix + Digest::MD5.hexdigest(target
|
147
|
+
@event_type_name = prefix + Digest::MD5.hexdigest([target, level.to_s, self.object_id.to_s, @summary].join("\t"))
|
148
148
|
self
|
149
149
|
end
|
150
150
|
|
151
|
+
def rebind
|
152
|
+
self.dup.bind(@target, @level)
|
153
|
+
end
|
154
|
+
|
151
155
|
def self.simple_guess(data, optional=true)
|
152
156
|
mapping = Hash[
|
153
157
|
data.map{|key,value|
|
@@ -279,6 +283,24 @@ module Norikra
|
|
279
283
|
true
|
280
284
|
end
|
281
285
|
|
286
|
+
def replace(level, old_fieldset, fieldset)
|
287
|
+
unless self.consistent?(fieldset)
|
288
|
+
raise ArgumentError, "inconsistent field set for this typedef"
|
289
|
+
end
|
290
|
+
if level != :data
|
291
|
+
raise ArgumentError, "invalid argument, fieldset replace should be called for :data"
|
292
|
+
end
|
293
|
+
if old_fieldset.field_names_key != fieldset.field_names_key
|
294
|
+
raise ArgumentError, "try to replace different field name sets"
|
295
|
+
end
|
296
|
+
@mutex.synchronize do
|
297
|
+
@datafieldsets.push(fieldset)
|
298
|
+
@set_map[fieldset.field_names_key] = fieldset
|
299
|
+
@datafieldsets.delete(old_fieldset)
|
300
|
+
end
|
301
|
+
true
|
302
|
+
end
|
303
|
+
|
282
304
|
def refer(data)
|
283
305
|
field_names_key = data.keys.sort.join(',')
|
284
306
|
return @set_map[field_names_key] if @set_map.has_key?(field_names_key)
|
@@ -45,6 +45,10 @@ module Norikra
|
|
45
45
|
@typedefs[target].push(level, fieldset)
|
46
46
|
end
|
47
47
|
|
48
|
+
def replace_fieldset(target, old_fieldset, new_fieldset)
|
49
|
+
@typedefs[target].replace(:data, old_fieldset, new_fieldset)
|
50
|
+
end
|
51
|
+
|
48
52
|
def generate_base_fieldset(target, event)
|
49
53
|
guessed = Norikra::FieldSet.simple_guess(event, false) # all fields are non-optional
|
50
54
|
guessed.update(@typedefs[target].fields, false)
|
@@ -80,6 +84,16 @@ module Norikra
|
|
80
84
|
sets
|
81
85
|
end
|
82
86
|
|
87
|
+
def supersets(target, fieldset) # for query fieldset
|
88
|
+
sets = []
|
89
|
+
@mutex.synchronize do
|
90
|
+
@typedefs[target].datafieldsets.each do |set|
|
91
|
+
sets.push(set) if fieldset.subset?(set)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
sets
|
95
|
+
end
|
96
|
+
|
83
97
|
def refer(target, event)
|
84
98
|
@typedefs[target].refer(event)
|
85
99
|
end
|
data/lib/norikra/version.rb
CHANGED
data/norikra.gemspec
CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_runtime_dependency "rack"
|
24
24
|
spec.add_runtime_dependency "msgpack-rpc-over-http-jruby", ">= 0.0.5.jruby1"
|
25
25
|
spec.add_runtime_dependency "thor"
|
26
|
-
spec.add_runtime_dependency "norikra-client-jruby"
|
26
|
+
spec.add_runtime_dependency "norikra-client-jruby", ">= 0.0.3"
|
27
27
|
|
28
28
|
spec.add_development_dependency "bundler", "~> 1.3"
|
29
29
|
spec.add_development_dependency "rake"
|
data/spec/fieldset_spec.rb
CHANGED
@@ -155,7 +155,23 @@ describe Norikra::FieldSet do
|
|
155
155
|
expect(x.bind('TargetExample', :query)).to eql(x)
|
156
156
|
|
157
157
|
expect(x.instance_eval{ @event_type_name }).not_to be_nil
|
158
|
-
expect(x.instance_eval{ @event_type_name }).to
|
158
|
+
expect(x.instance_eval{ @event_type_name }).to match(/q_[0-9a-f]{32}/) # MD5 hexdump
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe '#rebind' do
|
163
|
+
it 'returns duplicated object, but these event_type_name are same' do
|
164
|
+
x = set.dup
|
165
|
+
x.bind('TargetExample', :data)
|
166
|
+
|
167
|
+
y = x.rebind
|
168
|
+
expect(y.summary).to eql(x.summary)
|
169
|
+
expect(y.fields.values.map(&:to_hash)).to eql(x.fields.values.map(&:to_hash))
|
170
|
+
expect(y.target).to eql(x.target)
|
171
|
+
expect(y.level).to eql(x.level)
|
172
|
+
expect(y.field_names_key).to eql(x.field_names_key)
|
173
|
+
|
174
|
+
expect(y.event_type_name).not_to eql(x.event_type_name)
|
159
175
|
end
|
160
176
|
end
|
161
177
|
|
data/spec/query_spec.rb
CHANGED
@@ -12,7 +12,7 @@ describe Norikra::Query do
|
|
12
12
|
) }
|
13
13
|
its(:name){ should == 'TestTable query1' }
|
14
14
|
its(:expression){ should == expression }
|
15
|
-
its(:
|
15
|
+
its(:targets){ should == ['TestTable'] }
|
16
16
|
its(:fields){ should == ['param', 'path', 'size'] }
|
17
17
|
end
|
18
18
|
context 'with query including Static lib call'
|
@@ -22,7 +22,7 @@ describe Norikra::Query do
|
|
22
22
|
) }
|
23
23
|
its(:name){ should == 'TestTable query1' }
|
24
24
|
its(:expression){ should == expression }
|
25
|
-
its(:
|
25
|
+
its(:targets){ should == ['TestTable'] }
|
26
26
|
its(:fields){ should == ['path', 'size'] }
|
27
27
|
end
|
28
28
|
describe '#dup_with_stream_name' do
|
@@ -117,6 +117,24 @@ describe Norikra::TypedefManager do
|
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
|
+
describe '#supersets' do
|
121
|
+
it 'returns list of data fieldset, superset of specified fieldset, owned by manager for specified target' do
|
122
|
+
base = {'a'=>'string','b'=>'string','c'=>'double'}
|
123
|
+
set_x = Norikra::FieldSet.new(base.merge({'one'=>'int','two'=>'string','three'=>'double'}))
|
124
|
+
manager.bind_fieldset('sample', :data, set_x)
|
125
|
+
set_y = Norikra::FieldSet.new(base.merge({'one'=>'int','two'=>'string'}))
|
126
|
+
manager.bind_fieldset('sample', :data, set_y)
|
127
|
+
set_z = Norikra::FieldSet.new(base.merge({'one'=>'int','two'=>'string','three'=>'double','four'=>'boolean'}))
|
128
|
+
manager.bind_fieldset('sample', :data, set_z)
|
129
|
+
|
130
|
+
list = manager.supersets('sample', Norikra::FieldSet.new({'one'=>'int','three'=>'double'}))
|
131
|
+
expect(list.size).to eql(2) # set_x, set_z
|
132
|
+
expect(list.include?(set_x)).to be_true
|
133
|
+
expect(list.include?(set_y)).to be_false
|
134
|
+
expect(list.include?(set_z)).to be_true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
120
138
|
describe '#generate_query_fieldset' do
|
121
139
|
it 'returns fieldset instance with all required(non-optional) fields of target, and fields of query requires' do
|
122
140
|
r = manager.generate_query_fieldset('sample', ['a', 'b','f'])
|
data/spec/typedef_spec.rb
CHANGED
@@ -182,6 +182,30 @@ describe Norikra::Typedef do
|
|
182
182
|
end
|
183
183
|
end
|
184
184
|
|
185
|
+
describe '#replace' do
|
186
|
+
it 'raises error for different field name sets' do
|
187
|
+
t = Norikra::Typedef.new({'a'=>'string'})
|
188
|
+
set1 = Norikra::FieldSet.new({'a'=>'string','b'=>'int'})
|
189
|
+
set2 = Norikra::FieldSet.new({'a'=>'string','c'=>'int'})
|
190
|
+
t.push(:data, set1)
|
191
|
+
expect { t.replace(:data, set1, set2) }.to raise_error(ArgumentError)
|
192
|
+
end
|
193
|
+
|
194
|
+
it 'replaces typedef internal fieldset object for specified field_names_key' do
|
195
|
+
t = Norikra::Typedef.new({'a'=>'string'})
|
196
|
+
set1 = Norikra::FieldSet.new({'a'=>'string','b'=>'int'}).bind('x', :data)
|
197
|
+
t.push(:data, set1)
|
198
|
+
expect(t.instance_eval{ @set_map['a,b'].event_type_name }).to eql(set1.event_type_name)
|
199
|
+
expect(t.instance_eval{ @datafieldsets.size }).to eql(1)
|
200
|
+
|
201
|
+
set2 = set1.rebind
|
202
|
+
t.replace(:data, set1, set2)
|
203
|
+
expect(t.instance_eval{ @datafieldsets.size }).to eql(1)
|
204
|
+
expect(t.instance_eval{ @set_map['a,b'].event_type_name }).not_to eql(set1.event_type_name)
|
205
|
+
expect(t.instance_eval{ @set_map['a,b'].event_type_name }).to eql(set2.event_type_name)
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
185
209
|
describe '#refer' do
|
186
210
|
context 'for event defined by data-fieldset already known' do
|
187
211
|
it 'returns fieldset that already known itself' do
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: norikra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.3
|
6
6
|
platform: java
|
7
7
|
authors:
|
8
8
|
- TAGOMORI Satoshi
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-05-
|
12
|
+
date: 2013-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mizuno
|
@@ -85,15 +85,13 @@ dependencies:
|
|
85
85
|
requirements:
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version:
|
89
|
-
MA==
|
88
|
+
version: 0.0.3
|
90
89
|
none: false
|
91
90
|
requirement: !ruby/object:Gem::Requirement
|
92
91
|
requirements:
|
93
92
|
- - ">="
|
94
93
|
- !ruby/object:Gem::Version
|
95
|
-
version:
|
96
|
-
MA==
|
94
|
+
version: 0.0.3
|
97
95
|
none: false
|
98
96
|
prerelease: false
|
99
97
|
type: :runtime
|