norikra 0.0.6-java → 0.0.7-java

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
2
 
3
3
  require 'rspec/core/rake_task'
4
- RSpec::Core::RakeTask.new(:test) do |t|
4
+ RSpec::Core::RakeTask.new(:spec) do |t|
5
5
  t.rspec_opts = ["-c", "-f progress"] # '--format specdoc'
6
6
  t.pattern = 'spec/**/*_spec.rb'
7
7
  end
@@ -1,5 +1,7 @@
1
1
  require 'java'
2
2
 
3
+ require 'norikra/error'
4
+
3
5
  require 'norikra/logger'
4
6
  include Norikra::Log
5
7
 
@@ -33,11 +35,15 @@ module Norikra
33
35
  end
34
36
 
35
37
  def start
38
+ debug "norikra engine starting: creating esper runtime"
36
39
  @runtime = @service.getEPRuntime
40
+ debug "norikra engine started"
37
41
  end
38
42
 
39
43
  def stop
40
- #TODO: stop to @runtime
44
+ debug "stopping norikra engine: stop all statements on esper"
45
+ @service.getEPAdministrator.stopAllStatements
46
+ debug "norikra engine stopped"
41
47
  end
42
48
 
43
49
  def open(target, fields=nil)
@@ -48,8 +54,11 @@ module Norikra
48
54
 
49
55
  def close(target)
50
56
  info "closing target", :target => target
51
- #TODO: write
52
- raise NotImplementedError
57
+ return false unless @targets.include?(target)
58
+ @queries.select{|q| q.targets.include?(target)}.each do |query|
59
+ deregister_query(query)
60
+ end
61
+ close_target(target)
53
62
  end
54
63
 
55
64
  def reserve(target, field, type)
@@ -58,6 +67,8 @@ module Norikra
58
67
 
59
68
  def register(query)
60
69
  info "registering query", :name => query.name, :targets => query.targets, :expression => query.expression
70
+ raise Norikra::ClientError, "query name '#{query.name}' already exists" if @queries.select{|q| q.name == query.name }.size > 0
71
+
61
72
  query.targets.each do |target|
62
73
  open(target) unless @targets.include?(target)
63
74
  end
@@ -66,8 +77,10 @@ module Norikra
66
77
 
67
78
  def deregister(query_name)
68
79
  info "de-registering query", :name => query_name
69
- #TODO: write
70
- raise NotImplementedError
80
+ queries = @queries.select{|q| q.name == query_name }
81
+ return nil unless queries.size == 1 # just ignore for 'not found'
82
+
83
+ deregister_query(queries.first)
71
84
  end
72
85
 
73
86
  def send(target, events)
@@ -81,11 +94,9 @@ module Norikra
81
94
  if @typedef_manager.lazy?(target)
82
95
  info "opening lazy target", :target => target
83
96
  debug "generating base fieldset from event", :target => target, :event => events.first
84
-
85
97
  base_fieldset = @typedef_manager.generate_base_fieldset(target, events.first)
86
98
 
87
99
  debug "registering base fieldset", :target => target, :base => base_fieldset
88
-
89
100
  register_base_fieldset(target, base_fieldset)
90
101
 
91
102
  info "target successfully opened with fieldset", :target => target, :base => base_fieldset
@@ -99,10 +110,11 @@ module Norikra
99
110
  unless registered_data_fieldset[fieldset.summary]
100
111
  # register waiting queries including this fieldset, and this fieldset itself
101
112
  debug "registering unknown fieldset", :target => target, :fieldset => fieldset
102
-
103
113
  register_fieldset(target, fieldset)
104
-
105
114
  debug "successfully registered"
115
+
116
+ # fieldset should be refined, when waiting_queries rewrite inheritance structure and data fieldset be renewed.
117
+ fieldset = @typedef_manager.refer(target, event)
106
118
  end
107
119
 
108
120
  trace "calling sendEvent", :target => target, :fieldset => fieldset, :event_type_name => fieldset.event_type_name, :event => event
