norikra 1.0.4-java → 1.0.5-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/norikra/cli.rb +2 -0
- data/lib/norikra/engine.rb +2 -0
- data/lib/norikra/logger.rb +16 -12
- data/lib/norikra/query.rb +5 -0
- data/lib/norikra/server.rb +6 -1
- data/lib/norikra/version.rb +1 -1
- data/lib/norikra/webui/api.rb +10 -0
- data/spec/query_spec.rb +40 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 61894f524fea6b1a2baee5b6ded868b7b5897ad1
|
4
|
+
data.tar.gz: 07f714981b43d62258643265a8773e01077f5a4a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 372de0fa852cd3de9ed4a3adaab4a1946d004728522856dba8b4aad70bdfc82d9601e4c08a043d367d61f824cd449c57af0bc5bdb33e88dc123e429485fe9efa
|
7
|
+
data.tar.gz: f396b95240f6aab7a660a1e31af55c8f904b9fbd8c793c11c3f2c96702f1b4f96de73643beafdf357a2fb5ba58c1ec8f70e04430e54a3de4fe17aa70e3ed83d8
|
data/lib/norikra/cli.rb
CHANGED
@@ -68,6 +68,7 @@ module Norikra
|
|
68
68
|
option :'log-filesize', :type => :string, :default => nil, :desc => 'log rotation size [10MB]'
|
69
69
|
option :'log-backups' , :type => :numeric, :default => nil, :desc => 'log rotation backups [10]'
|
70
70
|
option :'log-buffer-lines', :type => :numeric, :default => nil, :desc => 'log lines to fetch from API [1000]'
|
71
|
+
option :'log4j-properties-path', :type => :string, :default => nil, :desc => 'path to log4j.properties. ignore other log* options when this option is present'
|
71
72
|
|
72
73
|
### Loglevel options
|
73
74
|
option :'more-quiet', :type => :boolean, :default => false, :desc => 'set loglevel as ERROR'
|
@@ -226,6 +227,7 @@ module Norikra
|
|
226
227
|
filesize: options[:'log-filesize'], backups: options[:'log-backups'],
|
227
228
|
bufferlines: options[:'log-buffer-lines'],
|
228
229
|
}
|
230
|
+
conf[:log4j_properties_path] = options[:'log4j-properties-path']
|
229
231
|
|
230
232
|
server_options = {
|
231
233
|
host: options[:host],
|
data/lib/norikra/engine.rb
CHANGED
@@ -169,6 +169,7 @@ module Norikra
|
|
169
169
|
def register(query)
|
170
170
|
info "registering query", :name => query.name, :targets => query.targets, :expression => query.expression
|
171
171
|
raise Norikra::ClientError, "query name '#{query.name}' already exists" if @queries.select{|q| q.name == query.name }.size > 0
|
172
|
+
raise Norikra::ClientError, "query '#{query.name}' is invalid query for Norikra" if query.invalid?
|
172
173
|
|
173
174
|
query.targets.each do |target_name|
|
174
175
|
open(target_name) unless @targets.any?{|t| t.name == target_name}
|
@@ -309,6 +310,7 @@ module Norikra
|
|
309
310
|
|
310
311
|
@mutex.synchronize do
|
311
312
|
raise Norikra::ClientError, "query '#{query.name}' already exists" unless @queries.select{|q| q.name == query.name }.empty?
|
313
|
+
raise Norikra::ClientError, "query '#{query.name}' is invalid query for Norikra" if query.invalid?
|
312
314
|
if lo_target_name = Norikra::Query.loopback(query.group)
|
313
315
|
raise Norikra::ClientError, "loopback target '#{lo_target_name}'" unless Norikra::Target.valid?(lo_target_name)
|
314
316
|
end
|
data/lib/norikra/logger.rb
CHANGED
@@ -37,8 +37,6 @@ module Norikra
|
|
37
37
|
module Log
|
38
38
|
@@logger = nil
|
39
39
|
|
40
|
-
@@level = nil
|
41
|
-
@@levelnum = nil
|
42
40
|
@@devmode = false
|
43
41
|
|
44
42
|
@@test_flag = false
|
@@ -56,9 +54,8 @@ module Norikra
|
|
56
54
|
@@test_flag = true
|
57
55
|
end
|
58
56
|
|
59
|
-
|
60
|
-
raise ArgumentError, "unknown log level: #{
|
61
|
-
@@levelnum = LOG_LEVELS.index(@@level)
|
57
|
+
level = level.upcase
|
58
|
+
raise ArgumentError, "unknown log level: #{level}" unless LOG_LEVELS.include?(level)
|
62
59
|
|
63
60
|
p = java.util.Properties.new
|
64
61
|
p.setProperty('log4j.appender.default.layout', 'org.apache.log4j.PatternLayout')
|
@@ -93,7 +90,7 @@ module Norikra
|
|
93
90
|
p.setProperty('log4j.appender.builtin.MaxFileSize', opts[:filesize] || LOGFILE_DEFAULT_MAX_SIZE)
|
94
91
|
p.setProperty('log4j.appender.builtin.MaxBackupIndex', opts[:backups].to_s || LOGFILE_DEFAULT_MAX_BACKUP_INDEX.to_s)
|
95
92
|
end
|
96
|
-
p.setProperty('log4j.rootLogger', "#{
|
93
|
+
p.setProperty('log4j.rootLogger', "#{level},default")
|
97
94
|
org.apache.log4j.PropertyConfigurator.configure(p)
|
98
95
|
|
99
96
|
@@logger = Logger.new('norikra.log', opts)
|
@@ -101,7 +98,7 @@ module Norikra
|
|
101
98
|
else # for test(rspec)
|
102
99
|
p.setProperty('log4j.appender.default', 'org.apache.log4j.varia.NullAppender')
|
103
100
|
p.setProperty('log4j.appender.builtin', 'org.apache.log4j.varia.NullAppender')
|
104
|
-
p.setProperty('log4j.rootLogger', "#{
|
101
|
+
p.setProperty('log4j.rootLogger', "#{level},default")
|
105
102
|
org.apache.log4j.PropertyConfigurator.configure(p)
|
106
103
|
@@logger = opts[:logger]
|
107
104
|
end
|
@@ -109,6 +106,12 @@ module Norikra
|
|
109
106
|
@@devmode = devmode
|
110
107
|
end
|
111
108
|
|
109
|
+
def self.init_with_log4j_properties_path(log4j_properties_path)
|
110
|
+
org.apache.log4j.PropertyConfigurator.configure(log4j_properties_path)
|
111
|
+
@@logger = Logger.new('norikra.log')
|
112
|
+
@@devmode = false
|
113
|
+
end
|
114
|
+
|
112
115
|
def self.swap(logger) # for tests
|
113
116
|
@@mon.synchronize do
|
114
117
|
original,@@logger = @@logger, logger
|
@@ -120,31 +123,26 @@ module Norikra
|
|
120
123
|
def self.logger; @@logger ; end
|
121
124
|
|
122
125
|
def trace(message, data=nil)
|
123
|
-
return if LEVEL_TRACE < @@levelnum
|
124
126
|
from = @@devmode ? caller_locations(1,1) : nil
|
125
127
|
@@logger.trace(message, data, from)
|
126
128
|
end
|
127
129
|
|
128
130
|
def debug(message, data=nil)
|
129
|
-
return if LEVEL_DEBUG < @@levelnum
|
130
131
|
from = @@devmode ? caller_locations(1,1) : nil
|
131
132
|
@@logger.debug(message, data, from)
|
132
133
|
end
|
133
134
|
|
134
135
|
def info(message, data=nil)
|
135
|
-
return if LEVEL_INFO < @@levelnum
|
136
136
|
from = @@devmode ? caller_locations(1,1) : nil
|
137
137
|
@@logger.info(message, data, from)
|
138
138
|
end
|
139
139
|
|
140
140
|
def warn(message, data=nil)
|
141
|
-
return if LEVEL_WARN < @@levelnum
|
142
141
|
from = @@devmode ? caller_locations(1,1) : nil
|
143
142
|
@@logger.warn(message, data, from)
|
144
143
|
end
|
145
144
|
|
146
145
|
def error(message, data=nil)
|
147
|
-
return if LEVEL_ERROR < @@levelnum
|
148
146
|
from = @@devmode ? caller_locations(1,1) : nil
|
149
147
|
@@logger.error(message, data, from)
|
150
148
|
end
|
@@ -175,36 +173,42 @@ module Norikra
|
|
175
173
|
end
|
176
174
|
|
177
175
|
def trace(message, data=nil, from=nil)
|
176
|
+
return unless @log4j.isTraceEnabled
|
178
177
|
line = format(from, message, data)
|
179
178
|
push('trace', line)
|
180
179
|
@log4j.trace(line)
|
181
180
|
end
|
182
181
|
|
183
182
|
def debug(message, data=nil, from=nil)
|
183
|
+
return unless @log4j.isDebugEnabled
|
184
184
|
line = format(from, message, data)
|
185
185
|
push('debug', line)
|
186
186
|
@log4j.debug(line)
|
187
187
|
end
|
188
188
|
|
189
189
|
def info(message, data=nil, from=nil)
|
190
|
+
return unless @log4j.isInfoEnabled
|
190
191
|
line = format(from, message, data)
|
191
192
|
push('info', line)
|
192
193
|
@log4j.info(line)
|
193
194
|
end
|
194
195
|
|
195
196
|
def warn(message, data=nil, from=nil)
|
197
|
+
return unless @log4j.isWarnEnabled
|
196
198
|
line = format(from, message, data)
|
197
199
|
push('warn', line)
|
198
200
|
@log4j.warn(line)
|
199
201
|
end
|
200
202
|
|
201
203
|
def error(message, data=nil, from=nil)
|
204
|
+
return unless @log4j.isErrorEnabled
|
202
205
|
line = format(from, message, data)
|
203
206
|
push('error', line)
|
204
207
|
@log4j.error(line)
|
205
208
|
end
|
206
209
|
|
207
210
|
def fatal(message, data=nil, from=nil)
|
211
|
+
return unless @log4j.isFatalEnabled
|
208
212
|
line = format(from, message, data)
|
209
213
|
push('fatal', line)
|
210
214
|
@log4j.fatal(line)
|
data/lib/norikra/query.rb
CHANGED
@@ -61,6 +61,11 @@ module Norikra
|
|
61
61
|
{name: @name, group: @group, expression: @expression}
|
62
62
|
end
|
63
63
|
|
64
|
+
def invalid?
|
65
|
+
# check query is invalid as Norikra query or not
|
66
|
+
self.ast.listup('selectionListElement').any?{|node| node.children.map(&:name).any?{|name| name == '*' } }
|
67
|
+
end
|
68
|
+
|
64
69
|
def targets
|
65
70
|
return @targets if @targets
|
66
71
|
@targets = (self.ast.listup(:stream).map(&:targets).flatten + self.subqueries.map(&:targets).flatten).sort.uniq
|
data/lib/norikra/server.rb
CHANGED
@@ -96,8 +96,13 @@ module Norikra
|
|
96
96
|
|
97
97
|
@thread_conf = self.class.threading_configuration(conf[:thread])
|
98
98
|
@log_conf = self.class.log_configuration(conf[:log])
|
99
|
+
@log4j_properties_path = conf[:log4j_properties_path]
|
99
100
|
|
100
|
-
|
101
|
+
if @log4j_properties_path
|
102
|
+
Norikra::Log.init_with_log4j_properties_path(@log4j_properties_path)
|
103
|
+
else
|
104
|
+
Norikra::Log.init(@log_conf[:level], @log_conf[:dir], {filesize: @log_conf[:filesize], backups: @log_conf[:backups], bufferlines: @log_conf[:bufferlines]})
|
105
|
+
end
|
101
106
|
|
102
107
|
info "thread configurations", @thread_conf
|
103
108
|
info "logging configurations", @log_conf
|
data/lib/norikra/version.rb
CHANGED
data/lib/norikra/webui/api.rb
CHANGED
@@ -18,6 +18,16 @@ class Norikra::WebUI::API < Sinatra::Base
|
|
18
18
|
@@engine = engine
|
19
19
|
end
|
20
20
|
|
21
|
+
before do
|
22
|
+
content_type :json
|
23
|
+
headers 'Access-Control-Allow-Origin' => '*',
|
24
|
+
'Access-Control-Allow-Methods' => ['OPTIONS', 'GET', 'POST'],
|
25
|
+
'Access-Control-Allow-Headers' => 'Content-Type'
|
26
|
+
if request.request_method == 'OPTIONS'
|
27
|
+
halt 200
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
21
31
|
def logging(type, handler, args=[], opts={})
|
22
32
|
if type == :manage
|
23
33
|
debug "WebAPI", :handler => handler.to_s, :args => args
|
data/spec/query_spec.rb
CHANGED
@@ -21,6 +21,8 @@ describe Norikra::Query do
|
|
21
21
|
expect(q.fields).to eql(['param', 'path', 'size'].sort)
|
22
22
|
expect(q.fields('TestTable')).to eql(['param','path','size'].sort)
|
23
23
|
expect(q.fields(nil)).to eql([])
|
24
|
+
|
25
|
+
expect(q.invalid?).to be_false
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -86,6 +88,8 @@ describe Norikra::Query do
|
|
86
88
|
expect(q.fields).to eql([])
|
87
89
|
expect(q.fields('TestTable')).to eql([])
|
88
90
|
expect(q.fields(nil)).to eql([])
|
91
|
+
|
92
|
+
expect(q.invalid?).to be_false
|
89
93
|
end
|
90
94
|
end
|
91
95
|
|
@@ -103,6 +107,8 @@ describe Norikra::Query do
|
|
103
107
|
expect(q.fields).to eql(['name.string', 'param', 'path', 'size'].sort)
|
104
108
|
expect(q.fields('TestTable')).to eql(['name.string', 'param','path','size'].sort)
|
105
109
|
expect(q.fields(nil)).to eql([])
|
110
|
+
|
111
|
+
expect(q.invalid?).to be_false
|
106
112
|
end
|
107
113
|
end
|
108
114
|
|
@@ -120,6 +126,8 @@ describe Norikra::Query do
|
|
120
126
|
expect(q.fields).to eql(['path', 'size'].sort)
|
121
127
|
expect(q.fields('TestTable')).to eql(['path', 'size'].sort)
|
122
128
|
expect(q.fields(nil)).to eql([])
|
129
|
+
|
130
|
+
expect(q.invalid?).to be_false
|
123
131
|
end
|
124
132
|
end
|
125
133
|
|
@@ -137,6 +145,8 @@ describe Norikra::Query do
|
|
137
145
|
expect(q.fields('StreamA')).to eql(['size','data'].sort)
|
138
146
|
expect(q.fields('StreamB')).to eql(['size','header'].sort)
|
139
147
|
expect(q.fields(nil)).to eql(['product'])
|
148
|
+
|
149
|
+
expect(q.invalid?).to be_false
|
140
150
|
end
|
141
151
|
|
142
152
|
it 'returns query instances collectly parsed, with field accessing views' do
|
@@ -152,12 +162,14 @@ describe Norikra::Query do
|
|
152
162
|
expect(q.fields('StreamA')).to eql(['size','data','ts1'].sort)
|
153
163
|
expect(q.fields('StreamB')).to eql(['size','header','ts2'].sort)
|
154
164
|
expect(q.fields(nil)).to eql(['product'])
|
165
|
+
|
166
|
+
expect(q.invalid?).to be_false
|
155
167
|
end
|
156
168
|
end
|
157
169
|
|
158
170
|
context 'with query with subquery (where clause)' do
|
159
171
|
it 'returns query instances collectly parsed' do
|
160
|
-
expression = 'select
|
172
|
+
expression = 'select zoneId from RfidEvent as RFID where "Dock 1" = (select name from Zones.std:unique(zoneName) where zoneId = RFID.zoneId)'
|
161
173
|
q = Norikra::Query.new(
|
162
174
|
:name => 'TestTable query4', :expression => expression
|
163
175
|
)
|
@@ -169,6 +181,8 @@ describe Norikra::Query do
|
|
169
181
|
expect(q.fields('RfidEvent')).to eql(['zoneId'])
|
170
182
|
expect(q.fields('Zones')).to eql(['name','zoneName','zoneId'].sort)
|
171
183
|
expect(q.fields(nil)).to eql([])
|
184
|
+
|
185
|
+
expect(q.invalid?).to be_false
|
172
186
|
end
|
173
187
|
end
|
174
188
|
|
@@ -186,12 +200,14 @@ describe Norikra::Query do
|
|
186
200
|
expect(q.fields('RfidEvent')).to eql(['zoneId'])
|
187
201
|
expect(q.fields('Zones')).to eql(['name','zoneName','zoneId'].sort)
|
188
202
|
expect(q.fields(nil)).to eql([])
|
203
|
+
|
204
|
+
expect(q.invalid?).to be_false
|
189
205
|
end
|
190
206
|
end
|
191
207
|
|
192
208
|
context 'with query with subquery (from clause)' do
|
193
209
|
it 'returns query instances collectly parsed' do
|
194
|
-
expression = "select
|
210
|
+
expression = "select ticker, closePrice from BarData(ticker='MSFT', sub(closePrice, (select movAgv from SMA20Stream(ticker='MSFT').std:lastevent())) > 0)"
|
195
211
|
q = Norikra::Query.new(
|
196
212
|
:name => 'TestTable query6', :expression => expression
|
197
213
|
)
|
@@ -203,6 +219,8 @@ describe Norikra::Query do
|
|
203
219
|
expect(q.fields('BarData')).to eql(['ticker','closePrice'].sort)
|
204
220
|
expect(q.fields('SMA20Stream')).to eql(['movAgv','ticker'].sort)
|
205
221
|
expect(q.fields(nil)).to eql([])
|
222
|
+
|
223
|
+
expect(q.invalid?).to be_false
|
206
224
|
end
|
207
225
|
end
|
208
226
|
|
@@ -220,6 +238,8 @@ describe Norikra::Query do
|
|
220
238
|
expect(q.fields).to eql(['params.path', 'size', 'opts.$0'].sort)
|
221
239
|
expect(q.fields('TestTable')).to eql(['params.path', 'size', 'opts.$0'].sort)
|
222
240
|
expect(q.fields(nil)).to eql([])
|
241
|
+
|
242
|
+
expect(q.invalid?).to be_false
|
223
243
|
end
|
224
244
|
end
|
225
245
|
|
@@ -237,6 +257,8 @@ describe Norikra::Query do
|
|
237
257
|
expect(q.fields).to eql(['params.$$path.$1', 'size.$0.bytes', 'opts.num.$0'].sort)
|
238
258
|
expect(q.fields('TestTable')).to eql(['params.$$path.$1', 'size.$0.bytes', 'opts.num.$0'].sort)
|
239
259
|
expect(q.fields(nil)).to eql([])
|
260
|
+
|
261
|
+
expect(q.invalid?).to be_false
|
240
262
|
end
|
241
263
|
|
242
264
|
it 'can parse with nested function calls correctly' do
|
@@ -249,6 +271,8 @@ describe Norikra::Query do
|
|
249
271
|
expression = 'SELECT path.f1.substring(0, path.f1.index("?")) AS urlpath, COUNT(*) AS count FROM TestTable.win:time_batch(60 seconds) GROUP BY path.f1.substring(0, path.f1.index("?"))'
|
250
272
|
q = Norikra::Query.new(:name => 'TestTable query8.2', :expression => expression)
|
251
273
|
expect(q.fields).to eql(['path.f1'])
|
274
|
+
|
275
|
+
expect(q.invalid?).to be_false
|
252
276
|
end
|
253
277
|
end
|
254
278
|
|
@@ -259,6 +283,8 @@ describe Norikra::Query do
|
|
259
283
|
expect(q.fields).to eql(['path.source', 'ts'].sort)
|
260
284
|
expect(q.fields('TestTable')).to eql(['path.source', 'ts'].sort)
|
261
285
|
expect(q.fields(nil)).to eql([])
|
286
|
+
|
287
|
+
expect(q.invalid?).to be_false
|
262
288
|
end
|
263
289
|
end
|
264
290
|
|
@@ -277,6 +303,18 @@ describe Norikra::Query do
|
|
277
303
|
expect(q.fields).to eql(['name', 'content', 'type', 'source'].sort)
|
278
304
|
expect(q.fields('EventA')).to eql(['name', 'content', 'type', 'source'].sort)
|
279
305
|
expect(q.fields(nil)).to eql([])
|
306
|
+
|
307
|
+
expect(q.invalid?).to be_false
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
context 'with "*" selection list' do
|
312
|
+
it 'returns query instance which is singed as invalid for norikra query' do
|
313
|
+
expression = "select * from target1 where key1=1"
|
314
|
+
q = Norikra::Query.new(
|
315
|
+
name: 'Invalid query 1', expression: expression
|
316
|
+
)
|
317
|
+
expect(q.invalid?).to be_true
|
280
318
|
end
|
281
319
|
end
|
282
320
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: norikra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- TAGOMORI Satoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mizuno
|