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