tribe.storage
Version:
Efficient, portable, extensible object storage.
87 lines (79 loc) • 2.87 kB
JavaScript
module.exports = {
indexName: function (expression) {
if (expression.constructor === Array) {
var paths = [];
for (var i = 0, l = expression.length; i < l; i++)
if(paths.indexOf(expression[i].p) === -1)
paths.push(expression[i].p);
return paths.join('_');
}
return expression.p;
},
convertExpression: function (expression) {
if (expression.constructor === Array) {
var upperBounds = [],
lowerBounds = [];
for (var i = 0, l = expression.length; i < l; i++) {
var bounds = convertExpression(expression[i]);
lowerBounds.push(bounds.lower);
upperBounds.push(bounds.upper);
}
return IDBKeyRange.bound(lowerBounds, upperBounds);
}
var bounds = convertExpression(expression);
return IDBKeyRange.bound(bounds.lower, bounds.upper);
}
};
function convertExpression(expression) {
var conversion = getConversion(expression.v);
switch (expression.o) {
case '=':
case undefined:
return { lower: expression.v, upper: expression.v };
case '<=':
return { lower: conversion.lower, upper: expression.v };
case '<':
return { lower: conversion.lower, upper: conversion.nextLower() };
case '>=':
return { lower: expression.v, upper: conversion.upper };
case '>':
return { lower: conversion.nextHigher(), upper: conversion.upper };
}
throw new Error('Unsupported expression type: ' + expression.o);
}
function getConversion(value) {
var conversions = {
'default': {
lower: value,
upper: value,
nextLower: function () { return value; },
nextHigher: function () { return value; }
},
'number': {
lower: Number.MIN_VALUE,
upper: Number.MAX_VALUE,
nextLower: function () {
return value - 1;
},
nextHigher: function () {
return value + 1;
}
},
'string': {
lower: String.fromCharCode(0),
upper: String.fromCharCode(65535),
nextLower: function () {
return value && (value.substring(0, value.length - 1) + String.fromCharCode(value.charCodeAt(value.length - 1) + 1));
},
nextHigher: function () {
return value + String.fromCharCode(0);
}
}
};
return conversions[typeof value] || conversions.default;
}
function sortByName(source) {
return source.sort(function (a, b) {
return a.p > b.p;
});
}