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 +1 -1
- data/lib/norikra/engine.rb +90 -24
- data/lib/norikra/error.rb +5 -0
- data/lib/norikra/query.rb +12 -4
- data/lib/norikra/rpc.rb +4 -1
- data/lib/norikra/rpc/error.rb +0 -0
- data/lib/norikra/rpc/handler.rb +9 -3
- data/lib/norikra/server.rb +7 -3
- data/lib/norikra/typedef.rb +40 -8
- data/lib/norikra/typedef_manager.rb +15 -4
- data/lib/norikra/version.rb +1 -1
- data/spec/field_spec.rb +2 -1
- data/spec/fieldset_spec.rb +4 -0
- data/spec/typedef_manager_spec.rb +5 -3
- data/spec/typedef_spec.rb +31 -5
- metadata +4 -2
data/Rakefile
CHANGED
data/lib/norikra/engine.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
52
|
-
|
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
|
-
|
70
|
-
|
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
|
-
|
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
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
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
|
-
|
189
|
-
|
190
|
-
|
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
|
277
|
-
return if level == :base
|
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 =>
|
282
|
-
@config.removeEventType(
|
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
|
data/lib/norikra/query.rb
CHANGED
@@ -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)
|
data/lib/norikra/rpc.rb
CHANGED
File without changes
|
data/lib/norikra/rpc/handler.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
63
|
-
|
68
|
+
r = @engine.deregister(query_name)
|
69
|
+
!!r
|
64
70
|
}
|
65
71
|
end
|
66
72
|
|
data/lib/norikra/server.rb
CHANGED
@@ -35,11 +35,15 @@ module Norikra
|
|
35
35
|
info "Norikra server started."
|
36
36
|
@running = true
|
37
37
|
|
38
|
-
|
39
|
-
#
|
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
|
46
|
+
sleep 0.3
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
data/lib/norikra/typedef.rb
CHANGED
@@ -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
|
-
|
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, "
|
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, "
|
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
|
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
|
-
#
|
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
|
data/lib/norikra/version.rb
CHANGED
data/spec/field_spec.rb
CHANGED
@@ -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(
|
26
|
+
expect { Norikra::Field.valid_type?('foo') }.to raise_error()
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
data/spec/fieldset_spec.rb
CHANGED
@@ -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(
|
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
|
data/spec/typedef_spec.rb
CHANGED
@@ -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
|
-
|
170
|
-
|
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.
|
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
|
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
|