@@ -136,9 +148,9 @@ module Norikra
136
148
  private
137
149
 
138
150
  def open_target(target, fields)
139
- # from open
140
151
  @mutex.synchronize do
141
152
  return false if @targets.include?(target)
153
+
142
154
  @typedef_manager.add_target(target, fields)
143
155
  @registered_fieldsets[target] = {:base => {}, :query => {}, :data => {}}
144
156
 
@@ -154,6 +166,18 @@ module Norikra
154
166
  true
155
167
  end
156
168
 
169
+ def close_target(target)
170
+ @mutex.synchronize do
171
+ return false unless @targets.include?(target)
172
+
173
+ @typedef_manager.remove_target(target)
174
+ @registered_fieldsets.delete(target)
175
+
176
+ @targets.delete(target)
177
+ end
178
+ true
179
+ end
180
+
157
181
  def register_base_fieldset(target, fieldset)
158
182
  # for lazy target, with generated fieldset from sent events.first
159
183
  @mutex.synchronize do
@@ -162,11 +186,24 @@ module Norikra
162
186
  @typedef_manager.activate(target, fieldset)
163
187
  register_fieldset_actually(target, fieldset, :base)
164
188
  end
165
- nil
189
+ true
190
+ end
191
+
192
+ def update_inherits_graph(target, query_fieldset)
193
+ # replace registered data fieldsets with new fieldset inherits this query fieldset
194
+ @typedef_manager.supersets(target, query_fieldset).each do |set|
195
+ rebound = set.rebind(true) # update event_type_name with new inheritations
196
+
197
+ register_fieldset_actually(target, rebound, :data, true) # replacing on esper engine
198
+ @typedef_manager.replace_fieldset(target, set, rebound)
199
+ deregister_fieldset_actually(target, set.event_type_name, :data)
200
+ end
166
201
  end
167
202
 
168
203
  def register_query(query)
169
204
  @mutex.synchronize do
205
+ raise Norikra::ClientError, "query '#{query.name}' already exists" unless @queries.select{|q| q.name == query.name }.empty?
206
+
170
207
  unless @typedef_manager.ready?(query)
171
208
  @waiting_queries.push(query)
172
209
  @queries.push(query)
@@ -177,22 +214,36 @@ module Norikra
177
214
  mapping.each do |target, query_fieldset|
178
215
  @typedef_manager.bind_fieldset(target, :query, query_fieldset)
179
216
  register_fieldset_actually(target, query_fieldset, :query)
217
+ update_inherits_graph(target, query_fieldset)
218
+ query.fieldsets[target] = query_fieldset
180
219
  end
220
+
181
221
  register_query_actually(query, mapping)
222
+ @queries.push(query)
223
+ end
224
+ true
225
+ end
182
226
 
183
- mapping.each do |target, query_fieldset|
184
- # replace registered data fieldsets with new fieldset inherits this query fieldset
185
- @typedef_manager.supersets(target, query_fieldset).each do |set|
186
- rebound = set.rebind(true) # update event_type_name with new inheritations
227
+ def deregister_query(query)
228
+ @mutex.synchronize do
229
+ return nil unless @queries.include?(query)
230
+
231
+ deregister_query_actually(query)
232
+ @queries.delete(query)
187
233
 
188
- register_fieldset_actually(target, rebound, :data, true) # replacing
189
- @typedef_manager.replace_fieldset(target, set, rebound)
190
- remove_fieldset_actually(target, set, :data)
234
+ if @waiting_queries.include?(query)
235
+ @waiting_queries.delete(query)
236
+ else
237
+ query.fieldsets.each do |target, query_fieldset|
238
+ removed_event_type_name = query_fieldset.event_type_name
239
+
240
+ @typedef_manager.unbind_fieldset(target, :query, query_fieldset)
241
+ update_inherits_graph(target, query_fieldset)
242
+ deregister_fieldset_actually(target, removed_event_type_name, :query)
191
243
  end
