norikra 0.1.2-java → 0.1.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/README.md CHANGED
@@ -22,7 +22,6 @@ For JRuby installation, you can use `rbenv`, `rvm` and `xbuild`, or install JRub
22
22
 
23
23
  * JRuby: http://jruby.org/
24
24
  * rbenv: https://github.com/sstephenson/rbenv/
25
- * rvm: https://rvm.io/rvm/install/
26
25
  * xbuild: https://github.com/tagomoris/xbuild
27
26
 
28
27
  ### Command line options
@@ -55,6 +54,27 @@ For other options, see help:
55
54
 
56
55
  norikra help start
57
56
 
57
+ ### How to execute norikra server and tests in development
58
+
59
+ Fix code and tests:
60
+
61
+ 1. clone this repository
62
+ 1. run `bundle install` w/ jruby
63
+ 1. add/fix spec in `spec/*_spec.rb`
64
+ 1. fix code in `lib`
65
+ 1. run `bundle exec rake`
66
+
67
+ Run tests faster than 2 or more times:
68
+
69
+ 1. execute `spork`
70
+ 1. execute `script/spec_server_pry` in another terminal
71
+ 1. run `rspec` in pry console (executed fastly after second times)
72
+
73
+ Execute norikra server with target/query continuation:
74
+
75
+ 1. `bundle exec rake devserver`
76
+ 1. `Ctrl-C` and re-execute for updated code
77
+
58
78
  ## Clients
59
79
 
60
80
  Use `Norikra::Client` and `norikra-client` cli command. These are available on both of JRuby and CRuby.
@@ -104,24 +124,71 @@ And send more events:
104
124
 
105
125
  Query 'www.search' matches the last event automatically.
106
126
 
127
+ ## Performance
128
+
129
+ Threads option available with `norikra start`. Simple specifiers for performance with threadings:
130
+
131
+ norikra start --micro # or --small, --middle, --large (default: 'micro')
132
+
133
+ Norikra server has 3 types of threads:
134
+
135
+ * engine: 4 query engine thread types on Esper
136
+ * inbound: input data handler for queries
137
+ * outbound: output data handler for queries
138
+ * router: event handler which decides which query needs that events
139
+ * timer: executer for queries with time_batches and other timing events
140
+ * rpc: data input/output rpc handler threads on Jetty
141
+ * web: web ui request handler threads on Jetty
142
+
143
+ In many cases, norikra server handling high rate events needs large number of rpc threads to handle input/output rpc requests. WebUI don't need threads rather than default in almost all of cases.
144
+
145
+ Engine threads depends on queries running on norikra, input/output event data rate and target numbers. For more details, see Esper's API Documents: http://esper.codehaus.org/esper-4.10.0/doc/reference/en-US/html/api.html#api-threading
146
+
147
+ Norikra's simple specifiers details of threadings are:
148
+
149
+ * micro: development and testing
150
+ * engine: all processings on single threads
151
+ * rpc: 2 threads
152
+ * web: 2 threads
153
+ * small: low rate events on virtual servers
154
+ * engine: inbound 1, outbound 1, route 1, timer 1 threads
155
+ * rpc: 2 threads
156
+ * web: 2 threads
157
+ * middle: high rate events on physical servers
158
+ * engine: inbound 4, outbound 2, route 2, timer 2 threads
159
+ * rpc: 4 threads
160
+ * web: 2 threads
161
+ * large: inbound heavy traffic and huge amount of queries
162
+ * engine: inbound 6, outbound 6, route 4, timer 4 threads
163
+ * rpc: 8 threads
164
+ * web: 2 threads
165
+
166
+ To specify sizes of each threads, use `--*-threads=NUM` options. For more details, see: `norikra help start`.
167
+
107
168
  ## User Defined Functions
108
169
 
109
- UDFs/UDAFs can be loaded as plugin gems over rubygems or as private plugins. For example, see 'norikra-udf-mock' repository.
170
+ UDFs/UDAFs can be loaded as plugin gems over rubygems or as private plugins.
171
+ In fact, Norikra's UDFs/UDAFs are Esper's plugin with a JRuby class to indicate plugin metadata.
110
172
 
111
- TBD
173
+ For details how to write your own UDF/UDAF for norikra and to release it as gem, see README of `norikra-udf-mock`.
174
+ https://github.com/norikra/norikra-udf-mock
112
175
 
