norikra 0.1.5-java → 0.1.6-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/README.md +27 -25
- data/lib/norikra/query.rb +18 -1
- data/lib/norikra/query/ast.rb +3 -1
- data/lib/norikra/version.rb +1 -1
- data/spec/query_spec.rb +37 -0
- 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: 0250e9866cf7d804dee32f348e8aa7832fbf5ef2
|
4
|
+
data.tar.gz: a91fb11a6ed74fd8bc2bc56108c62e4a4d3e8b0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 506b88f4cb736f441566f9ee02d34fbe7d2c990cddcf8bf8c30c2ebe907010a8dc44fc5586db57985d86fcf8f6aa784f09b80e12d8211147315621d230fbd8b6
|
7
|
+
data.tar.gz: 5913062545c129fcdd227260c1c0081ed8f7ff3682103f833f03e41740571be637ca35968e6264d94690900e62b499b0460270a14a1fcb2a5e5c6c9a0ab80f87
|
data/README.md
CHANGED
@@ -69,37 +69,39 @@ See: http://norikra.github.io/
|
|
69
69
|
|
70
70
|
## Changes
|
71
71
|
|
72
|
+
* v0.1.6:
|
73
|
+
* Fix bug: Wrong escape for java instance method calls
|
72
74
|
* v0.1.5:
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
75
|
+
* Add RPC port monitoring handler (GET /)
|
76
|
+
* Add `Pattern` support
|
77
|
+
* Changes for GC/JVM
|
78
|
+
* Server starts with default(recommended) JVM options for GC configurations
|
79
|
+
* Add option not to use default JVM options
|
80
|
+
* Add option to configure JVM to print GC logs
|
81
|
+
* Stats file changes
|
82
|
+
* Changed to use SIGUSR2 (SIGUSR1 is used by JVM on linux platform)
|
83
|
+
* Changed no to contain server process configurations (ports, threads, logs ...)
|
84
|
+
* WebUI improvements
|
85
|
+
* Add button to close target on WebUI
|
86
|
+
* Add link to download stats file
|
87
|
+
* Fix bugs
|
88
|
+
* Fieldname handlings about names with non-alphabetic chars
|
89
|
+
* Query parser bug for some built-in functions (ex: `rate(10)`)
|
90
|
+
* Write stats file in more safe way
|
91
|
+
* WebUI: Incorrect memory bar
|
90
92
|
* v0.1.4:
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
93
|
+
* Stat dump option on runtime per specified intervals (`--dump-stat-interval`)
|
94
|
+
* Stat dump on demand by SIGUSR1
|
95
|
+
* `norikra-client event see` command (and API call) to get query results, but not remove it
|
96
|
+
* Last modified time for each target on WebUI
|
95
97
|
* v0.1.3:
|
96
|
-
|
98
|
+
* Fix critical bug about query de-registration
|
97
99
|
* v0.1.2:
|
98
|
-
|
100
|
+
* Fix CLI start command to detect jruby path collectly (behind rbenv/rvm and others)
|
99
101
|
* v0.1.1:
|
100
|
-
|
102
|
+
* Fix types more explicitly for users ('int/long' -> 'integer', 'float/double' -> 'float')
|
101
103
|
* v0.1.0:
|
102
|
-
|
104
|
+
* First release for production
|
103
105
|
|
104
106
|
## Copyright
|
105
107
|
|
data/lib/norikra/query.rb
CHANGED
@@ -215,7 +215,24 @@ module Norikra
|
|
215
215
|
else
|
216
216
|
raise Norikra::QueryError, "target cannot be determined for field '#{name}'"
|
217
217
|
end
|
218
|
-
|
218
|
+
#### 'field.javaMethod("args")' MUST NOT be escaped....
|
219
|
+
# 'getPropertyName' returns a String "path.index(\".\")" for java method calling,
|
220
|
+
# and other optional informations are not provided.
|
221
|
+
# We seems that '.camelCase(ANYTHING)' should be a method calling, not nested field accesses.
|
222
|
+
# This is ugly, but works.
|
223
|
+
#
|
224
|
+
# 'path.substring(0, path.indexOf(path.substring(1,1)))' is parsed as 3-times-nested LIB_FUNCTION_CHAIN,
|
225
|
+
# so does not make errors.
|
226
|
+
#
|
227
|
+
method_chains = []
|
228
|
+
body_chains = body.split('.')
|
229
|
+
while body_chains.size > 0
|
230
|
+
break unless body_chains.last =~ /^[a-z][a-zA-Z]*\(.*\)$/
|
231
|
+
method_chains.unshift body_chains.pop
|
232
|
+
end
|
233
|
+
|
234
|
+
escaped_body = Norikra::Field.escape_name(body_chains.join('.'))
|
235
|
+
encoded = (prefix ? "#{prefix}." : "") + escaped_body + (method_chains.size > 0 ? '.' + method_chains.join('.') : '' )
|
219
236
|
node.send(setter, encoded)
|
220
237
|
end
|
221
238
|
}
|
data/lib/norikra/query/ast.rb
CHANGED
@@ -207,6 +207,8 @@ module Norikra
|
|
207
207
|
# "bbb" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "bbb"]]
|
208
208
|
# "fraud.aaa" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "fraud"], ["EVENT_PROP_SIMPLE", "aaa"]]
|
209
209
|
# "size.$0.bytes" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "size"], ["EVENT_PROP_SIMPLE", "$0"], ["EVENT_PROP_SIMPLE", "bytes"]]
|
210
|
+
# "field.index("?")" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "path"], ["EVENT_PROP_MAPPED", "index", "\"?\""]]
|
211
|
+
# "field.f1.index(".")" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "path"], ["EVENT_PROP_SIMPLE", "q1"], ["EVENT_PROP_MAPPED", "index", "\".\""]]
|
210
212
|
|
211
213
|
def nodetype?(*sym)
|
212
214
|
sym.include?(:prop) || sym.include?(:property)
|
@@ -214,7 +216,7 @@ module Norikra
|
|
214
216
|
|
215
217
|
def fields(default_target=nil, known_targets_aliases=[])
|
216
218
|
props = self.listup('EVENT_PROP_SIMPLE')
|
217
|
-
if props.size > 1 # alias.fieldname or container_fieldname.key.$1
|
219
|
+
if props.size > 1 # alias.fieldname or container_fieldname.key.$1 or fieldname.method(...)
|
218
220
|
if known_targets_aliases.include?(props[0].child.name)
|
219
221
|
[ {:f => props[1..-1].map{|n| n.child.name}.join("."), :t => props[0].child.name} ]
|
220
222
|
else
|
data/lib/norikra/version.rb
CHANGED
data/spec/query_spec.rb
CHANGED
@@ -175,6 +175,18 @@ describe Norikra::Query do
|
|
175
175
|
expect(q.fields('TestTable')).to eql(['params.$$path.$1', 'size.$0.bytes', 'opts.num.$0'].sort)
|
176
176
|
expect(q.fields(nil)).to eql([])
|
177
177
|
end
|
178
|
+
|
179
|
+
it 'can parse with nested function calls correctly' do
|
180
|
+
expression = 'SELECT path.substring(0, path.index("?")) AS urlpath, COUNT(*) AS count FROM TestTable.win:time_batch(60 seconds) GROUP BY path.substring(0, path.index("?"))'
|
181
|
+
q = Norikra::Query.new(:name => 'TestTable query8.1', :expression => expression)
|
182
|
+
expect(q.fields).to eql(['path'])
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'can parse with nested function calls w/ nested fields correctly' do
|
186
|
+
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("?"))'
|
187
|
+
q = Norikra::Query.new(:name => 'TestTable query8.2', :expression => expression)
|
188
|
+
expect(q.fields).to eql(['path.f1'])
|
189
|
+
end
|
178
190
|
end
|
179
191
|
|
180
192
|
context 'with query with patterns' do
|
@@ -333,60 +345,85 @@ describe Norikra::Query do
|
|
333
345
|
describe '.rewrite_query' do
|
334
346
|
it 'rewrites all of targets and container-field-accesses' do
|
335
347
|
with_engine do
|
348
|
+
# single simple query
|
336
349
|
e1 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path = "/" and size > 100 and (param.length()) > 0'
|
337
350
|
x1 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path = "/" and size > 100 and (param.length()) > 0'
|
338
351
|
model = administrator.compileEPL(e1)
|
339
352
|
mapping = {'TestTable' => 'T1'}
|
340
353
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
341
354
|
|
355
|
+
# nested container field access
|
342
356
|
e2 = 'select max(result.$0.size) as cnt from TestTable.win:time_batch(10 seconds) where req.path = "/" and result.$0.size > 100 and (req.param.length()) > 0'
|
343
357
|
x2 = 'select max(result$$0$size) as cnt from T1.win:time_batch(10 seconds) where req$path = "/" and result$$0$size > 100 and (req$param.length()) > 0'
|
344
358
|
model = administrator.compileEPL(e2)
|
345
359
|
mapping = {'TestTable' => 'T1'}
|
346
360
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x2)
|
347
361
|
|
362
|
+
# nested container field access w/ function call and alias
|
348
363
|
e3 = 'select product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size > 10).win:time(20 seconds) as stb where (sta.data.$0.$$body.substr(0, 8)) = stb.header and (Math.abs(sta.size)) > 3'
|
349
364
|
x3 = 'select product, max(sta.param$size) as maxsize from S1.win:keepall() as sta, S2(size > 10).win:time(20 seconds) as stb where (sta.data$$0$$$body.substr(0, 8)) = stb.header and (Math.abs(sta.size)) > 3'
|
350
365
|
model = administrator.compileEPL(e3)
|
351
366
|
mapping = {'StreamA' => 'S1', 'StreamB' => 'S2'}
|
352
367
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3)
|
353
368
|
|
369
|
+
# nested function call
|
370
|
+
e3a = 'select path.substring(0, path.index("?")) as urlpath, count(*) as count from TestTable.win:time_batch(60 seconds) group by path.substring(0, path.index("?"))'
|
371
|
+
x3a = 'select path.substring(0, path.index("?")) as urlpath, count(*) as count from T1.win:time_batch(60 seconds) group by path.substring(0, path.index("?"))'
|
372
|
+
model = administrator.compileEPL(e3a)
|
373
|
+
mapping = {'TestTable' => 'T1'}
|
374
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3a)
|
375
|
+
|
376
|
+
# nested function call w/ container field access
|
377
|
+
e3b = '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("?"))'
|
378
|
+
x3b = 'select path$f1.substring(0, path$f1.index("?")) as urlpath, count(*) as count from T1.win:time_batch(60 seconds) group by path$f1.substring(0, path$f1.index("?"))'
|
379
|
+
model = administrator.compileEPL(e3b)
|
380
|
+
mapping = {'TestTable' => 'T1'}
|
381
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3b)
|
382
|
+
|
383
|
+
|
384
|
+
# Fully-qualified field access
|
354
385
|
e4 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path = "/" and TestTable.size > 100 and (param.length()) > 0'
|
355
386
|
x4 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path = "/" and T1.size > 100 and (param.length()) > 0'
|
356
387
|
model = administrator.compileEPL(e4)
|
357
388
|
mapping = {'TestTable' => 'T1'}
|
358
389
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x4)
|
359
390
|
|
391
|
+
# Fully-qualified field access w/ container field access
|
360
392
|
e5 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId = RfidEvent.zoneId.$0) as name from RfidEvent'
|
361
393
|
x5 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId = R1.zoneId$$0) as name from R1'
|
362
394
|
model = administrator.compileEPL(e5)
|
363
395
|
mapping = {'RfidEvent' => 'R1', 'Zones' => 'Z1'}
|
364
396
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x5)
|
365
397
|
|
398
|
+
# Fully-qualified field access w/ container field access and function calls, JOINs
|
366
399
|
e6 = 'select StreamA.product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size > 10).win:time(20 seconds) as stb where (sta.data.$0.$$body.substr(0, 8)) = StreamB.header.$0 and (Math.abs(StreamA.size.$0.$$abs)) > 3'
|
367
400
|
x6 = 'select S1.product, max(sta.param$size) as maxsize from S1.win:keepall() as sta, S2(size > 10).win:time(20 seconds) as stb where (sta.data$$0$$$body.substr(0, 8)) = S2.header$$0 and (Math.abs(S1.size$$0$$$abs)) > 3'
|
368
401
|
model = administrator.compileEPL(e6)
|
369
402
|
mapping = {'StreamA' => 'S1', 'StreamB' => 'S2'}
|
370
403
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x6)
|
371
404
|
|
405
|
+
# ??? simple query
|
372
406
|
e7 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path = "/" and size > 100 and (param.length()) > 0'
|
373
407
|
x7 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path = "/" and size > 100 and (param.length()) > 0'
|
374
408
|
model = administrator.compileEPL(e7)
|
375
409
|
mapping = {'TestTable' => 'T1'}
|
376
410
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x7)
|
377
411
|
|
412
|
+
# subquery
|
378
413
|
e8 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId = RfidEvent.zoneId.$0) as name from RfidEvent'
|
379
414
|
x8 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId = R1.zoneId$$0) as name from R1'
|
380
415
|
model = administrator.compileEPL(e8)
|
381
416
|
mapping = {'Zones' => 'Z1', 'RfidEvent' => 'R1'}
|
382
417
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x8)
|
383
418
|
|
419
|
+
# filters and subquery
|
384
420
|
e9 = 'select * from BarData(ticker = "MSFT" and (sub(closePrice, (select movAgv from SMA20Stream(ticker = "MSFT").std:lastevent())) > 0))'
|
385
421
|
x9 = 'select * from B1(ticker = "MSFT" and (sub(closePrice, (select movAgv from S1(ticker = "MSFT").std:lastevent()))) > 0)'
|
386
422
|
model = administrator.compileEPL(e9)
|
387
423
|
mapping = {'BarData' => 'B1', 'SMA20Stream' => 'S1'}
|
388
424
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x9)
|
389
425
|
|
426
|
+
# JOINs
|
390
427
|
e10 = 'select product, max(sta.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size > 10).win:time(20 seconds) as stb where (sta.data.substr(0, 8)) = stb.header and (Math.abs(sta.size)) > 3'
|
391
428
|
x10 = 'select product, max(sta.size) as maxsize from S1.win:keepall() as sta, S2(size > 10).win:time(20 seconds) as stb where (sta.data.substr(0, 8)) = stb.header and (Math.abs(sta.size)) > 3'
|
392
429
|
model = administrator.compileEPL(e10)
|
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: 0.1.
|
4
|
+
version: 0.1.6
|
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-03-
|
11
|
+
date: 2014-03-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mizuno
|