norikra 0.1.6-java → 0.1.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.
- checksums.yaml +4 -4
- data/lib/norikra/query.rb +12 -11
- data/lib/norikra/query/ast.rb +9 -0
- data/lib/norikra/version.rb +1 -1
- data/script/spec_server_pry +17 -3
- data/spec/query_spec.rb +100 -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: c60623a71ba50774fd30d435b33ddd5abddb5a32
|
4
|
+
data.tar.gz: 4540758d58b47d144feaa504087a393a7853d380
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fba4984d9d6c96573f169d5d7fe1f62e6bf711666c0546886d11fce7723beaaf64dce7a30d884b1c05870c7edce49603345e18d660c6d67824d408e22ef768ba
|
7
|
+
data.tar.gz: 3359da4c4bd851e4f2191ab859b902843619d17124da18b5fe6ab7f3c9fe1d07afed9d12b0e4579fc5b81c40ebba7db0a8035fe1e831dd0dea3ec7367c7d820f
|
data/lib/norikra/query.rb
CHANGED
@@ -260,22 +260,22 @@ module Norikra
|
|
260
260
|
# Subqueries can only consist of a select clause, a from clause and a where clause.
|
261
261
|
# The group by and having clauses, as well as joins, outer-joins and output rate limiting are not permitted within subqueries.
|
262
262
|
|
263
|
-
# model.getFromClause.getStreams[0].getFilter.setEventTypeName("hoge")
|
263
|
+
# model.getFromClause.getStreams[0].getFilter.setEventTypeName("hoge") # normal Stream
|
264
|
+
# model.getFromClause.getStreams[1].getExpression.getChildren[0].getChildren[0].getFilter.getEventTypeName # pattern
|
264
265
|
|
265
266
|
# model.getSelectClause.getSelectList[1].getExpression => #<Java::ComEspertechEsperClientSoda::SubqueryExpression:0x3344c133>
|
266
267
|
# model.getSelectClause.getSelectList[1].getExpression.getModel.getFromClause.getStreams[0].getFilter.getEventTypeName
|
267
268
|
# model.getWhereClause.getChildren[1] .getModel.getFromClause.getStreams[0].getFilter.getEventTypeName
|
268
269
|
|
269
|
-
statement_model.getFromClause.getStreams.each do |stream|
|
270
|
-
target_name = stream.getFilter.getEventTypeName
|
271
|
-
unless mapping[target_name]
|
272
|
-
raise RuntimeError, "target missing in mapping, maybe BUG"
|
273
|
-
end
|
274
|
-
stream.getFilter.setEventTypeName(mapping[target_name])
|
275
|
-
end
|
276
|
-
|
277
270
|
rewriter = lambda {|node|
|
278
|
-
|
271
|
+
if node.respond_to?(:getEventTypeName)
|
272
|
+
target_name = node.getEventTypeName
|
273
|
+
rewrite_name = mapping[ target_name ]
|
274
|
+
unless rewrite_name
|
275
|
+
raise RuntimeError, "target missing in mapping, maybe BUG: #{target_name}"
|
276
|
+
end
|
277
|
+
node.setEventTypeName(rewrite_name)
|
278
|
+
end
|
279
279
|
}
|
280
280
|
recaller = lambda {|node|
|
281
281
|
Norikra::Query.rewrite_event_type_name(node.getModel, mapping)
|
@@ -314,6 +314,7 @@ module Norikra
|
|
314
314
|
def self.traverse_fields(rewriter, recaller, statement_model)
|
315
315
|
#NOTICE: SQLStream is not supported yet.
|
316
316
|
dig = lambda {|node|
|
317
|
+
return unless node
|
317
318
|
rewriter.call(node)
|
318
319
|
|
319
320
|
if node.is_a?(Java::ComEspertechEsperClientSoda::SubqueryExpression)
|
@@ -344,7 +345,7 @@ module Norikra
|
|
344
345
|
dig.call(stream.getExpression)
|
345
346
|
end
|
346
347
|
if stream.respond_to?(:getFilter) # Filter < ProjectedStream
|
347
|
-
dig.call(stream.getFilter
|
348
|
+
dig.call(stream.getFilter)
|
348
349
|
end
|
349
350
|
if stream.respond_to?(:getParameterExpressions) # MethodInvocationStream
|
350
351
|
dig.call(stream.getParameterExpressions)
|
data/lib/norikra/query/ast.rb
CHANGED
@@ -210,6 +210,11 @@ module Norikra
|
|
210
210
|
# "field.index("?")" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "path"], ["EVENT_PROP_MAPPED", "index", "\"?\""]]
|
211
211
|
# "field.f1.index(".")" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "path"], ["EVENT_PROP_SIMPLE", "q1"], ["EVENT_PROP_MAPPED", "index", "\".\""]]
|
212
212
|
|
213
|
+
#### escapes: Oops!!!! unsupported yet.
|
214
|
+
# "`path name`" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "`path name`"]]
|
215
|
+
# "`T Table`.`path name`" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "`T Testing`"], ["EVENT_PROP_SIMPLE", "`path name`"]]
|
216
|
+
# "`size.num`" => ["EVENT_PROP_EXPR", ["EVENT_PROP_SIMPLE", "`size.num`"]]
|
217
|
+
|
213
218
|
def nodetype?(*sym)
|
214
219
|
sym.include?(:prop) || sym.include?(:property)
|
215
220
|
end
|
@@ -258,6 +263,10 @@ module Norikra
|
|
258
263
|
# 2nd child is bare-word (like [a-z][a-z0-9]*) -> this is function -> 1st child is receiver -> property
|
259
264
|
# 2nd child is literal or property or none -> 1st child is built-in function
|
260
265
|
|
266
|
+
### escaped name access
|
267
|
+
# "`T Table`.param.length()" => ["LIB_FUNC_CHAIN", ["LIB_FUNCTION", "TestTable Testing.param", "length", "("]]
|
268
|
+
## Oops! we CANNOT support this syntax
|
269
|
+
|
261
270
|
def nodetype?(*sym)
|
262
271
|
sym.include?(:lib) || sym.include?(:libfunc)
|
263
272
|
end
|
data/lib/norikra/version.rb
CHANGED
data/script/spec_server_pry
CHANGED
@@ -32,8 +32,8 @@ def administrator
|
|
32
32
|
$administrator ||= service.getEPAdministrator
|
33
33
|
end
|
34
34
|
|
35
|
-
def compileEPL(
|
36
|
-
administrator.compileEPL(
|
35
|
+
def compileEPL(query)
|
36
|
+
administrator.compileEPL(query.expression)
|
37
37
|
end
|
38
38
|
|
39
39
|
def query_string(model)
|
@@ -43,7 +43,11 @@ def query_string(model)
|
|
43
43
|
model.toEPLElement(writer)
|
44
44
|
writer.toString
|
45
45
|
elsif model.respond_to?(:toPrecedenceFreeEPL)
|
46
|
-
|
46
|
+
begin
|
47
|
+
model.toPrecedenceFreeEPL(writer)
|
48
|
+
rescue ArgumentError
|
49
|
+
model.toPrecedenceFreeEPL(writer, formatter)
|
50
|
+
end
|
47
51
|
writer.toString
|
48
52
|
elsif model.is_a?(Java::ComEspertechEsperClientSoda::EPStatementObjectModel)
|
49
53
|
model.toEPL
|
@@ -53,6 +57,16 @@ def query_string(model)
|
|
53
57
|
end
|
54
58
|
end
|
55
59
|
|
60
|
+
def compiledExpression(query)
|
61
|
+
model = compileEPL(query)
|
62
|
+
mapping = {}
|
63
|
+
query.targets.each do |target|
|
64
|
+
mapping[target] = target
|
65
|
+
end
|
66
|
+
Norikra::Query.rewrite_query(model, mapping)
|
67
|
+
query_string(model)
|
68
|
+
end
|
69
|
+
|
56
70
|
puts <<DESC
|
57
71
|
|
58
72
|
Example:
|
data/spec/query_spec.rb
CHANGED
@@ -24,6 +24,54 @@ describe Norikra::Query do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
### Escaped target/field names are not supported yet!
|
28
|
+
# context 'with escaped abnormal field name' do
|
29
|
+
# it 'returns instance wrongly parsed for field with instance method call' do
|
30
|
+
# expression = 'SELECT count(*) AS cnt FROM `TestTable Testing`.win:time_batch(10 sec) WHERE `path name`="/" AND size > 100 and `param string`.length() > 0'
|
31
|
+
# q = Norikra::Query.new(
|
32
|
+
# :name => 'TestTable query1.1', :expression => expression
|
33
|
+
# )
|
34
|
+
# expect(q.name).to eql('TestTable query1.1')
|
35
|
+
# expect(q.group).to be_nil
|
36
|
+
# expect(q.expression).to eql(expression)
|
37
|
+
# expect(q.targets).to eql(['TestTable Testing'])
|
38
|
+
|
39
|
+
# expect(q.fields).to eql(['param string', '`path name`', 'size'].sort)
|
40
|
+
# expect(q.fields('TestTable Testing')).to eql(['param string','`path name`','size'].sort) # 'param string' is not escaped!
|
41
|
+
# expect(q.fields(nil)).to eql([])
|
42
|
+
# end
|
43
|
+
|
44
|
+
# it 'returns instance correctly parsed w/ fully-qualified escaped name fields' do
|
45
|
+
# expression = 'SELECT count(*) AS cnt FROM `TestTable Testing`.win:time_batch(10 sec) WHERE `TestTable Testing`.`path name`="/" AND `size.num` > 100 and `TestTable Testing`.param.length() > 0'
|
46
|
+
# q = Norikra::Query.new(
|
47
|
+
# :name => 'TestTable query1.2', :expression => expression
|
48
|
+
# )
|
49
|
+
# expect(q.name).to eql('TestTable query1.2')
|
50
|
+
# expect(q.group).to be_nil
|
51
|
+
# expect(q.expression).to eql(expression)
|
52
|
+
# expect(q.targets).to eql(['TestTable Testing'])
|
53
|
+
|
54
|
+
# expect(q.fields).to eql(['param', '`path name`', '`size.num`'].sort)
|
55
|
+
# expect(q.fields('TestTable Testing')).to eql(['param','`path name`','`size.num`'].sort)
|
56
|
+
# expect(q.fields(nil)).to eql([])
|
57
|
+
# end
|
58
|
+
|
59
|
+
# it 'returns instance correctly parsed w/ fully-qualified escaped name fields' do
|
60
|
+
# expression = 'SELECT count(*) AS cnt FROM `TestTable Testing`.win:time_batch(10 sec) WHERE path\.name="/" AND size\.num > 100 and `TestTable Testing`.param\.name.length() > 0'
|
61
|
+
# q = Norikra::Query.new(
|
62
|
+
# :name => 'TestTable query1.3', :expression => expression
|
63
|
+
# )
|
64
|
+
# expect(q.name).to eql('TestTable query1.3')
|
65
|
+
# expect(q.group).to be_nil
|
66
|
+
# expect(q.expression).to eql(expression)
|
67
|
+
# expect(q.targets).to eql(['TestTable Testing'])
|
68
|
+
|
69
|
+
# expect(q.fields).to eql(['param\.name', 'path\.name', 'size\.num'].sort)
|
70
|
+
# expect(q.fields('TestTable Testing')).to eql(['param\.name', 'path\.name', 'size\.num'].sort)
|
71
|
+
# expect(q.fields(nil)).to eql([])
|
72
|
+
# end
|
73
|
+
# end
|
74
|
+
|
27
75
|
context 'with top-level built-in functions' do
|
28
76
|
it 'returns query instances collectly parsed' do
|
29
77
|
expression = 'SELECT rate(10) FROM TestTable output snapshot every 2 sec'
|
@@ -90,6 +138,21 @@ describe Norikra::Query do
|
|
90
138
|
expect(q.fields('StreamB')).to eql(['size','header'].sort)
|
91
139
|
expect(q.fields(nil)).to eql(['product'])
|
92
140
|
end
|
141
|
+
|
142
|
+
it 'returns query instances collectly parsed, with field accessing views' do
|
143
|
+
expression = 'select product, max(sta.size) as maxsize from StreamA.win:ext_timed_batch(ts1, 1 hours, 0L) as sta, StreamB(size > 10).win:ext_timed_batch(ts2, 20 sec) as stb where sta.data.substr(0,8) = stb.header AND Math.abs(sta.size) > 3'
|
144
|
+
q = Norikra::Query.new(
|
145
|
+
:name => 'TestTable query3.1', :expression => expression
|
146
|
+
)
|
147
|
+
expect(q.name).to eql('TestTable query3.1')
|
148
|
+
expect(q.expression).to eql(expression)
|
149
|
+
expect(q.targets).to eql(['StreamA', 'StreamB'])
|
150
|
+
|
151
|
+
expect(q.fields).to eql(['product', 'size', 'ts1', 'data', 'header', 'ts2'].sort)
|
152
|
+
expect(q.fields('StreamA')).to eql(['size','data','ts1'].sort)
|
153
|
+
expect(q.fields('StreamB')).to eql(['size','header','ts2'].sort)
|
154
|
+
expect(q.fields(nil)).to eql(['product'])
|
155
|
+
end
|
93
156
|
end
|
94
157
|
|
95
158
|
context 'with query with subquery (where clause)' do
|
@@ -189,6 +252,16 @@ describe Norikra::Query do
|
|
189
252
|
end
|
190
253
|
end
|
191
254
|
|
255
|
+
context 'with simple query and views with field reference' do
|
256
|
+
it 'returns query instances collectly parsed' do
|
257
|
+
expression = 'SELECT count(*) AS c FROM TestTable.win:ext_timed_batch(ts, 1 min, 0L) WHERE path.source.length() > 0'
|
258
|
+
q = Norikra::Query.new(:name => 'TestTable query8.3', :expression => expression)
|
259
|
+
expect(q.fields).to eql(['path.source', 'ts'].sort)
|
260
|
+
expect(q.fields('TestTable')).to eql(['path.source', 'ts'].sort)
|
261
|
+
expect(q.fields(nil)).to eql([])
|
262
|
+
end
|
263
|
+
end
|
264
|
+
|
192
265
|
context 'with query with patterns' do
|
193
266
|
it 'returns query instances collectly parsed' do
|
194
267
|
|
@@ -352,6 +425,20 @@ describe Norikra::Query do
|
|
352
425
|
mapping = {'TestTable' => 'T1'}
|
353
426
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
354
427
|
|
428
|
+
## not supported yet!
|
429
|
+
# # escaped abnormal field name / target name
|
430
|
+
# e1a = 'select count(*) as cnt from `TestTable Testing`.win:time_batch(10 sec) where `TestTable testing`.`path name`="/" and size > 100 and param.length() > 0'
|
431
|
+
# x1a = 'select count(*) as cnt from T2.win:time_batch(10 seconds) where T2.`path name`="/" and size > 100 and (param.length()) > 0'
|
432
|
+
# model = administrator.compileEPL(e1a)
|
433
|
+
# mapping = {'TestTable Testing' => 'T2'}
|
434
|
+
# expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1a)
|
435
|
+
|
436
|
+
# e1b = 'select count(*) as cnt from `TestTable Testing`.win:time_batch(10 sec) where path\.name="/" and size\.num > 100 and `testtable testing`.param\.name.length() > 0'
|
437
|
+
# x1b = 'select count(*) as cnt from T2.win:time_batch(10 seconcds) where path\.name="/" and size\.num > 100 and T2.param\.name.length() > 0'
|
438
|
+
# model = administrator.compileEPL(e1b)
|
439
|
+
# mapping = {'TestTable Testing' => 'T2'}
|
440
|
+
# expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1b)
|
441
|
+
|
355
442
|
# nested container field access
|
356
443
|
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'
|
357
444
|
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'
|
@@ -380,6 +467,12 @@ describe Norikra::Query do
|
|
380
467
|
mapping = {'TestTable' => 'T1'}
|
381
468
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3b)
|
382
469
|
|
470
|
+
# views w/ field access
|
471
|
+
e3c = 'select count(*) as c from TestTable.win:ext_timed_batch(TestTable.ts, 1 min, 0L) where path.source.length() > 0'
|
472
|
+
x3c = 'select count(*) as c from T1.win:ext_timed_batch(T1.ts, 1 minutes, 0L) where (path$source.length()) > 0'
|
473
|
+
model = administrator.compileEPL(e3c)
|
474
|
+
mapping = {'TestTable' => 'T1'}
|
475
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3c)
|
383
476
|
|
384
477
|
# Fully-qualified field access
|
385
478
|
e4 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path = "/" and TestTable.size > 100 and (param.length()) > 0'
|
@@ -450,6 +543,13 @@ describe Norikra::Query do
|
|
450
543
|
model = administrator.compileEPL(e13)
|
451
544
|
mapping = {'logs' => 'L111'}
|
452
545
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x13)
|
546
|
+
|
547
|
+
# Pattern
|
548
|
+
e14 = 'select a.type from pattern [every a=TestTable -> b=TestTable(type = a.type)]'
|
549
|
+
x14 = 'select a.type from pattern [every a=T1 -> b=T1(type = a.type)]'
|
550
|
+
model = administrator.compileEPL(e14)
|
551
|
+
mapping = {'TestTable' => 'T1'}
|
552
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x14)
|
453
553
|
end
|
454
554
|
end
|
455
555
|
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: 0.1.
|
4
|
+
version: 0.1.7
|
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-
|
11
|
+
date: 2014-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mizuno
|