113
- ## Performance
176
+ ## Tips
114
177
 
115
- Threads option available with command line options.
178
+ We need to write this document on http://norikra.github.io
116
179
 
117
- TBD
180
+ ### Esper query syntax
118
181
 
119
- ## Versions
182
+ * String concatination operator: `||`
120
183
 
121
- * v0.1.0:
122
- * First release for production
184
+ ## Changes
185
+
186
+ * v0.1.2:
187
+ * Fix CLI start command to detect jruby path collectly (behind rbenv/rvm and others)
123
188
  * v0.1.1:
124
189
  * Fix types more explicitly for users ('int/long' -> 'integer', 'float/double' -> 'float')
190
+ * v0.1.0:
191
+ * First release for production
125
192
 
126
193
  ## Copyright
127
194
 
@@ -42,6 +42,9 @@ module Norikra
42
42
  option :'outbound-threads', :type => :numeric, :default => nil, :desc => 'number of threads for outbound data'
43
43
  option :'route-threads', :type => :numeric, :default => nil, :desc => 'number of threads for events routing for query execution'
44
44
  option :'timer-threads', :type => :numeric, :default => nil, :desc => 'number of threads for internal timers for query execution'
45
+ ### about capacity options of esper's capacity-bound queue processing, see Esper's thread reference.
46
+ # http://esper.codehaus.org/esper-4.10.0/doc/reference/en-US/html/configuration.html#config-engine-threading-advanced
47
+ # default nil: unbound queueing
45
48
  option :'inbound-thread-capacity', :type => :numeric, :default => nil
46
49
  option :'outbound-thread-capacity', :type => :numeric, :default => nil
47
50
  option :'route-thread-capacity', :type => :numeric, :default => nil
@@ -4,10 +4,10 @@ require 'norikra/field'
4
4
  module Norikra
5
5
  class FieldSet
6
6
  attr_accessor :summary, :fields
7
- attr_accessor :target, :level
7
+ attr_accessor :target, :level, :query_unique_keys
8
8
 
9
9
  # fieldset doesn't have container fields
10
- def initialize(fields, default_optional=nil, rebounds=0)
10
+ def initialize(fields, default_optional=nil, rebounds=0, query_unique_keys=[])
11
11
  @fields = {}
12
12
  # fields.keys are raw key for container access chains
13
13
  fields.keys.each do |key|
@@ -29,12 +29,13 @@ module Norikra
29
29
  @target = nil
30
30
  @level = nil
31
31
  @rebounds = rebounds
32
+ @query_unique_keys = query_unique_keys
32
33
  @event_type_name = nil
33
34
  end
34
35
 
35
36
  def dup
36
37
  fields = Hash[@fields.map{|key,field| [key, {:type => field.type, :optional => field.optional}]}]
37
- self.class.new(fields, nil, @rebounds)
38
+ self.class.new(fields, nil, @rebounds, @query_unique_keys)
38
39
  end
39
40
 
40
41
  def self.leaves(container)
@@ -127,7 +128,7 @@ module Norikra
127
128
  #TODO: have a bug?
128
129
  def ==(other)
129
130
  return false if self.class != other.class
130
- self.summary == other.summary
131
+ self.summary == other.summary && self.query_unique_keys == other.query_unique_keys
131
132
  end
132
133
 
133
134
  def definition
@@ -157,8 +158,9 @@ module Norikra
157
158
  raise ArgumentError, "unknown fieldset bind level: #{level}, for target #{target}"
158
159
  end
159
160
  @rebounds += 1 if update_type_name
161
+ query_unique_key = @query_unique_keys ? @query_unique_keys.join("\t") : ''
160
162
 
161
- @event_type_name = prefix + Digest::MD5.hexdigest([target, level.to_s, @rebounds.to_s, @summary].join("\t"))
163
+ @event_type_name = prefix + Digest::MD5.hexdigest([target, level.to_s, @rebounds.to_s, query_unique_key, @summary].join("\t"))
162
164
  self
163
165
  end
164
166
 
@@ -82,7 +82,7 @@ module Norikra
82
82
 
83
83
  mapping = {}
84
84
  fields_set.each do |target,fields|
85
- mapping[target] = generate_query_fieldset(target, fields.sort.uniq)
85
+ mapping[target] = generate_query_fieldset(target, fields.sort.uniq, query.name, query.group)
86
86
  end
