norikra 0.1.7-java → 1.0.0-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 +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)
|