norikra 0.0.1-java → 0.0.3-java
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.
- 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
|