mirror of https://github.com/seald/nedb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
4.0 KiB
119 lines
4.0 KiB
var Index = require('../lib/indexes')
|
|
, customUtils = require('../lib/customUtils')
|
|
, should = require('chai').should()
|
|
, assert = require('chai').assert
|
|
, _ = require('underscore')
|
|
, async = require('async')
|
|
, model = require('../lib/model')
|
|
;
|
|
|
|
describe('Indexing', function () {
|
|
|
|
describe('Insertion', function () {
|
|
|
|
it('Can insert pointers to documents in the index correctly when they have the field', function () {
|
|
var idx = new Index({ fieldName: 'tf' })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
, doc2 = { a: 8, tf: 'world' }
|
|
, doc3 = { a: 2, tf: 'bloup' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.insert(doc2);
|
|
idx.insert(doc3);
|
|
|
|
// The underlying BST now has 3 nodes which contain the docs where it's expected
|
|
idx.tree.getNumberOfKeys().should.equal(3);
|
|
assert.deepEqual(idx.tree.search('hello'), [{ a: 5, tf: 'hello' }]);
|
|
assert.deepEqual(idx.tree.search('world'), [{ a: 8, tf: 'world' }]);
|
|
assert.deepEqual(idx.tree.search('bloup'), [{ a: 2, tf: 'bloup' }]);
|
|
|
|
// The nodes contain pointers to the actual documents
|
|
idx.tree.search('world')[0].should.equal(doc2);
|
|
idx.tree.search('bloup')[0].a = 42;
|
|
doc3.a.should.equal(42);
|
|
});
|
|
|
|
it('Inserting twice for the same fieldName in a unique index will result in an error thrown', function () {
|
|
var idx = new Index({ fieldName: 'tf', unique: true })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.tree.getNumberOfKeys().should.equal(1);
|
|
(function () { idx.insert(doc1); }).should.throw();
|
|
});
|
|
|
|
it('Inserting twice for a fieldName the docs dont have with a unique index results in an error thrown', function () {
|
|
var idx = new Index({ fieldName: 'nope', unique: true })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
, doc2 = { a: 5, tf: 'world' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.tree.getNumberOfKeys().should.equal(1);
|
|
(function () { idx.insert(doc2); }).should.throw();
|
|
});
|
|
|
|
it('Inserting twice for a fieldName the docs dont have with a unique and sparse index will not throw, since the docs will be non indexed', function () {
|
|
var idx = new Index({ fieldName: 'nope', unique: true, sparse: true })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
, doc2 = { a: 5, tf: 'world' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.insert(doc2);
|
|
idx.tree.getNumberOfKeys().should.equal(0); // Docs are not indexed
|
|
assert.deepEqual(idx.nonindexedDocs, [doc1, doc2]); // Pointers are stored in the non indexed documents
|
|
idx.nonindexedDocs[1].a = 12;
|
|
doc2.a.should.equal(12);
|
|
});
|
|
|
|
}); // ==== End of 'Insertion' ==== //
|
|
|
|
|
|
describe('Removal', function () {
|
|
|
|
it('Can remove pointers from the index, even when multiple documents have the same key', function () {
|
|
var idx = new Index({ fieldName: 'tf' })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
, doc2 = { a: 8, tf: 'world' }
|
|
, doc3 = { a: 2, tf: 'bloup' }
|
|
, doc4 = { a: 23, tf: 'world' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.insert(doc2);
|
|
idx.insert(doc3);
|
|
idx.insert(doc4);
|
|
idx.tree.getNumberOfKeys().should.equal(3);
|
|
|
|
idx.remove(doc1);
|
|
idx.tree.getNumberOfKeys().should.equal(2);
|
|
idx.tree.search('hello').length.should.equal(0);
|
|
|
|
idx.remove(doc2);
|
|
idx.tree.getNumberOfKeys().should.equal(2);
|
|
idx.tree.search('world').length.should.equal(1);
|
|
idx.tree.search('world')[0].should.equal(doc4);
|
|
});
|
|
|
|
it('If we have a sparse index, we remove the doc from the nonindexedDocs array', function () {
|
|
var idx = new Index({ fieldName: 'nope', sparse: true })
|
|
, doc1 = { a: 5, tf: 'hello' }
|
|
, doc2 = { a: 5, tf: 'world' }
|
|
;
|
|
|
|
idx.insert(doc1);
|
|
idx.insert(doc2);
|
|
idx.tree.getNumberOfKeys().should.equal(0);
|
|
assert.deepEqual(idx.nonindexedDocs, [doc1, doc2]);
|
|
|
|
idx.remove(doc1);
|
|
idx.tree.getNumberOfKeys().should.equal(0);
|
|
assert.deepEqual(idx.nonindexedDocs, [doc2]);
|
|
});
|
|
|
|
}); // ==== End of 'Removal' ==== //
|
|
|
|
});
|
|
|