192
244
  end
193
-
194
- @queries.push(query)
195
245
  end
246
+ true
196
247
  end
197
248
 
198
249
  def register_waiting_queries(target)
@@ -212,6 +263,8 @@ module Norikra
212
263
  mapping.each do |target, query_fieldset|
213
264
  @typedef_manager.bind_fieldset(target, :query, query_fieldset)
214
265
  register_fieldset_actually(target, query_fieldset, :query)
266
+ update_inherits_graph(target, query_fieldset)
267
+ query.fieldsets[target] = query_fieldset
215
268
  end
216
269
  register_query_actually(query, mapping)
217
270
  end
@@ -244,6 +297,19 @@ module Norikra
244
297
 
245
298
  epl = administrator.create(statement_model)
246
299
  epl.java_send :addListener, [com.espertech.esper.client.UpdateListener.java_class], Listener.new(query.name, @output_pool)
300
+ query.statement_name = epl.getName
301
+ # epl is automatically started.
302
+ # epl.isStarted #=> true
303
+ end
304
+
305
+ # this method should be protected with @mutex lock
306
+ def deregister_query_actually(query)
307
+ administrator = @service.getEPAdministrator
308
+ epl = administrator.getStatement(query.statement_name)
309
+ return unless epl
310
+
311
+ epl.stop unless epl.isStopped
312
+ epl.destroy unless epl.isDestroyed
247
313
  end
248
314
 
249
315
  # this method should be protected with @mutex lock
@@ -273,13 +339,13 @@ module Norikra
273
339
  end
274
340
 
275
341
  # this method should be protected with @mutex lock as same as register
276
- def remove_fieldset_actually(target, fieldset, level)
277
- return if level == :base || level == :query
342
+ def deregister_fieldset_actually(target, event_type_name, level)
343
+ return if level == :base
278
344
 
279
345
  # DON'T check @registered_fieldsets[target][level][fieldset.summary]
280
346
  # removed fieldset should be already replaced with register_fieldset_actually w/ replace flag
281
- debug "remove event type", :target => target, :event_type => fieldset.event_type_name
282
- @config.removeEventType(fieldset.event_type_name, true)
347
+ debug "remove event type", :target => target, :event_type => event_type_name
348
+ @config.removeEventType(event_type_name, true)
283
349
  end
284
350
  end
285
351
  end
@@ -0,0 +1,5 @@
1
+ module Norikra
2
+ class ClientError < StandardError; end
3
+ class ArgumentError < ClientError; end
4
+ class QueryError < ClientError; end
5
+ end
@@ -4,15 +4,18 @@ require 'esper/lib/commons-logging-1.1.1.jar'
4
4
  require 'esper/lib/antlr-runtime-3.2.jar'
5
5
  require 'esper/lib/cglib-nodep-2.2.jar'
6
6
 
7
+ require 'norikra/error'
7
8
  require 'norikra/query/ast'
8
9
 
9
10
  module Norikra
10
11
  class Query
11
- attr_accessor :name, :expression
12
+ attr_accessor :name, :expression, :statement_name, :fieldsets
12
13
 
13
14
  def initialize(param={})
14
15
  @name = param[:name]
15
16
  @expression = param[:expression]
17
+ @statement_name = nil
18
+ @fieldsets = {} # { target => fieldset }
16
19
  @ast = nil
17
20
  @targets = nil
18
21
  @subqueries = nil
@@ -56,13 +59,17 @@ module Norikra
56
59
  all = []
57
60
  unknowns = []
58
61
  self.ast.listup(:stream).each do |node|
59
- #TODO: raise error for same name of target/alias
60
62
  if node.alias
61
63
  alias_map[node.alias] = node.target
62
64
  end
63
65
  fields[node.target] = []
64
66
  end
65
67
 
68
+ dup_aliases = (alias_map.keys & fields.keys)
69
+ unless dup_aliases.empty?
70
+ raise Norikra::ClientError, "Invalid alias '#{dup_aliases.join(',')}', same with target name"
71
+ end
72
+
66
73
  default_target = fields.keys.size == 1 ? fields.keys.first : nil
