escher-vis
Version:
Escher: A Web Application for Building, Sharing, and Embedding Data-Rich Visualizations of Biological Pathways
83 lines (60 loc) • 1.94 kB
JavaScript
/** SearchIndex. Define an index for searching for reaction and metabolites in
the map.
The index is stored in SearchIndex.index, an object of id/record pairs.
*/
var utils = require('./utils');
var SearchIndex = utils.make_class();
SearchIndex.prototype = {
init: init,
insert: insert,
remove: remove,
find: find
};
module.exports = SearchIndex;
function init() {
this.index = {};
}
function insert(id, record, overwrite, check_record) {
/** Insert a record into the index.
id: A unique string id.
record: Records have the form:
{ 'name': '',
'data': {} }
Search is performed on substrings of the name.
overwrite: (Default false) For faster performance, make overwrite true,
and records will be inserted without checking for an existing record.
check_record: (Default false) For faster performance, make check_record
false. If true, records will be checked to make sure they have name and
data attributes.
Returns undefined.
*/
if (!overwrite && (id in this.index))
throw new Error("id is already in the index");
if (check_record && !(('name' in record) && ('data' in record)))
throw new Error("malformed record");
this.index[id] = record;
}
function remove(record_id) {
/** Remove the matching record.
Returns true is a record is found, or false if no match is found.
*/
if (record_id in this.index) {
delete this.index[record_id];
return true;
} else {
return false;
}
}
function find(substring) {
/** Find a record that matches the substring.
Returns an array of data from matching records.
*/
var re = RegExp(substring, "i"), // ignore case
matches = [];
for (var id in this.index) {
var record = this.index[id];
if (re.exec(record.name))
matches.push(record.data);
}
return matches;
}