qminer
Version:
A C++ based data analytics platform for processing large-scale real-time streams containing structured and unstructured data
1,029 lines (998 loc) • 84.8 kB
JavaScript
/**
* Copyright (c) 2015, Jozef Stefan Institute, Quintelligence d.o.o. and contributors
* All rights reserved.
*
* This source code is licensed under the FreeBSD license found in the
* LICENSE file in the root directory of this source tree.
*/
// console.log(__filename)
var assert = require('../../src/nodejs/scripts/assert.js'); //adds assert.run function
var qm = require('../../index.js');
describe('BTree Integer Search Tests', function () {
var base = undefined;
var store = undefined;
beforeEach(function () {
qm.delLock();
base = new qm.Base({mode: 'createClean'});
// prepare test set
base.createStore({
'name': 'BTreeSearchTest',
'fields': [
{ 'name': 'Value', 'type': 'int' },
{ 'name': 'ForSort', 'type': 'float' }
],
'joins': [],
'keys': [
{ field: 'Value', type: 'linear' }
]
});
store = base.store('BTreeSearchTest');
for (var i = 0; i < 100; i++) {
store.push({ Value: i % 10, ForSort: Math.random() });
}
});
afterEach(function () {
base.close();
});
describe('Tests of base.search after initial push', function () {
it('returns all elements >= 5', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6 and sort according to ForSort field', function () {
var result = base.search({ $from: 'BTreeSearchTest', $sort: {ForSort: 1}, Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
for (var i = 1; i < result.length; i++) {
assert.strictEqual(result[i-1].ForSort < result[i].ForSort, true);
}
})
it('returns all elements == 5', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests after serialization and deserialization', function () {
it('returns all elements >= 5', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after deleting 50 records', function () {
it('returns all elements >= 5', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 25);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 35);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 5);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 50);
})
it('returns no elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after changing rec.Value += 1', function () {
it('returns all elements >= 5', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 0});
assert.strictEqual(result.length, 0);
})
});
});
describe('BTree UInt64 Search Tests', function () {
var base = undefined;
var store = undefined;
beforeEach(function () {
qm.delLock();
base = new qm.Base({mode: 'createClean'});
// prepare test set
base.createStore({
'name': 'BTreeSearchTest',
'fields': [
{ 'name': 'Value', 'type': 'uint64' },
{ 'name': 'ForSort', 'type': 'float' }
],
'joins': [],
'keys': [
{ field: 'Value', type: 'linear' }
]
});
store = base.store('BTreeSearchTest');
for (var i = 0; i < 100; i++) {
store.push({ Value: i % 10, ForSort: Math.random() });
}
});
afterEach(function () {
base.close();
});
describe('Tests of base.search after initial push', function () {
it('returns all elements >= 5', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6 and sort according to ForSort field', function () {
var result = base.search({ $from: 'BTreeSearchTest', $sort: {ForSort: 1}, Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
for (var i = 1; i < result.length; i++) {
assert.strictEqual(result[i-1].ForSort < result[i].ForSort, true);
}
})
it('returns all elements == 5', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests after serialization and deserialization', function () {
it('returns all elements >= 5', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after deleting 50 records', function () {
it('returns all elements >= 5', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 25);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 35);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 5);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 50);
})
it('returns no elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after changing rec.Value += 1', function () {
it('returns all elements >= 5', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 5});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5, true); });
})
it('returns all elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 0});
assert.strictEqual(result.length, 0);
})
});
});
describe('BTree Float Search Tests', function () {
var base = undefined;
var store = undefined;
beforeEach(function () {
qm.delLock();
base = new qm.Base({mode: 'createClean'});
// prepare test set
base.createStore({
'name': 'BTreeSearchTest',
'fields': [
{ 'name': 'Value', 'type': 'float' },
{ 'name': 'ForSort', 'type': 'float' }
],
'joins': [],
'keys': [
{ field: 'Value', type: 'linear' }
]
});
store = base.store('BTreeSearchTest');
for (var i = 0; i < 100; i++) {
store.push({ Value: (i % 10) + 0.123, ForSort: Math.random() });
}
});
afterEach(function () {
base.close();
});
describe('Tests of base.search after initial push', function () {
it('returns all elements >= 5', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6 and sort according to ForSort field', function () {
var result = base.search({ $from: 'BTreeSearchTest', $sort: {ForSort: 1}, Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
for (var i = 1; i < result.length; i++) {
assert.strictEqual(result[i-1].ForSort < result[i].ForSort, true);
}
})
it('returns all elements == 5.123', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: 5.123});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5.123, true); });
})
it('returns all elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests after serialization and deserialization', function () {
it('returns all elements >= 5', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5.123', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: 5.123});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5.123, true); });
})
it('returns all elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
base.close();
base = new qm.Base({ mode: 'open'});
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after deleting 50 records', function () {
it('returns all elements >= 5', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 25);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 30);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 5);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5.123', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: 5.123});
assert.strictEqual(result.length, 5);
result.each(function (rec) { assert.strictEqual(rec.Value == 5.123, true); });
})
it('returns all elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 50);
})
it('returns no elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after changing rec.Value += 1', function () {
it('returns all elements >= 5', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
})
it('returns all elements <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: 6}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements >= 5 and <= 6', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: 5, $lt: 6}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value >= 5, true); });
result.each(function (rec) { assert.strictEqual(rec.Value <= 6, true); });
})
it('returns all elements == 5.123', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 5.123});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value == 5.123, true); });
})
it('returns all elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
store.each(function (rec) { rec.Value = rec.Value + 1; });
var result = base.search({ $from: 'BTreeSearchTest', Value: 0});
assert.strictEqual(result.length, 0);
})
});
});
describe('BTree DateTime Search Tests', function () {
var base = undefined;
var store = undefined;
beforeEach(function () {
qm.delLock();
base = new qm.Base({mode: 'createClean'});
// prepare test set
base.createStore({
'name': 'BTreeSearchTest',
'fields': [
{ 'name': 'Value', 'type': 'datetime' },
{ 'name': 'ForSort', 'type': 'float' }
],
'joins': [],
'keys': [
{ field: 'Value', type: 'linear' }
]
});
store = base.store('BTreeSearchTest');
var date = new Date('2015-09-27T00:00:00.000Z');
for (var i = 0; i < 100; i++) {
var _date = new Date(date.getTime() + (i % 10)*60*60*1000);
store.push({ Value: _date.toISOString(), ForSort: Math.random() });
}
});
afterEach(function () {
base.close();
});
describe('Tests of base.search after initial push', function () {
it('returns all elements >= 2015-09-27T05:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: '2015-09-27T05:00:00.000Z'}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements <= 2015-09-27T06:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements >= 2015-09-27T05:00:00.000 and <= 2015-09-27T06:00:00.000Z', function () {
var result = base.search({
$from: 'BTreeSearchTest',
Value: { $gt: '2015-09-27T05:00:00.000Z', $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements >= 2015-09-27T05:00:00.000 and <= 2015-09-27T06:00:00.000Z and sort according to ForSort field', function () {
var result = base.search({
$from: 'BTreeSearchTest',
$sort: {ForSort: 1},
Value: { $gt: '2015-09-27T05:00:00.000Z', $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
for (var i = 1; i < result.length; i++) {
assert.strictEqual(result[i-1].ForSort < result[i].ForSort, true);
}
})
it('returns all elements == 2015-09-27T05:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: '2015-09-27T05:00:00.000Z'});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() == '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search passing DateTime as JavaScript timestamp (date.getTime())', function () {
it('returns all elements >= 2015-09-27T05:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: new Date('2015-09-27T05:00:00.000Z').getTime()}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements <= 2015-09-27T06:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: new Date('2015-09-27T06:00:00.000Z').getTime()}});
assert.strictEqual(result.length, 70);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements >= 2015-09-27T05:00:00.000 and <= 2015-09-27T06:00:00.000Z', function () {
var result = base.search({
$from: 'BTreeSearchTest',
Value: { $gt: new Date('2015-09-27T05:00:00.000Z').getTime(), $lt: new Date('2015-09-27T06:00:00.000Z').getTime()}});
assert.strictEqual(result.length, 20);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements == 2015-09-27T05:00:00.000Z', function () {
var result = base.search({ $from: 'BTreeSearchTest', Value: new Date('2015-09-27T05:00:00.000Z').getTime()});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() == '2015-09-27T05:00:00.000Z', true); });
})
});
describe('Tests of base.search after deleting 50 records', function () {
it('returns all elements >= 2015-09-27T05:00:00.000Z', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: '2015-09-27T05:00:00.000Z'}});
assert.strictEqual(result.length, 25);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements <= 2015-09-27T06:00:00.000Z', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 35);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements >= 2015-09-27T05:00:00.000 and <= 2015-09-27T06:00:00.000Z', function () {
store.clear(50);
var result = base.search({
$from: 'BTreeSearchTest',
Value: { $gt: '2015-09-27T05:00:00.000Z', $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements == 2015-09-27T05:00:00.000Z', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: '2015-09-27T05:00:00.000Z'});
assert.strictEqual(result.length, 5);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() == '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 50);
})
it('returns no elements', function () {
store.clear(50);
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
describe('Tests of base.search after changing rec.Value += 1 minute', function () {
it('returns all elements >= 2015-09-27T05:00:00.000Z', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $gt: '2015-09-27T05:00:00.000Z'}});
assert.strictEqual(result.length, 50);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
})
it('returns all elements <= 2015-09-27T06:00:00.000Z', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({ $from: 'BTreeSearchTest', Value: { $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 60);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements >= 2015-09-27T05:00:00.000 and <= 2015-09-27T06:00:00.000Z', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({
$from: 'BTreeSearchTest',
Value: { $gt: '2015-09-27T05:00:00.000Z', $lt: '2015-09-27T06:00:00.000Z'}});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() >= '2015-09-27T05:00:00.000Z', true); });
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() <= '2015-09-27T06:00:00.000Z', true); });
})
it('returns all elements == 2015-09-27T05:00:00.000Z', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({ $from: 'BTreeSearchTest', Value: '2015-09-27T05:00:01.000Z'});
assert.strictEqual(result.length, 10);
result.each(function (rec) { assert.strictEqual(rec.Value.toISOString() == '2015-09-27T05:00:01.000Z', true); });
})
it('returns all elements', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({ $from: 'BTreeSearchTest', Value: { }});
assert.strictEqual(result.length, 100);
})
it('returns no elements', function () {
store.each(function (rec) { rec.Value = new Date(rec.Value.getTime() + 1000); });
var result = base.search({ $from: 'BTreeSearchTest', Value: -5});
assert.strictEqual(result.length, 0);
})
});
});
describe('Gix Tests', function () {
var base = undefined;
beforeEach(function () {
qm.delLock();
base = new qm.Base({mode: 'createClean'});
});
afterEach(function () {
base.close();
});
describe('Test creating stores with different gix types', function () {
it('create stores with value index key', function () {
var store = base.createStore({
name: 'TestStore',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value' } ]
});
var storeFull = base.createStore({
name: 'TestStoreFull',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value', storage: 'full' } ]
});
var storeSmall = base.createStore({
name: 'TestStoreSmall',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value', storage: 'small' } ]
});
var storeTiny = base.createStore({
name: 'TestStoreTiny',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value', storage: 'tiny' } ]
});
})
it('create stores with bad parameters for value index key', function () {
assert.throws(function() {
var store = base.createStore({
name: 'TestStore',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'XXX', type: 'value' } ]
});
});
assert.throws(function() {
var store = base.createStore({
name: 'TestStore',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'XXX' } ]
});
});
assert.throws(function() {
var storeFull = base.createStore({
name: 'TestStoreFull',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value', storage: 'XXX' } ]
});
});
})
it('create stores with index join', function () {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'index', store: 'TestStore2' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreFull1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'index', store: 'TestStore2', storage: 'full' } ],
keys: [ ]
}, {
name: 'TestStoreFull2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreSmall1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'index', store: 'TestStore2', storage: 'small' } ],
keys: [ ]
}, {
name: 'TestStoreSmall2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreTiny1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'index', store: 'TestStore2', storage: 'tiny' } ],
keys: [ ]
}, {
name: 'TestStoreTiny2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
})
it('create stores with field join', function () {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreFull1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'full' } ],
keys: [ ]
}, {
name: 'TestStoreFull2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreSmall1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'small' } ],
keys: [ ]
}, {
name: 'TestStoreSmall2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreTiny1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'tiny' } ],
keys: [ ]
}, {
name: 'TestStoreTiny2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreIntInt1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'int-int' } ],
keys: [ ]
}, {
name: 'TestStoreIntInt2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreByteInt1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'byte-int' } ],
keys: [ ]
}, {
name: 'TestStoreByteInt2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
base.createStore([{
name: 'TestStoreUInt641',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'uint64-' } ],
keys: [ ]
}, {
name: 'TestStoreUInt642',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
})
it('create stores with bad parameters for join', function () {
assert.throws(function() {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'XXX', store: 'TestStore2' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
});
assert.throws(function() {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'index', store: 'TestStore2', storage: 'XXX' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
});
assert.throws(function() {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'XXX' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
});
assert.throws(function() {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'int-XXX' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
});
assert.throws(function() {
base.createStore([{
name: 'TestStore1',
fields: [ { name: 'Value', type: 'string' } ],
joins: [ { name: 'Join', type: 'field', store: 'TestStore2', storage: 'XXX-' } ],
keys: [ ]
}, {
name: 'TestStore2',
fields: [ { name: 'Value', type: 'string' } ],
keys: [ ]
}]);
});
})
});
function testGixSearch(gixType) {
function prepareSimpleStore() {
var store = base.createStore({
name: 'TestStore',
fields: [ { 'name': 'Value', 'type': 'string' } ],
joins: [ ],
keys: [ { field: 'Value', type: 'value', storage: 'full' } ]
});
store.push({ Value: "A" });
store.push({ Value: "B" });
store.push({ Value: "C" });
store.push({ Value: "D" });
store.push({ Value: "B" });
store.push({ Value: "C" });
store.push({ Value: "D" });
store.push({ Value: "C" });
store.push({ Value: "D" });
store.push({ Value: "D" });
}
fun