UNPKG

tribe.storage

Version:

Efficient, portable, extensible object storage.

87 lines (79 loc) 2.87 kB
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; }); }