67
74
 
68
75
  outer_targets.each do |t|
@@ -81,7 +88,7 @@ module Norikra
81
88
  if field_def[:t]
82
89
  t = alias_map[field_def[:t]] || field_def[:t]
83
90
  unless fields[t]
84
- raise "unknown target alias name for: #{field_def[:t]}.#{field_def[:f]}"
91
+ raise Norikra::ClientError, "unknown target alias name for: #{field_def[:t]}.#{field_def[:f]}"
85
92
  end
86
93
  fields[t].push(f)
87
94
 
@@ -125,7 +132,6 @@ module Norikra
125
132
  end
126
133
 
127
134
  def ast
128
- #TODO: take care for parse error(com.espertech.esper.client.EPStatementSyntaxException)
129
135
  return @ast if @ast
130
136
  rule = ParseRuleSelectorImpl.new
131
137
  target = @expression.dup
@@ -134,6 +140,8 @@ module Norikra
134
140
 
135
141
  @ast = astnode(result.getTree)
136
142
  @ast
143
+ rescue Java::ComEspertechEsperClient::EPStatementSyntaxException => e
144
+ raise Norikra::QueryError, e.message
137
145
  end
138
146
 
139
147
  def self.rewrite_event_type_name(statement_model, mapping)
@@ -1,5 +1,8 @@
1
+ require 'msgpack-rpc-over-http-jruby'
2
+
1
3
  module Norikra::RPC
2
- # namespace only
4
+ class ClientError < MessagePack::RPCOverHTTP::RemoteError; end
5
+ class ServerError < MessagePack::RPCOverHTTP::RemoteError; end
3
6
  end
4
7
 
5
8
  require 'norikra/rpc/handler'
File without changes
@@ -1,6 +1,9 @@
1
+ require 'norikra/error'
1
2
  require 'norikra/logger'
2
3
  include Norikra::Log
3
4
 
5
+ require 'norikra/rpc'
6
+
4
7
  class Norikra::RPC::Handler
5
8
  def initialize(engine)
6
9
  @engine = engine
@@ -15,12 +18,15 @@ class Norikra::RPC::Handler
15
18
 
16
19
  begin
17
20
  yield
21
+ rescue Norikra::ClientError => e
22
+ info "ClientError #{e.class}: #{e.message}"
23
+ raise Norikra::RPC::ClientError, e.message
18
24
  rescue => e
19
25
  error "Exception #{e.class}: #{e.message}"
20
26
  e.backtrace.each do |t|
21
27
  error " " + t
22
28
  end
23
- nil
29
+ raise Norikra::RPC::ServerError, "#{e.class}, #{e.message}"
24
30
  end
25
31
  end
26
32
 
@@ -59,8 +65,8 @@ class Norikra::RPC::Handler
59
65
 
60
66
  def deregister(query_name)
61
67
  logging(:manage, :deregister, query_name){
62
- #TODO: write!
63
- raise NotImplementedError
68
+ r = @engine.deregister(query_name)
69
+ !!r
64
70
  }
65
71
  end
66
72
 
@@ -35,11 +35,15 @@ module Norikra
35
35
  info "Norikra server started."
36
36
  @running = true
37
37
 
38
- Signal.trap(:INT){ @running = false }
39
- #TODO: more signal traps (dumps of query/fields? or other handler?)
38
+ shutdown_proc = ->{ @running = false }
39
+ # JVM uses SIGQUIT for thread/heap state dumping
40
+ [:INT, :TERM].each do |s|
41
+ Signal.trap(s, shutdown_proc)
42
+ end
43
+ #TODO: SIGHUP? SIGUSR1? SIGUSR2? (dumps of query/fields? or other handler?)
40
44
 
41
45
  while @running
42
- sleep 1
46
+ sleep 0.3
43
47
  end
44
48
  end
