relution-sdk
Version:
Relution Software Development Kit for TypeScript and JavaScript
145 lines • 17 kB
JavaScript
/*
* @file query/SortOrderComparator.ts
* Relution SDK
*
* Created by Thomas Beckmann on 22.06.2015
* Copyright 2016 M-Way Solutions GmbH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @module query
*/
/** */
;
var _ = require('lodash');
var SortOrder_1 = require('./SortOrder');
var JsonPath_1 = require('./JsonPath');
/**
* compiles a JsonCompareFn from a given SortOrder.
*
* @param arg defining the SortOrder being compiled.
* @return {function} a JsonCompareFn function compatible to Array.sort().
*/
function jsonCompare(arg, options) {
var sortOrder;
if (typeof arg === 'string') {
sortOrder = new SortOrder_1.SortOrder();
sortOrder.fromJSON([arg]);
}
else if (_.isArray(arg)) {
sortOrder = new SortOrder_1.SortOrder();
sortOrder.fromJSON(arg);
}
else {
sortOrder = arg;
}
var comparator = new SortOrderComparator(sortOrder, options);
return (_.bind(comparator.compare, comparator));
}
exports.jsonCompare = jsonCompare;
/**
* compiled SortOrder for comparison of objects.
*
* @see SortOrder
*/
var SortOrderComparator = (function () {
/**
* constructs a compiled SortOrder for object comparison.
*
* @param sortOrder to realize.
*/
function SortOrderComparator(sortOrder, options) {
this.sortOrder = sortOrder;
this.options = {
casesensitive: false
};
if (options) {
_.extend(this.options, options);
}
this.expressions = new Array(sortOrder.sortFields.length);
for (var i = 0; i < this.expressions.length; ++i) {
this.expressions[i] = new JsonPath_1.JsonPath(sortOrder.sortFields[i].name);
}
}
/**
* compares objects in a way compatible to Array.sort().
*
* @param o1 left operand.
* @param o2 right operand.
* @return {number} indicating relative ordering of operands.
*/
SortOrderComparator.prototype.compare = function (o1, o2) {
for (var i = 0; i < this.sortOrder.sortFields.length; ++i) {
var expression = this.expressions[i];
var val1 = expression.evaluate(o1);
var val2 = expression.evaluate(o2);
var cmp = this.compare1(val1, val2);
if (cmp !== 0) {
return this.sortOrder.sortFields[i].ascending ? +cmp : -cmp;
}
}
return 0;
};
/**
* compares values in a way compatible to Array.sort().
*
* @param o1 left operand.
* @param o2 right operand.
* @return {number} indicating relative ordering of operands.
*/
SortOrderComparator.prototype.compare1 = function (val1, val2) {
if (!val1 || !val2) {
// null/undefined case
if (val2) {
return -1;
}
if (val1) {
return +1;
}
}
else if (Array.isArray(val1) || Array.isArray(val2)) {
// array case
var items1 = Array.isArray(val1) ? val1 : [val1];
var items2 = Array.isArray(val2) ? val2 : [val2];
var length = Math.max(items1.length, items2.length);
for (var i = 0; i < length; ++i) {
var c = this.compare1(items1[i], items2[i]);
if (c !== 0) {
return c;
}
}
}
else {
// comparision case
if (!this.options.casesensitive) {
if (typeof val1 === 'string') {
val1 = val1.toLowerCase();
}
if (typeof val2 === 'string') {
val2 = val2.toLowerCase();
}
}
// value case
if (val1 < val2) {
return -1;
}
if (val1 > val2) {
return +1;
}
}
return 0;
};
return SortOrderComparator;
}());
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29ydE9yZGVyQ29tcGFyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9xdWVyeS9Tb3J0T3JkZXJDb21wYXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSDs7R0FFRztBQUNILE1BQU07O0FBRU4sSUFBWSxDQUFDLFdBQU0sUUFBUSxDQUFDLENBQUE7QUFFNUIsMEJBQXdCLGFBQWEsQ0FBQyxDQUFBO0FBQ3RDLHlCQUF1QixZQUFZLENBQUMsQ0FBQTtBQWlEcEM7Ozs7O0dBS0c7QUFDSCxxQkFBK0IsR0FBa0MsRUFBRSxPQUE0QjtJQUU3RixJQUFJLFNBQW9CLENBQUM7SUFDekIsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM1QixTQUFTLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFFLEdBQUcsQ0FBRSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLEdBQUcsSUFBSSxxQkFBUyxFQUFFLENBQUM7UUFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQUMsSUFBSSxDQUFDLENBQUM7UUFDTixTQUFTLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLFVBQVUsR0FBRyxJQUFJLG1CQUFtQixDQUFJLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxNQUFNLENBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQWZlLG1CQUFXLGNBZTFCLENBQUE7QUFF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QUNILDBCQUFDO0FBQUQsQ0FBQyxBQS9GRCxJQStGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBAZmlsZSBxdWVyeS9Tb3J0T3JkZXJDb21wYXJhdG9yLnRzXG4gKiBSZWx1dGlvbiBTREtcbiAqXG4gKiBDcmVhdGVkIGJ5IFRob21hcyBCZWNrbWFubiBvbiAyMi4wNi4yMDE1XG4gKiBDb3B5cmlnaHQgMjAxNiBNLVdheSBTb2x1dGlvbnMgR21iSFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBtb2R1bGUgcXVlcnlcbiAqL1xuLyoqICovXG5cbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHtTb3J0T3JkZXJ9IGZyb20gJy4vU29ydE9yZGVyJztcbmltcG9ydCB7SnNvblBhdGh9IGZyb20gJy4vSnNvblBhdGgnO1xuXG4vKipcbiAqIG9wdGlvbnMgb2YgI2pzb25Db21wYXJlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpzb25Db21wYXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBzZXQgdG8gZXhwbGljaXRseSB1c2UgY2FzZS1zZW5zaXRpdmUgc3RyaW5nIG1hdGNoaW5nLCBldmFsYXRlcyB0byBmYWxzZSB0byB1c2UgbWF0Y2hpbmdcbiAgICogc2VtYW50aWNzIG9mIFdlYlNRTC5cbiAgICovXG4gIGNhc2VzZW5zaXRpdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIGNvbXBpbGVkIGNvbXBhcmUgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSnNvbkNvbXBhcmVGbjxUPiB7XG4gIC8qKlxuICAgKiBjb21wYXJlcyBvYmplY3RzIGluIGEgd2F5IGNvbXBhdGlibGUgdG8gQXJyYXkuc29ydCgpLlxuICAgKlxuICAgKiBAcGFyYW0gbzEgbGVmdCBvcGVyYW5kLlxuICAgKiBAcGFyYW0gbzIgcmlnaHQgb3BlcmFuZC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBpbmRpY2F0aW5nIHJlbGF0aXZlIG9yZGVyaW5nIG9mIG9wZXJhbmRzLlxuICAgKi9cbiAgKG8xOiBULCBvMjogVCk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBjb21waWxlcyBhIEpzb25Db21wYXJlRm4gZnJvbSBhIGdpdmVuIFNvcnRPcmRlci5cbiAqXG4gKiBAcGFyYW0ganNvbiBvZiBTb3J0T3JkZXIgYmVpbmcgY29tcGlsZWQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gYSBKc29uQ29tcGFyZUZuIGZ1bmN0aW9uIGNvbXBhdGlibGUgdG8gQXJyYXkuc29ydCgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkNvbXBhcmU8VD4oanNvbjogc3RyaW5nLCBvcHRpb25zPzogSnNvbkNvbXBhcmVPcHRpb25zKTogSnNvbkNvbXBhcmVGbjxUPjtcbi8qKlxuICogY29tcGlsZXMgYSBKc29uQ29tcGFyZUZuIGZyb20gYSBnaXZlbiBTb3J0T3JkZXIuXG4gKlxuICogQHBhcmFtIGpzb24gb2YgU29ydE9yZGVyIGJlaW5nIGNvbXBpbGVkLlxuICogQHJldHVybiB7ZnVuY3Rpb259IGEgSnNvbkNvbXBhcmVGbiBmdW5jdGlvbiBjb21wYXRpYmxlIHRvIEFycmF5LnNvcnQoKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25Db21wYXJlPFQ+KGpzb246IHN0cmluZ1tdLCBvcHRpb25zPzogSnNvbkNvbXBhcmVPcHRpb25zKTogSnNvbkNvbXBhcmVGbjxUPjtcbi8qKlxuICogY29tcGlsZXMgYSBKc29uQ29tcGFyZUZuIGZyb20gYSBnaXZlbiBTb3J0T3JkZXIuXG4gKlxuICogQHBhcmFtIHNvcnRPcmRlciBiZWluZyBjb21waWxlZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBhIEpzb25Db21wYXJlRm4gZnVuY3Rpb24gY29tcGF0aWJsZSB0byBBcnJheS5zb3J0KCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQ29tcGFyZTxUPihzb3J0T3JkZXI6IFNvcnRPcmRlciwgb3B0aW9ucz86IEpzb25Db21wYXJlT3B0aW9ucyk6XG4gIEpzb25Db21wYXJlRm48VD47XG4vKipcbiAqIGNvbXBpbGVzIGEgSnNvbkNvbXBhcmVGbiBmcm9tIGEgZ2l2ZW4gU29ydE9yZGVyLlxuICpcbiAqIEBwYXJhbSBhcmcgZGVmaW5pbmcgdGhlIFNvcnRPcmRlciBiZWluZyBjb21waWxlZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBhIEpzb25Db21wYXJlRm4gZnVuY3Rpb24gY29tcGF0aWJsZSB0byBBcnJheS5zb3J0KCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqc29uQ29tcGFyZTxUPihhcmc6IHN0cmluZyB8IHN0cmluZ1tdIHwgU29ydE9yZGVyLCBvcHRpb25zPzogSnNvbkNvbXBhcmVPcHRpb25zKTpcbiAgSnNvbkNvbXBhcmVGbjxUPiB7XG4gIHZhciBzb3J0T3JkZXI6IFNvcnRPcmRlcjtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnKSB7XG4gICAgc29ydE9yZGVyID0gbmV3IFNvcnRPcmRlcigpO1xuICAgIHNvcnRPcmRlci5mcm9tSlNPTihbIGFyZyBdKTtcbiAgfSBlbHNlIGlmIChfLmlzQXJyYXkoYXJnKSkge1xuICAgIHNvcnRPcmRlciA9IG5ldyBTb3J0T3JkZXIoKTtcbiAgICBzb3J0T3JkZXIuZnJvbUpTT04oYXJnKTtcbiAgfSBlbHNlIHtcbiAgICBzb3J0T3JkZXIgPSBhcmc7XG4gIH1cblxuICB2YXIgY29tcGFyYXRvciA9IG5ldyBTb3J0T3JkZXJDb21wYXJhdG9yPFQ+KHNvcnRPcmRlciwgb3B0aW9ucyk7XG4gIHJldHVybiA8SnNvbkNvbXBhcmVGbjxUPj4oXy5iaW5kKGNvbXBhcmF0b3IuY29tcGFyZSwgY29tcGFyYXRvcikpO1xufVxuXG4vKipcbiAqIGNvbXBpbGVkIFNvcnRPcmRlciBmb3IgY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuICpcbiAqIEBzZWUgU29ydE9yZGVyXG4gKi9cbmNsYXNzIFNvcnRPcmRlckNvbXBhcmF0b3I8VD4ge1xuXG4gIHByb3RlY3RlZCBvcHRpb25zOiBKc29uQ29tcGFyZU9wdGlvbnMgPSB7XG4gICAgY2FzZXNlbnNpdGl2ZTogZmFsc2VcbiAgfTtcblxuICAvKipcbiAgICogY29tcGlsZWQgYWNjZXNzb3IgcGF0aHMgb2YgU29ydEZpZWxkIGRhdGEuXG4gICAqL1xuICBwcml2YXRlIGV4cHJlc3Npb25zOiBKc29uUGF0aFtdO1xuXG4gIC8qKlxuICAgKiBjb25zdHJ1Y3RzIGEgY29tcGlsZWQgU29ydE9yZGVyIGZvciBvYmplY3QgY29tcGFyaXNvbi5cbiAgICpcbiAgICogQHBhcmFtIHNvcnRPcmRlciB0byByZWFsaXplLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgc29ydE9yZGVyOiBTb3J0T3JkZXIsIG9wdGlvbnM/OiBKc29uQ29tcGFyZU9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgXy5leHRlbmQodGhpcy5vcHRpb25zLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmV4cHJlc3Npb25zID0gbmV3IEFycmF5PEpzb25QYXRoPihzb3J0T3JkZXIuc29ydEZpZWxkcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5leHByZXNzaW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgdGhpcy5leHByZXNzaW9uc1tpXSA9IG5ldyBKc29uUGF0aChzb3J0T3JkZXIuc29ydEZpZWxkc1tpXS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogY29tcGFyZXMgb2JqZWN0cyBpbiBhIHdheSBjb21wYXRpYmxlIHRvIEFycmF5LnNvcnQoKS5cbiAgICpcbiAgICogQHBhcmFtIG8xIGxlZnQgb3BlcmFuZC5cbiAgICogQHBhcmFtIG8yIHJpZ2h0IG9wZXJhbmQuXG4gICAqIEByZXR1cm4ge251bWJlcn0gaW5kaWNhdGluZyByZWxhdGl2ZSBvcmRlcmluZyBvZiBvcGVyYW5kcy5cbiAgICovXG4gIHB1YmxpYyBjb21wYXJlKG8xOiBULCBvMjogVCk6IG51bWJlciB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNvcnRPcmRlci5zb3J0RmllbGRzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgZXhwcmVzc2lvbiA9IHRoaXMuZXhwcmVzc2lvbnNbaV07XG4gICAgICB2YXIgdmFsMSA9IGV4cHJlc3Npb24uZXZhbHVhdGUobzEpO1xuICAgICAgdmFyIHZhbDIgPSBleHByZXNzaW9uLmV2YWx1YXRlKG8yKTtcbiAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUxKHZhbDEsIHZhbDIpO1xuICAgICAgaWYgKGNtcCAhPT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3J0T3JkZXIuc29ydEZpZWxkc1tpXS5hc2NlbmRpbmcgPyArY21wIDogLWNtcDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICAvKipcbiAgICogY29tcGFyZXMgdmFsdWVzIGluIGEgd2F5IGNvbXBhdGlibGUgdG8gQXJyYXkuc29ydCgpLlxuICAgKlxuICAgKiBAcGFyYW0gbzEgbGVmdCBvcGVyYW5kLlxuICAgKiBAcGFyYW0gbzIgcmlnaHQgb3BlcmFuZC5cbiAgICogQHJldHVybiB7bnVtYmVyfSBpbmRpY2F0aW5nIHJlbGF0aXZlIG9yZGVyaW5nIG9mIG9wZXJhbmRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wYXJlMSh2YWwxOiBhbnksIHZhbDI6IGFueSk6IG51bWJlciB7XG4gICAgaWYgKCF2YWwxIHx8ICF2YWwyKSB7XG4gICAgICAvLyBudWxsL3VuZGVmaW5lZCBjYXNlXG4gICAgICBpZiAodmFsMikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAodmFsMSkge1xuICAgICAgICByZXR1cm4gKzE7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbDEpIHx8IEFycmF5LmlzQXJyYXkodmFsMikpIHtcbiAgICAgIC8vIGFycmF5IGNhc2VcbiAgICAgIHZhciBpdGVtczEgPSBBcnJheS5pc0FycmF5KHZhbDEpID8gdmFsMSA6IFt2YWwxXTtcbiAgICAgIHZhciBpdGVtczIgPSBBcnJheS5pc0FycmF5KHZhbDIpID8gdmFsMiA6IFt2YWwyXTtcbiAgICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChpdGVtczEubGVuZ3RoLCBpdGVtczIubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGMgPSB0aGlzLmNvbXBhcmUxKGl0ZW1zMVtpXSwgaXRlbXMyW2ldKTtcbiAgICAgICAgaWYgKGMgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBjb21wYXJpc2lvbiBjYXNlXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5jYXNlc2Vuc2l0aXZlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsMSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWwxID0gdmFsMS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsMiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWwyID0gdmFsMi50b0xvd2VyQ2FzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHZhbHVlIGNhc2VcbiAgICAgIGlmICh2YWwxIDwgdmFsMikge1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICBpZiAodmFsMSA+IHZhbDIpIHtcbiAgICAgICAgcmV0dXJuICsxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIl19