UNPKG

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
/** * 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