87
87
  mapping
88
88
  end
@@ -106,7 +106,7 @@ module Norikra
106
106
  guessed
107
107
  end
108
108
 
109
- def generate_query_fieldset(target, field_name_list)
109
+ def generate_query_fieldset(target, field_name_list, query_name, query_group)
110
110
  # all fields of field_name_list should exists in definitions of typedef fields
111
111
  # for this premise, call 'bind_fieldset' for data fieldset before this method.
112
112
  required_fields = {}
@@ -117,7 +117,7 @@ module Norikra
117
117
  end
118
118
  end
119
119
  end
120
- Norikra::FieldSet.new(required_fields)
120
+ Norikra::FieldSet.new(required_fields, nil, 0, [query_name, (query_group || '')])
121
121
  end
122
122
 
123
123
  def base_fieldset(target)
@@ -1,3 +1,3 @@
1
1
  module Norikra
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -42,12 +42,27 @@ describe Norikra::FieldSet do
42
42
  set = Norikra::FieldSet.new({'x' => 'string', 'y' => 'long', 'a' => 'Boolean'})
43
43
  set2 = Norikra::FieldSet.new({'a' => 'string', 'b' => 'int', 'c' => 'float', 'd' => 'bool', 'e' => 'integer'})
44
44
 
45
+ q_set1 = Norikra::FieldSet.new({'x' => 'string', 'y' => 'long'}, nil, 0, ['set1', 'g1'])
46
+ q_set2 = Norikra::FieldSet.new({'x' => 'string', 'y' => 'long'}, nil, 0, ['set2', nil])
47
+ q_set3 = Norikra::FieldSet.new({'x' => 'string', 'y' => 'long'}, nil, 0, ['set3', nil])
48
+
45
49
  describe '#dup' do
46
50
  it 'make duplicated object with different internal instance' do
47
51
  x = set.dup
48
52
  expect(x.fields.object_id).not_to eql(set.fields.object_id)
49
53
  expect(x.fields).to eq(set.fields)
50
54
  end
55
+
56
+ it 'make duplicated object with query name and group' do
57
+ expect(q_set1.dup.instance_eval{ @query_unique_keys }).to eql(['set1', 'g1'])
58
+ expect(q_set2.dup.instance_eval{ @query_unique_keys }).to eql(['set2', nil])
59
+
60
+ expect(q_set2 == q_set3).to be_false
61
+
62
+ expect(q_set1 == q_set1.dup).to be_true
63
+ expect(q_set2 == q_set2.dup).to be_true
64
+ expect(q_set3 == q_set3.dup).to be_true
65
+ end
51
66
  end
52
67
 
53
68
  describe '.leaves' do
@@ -252,6 +267,18 @@ describe Norikra::FieldSet do
252
267
  expect(x.instance_eval{ @event_type_name }).not_to be_nil
253
268
  expect(x.instance_eval{ @event_type_name }).to match(/q_[0-9a-f]{32}/) # MD5 hexdump
254
269
  end
270
+
271
+ it 'sets different event_type_name for different query names and groups for query fieldsets w/ same field set' do
272
+ x = q_set1.dup
273
+ y = q_set2.dup
274
+ z = q_set3.dup
275
+ x.bind('TargetExample', :query)
276
+ y.bind('TargetExample', :query)
277
+ z.bind('TargetExample', :query)
278
+
279
+ expect(x.instance_eval{ @event_type_name }).not_to eql(y.instance_eval{ @event_type_name })
280
+ expect(x.instance_eval{ @event_type_name }).not_to eql(z.instance_eval{ @event_type_name })
281
+ end
255
282
  end
256
283
 
257
284
  describe '#rebind' do
@@ -218,7 +218,7 @@ describe Norikra::TypedefManager do
218
218
 
219
219
  describe '#generate_query_fieldset' do
220
220
  it 'returns fieldset instance with all required(non-optional) fields of target, and fields of query requires' do
221
- r = manager.generate_query_fieldset('sample', ['a', 'b','f'])
221
+ r = manager.generate_query_fieldset('sample', ['a', 'b','f'], 'qname1', nil)
222
222
  expect(r.fields.size).to eql(4) # a,b,c,f
223
223
  expect(r.summary).to eql('a:string,b:string,c:float,f:boolean')
224
224
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: norikra
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ prerelease:
5
+ version: 0.1.3
5
6
  platform: java
