norikra 0.1.2-java → 0.1.3-java

Sign up to get free protection for your applications and to get access to all the features.
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