45
49
 
@@ -1,6 +1,8 @@
1
1
  require 'digest'
2
2
  require 'json'
3
3
 
4
+ require 'norikra/error'
5
+
4
6
  # Norikra::Field, Norikra::FieldSet, Norikra::Typedef
5
7
 
6
8
  module Norikra
@@ -53,7 +55,7 @@ module Norikra
53
55
  when 'float' then 'float'
54
56
  when 'double' then 'double'
55
57
  else
56
- raise ArgumentError, "invalid field type #{type}"
58
+ raise Norikra::ArgumentError, "invalid field type #{type}"
57
59
  end
58
60
  end
59
61
 
@@ -99,8 +101,21 @@ module Norikra
99
101
  self.class.new(fields, nil, @rebounds)
100
102
  end
101
103
 
102
- def self.field_names_key(data)
103
- data.keys.sort.join(',')
104
+ def self.field_names_key(data, fieldset=nil)
105
+ if fieldset
106
+ keys = []
107
+ fieldset.fields.each do |key,field|
108
+ unless field.optional?
109
+ keys.push(key)
110
+ end
111
+ end
112
+ data.keys.each do |key|
113
+ keys.push(key) unless keys.include?(key)
114
+ end
115
+ keys.sort.join(',')
116
+ else
117
+ data.keys.sort.join(',')
118
+ end
104
119
  end
105
120
 
106
121
  def field_names_key
@@ -217,7 +232,7 @@ module Norikra
217
232
  @queryfieldsets = []
218
233
  @datafieldsets = []
219
234
 
220
- @set_map = {} # FieldSet.field_names_key(data_fieldset) => data_fieldset
235
+ @set_map = {} # FieldSet.field_names_key(data_fieldset, fieldset) => data_fieldset
221
236
 
222
237
  @mutex = Mutex.new
223
238
  end
@@ -259,7 +274,7 @@ module Norikra
259
274
 
260
275
  def push(level, fieldset)
261
276
  unless self.consistent?(fieldset)
262
- raise ArgumentError, "inconsistent field set for this typedef"
277
+ raise Norikra::ArgumentError, "field definition mismatch with already defined fields"
263
278
  end
264
279
 
265
280
  @mutex.synchronize do
@@ -292,9 +307,25 @@ module Norikra
292
307
  true
293
308
  end
294
309
 
310
+ def pop(level, fieldset)
311
+ @mutex.synchronize do
312
+ case level
313
+ when :base
314
+ raise RuntimeError, "BUG: pop of base fieldset is nonsense (typedef deletion?)"
315
+ when :query
316
+ @queryfieldsets.delete(fieldset) if @queryfieldsets.include?(fieldset)
317
+ when :data
318
+ raise RuntimeError, "BUG: pop of data fieldset is nonsense"
319
+ else
320
+ raise ArgumentError, "unknown level #{level}"
321
+ end
322
+ end
323
+ true
324
+ end
325
+
295
326
  def replace(level, old_fieldset, fieldset)
296
327
  unless self.consistent?(fieldset)
297
- raise ArgumentError, "inconsistent field set for this typedef"
328
+ raise Norikra::ArgumentError, "field definition mismatch with already defined fields"
298
329
  end
299
330
  if level != :data
300
331
  raise ArgumentError, "invalid argument, fieldset replace should be called for :data"
@@ -311,7 +342,7 @@ module Norikra
311
342
  end
312
343
 
313
344
  def refer(data)
314
- field_names_key = FieldSet.field_names_key(data)
345
+ field_names_key = FieldSet.field_names_key(data, self)
315
346
  return @set_map[field_names_key] if @set_map.has_key?(field_names_key)
316
347
 
317
348
  guessed = FieldSet.simple_guess(data)
@@ -319,11 +350,12 @@ module Norikra
319
350
  @fields.each do |key,field|
320
351
  if guessed_fields.has_key?(key)
321
352
  guessed_fields[key].type = field.type if guessed_fields[key].type != field.type
