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 +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
|