6
7
  authors:
7
8
  - TAGOMORI Satoshi
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2013-12-06 00:00:00.000000000 Z
12
+ date: 2013-12-31 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: mizuno
@@ -17,11 +18,13 @@ dependencies:
17
18
  - - ~>
18
19
  - !ruby/object:Gem::Version
19
20
  version: '0.6'
21
+ none: false
20
22
  requirement: !ruby/object:Gem::Requirement
21
23
  requirements:
22
24
  - - ~>
23
25
  - !ruby/object:Gem::Version
24
26
  version: '0.6'
27
+ none: false
25
28
  prerelease: false
26
29
  type: :runtime
27
30
  - !ruby/object:Gem::Dependency
@@ -31,11 +34,13 @@ dependencies:
31
34
  - - '>='
32
35
  - !ruby/object:Gem::Version
33
36
  version: '0'
37
+ none: false
34
38
  requirement: !ruby/object:Gem::Requirement
35
39
  requirements:
36
40
  - - '>='
37
41
  - !ruby/object:Gem::Version
38
42
  version: '0'
43
+ none: false
39
44
  prerelease: false
40
45
  type: :runtime
41
46
  - !ruby/object:Gem::Dependency
@@ -45,11 +50,13 @@ dependencies:
45
50
  - - '>='
46
51
  - !ruby/object:Gem::Version
47
52
  version: '0'
53
+ none: false
48
54
  requirement: !ruby/object:Gem::Requirement
49
55
  requirements:
50
56
  - - '>='
51
57
  - !ruby/object:Gem::Version
52
58
  version: '0'
59
+ none: false
53
60
  prerelease: false
54
61
  type: :runtime
55
62
  - !ruby/object:Gem::Dependency
@@ -59,11 +66,13 @@ dependencies:
59
66
  - - '>='
60
67
  - !ruby/object:Gem::Version
61
68
  version: 0.0.5
69
+ none: false
62
70
  requirement: !ruby/object:Gem::Requirement
63
71
  requirements:
64
72
  - - '>='
65
73
  - !ruby/object:Gem::Version
66
74
  version: 0.0.5
75
+ none: false
67
76
  prerelease: false
68
77
  type: :runtime
69
78
  - !ruby/object:Gem::Dependency
@@ -73,11 +82,13 @@ dependencies:
73
82
  - - ~>
74
83
  - !ruby/object:Gem::Version
75
84
  version: 0.1.0
85
+ none: false
76
86
  requirement: !ruby/object:Gem::Requirement
77
87
  requirements:
78
88
  - - ~>
79
89
  - !ruby/object:Gem::Version
80
90
  version: 0.1.0
91
+ none: false
81
92
  prerelease: false
82
93
  type: :runtime
83
94
  - !ruby/object:Gem::Dependency
@@ -87,11 +98,13 @@ dependencies:
87
98
  - - '>='
88
99
  - !ruby/object:Gem::Version
89
100
  version: '0'
101
+ none: false
90
102
  requirement: !ruby/object:Gem::Requirement
91
103
  requirements:
92
104
  - - '>='
93
105
  - !ruby/object:Gem::Version
94
106
  version: '0'
107
+ none: false
95
108
  prerelease: false
96
109
  type: :runtime
97
110
  - !ruby/object:Gem::Dependency
@@ -101,11 +114,13 @@ dependencies:
101
114
  - - '>='
102
115
  - !ruby/object:Gem::Version
103
116
  version: '0'
117
+ none: false
104
118
  requirement: !ruby/object:Gem::Requirement
105
119
  requirements:
106
120
  - - '>='
107
121
  - !ruby/object:Gem::Version
108
122
  version: '0'
123
+ none: false
109
124
  prerelease: false
110
125
  type: :runtime
111
126
  - !ruby/object:Gem::Dependency
@@ -115,11 +130,13 @@ dependencies:
115
130
  - - '>='
116
131
  - !ruby/object:Gem::Version
117
132
  version: '0'
133
+ none: false
118
134
  requirement: !ruby/object:Gem::Requirement
119
135
  requirements:
120
136
  - - '>='
121
137
  - !ruby/object:Gem::Version
122
138
  version: '0'
139
+ none: false
123
140
  prerelease: false
124
141
  type: :runtime
125
142
  - !ruby/object:Gem::Dependency
@@ -129,11 +146,13 @@ dependencies:
129
146
  - - ~>