353
+ guessed_fields[key].optional = field.optional if guessed_fields[key].optional != field.optional
322
354
  else
323
355
  guessed_fields[key] = field unless field.optional?
324
356
  end
325
357
  end
326
- guessed
358
+ guessed.update_summary
327
359
  end
328
360
 
329
361
  def format(data)
@@ -1,6 +1,7 @@
1
1
  require 'digest'
2
2
 
3
3
  require 'norikra/typedef'
4
+ require 'norikra/error'
4
5
 
5
6
  module Norikra
6
7
  class TypedefManager
@@ -19,11 +20,18 @@ module Norikra
19
20
  # fields nil || [] => lazy
20
21
  # fields {'fieldname' => 'type'}
21
22
  @mutex.synchronize do
22
- raise RuntimeError, "target #{target} already exists" if @typedefs[target]
23
+ raise Norikra::ArgumentError, "target '#{target}' already exists" if @typedefs[target]
23
24
  @typedefs[target] = Typedef.new(fields)
24
25
  end
25
26
  end
26
27
 
28
+ def remove_target(target)
29
+ @mutex.synchronize do
30
+ raise Norikra::ArgumentError, "target '#{target}' doesn't exists" unless @typedefs[target]
31
+ @typedefs.delete(target)
32
+ end
33
+ end
34
+
27
35
  def lazy?(target)
28
36
  @typedefs[target].lazy?
29
37
  end
@@ -48,14 +56,14 @@ module Norikra
48
56
 
49
57
  def generate_fieldset_mapping(query)
50
58
  fields_set = {}
59
+
51
60
  query.targets.each do |target|
52
61
  fields_set[target] = query.fields(target)
53
62
  end
54
63
  query.fields(nil).each do |field|
55
64
  assumed = query.targets.select{|t| @typedefs[t].field_defined?([field])}
56
65
  if assumed.size != 1
57
- #TODO exception class
58
- raise "cannot determine target for field #{field}"
66
+ raise Norikra::ClientError, "cannot determine target for field '#{field}' in this query"
59
67
  end
60
68
  fields_set[assumed.first].push(field)
61
69
  end
@@ -64,7 +72,6 @@ module Norikra
64
72
  fields_set.each do |target,fields|
65
73
  mapping[target] = generate_query_fieldset(target, fields.sort.uniq)
66
74
  end
67
-
68
75
  mapping
69
76
  end
70
77
 
@@ -73,6 +80,10 @@ module Norikra
73
80
  @typedefs[target].push(level, fieldset)
74
81
  end
75
82
 
83
+ def unbind_fieldset(target, level, fieldset)
84
+ @typedefs[target].pop(level, fieldset)
85
+ end
86
+
76
87
  def replace_fieldset(target, old_fieldset, new_fieldset)
77
88
  @typedefs[target].replace(:data, old_fieldset, new_fieldset)
78
89
  end
@@ -1,3 +1,3 @@
1
1
  module Norikra
2
- VERSION = "0.0.6"
2
+ VERSION = "0.0.7"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  require_relative './spec_helper'
2
2
 
3
3
  require 'norikra/typedef'
4
+ # require 'norikra/error'
4
5
 
5
6
  require 'json'
6
7
  require 'digest'
@@ -22,7 +23,7 @@ describe Norikra::Field do
22
23
  end
23
24
 
24
25
  it 'raises ArgumentError for unknown type string' do
25
- expect { Norikra::Field.valid_type?('foo') }.to raise_error(ArgumentError)
26
+ expect { Norikra::Field.valid_type?('foo') }.to raise_error()
26
27
  end
27
28
  end
28
29
 
@@ -75,6 +75,10 @@ describe Norikra::FieldSet do
75
75
  it 'returns comma-separated sorted field names of argument hash' do
76
76
  expect(Norikra::FieldSet.field_names_key({'x1'=>1,'y3'=>2,'xx'=>3,'xx1'=>4,'a'=>5})).to eql('a,x1,xx,xx1,y3')
