norikra 0.1.7-java → 1.0.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/esper/changelog.txt +103 -0
- data/esper/{esper-4.9.0.jar → esper-5.0.0.jar} +0 -0
- data/esper/esper/lib/antlr-runtime-4.1.jar +0 -0
- data/esper/esper/lib/cglib-nodep-3.1.jar +0 -0
- data/esper/esper/lib/commons-logging-1.1.3.jar +0 -0
- data/esper/esper/lib/esper_3rdparties.license +7 -13
- data/esper/esper/lib/log4j-1.2.17.jar +0 -0
- data/esper/esper/lib/readme.txt +7 -7
- data/lib/norikra/cli.rb +8 -2
- data/lib/norikra/engine.rb +55 -6
- data/lib/norikra/field.rb +14 -1
- data/lib/norikra/logger.rb +37 -11
- data/lib/norikra/logger_mizuno_patch.rb +1 -1
- data/lib/norikra/query.rb +56 -19
- data/lib/norikra/query/ast.rb +1129 -246
- data/lib/norikra/rpc/handler.rb +8 -0
- data/lib/norikra/server.rb +5 -4
- data/lib/norikra/stats.rb +7 -1
- data/lib/norikra/udf.rb +11 -2
- data/lib/norikra/udf_spec_helper.rb +3 -1
- data/lib/norikra/version.rb +1 -1
- data/lib/norikra/webui.rb +1 -0
- data/lib/norikra/webui/api.rb +168 -0
- data/lib/norikra/webui/handler.rb +6 -1
- data/lib/norikra/webui/http.rb +5 -0
- data/norikra.gemspec +1 -1
- data/public/css/norikra.css +20 -0
- data/public/js/jquery.min.js +6 -0
- data/public/js/norikra.webui.js +12 -1
- data/script/spec_server_pry +27 -13
- data/spec/field_spec.rb +20 -8
- data/spec/fieldset_spec.rb +11 -0
- data/spec/query_spec.rb +161 -52
- data/spec/stats_spec.rb +6 -1
- data/views/base.erb +2 -1
- data/views/index.erb +12 -0
- metadata +10 -62
- data/esper/esper/lib/antlr-runtime-3.2.jar +0 -0
- data/esper/esper/lib/cglib-nodep-2.2.jar +0 -0
- data/esper/esper/lib/commons-logging-1.1.1.jar +0 -0
- data/esper/esper/lib/log4j-1.2.16.jar +0 -0
- data/esper/esperio-amqp-4.9.0.jar +0 -0
- data/esper/esperio-amqp/lib/commons-cli-1.1.jar +0 -0
- data/esper/esperio-amqp/lib/commons-io-1.2.jar +0 -0
- data/esper/esperio-amqp/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-amqp/lib/esperio_amqp_jars.txt +0 -2
- data/esper/esperio-amqp/lib/rabbitmq-client.jar +0 -0
- data/esper/esperio-csv-4.9.0.jar +0 -0
- data/esper/esperio-csv/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-db-4.9.0.jar +0 -0
- data/esper/esperio-db/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-http-4.9.0.jar +0 -0
- data/esper/esperio-http/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-http/lib/httpclient-4.0.1.jar +0 -0
- data/esper/esperio-http/lib/httpcore-4.0.1.jar +0 -0
- data/esper/esperio-http/lib/httpcore-nio-4.0.1.jar +0 -0
- data/esper/esperio-license.txt +0 -95
- data/esper/esperio-socket-4.9.0.jar +0 -0
- data/esper/esperio-socket/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-springjms-4.9.0.jar +0 -0
- data/esper/esperio-springjms/lib/activation-1.1.jar +0 -0
- data/esper/esperio-springjms/lib/activemq-core-5.7.0.jar +0 -0
- data/esper/esperio-springjms/lib/activemq-pool-5.7.0.jar +0 -0
- data/esper/esperio-springjms/lib/commons-pool-1.6.jar +0 -0
- data/esper/esperio-springjms/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-springjms/lib/geronimo-j2ee-management_1.1_spec-1.0.1.jar +0 -0
- data/esper/esperio-springjms/lib/geronimo-jms_1.1_spec-1.1.1.jar +0 -0
- data/esper/esperio-springjms/lib/junit-4.8.2.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.asm-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.beans-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.context-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.core-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.expression-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.jms-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/org.springframework.transaction-3.1.1.RELEASE.jar +0 -0
- data/esper/esperio-springjms/lib/slf4j-api-1.7.2.jar +0 -0
- data/esper/esperio-springjms/lib/slf4j-log4j12-1.7.2.jar +0 -0
- data/esper/esperio-stax-4.9.0.jar +0 -0
- data/esper/esperio-stax/lib/axiom-api-1.2.9.jar +0 -0
- data/esper/esperio-stax/lib/axiom-c14n-1.2.9.jar +0 -0
- data/esper/esperio-stax/lib/axiom-dom-1.2.9.jar +0 -0
- data/esper/esperio-stax/lib/axiom-impl-1.2.9.jar +0 -0
- data/esper/esperio-stax/lib/commons-logging-1.1.1.jar +0 -0
- data/esper/esperio-stax/lib/commons-logging-LICENSE.txt +0 -203
- data/esper/esperio-stax/lib/esperio_3rdparties.license +0 -1328
- data/esper/esperio-stax/lib/geronimo-activation-LICENSE.txt +0 -203
- data/esper/esperio-stax/lib/geronimo-activation_1.1_spec-1.0.2.jar +0 -0
- data/esper/esperio-stax/lib/geronimo-javamail-LICENSE.txt +0 -203
- data/esper/esperio-stax/lib/geronimo-javamail_1.4_spec-1.6.jar +0 -0
- data/esper/esperio-stax/lib/geronimo-stax-api-LICENSE.txt +0 -203
- data/esper/esperio-stax/lib/geronimo-stax-api_1.0_spec-1.0.1.jar +0 -0
- data/esper/esperio-stax/lib/jaxen-1.1.1.jar +0 -0
- data/esper/esperio-stax/lib/jaxen-LICENSE.txt +0 -33
- data/esper/esperio-stax/lib/wstx-LICENSE.txt +0 -203
- data/esper/esperio-stax/lib/wstx-asl-3.2.9.jar +0 -0
data/spec/field_spec.rb
CHANGED
@@ -145,9 +145,10 @@ describe Norikra::Field do
|
|
145
145
|
expect(f.format(' ')).to eql(' ')
|
146
146
|
expect(f.format(true)).to eql('true')
|
147
147
|
expect(f.format(false)).to eql('false')
|
148
|
-
|
149
|
-
expect(f.format(
|
150
|
-
expect(f.format(
|
148
|
+
|
149
|
+
expect(f.format(nil)).to be_nil
|
150
|
+
expect(f.format({})).to be_nil
|
151
|
+
expect(f.format([])).to be_nil
|
151
152
|
end
|
152
153
|
end
|
153
154
|
end
|
@@ -158,11 +159,14 @@ describe Norikra::Field do
|
|
158
159
|
f = Norikra::Field.new('x', 'boolean')
|
159
160
|
expect(f.format(true)).to eql(true)
|
160
161
|
expect(f.format(false)).to eql(false)
|
161
|
-
expect(f.format(nil)).to eql(false)
|
162
162
|
expect(f.format('')).to eql(true)
|
163
163
|
|
164
164
|
expect(f.format('true')).to eql(true)
|
165
165
|
expect(f.format('false')).to eql(false)
|
166
|
+
|
167
|
+
expect(f.format(nil)).to be_nil
|
168
|
+
expect(f.format({})).to be_nil
|
169
|
+
expect(f.format([])).to be_nil
|
166
170
|
end
|
167
171
|
end
|
168
172
|
end
|
@@ -177,7 +181,9 @@ describe Norikra::Field do
|
|
177
181
|
expect(f.format('.1')).to eql(0)
|
178
182
|
expect(f.format('')).to eql(0)
|
179
183
|
expect(f.format(' ')).to eql(0)
|
180
|
-
expect(f.format(nil)).to
|
184
|
+
expect(f.format(nil)).to be_nil
|
185
|
+
expect(f.format({})).to be_nil
|
186
|
+
expect(f.format([])).to be_nil
|
181
187
|
|
182
188
|
f = Norikra::Field.new('x', 'long')
|
183
189
|
expect(f.format('1')).to eql(1)
|
@@ -186,7 +192,9 @@ describe Norikra::Field do
|
|
186
192
|
expect(f.format('.1')).to eql(0)
|
187
193
|
expect(f.format('')).to eql(0)
|
188
194
|
expect(f.format(' ')).to eql(0)
|
189
|
-
expect(f.format(nil)).to
|
195
|
+
expect(f.format(nil)).to be_nil
|
196
|
+
expect(f.format({})).to be_nil
|
197
|
+
expect(f.format([])).to be_nil
|
190
198
|
|
191
199
|
f = Norikra::Field.new('x', 'float')
|
192
200
|
expect(f.format('1')).to eql(1.0)
|
@@ -195,7 +203,9 @@ describe Norikra::Field do
|
|
195
203
|
expect(f.format('.1')).to eql(0.1)
|
196
204
|
expect(f.format('')).to eql(0.0)
|
197
205
|
expect(f.format(' ')).to eql(0.0)
|
198
|
-
expect(f.format(nil)).to
|
206
|
+
expect(f.format(nil)).to be_nil
|
207
|
+
expect(f.format({})).to be_nil
|
208
|
+
expect(f.format([])).to be_nil
|
199
209
|
|
200
210
|
f = Norikra::Field.new('x', 'double')
|
201
211
|
expect(f.format('1')).to eql(1.0)
|
@@ -204,7 +214,9 @@ describe Norikra::Field do
|
|
204
214
|
expect(f.format('.1')).to eql(0.1)
|
205
215
|
expect(f.format('')).to eql(0.0)
|
206
216
|
expect(f.format(' ')).to eql(0.0)
|
207
|
-
expect(f.format(nil)).to
|
217
|
+
expect(f.format(nil)).to be_nil
|
218
|
+
expect(f.format({})).to be_nil
|
219
|
+
expect(f.format([])).to be_nil
|
208
220
|
end
|
209
221
|
end
|
210
222
|
end
|
data/spec/fieldset_spec.rb
CHANGED
@@ -350,6 +350,17 @@ describe Norikra::FieldSet do
|
|
350
350
|
expect(d['f$foo$$$0']).to be_instance_of(String)
|
351
351
|
expect(d['f$foo$$$0']).to eql('zero')
|
352
352
|
end
|
353
|
+
|
354
|
+
it 'returns nil for value field but events has nested record' do
|
355
|
+
t = Norikra::FieldSet.new({'a' => 'string', 'b' => 'boolean', 'c' => 'long', 'd.$0' => 'double'})
|
356
|
+
|
357
|
+
d = t.format({'a'=>{'a1'=>"1"}, 'b'=>[1,2,3], 'c'=>{'cc'=>0.01}, 'd' => [ {'value'=>0.1} ]})
|
358
|
+
expect(d.size).to eql(4)
|
359
|
+
expect(d['a']).to be_nil
|
360
|
+
expect(d['b']).to be_nil
|
361
|
+
expect(d['c']).to be_nil
|
362
|
+
expect(d['d$$0']).to be_nil
|
363
|
+
end
|
353
364
|
end
|
354
365
|
end
|
355
366
|
end
|
data/spec/query_spec.rb
CHANGED
@@ -281,6 +281,25 @@ describe Norikra::Query do
|
|
281
281
|
end
|
282
282
|
end
|
283
283
|
|
284
|
+
describe '.looback' do
|
285
|
+
it 'returns nil for nil group' do
|
286
|
+
expect(Norikra::Query.loopback(nil)).to be_nil
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'returns nil for string group name without prefix' do
|
290
|
+
expect(Norikra::Query.loopback('a')).to be_nil
|
291
|
+
expect(Norikra::Query.loopback('group1')).to be_nil
|
292
|
+
expect(Norikra::Query.loopback('LOOPBACK')).to be_nil
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'returns specified string as loopback target by parentheses' do
|
296
|
+
expect(Norikra::Query.loopback('LOOPBACK()')).to be_nil
|
297
|
+
expect(Norikra::Query.loopback('LOOPBACK(a)')).to eql('a')
|
298
|
+
expect(Norikra::Query.loopback('LOOPBACK(loopback_target)')).to eql('loopback_target')
|
299
|
+
expect(Norikra::Query.loopback('LOOPBACK(target name)')).to eql('target name') # should be invalid on 'open'
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
284
303
|
describe '#dup' do
|
285
304
|
context 'for queries without group (default group)' do
|
286
305
|
it 'returns query object with default group' do
|
@@ -307,7 +326,7 @@ describe Norikra::Query do
|
|
307
326
|
|
308
327
|
describe '.rewrite_event_field_name' do
|
309
328
|
context 'without any container field access' do
|
310
|
-
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
329
|
+
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
311
330
|
it 'returns same query with original' do
|
312
331
|
with_engine do
|
313
332
|
model = administrator.compileEPL(expression)
|
@@ -317,8 +336,8 @@ describe Norikra::Query do
|
|
317
336
|
end
|
318
337
|
|
319
338
|
context 'with container field access' do
|
320
|
-
expression = 'select max(result.$0.size) as cnt from TestTable.win:time_batch(10 seconds) where req.path
|
321
|
-
expected = 'select max(result$$0$size) as cnt from TestTable.win:time_batch(10 seconds) where req$path
|
339
|
+
expression = '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'
|
340
|
+
expected = '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'
|
322
341
|
it 'returns query with encoded container fields' do
|
323
342
|
with_engine do
|
324
343
|
model = administrator.compileEPL(expression)
|
@@ -328,8 +347,8 @@ describe Norikra::Query do
|
|
328
347
|
end
|
329
348
|
|
330
349
|
context 'with container field access with joins' do
|
331
|
-
expression = 'select product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
332
|
-
expected = 'select product, max(sta.param$size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
350
|
+
expression = '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'
|
351
|
+
expected = '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'
|
333
352
|
it 'returns query with encoded container fields' do
|
334
353
|
with_engine do
|
335
354
|
model = administrator.compileEPL(expression)
|
@@ -339,8 +358,8 @@ describe Norikra::Query do
|
|
339
358
|
end
|
340
359
|
|
341
360
|
context 'without any container field access, but with alias specification, without joins' do
|
342
|
-
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
343
|
-
expected = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
361
|
+
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and TestTable.size>100 and (param.length())>0'
|
362
|
+
expected = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and T1.size>100 and (param.length())>0'
|
344
363
|
it 'returns query expression' do
|
345
364
|
with_engine do
|
346
365
|
model = administrator.compileEPL(expression)
|
@@ -350,8 +369,8 @@ describe Norikra::Query do
|
|
350
369
|
end
|
351
370
|
|
352
371
|
context 'with subquery in select clause' do
|
353
|
-
expression = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId
|
354
|
-
expected = 'select Z2.zoneId$$0, (select name$x from Zones.std:unique(zoneName) where zoneId
|
372
|
+
expression = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId=RfidEvent.zoneId.$0) as name from RfidEvent'
|
373
|
+
expected = 'select Z2.zoneId$$0, (select name$x from Zones.std:unique(zoneName) where zoneId=Z2.zoneId$$0) as name from RfidEvent'
|
355
374
|
it 'returns query model which have replaced stream name, for only targets of fully qualified field name access' do
|
356
375
|
with_engine do
|
357
376
|
model = administrator.compileEPL(expression)
|
@@ -361,8 +380,8 @@ describe Norikra::Query do
|
|
361
380
|
end
|
362
381
|
|
363
382
|
context 'with container field accesses, with targets, aliases and joins' do
|
364
|
-
expression = 'select StreamA.product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
365
|
-
expected = 'select S1.product, max(sta.param$size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
383
|
+
expression = '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'
|
384
|
+
expected = 'select S1.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))=S2.header$$0 and (Math.abs(S1.size$$0$$$abs))>3'
|
366
385
|
it 'returns query model which have replaced stream name, for only targets of fully qualified field name access' do
|
367
386
|
with_engine do
|
368
387
|
model = administrator.compileEPL(expression)
|
@@ -374,7 +393,7 @@ describe Norikra::Query do
|
|
374
393
|
|
375
394
|
describe '.rewrite_event_type_name' do
|
376
395
|
context 'with simple query' do
|
377
|
-
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
396
|
+
expression = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
378
397
|
|
379
398
|
it 'returns query model which have replaced stream name' do
|
380
399
|
with_engine do
|
@@ -384,8 +403,8 @@ describe Norikra::Query do
|
|
384
403
|
end
|
385
404
|
end
|
386
405
|
context 'with subquery in select clause' do
|
387
|
-
expression = 'select zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId
|
388
|
-
expected = 'select zoneId.$0, (select name.x from Z1.std:unique(zoneName) where zoneId
|
406
|
+
expression = 'select zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId=RfidEvent.zoneId.$0) as name from RfidEvent'
|
407
|
+
expected = 'select zoneId.$0, (select name.x from Z1.std:unique(zoneName) where zoneId=RfidEvent.zoneId.$0) as name from Z2'
|
389
408
|
it 'returns query model which have replaced stream name, for only From clause' do
|
390
409
|
with_engine do
|
391
410
|
model = administrator.compileEPL(expression)
|
@@ -394,8 +413,8 @@ describe Norikra::Query do
|
|
394
413
|
end
|
395
414
|
end
|
396
415
|
context 'with subquery in from clause' do
|
397
|
-
expression = "select * from BarData(ticker='MSFT', sub(closePrice,
|
398
|
-
expected = 'select * from B1(ticker
|
416
|
+
expression = "select * from BarData(ticker='MSFT', sub(closePrice,(select movAgv from SMA20Stream(ticker='MSFT').std:lastevent()))>0)"
|
417
|
+
expected = 'select * from B1(ticker="MSFT" and (sub(closePrice,(select movAgv from B2(ticker="MSFT").std:lastevent())))>0)'
|
399
418
|
it 'returns query model which have replaced stream name' do
|
400
419
|
with_engine do
|
401
420
|
model = administrator.compileEPL(expression)
|
@@ -404,7 +423,7 @@ describe Norikra::Query do
|
|
404
423
|
end
|
405
424
|
end
|
406
425
|
context 'with joins' do
|
407
|
-
expression = 'select product, max(sta.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
426
|
+
expression = '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'
|
408
427
|
it 'returns query model which have replaced stream name' do
|
409
428
|
with_engine do
|
410
429
|
model = administrator.compileEPL(expression)
|
@@ -416,11 +435,11 @@ describe Norikra::Query do
|
|
416
435
|
end
|
417
436
|
|
418
437
|
describe '.rewrite_query' do
|
419
|
-
it 'rewrites all of targets and container-field-accesses' do
|
438
|
+
it 'rewrites all of targets and container-field-accesses, for single simple query' do
|
420
439
|
with_engine do
|
421
440
|
# single simple query
|
422
|
-
e1 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
423
|
-
x1 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path
|
441
|
+
e1 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
442
|
+
x1 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
424
443
|
model = administrator.compileEPL(e1)
|
425
444
|
mapping = {'TestTable' => 'T1'}
|
426
445
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
@@ -440,113 +459,203 @@ describe Norikra::Query do
|
|
440
459
|
# expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1b)
|
441
460
|
|
442
461
|
# nested container field access
|
443
|
-
e2 = 'select max(result.$0.size) as cnt from TestTable.win:time_batch(10 seconds) where req.path
|
444
|
-
x2 = 'select max(result$$0$size) as cnt from T1.win:time_batch(10 seconds) where req$path
|
462
|
+
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'
|
463
|
+
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'
|
445
464
|
model = administrator.compileEPL(e2)
|
446
465
|
mapping = {'TestTable' => 'T1'}
|
447
466
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x2)
|
467
|
+
end
|
468
|
+
end
|
448
469
|
|
470
|
+
it 'rewrites targets/container field accesses w/ function calls and aliases' do
|
471
|
+
with_engine do
|
449
472
|
# nested container field access w/ function call and alias
|
450
|
-
e3 = 'select product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
451
|
-
x3 = 'select product, max(sta.param$size) as maxsize from S1.win:keepall() as sta, S2(size
|
473
|
+
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'
|
474
|
+
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'
|
452
475
|
model = administrator.compileEPL(e3)
|
453
476
|
mapping = {'StreamA' => 'S1', 'StreamB' => 'S2'}
|
454
477
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3)
|
455
478
|
|
456
479
|
# nested function call
|
457
|
-
e3a = 'select path.substring(0,
|
458
|
-
x3a = 'select path.substring(0,
|
480
|
+
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("?"))'
|
481
|
+
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("?"))'
|
459
482
|
model = administrator.compileEPL(e3a)
|
460
483
|
mapping = {'TestTable' => 'T1'}
|
461
484
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3a)
|
462
485
|
|
463
486
|
# nested function call w/ container field access
|
464
|
-
e3b = 'select path.f1.substring(0,
|
465
|
-
x3b = 'select path$f1.substring(0,
|
487
|
+
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("?"))'
|
488
|
+
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("?"))'
|
466
489
|
model = administrator.compileEPL(e3b)
|
467
490
|
mapping = {'TestTable' => 'T1'}
|
468
491
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3b)
|
469
492
|
|
470
493
|
# views w/ field access
|
471
|
-
e3c = 'select count(*) as c from TestTable.win:ext_timed_batch(TestTable.ts,
|
472
|
-
x3c = 'select count(*) as c from T1.win:ext_timed_batch(T1.ts,
|
494
|
+
e3c = 'select count(*) as c from TestTable.win:ext_timed_batch(TestTable.ts,1 min,0L) where path.source.length()>0'
|
495
|
+
x3c = 'select count(*) as c from T1.win:ext_timed_batch(T1.ts,1 minutes,0L) where (path$source.length())>0'
|
473
496
|
model = administrator.compileEPL(e3c)
|
474
497
|
mapping = {'TestTable' => 'T1'}
|
475
498
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3c)
|
476
499
|
|
477
500
|
# Fully-qualified field access
|
478
|
-
e4 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
479
|
-
x4 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path
|
501
|
+
e4 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and TestTable.size>100 and (param.length())>0'
|
502
|
+
x4 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path="/" and T1.size>100 and (param.length())>0'
|
480
503
|
model = administrator.compileEPL(e4)
|
481
504
|
mapping = {'TestTable' => 'T1'}
|
482
505
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x4)
|
483
506
|
|
484
507
|
# Fully-qualified field access w/ container field access
|
485
|
-
e5 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId
|
486
|
-
x5 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId
|
508
|
+
e5 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId=RfidEvent.zoneId.$0) as name from RfidEvent'
|
509
|
+
x5 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId=R1.zoneId$$0) as name from R1'
|
487
510
|
model = administrator.compileEPL(e5)
|
488
511
|
mapping = {'RfidEvent' => 'R1', 'Zones' => 'Z1'}
|
489
512
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x5)
|
513
|
+
end
|
514
|
+
end
|
490
515
|
|
516
|
+
it 'rewrites targets and container field accesses with JOINs and SubQueries' do
|
517
|
+
with_engine do
|
491
518
|
# Fully-qualified field access w/ container field access and function calls, JOINs
|
492
|
-
e6 = 'select StreamA.product, max(sta.param.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
493
|
-
x6 = 'select S1.product, max(sta.param$size) as maxsize from S1.win:keepall() as sta, S2(size
|
519
|
+
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'
|
520
|
+
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'
|
494
521
|
model = administrator.compileEPL(e6)
|
495
522
|
mapping = {'StreamA' => 'S1', 'StreamB' => 'S2'}
|
496
523
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x6)
|
497
524
|
|
498
525
|
# ??? simple query
|
499
|
-
e7 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path
|
500
|
-
x7 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path
|
526
|
+
e7 = 'select count(*) as cnt from TestTable.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
527
|
+
x7 = 'select count(*) as cnt from T1.win:time_batch(10 seconds) where path="/" and size>100 and (param.length())>0'
|
501
528
|
model = administrator.compileEPL(e7)
|
502
529
|
mapping = {'TestTable' => 'T1'}
|
503
530
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x7)
|
504
531
|
|
505
532
|
# subquery
|
506
|
-
e8 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId
|
507
|
-
x8 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId
|
533
|
+
e8 = 'select RfidEvent.zoneId.$0, (select name.x from Zones.std:unique(zoneName) where zoneId=RfidEvent.zoneId.$0) as name from RfidEvent'
|
534
|
+
x8 = 'select R1.zoneId$$0, (select name$x from Z1.std:unique(zoneName) where zoneId=R1.zoneId$$0) as name from R1'
|
508
535
|
model = administrator.compileEPL(e8)
|
509
536
|
mapping = {'Zones' => 'Z1', 'RfidEvent' => 'R1'}
|
510
537
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x8)
|
511
538
|
|
512
539
|
# filters and subquery
|
513
|
-
e9 = 'select * from BarData(ticker
|
514
|
-
x9 = 'select * from B1(ticker
|
540
|
+
e9 = 'select * from BarData(ticker="MSFT" and (sub(closePrice,(select movAgv from SMA20Stream(ticker="MSFT").std:lastevent()))>0))'
|
541
|
+
x9 = 'select * from B1(ticker="MSFT" and (sub(closePrice,(select movAgv from S1(ticker="MSFT").std:lastevent())))>0)'
|
515
542
|
model = administrator.compileEPL(e9)
|
516
543
|
mapping = {'BarData' => 'B1', 'SMA20Stream' => 'S1'}
|
517
544
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x9)
|
518
545
|
|
519
546
|
# JOINs
|
520
|
-
e10 = 'select product, max(sta.size) as maxsize from StreamA.win:keepall() as sta, StreamB(size
|
521
|
-
x10 = 'select product, max(sta.size) as maxsize from S1.win:keepall() as sta, S2(size
|
547
|
+
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'
|
548
|
+
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'
|
522
549
|
model = administrator.compileEPL(e10)
|
523
550
|
mapping = {'StreamA' => 'S1', 'StreamB' => 'S2'}
|
524
551
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x10)
|
552
|
+
end
|
553
|
+
end
|
525
554
|
|
555
|
+
it 'rewrites targets and container field accesses with GROUP BY' do
|
556
|
+
with_engine do
|
526
557
|
# GROUP BY clause
|
527
|
-
e11 = 'select applog.campaign.id as campaign_id, member.region as region, member.lang as lang, count(*) as click, count(distinct member.id) as uu from applog.win:time_batch(1 minutes) where type
|
528
|
-
x11 = 'select A1.campaign$id as campaign_id, member$region as region, member$lang as lang, count(*) as click, count(distinct member$id) as uu from A1.win:time_batch(1 minutes) where type
|
558
|
+
e11 = 'select applog.campaign.id as campaign_id, member.region as region, member.lang as lang, count(*) as click, count(distinct member.id) as uu from applog.win:time_batch(1 minutes) where type="click" group by applog.campaign.id, member.region, member.lang'
|
559
|
+
x11 = 'select A1.campaign$id as campaign_id, member$region as region, member$lang as lang, count(*) as click, count(distinct member$id) as uu from A1.win:time_batch(1 minutes) where type="click" group by A1.campaign$id, member$region, member$lang'
|
529
560
|
model = administrator.compileEPL(e11)
|
530
561
|
mapping = {'applog' => 'A1'}
|
531
562
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x11)
|
532
563
|
|
564
|
+
# GROUP BY with MIN()/MAX()
|
565
|
+
e11a = 'select applog.campaign.id as campaign_id, member.region as region, member.lang as lang, MIN(login.times) as min, MAX(login.times) as max, count(*) as click, count(distinct member.id) as uu from applog.win:time_batch(1 minutes) where type="click" group by applog.campaign.id, member.region, member.lang'
|
566
|
+
x11a = 'select A1.campaign$id as campaign_id, member$region as region, member$lang as lang, min(login$times) as min, max(login$times) as max, count(*) as click, count(distinct member$id) as uu from A1.win:time_batch(1 minutes) where type="click" group by A1.campaign$id, member$region, member$lang'
|
567
|
+
q11a = Norikra::Query.new(name: 'q11a', expression: e11a)
|
568
|
+
model = administrator.compileEPL(q11a.expression)
|
569
|
+
mapping = {'applog' => 'A1'}
|
570
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x11a)
|
571
|
+
end
|
572
|
+
end
|
573
|
+
|
574
|
+
it 'rewrites targets and container field accesses with GROUP BY ROLLUP' do
|
575
|
+
with_engine do
|
576
|
+
e1 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by rollup(f1.$0.Symbol, StockTickEvent.data.feed)'
|
577
|
+
x1 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by rollup(f1$$0$Symbol, S1.data$feed)'
|
578
|
+
model = administrator.compileEPL(e1)
|
579
|
+
mapping = {'StockTickEvent' => 'S1'}
|
580
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
581
|
+
end
|
582
|
+
end
|
583
|
+
|
584
|
+
it 'rewrites targets and container field accesses with GROUP BY CUBE' do
|
585
|
+
with_engine do
|
586
|
+
e1 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by cube(f1.$0.Symbol, StockTickEvent.data.feed)'
|
587
|
+
x1 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by cube(f1$$0$Symbol, S1.data$feed)'
|
588
|
+
model = administrator.compileEPL(e1)
|
589
|
+
mapping = {'StockTickEvent' => 'S1'}
|
590
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
591
|
+
end
|
592
|
+
end
|
593
|
+
|
594
|
+
it 'rewrites targets and container field accesses with GROUP BY GROUPING SETS' do
|
595
|
+
with_engine do
|
596
|
+
e1 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by grouping sets(f1.$0.Symbol, StockTickEvent.data.feed)'
|
597
|
+
x1 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by grouping sets(f1$$0$Symbol, S1.data$feed)'
|
598
|
+
model = administrator.compileEPL(e1)
|
599
|
+
mapping = {'StockTickEvent' => 'S1'}
|
600
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
601
|
+
end
|
602
|
+
end
|
603
|
+
|
604
|
+
it 'rewrites targets and container field accesses with GROUP BY using complex combinations' do
|
605
|
+
with_engine do
|
606
|
+
e1 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by f1.$0.Symbol, rollup(StockTickEvent.data.feed)'
|
607
|
+
x1 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by f1$$0$Symbol, rollup(S1.data$feed)'
|
608
|
+
model = administrator.compileEPL(e1)
|
609
|
+
mapping = {'StockTickEvent' => 'S1'}
|
610
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x1)
|
611
|
+
|
612
|
+
e2 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by grouping sets((f1.$0.Symbol, StockTickEvent.data.feed), f1.$0.Symbol)'
|
613
|
+
x2 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by grouping sets((f1$$0$Symbol, S1.data$feed), f1$$0$Symbol)'
|
614
|
+
model = administrator.compileEPL(e2)
|
615
|
+
mapping = {'StockTickEvent' => 'S1'}
|
616
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x2)
|
617
|
+
|
618
|
+
e3 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by grouping sets(f1.$0.Symbol, StockTickEvent.data.feed, ())'
|
619
|
+
x3 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by grouping sets(f1$$0$Symbol, S1.data$feed, ())'
|
620
|
+
model = administrator.compileEPL(e3)
|
621
|
+
mapping = {'StockTickEvent' => 'S1'}
|
622
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x3)
|
623
|
+
|
624
|
+
e4 = 'select f1.$0.Symbol, StockTickEvent.data.feed, sum(f1.volume) from StockTickEvent.win:time_batch(30 seconds) as event group by grouping sets(rollup(f1.$0.Symbol, StockTickEvent.data.feed), StockTickEvent.data.feed)'
|
625
|
+
x4 = 'select f1$$0$Symbol, S1.data$feed, sum(f1$volume) from S1.win:time_batch(30 seconds) as event group by grouping sets(rollup(f1$$0$Symbol, S1.data$feed), S1.data$feed)'
|
626
|
+
model = administrator.compileEPL(e4)
|
627
|
+
mapping = {'StockTickEvent' => 'S1'}
|
628
|
+
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x4)
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'rewrites targets and container field accesses with ORDER BY' do
|
633
|
+
with_engine do
|
533
634
|
# ORDER BY clause
|
534
|
-
e12 = 'select campaign.id, member.region as region, member.lang as lang, count(*) as click, count(distinct member.id) as uu from applog.win:time_batch(1 minutes) where type
|
535
|
-
x12 = 'select campaign$id, member$region as region, member$lang as lang, count(*) as click, count(distinct member$id) as uu from A1.win:time_batch(1 minutes) where type
|
635
|
+
e12 = 'select campaign.id, member.region as region, member.lang as lang, count(*) as click, count(distinct member.id) as uu from applog.win:time_batch(1 minutes) where type="click" group by campaign.id, member.region, member.lang order by campaign.id'
|
636
|
+
x12 = 'select campaign$id, member$region as region, member$lang as lang, count(*) as click, count(distinct member$id) as uu from A1.win:time_batch(1 minutes) where type="click" group by campaign$id, member$region, member$lang order by campaign$id'
|
536
637
|
model = administrator.compileEPL(e12)
|
537
638
|
mapping = {'applog' => 'A1'}
|
538
639
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x12)
|
640
|
+
end
|
641
|
+
end
|
539
642
|
|
643
|
+
it 'rewrites targets and container field accesses with HAVING' do
|
644
|
+
with_engine do
|
540
645
|
# HAVING clause
|
541
|
-
e13 = 'select path, max(response.duration) from logs.win:time_batch(10 seconds) where path.startsWith("/api/") group by path having max(response.duration)
|
542
|
-
x13 = 'select path, max(response$duration) from L111.win:time_batch(10 seconds) where path.startsWith("/api/") group by path having max(response$duration)
|
646
|
+
e13 = 'select path, max(response.duration) from logs.win:time_batch(10 seconds) where path.startsWith("/api/") group by path having max(response.duration)>=100'
|
647
|
+
x13 = 'select path, max(response$duration) from L111.win:time_batch(10 seconds) where path.startsWith("/api/") group by path having max(response$duration)>=100'
|
543
648
|
model = administrator.compileEPL(e13)
|
544
649
|
mapping = {'logs' => 'L111'}
|
545
650
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x13)
|
651
|
+
end
|
652
|
+
end
|
546
653
|
|
654
|
+
it 'rewrites targets and container field accesses with Patterns' do
|
655
|
+
with_engine do
|
547
656
|
# Pattern
|
548
|
-
e14 = 'select a.type from pattern [every a=TestTable -> b=TestTable(type
|
549
|
-
x14 = 'select a.type from pattern [every a=T1 -> b=T1(type
|
657
|
+
e14 = 'select a.type from pattern [every a=TestTable -> b=TestTable(type=a.type)]'
|
658
|
+
x14 = 'select a.type from pattern [every a=T1 -> b=T1(type=a.type)]'
|
550
659
|
model = administrator.compileEPL(e14)
|
551
660
|
mapping = {'TestTable' => 'T1'}
|
552
661
|
expect(Norikra::Query.rewrite_query(model, mapping).toEPL).to eql(x14)
|