130
147
  - !ruby/object:Gem::Version
131
148
  version: '1.3'
149
+ none: false
132
150
  requirement: !ruby/object:Gem::Requirement
133
151
  requirements:
134
152
  - - ~>
135
153
  - !ruby/object:Gem::Version
136
154
  version: '1.3'
155
+ none: false
137
156
  prerelease: false
138
157
  type: :development
139
158
  - !ruby/object:Gem::Dependency
@@ -143,11 +162,13 @@ dependencies:
143
162
  - - '>='
144
163
  - !ruby/object:Gem::Version
145
164
  version: '0'
165
+ none: false
146
166
  requirement: !ruby/object:Gem::Requirement
147
167
  requirements:
148
168
  - - '>='
149
169
  - !ruby/object:Gem::Version
150
170
  version: '0'
171
+ none: false
151
172
  prerelease: false
152
173
  type: :development
153
174
  - !ruby/object:Gem::Dependency
@@ -157,11 +178,13 @@ dependencies:
157
178
  - - ~>
158
179
  - !ruby/object:Gem::Version
159
180
  version: '2.0'
181
+ none: false
160
182
  requirement: !ruby/object:Gem::Requirement
161
183
  requirements:
162
184
  - - ~>
163
185
  - !ruby/object:Gem::Version
164
186
  version: '2.0'
187
+ none: false
165
188
  prerelease: false
166
189
  type: :development
167
190
  - !ruby/object:Gem::Dependency
@@ -171,11 +194,13 @@ dependencies:
171
194
  - - '>='
172
195
  - !ruby/object:Gem::Version
173
196
  version: '0'
197
+ none: false
174
198
  requirement: !ruby/object:Gem::Requirement
175
199
  requirements:
176
200
  - - '>='
177
201
  - !ruby/object:Gem::Version
178
202
  version: '0'
203
+ none: false
179
204
  prerelease: false
180
205
  type: :development
181
206
  - !ruby/object:Gem::Dependency
@@ -185,11 +210,13 @@ dependencies:
185
210
  - - '>='
186
211
  - !ruby/object:Gem::Version
187
212
  version: '0'
213
+ none: false
188
214
  requirement: !ruby/object:Gem::Requirement
189
215
  requirements:
190
216
  - - '>='
191
217
  - !ruby/object:Gem::Version
192
218
  version: '0'
219
+ none: false
193
220
  prerelease: false
194
221
  type: :development
195
222
  description: 'CEP: Complex Event Processor with Esper EPL qeury language, messagepack
@@ -334,7 +361,6 @@ files:
334
361
  homepage: http://norikra.github.io/
335
362
  licenses:
336
363
  - GPLv2
337
- metadata: {}
338
364
  post_install_message:
339
365
  rdoc_options: []
340
366
  require_paths:
@@ -344,17 +370,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
344
370
  requirements:
345
371
  - - '>='
346
372
  - !ruby/object:Gem::Version
373
+ segments:
374
+ - 0
375
+ hash: 2
347
376
  version: '0'
377
+ none: false
348
378
  required_rubygems_version: !ruby/object:Gem::Requirement
349
379
  requirements:
350
380
  - - '>='
351
381
  - !ruby/object:Gem::Version
382
+ segments:
383
+ - 0
384
+ hash: 2
352
385
  version: '0'
386
+ none: false
353
387
  requirements: []
354
388
  rubyforge_project:
355
- rubygems_version: 2.1.9
389
+ rubygems_version: 1.8.24
356
390
  signing_key:
357
- specification_version: 4
391
+ specification_version: 3
358
392
  summary: CEP engine/server with Esper and JRuby
359
393
  test_files:
360
394
  - spec/field_spec.rb
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: e528e20d062b04aa923fc369e3848b79af3988a5
4
- data.tar.gz: 6b630871d14d48df16ca71521c0fbf1d9927e9cc
5
- SHA512:
6
- metadata.gz: bb30da37af4e23c1a8c1f121afe314e88f31123547d4c6a588cbadca36134c543b3a34edfda9197e5ee1afdbe4883f38ed0096789de4331889363f0b73d06530
7
- data.tar.gz: 3bc139cc9b58f567dcf340aa256275445df156dc524923edce8a99100d6a52f356938407f4436aaa931b6419e897ac85340fa9d7900bb9a71b27e23888bbcf22