77
77
  end
78
+
79
+ it 'returns comma-separated sorted field names of argument hash AND non-optional fields of 2nd argument fieldset instance' do
80
+ expect(Norikra::FieldSet.field_names_key({'x1'=>1,'y3'=>2,'xx'=>3,'xx1'=>4}, set)).to eql('a,x,x1,xx,xx1,y,y3')
81
+ end
78
82
  end
79
83
 
80
84
  describe '#field_names_key' do
@@ -127,12 +127,15 @@ describe Norikra::TypedefManager do
127
127
  end
128
128
  end
129
129
 
130
- describe '#bind_fieldset' do
130
+ describe '#bind_fieldset and #unbind_fieldset' do
131
131
  it 'does not fail' do
132
132
  manager.bind_fieldset('sample', :query, set_query_base)
133
133
  expect(set_query_base.target).to eql('sample')
134
134
  expect(set_query_base.level).to eql(:query)
135
135
  expect(manager.typedefs['sample'].queryfieldsets.include?(set_query_base)).to be_true
136
+
137
+ manager.unbind_fieldset('sample', :query, set_query_base)
138
+ expect(manager.typedefs['sample'].queryfieldsets.include?(set_query_base)).to be_false
136
139
  end
137
140
  end
138
141
 
@@ -165,8 +168,7 @@ describe Norikra::TypedefManager do
165
168
  manager.bind_fieldset('sample', :query, set_f)
166
169
 
167
170
  list = manager.subsets('sample', Norikra::FieldSet.new(base.merge({'d'=>'string','e'=>'string','g'=>'string'})))
168
- expect(list.size).to eql(4) # set_query_base, set_d, set_e, baseset
169
- expect(list.include?(set_query_base)).to be_true
171
+ expect(list.size).to eql(3) # set_d, set_e, baseset
170
172
  expect(list.include?(set_d)).to be_true
171
173
  expect(list.include?(set_e)).to be_true
172
174
  expect(list.include?(set_f)).to be_false
@@ -1,6 +1,7 @@
1
1
  require_relative './spec_helper'
2
2
 
3
3
  require 'norikra/typedef'
4
+ # require 'norikra/error'
4
5
 
5
6
  require 'json'
6
7
  require 'digest'
@@ -158,16 +159,16 @@ describe Norikra::Typedef do
158
159
  describe '#push' do
159
160
  it 'does not accepts fieldset which conflicts pre-defined fields' do
160
161
  t = Norikra::Typedef.new({'a' => 'string', 'b' => 'long'})
161
- expect { t.push(:query, Norikra::FieldSet.new({'a'=>'string','b'=>'int'})) }.to raise_error(ArgumentError)
162
- expect { t.push(:data, Norikra::FieldSet.new({'a'=>'string'})) }.to raise_error(ArgumentError)
162
+ expect { t.push(:query, Norikra::FieldSet.new({'a'=>'string','b'=>'int'})) }.to raise_error(Norikra::ArgumentError)
163
+ expect { t.push(:data, Norikra::FieldSet.new({'a'=>'string'})) }.to raise_error(Norikra::ArgumentError)
163
164
  end
164
165
 
165
166
  it 'accepts fieldsets which is consistent with self' do
166
167
  t = Norikra::Typedef.new({'a'=>'string','b'=>'long'})
167
168
  expect(t.fields.size).to eql(2)
168
169
 
169
- expect { t.push(:query, Norikra::FieldSet.new({'a'=>'string','b'=>'long'})) }.not_to raise_error(ArgumentError)
170
- expect { t.push(:data, Norikra::FieldSet.new({'a'=>'string','b'=>'long'})) }.not_to raise_error(ArgumentError)
170
+ t.push(:query, Norikra::FieldSet.new({'a'=>'string','b'=>'long'}))
171
+ t.push(:data, Norikra::FieldSet.new({'a'=>'string','b'=>'long'}))
171
172
 
