norikra 1.0.4-java → 1.0.5-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.
- 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
|