norikra 0.0.6-java → 0.0.7-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/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