The JavaScript Database, for Node.js, nw.js, electron and the browser
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.
nedb/lib/indexes.js

52 lines
1.5 KiB

var BinarySearchTree = require('binary-search-tree').BinarySearchTree
, model = require('./model')
;
/**
* We can't use the one in model here since it doesn't work for arrays
*/
function checkValueEquality (a, b) {
return model.compareThings(a, b) === 0;
}
/**
* Create a new index
* @param {String} options.fieldName On which field should the index apply (can use dot notation to index on sub fields)
* @param {Datastore} options.datastore Datastore on which the index is created
* @param {Boolean} options.unique Optional, enforce a unique constraint (default: false)
* @param {Boolean} options.sparse Optional, allow a sparse index (we can have documents for which fieldName is undefined) (default: false)
*/
function Index (options) {
this.fieldName = options.fieldName;
this.datastore = options.datastore;
this.unique = options.unique || false;
this.sparse = options.unique || false;
if (this.sparse) { this.unindexedDocs = []; }
this.tree = new BinarySearchTree({ unique: this.unique, compareKeys: model.compareThings, checkValueEquality: checkValueEquality });
}
/**
* Insert a new document in the index (synchronously)
*/
Index.prototype.insert = function (doc) {
var key = model.getDotValue(doc, this.fieldName);
// We don't index documents that don't contain the field if the index is sparse
if (key === undefined && this.sparse) {
this.unindexedDocs.push(doc);
return;
}
this.tree.insert(key, doc);
};
// Interface
module.exports = Index;