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 CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require 'pathname'
4
- lib = Pathname.new(__FILE__).dirname.join('..', 'lib').expand_path
5
- $LOAD_PATH.unshift lib.to_s
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
@@ -51,8 +51,8 @@ module Norikra
51
51
  end
52
52
 
53
53
  def register(query)
54
- unless @targets.include?(query.target)
55
- open(query.target) # open as lazy defined target
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
- target = query.target
149
+ #TODO: support JOINs
150
+ target = query.targets.first
150
151
  @mutex.synchronize do
151
- if @typedef_manager.lazy?(target) || @typedef_manager.fields_defined?(target, query.fields)
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
- @target = nil
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
- target = self.target
24
+ first_target = self.targets.first
25
25
  query = self.dup
26
- query.expression = self.expression.gsub(/(\s[Ff][Rr][Oo][Mm]\s+)#{target}(\.|\s)/, '\1' + actual_name + '\2')
27
- if query.target != actual_name
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, 'target' => self.target}
34
+ {'name' => @name, 'expression' => @expression, 'targets' => self.targets}
35
35
  end
36
36
 
37
- def target
38
- return @target if @target
39
- #TODO: this code doesn't care JOINs.
40
- @target = self.ast.find('STREAM_EXPR').find('EVENT_FILTER_EXPR').children.first.name
41
- @target
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',
@@ -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 + "\t" + level.to_s + "\t" + @summary)
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
@@ -1,3 +1,3 @@
1
1
  module Norikra
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.3"
3
3
  end
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"
@@ -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 eql('q_' + Digest::MD5.hexdigest("TargetExample\tquery\t" + x.summary))
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(:target){ should == 'TestTable' }
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(:target){ should == 'TestTable' }
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.1
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-21 00:00:00.000000000 Z
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: !binary |-
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: !binary |-
96
- MA==
94
+ version: 0.0.3
97
95
  none: false
98
96
  prerelease: false
99
97
  type: :runtime