172
173
  expect(t.fields.size).to eql(2)
173
174
 
@@ -184,13 +185,36 @@ describe Norikra::Typedef do
184
185
  end
185
186
  end
186
187
 
188
+ describe '#pop' do
189
+ it 'does not accepts base/data fieldsets' do
190
+ t = Norikra::Typedef.new({'a' => 'string', 'b' => 'long'})
191
+ expect { t.pop(:base, Norikra::FieldSet.new({'a'=>'string','b'=>'int'})) }.to raise_error(RuntimeError)
192
+ expect { t.pop(:data, Norikra::FieldSet.new({'a'=>'string'})) }.to raise_error(RuntimeError)
193
+ end
194
+
195
+ it 'removes specified query fieldset from queryfieldsets' do
196
+ t = Norikra::Typedef.new({'a' => 'string', 'b' => 'long'})
197
+ set1 = Norikra::FieldSet.new({'a'=>'string','b' => 'long','c'=>'int'})
198
+ set2 = Norikra::FieldSet.new({'a'=>'string','b' => 'long'})
199
+ t.push(:query, set1)
200
+ t.push(:query, set2)
201
+
202
+ expect(t.queryfieldsets.size).to eql(2)
203
+
204
+ t.pop(:query, set1)
205
+ expect(t.queryfieldsets.size).to eql(1)
206
+ t.pop(:query, set2)
207
+ expect(t.queryfieldsets.size).to eql(0)
208
+ end
209
+ end
210
+
187
211
  describe '#replace' do
188
212
  it 'raises error for different field name sets' do
189
213
  t = Norikra::Typedef.new({'a'=>'string'})
190
214
  set1 = Norikra::FieldSet.new({'a'=>'string','b'=>'int'})
191
215
  set2 = Norikra::FieldSet.new({'a'=>'string','c'=>'int'})
192
216
  t.push(:data, set1)
193
- expect { t.replace(:data, set1, set2) }.to raise_error(ArgumentError)
217
+ expect { t.replace(:data, set1, set2) }.to raise_error(Norikra::ArgumentError)
194
218
  end
195
219
 
196
220
  it 'replaces typedef internal fieldset object for specified field_names_key' do
@@ -235,6 +259,7 @@ describe Norikra::Typedef do
235
259
  expect(r.fields['b'].type).to eql('long')
236
260
  expect(r.fields['c'].type).to eql('boolean')
237
261
  expect(r.fields['d'].type).to eql('double')
262
+ expect(r.summary).to eql('a:string,b:long,c:boolean,d:double')
238
263
  end
239
264
  end
240
265
 
@@ -249,6 +274,7 @@ describe Norikra::Typedef do
249
274
  expect(r.fields['b'].type).to eql('long')
250
275
  expect(r.fields['c'].type).to eql('string')
251
276
  expect(r.fields['d'].type).to eql('string')
277
+ expect(r.summary).to eql('a:string,b:long,c:string,d:string')
252
278
  end
253
279
  end
254
280
  end
metadata CHANGED
@@ -2,14 +2,14 @@
2
2
  name: norikra
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.6
5
+ version: 0.0.7
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-07-05 00:00:00.000000000 Z
12
+ date: 2013-08-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mizuno
@@ -262,12 +262,14 @@ files:
262
262
  - lib/norikra.rb
263
263
  - lib/norikra/cli.rb
264
264
  - lib/norikra/engine.rb
265
+ - lib/norikra/error.rb
265
266
  - lib/norikra/logger.rb
266
267
  - lib/norikra/logger_mizuno_patch.rb
267
268
  - lib/norikra/output_pool.rb
268
269
  - lib/norikra/query.rb
269
270
  - lib/norikra/query/ast.rb
270
271
  - lib/norikra/rpc.rb
272
+ - lib/norikra/rpc/error.rb
271
273
  - lib/norikra/rpc/handler.rb
272
274
  - lib/norikra/rpc/http.rb
273
275
  - lib/norikra/server.rb