orange-orm
Version:
Object Relational Mapper
123 lines (108 loc) • 3.28 kB
JavaScript
const newParameterized = require('../query/newParameterized');
const negotiateNextAndFilter = require('./negotiateNextAndFilter');
const negotiateNextOrFilter = require('./negotiateNextOrFilter');
function newBoolean(filter) {
var c = {};
c.sql = filter.sql.bind(filter);
c.parameters = filter.parameters;
c.append = function(other) {
var nextFilter = filter.append(other);
return newBoolean(nextFilter);
};
c.prepend = function(other) {
var nextFilter = filter.prepend(other);
return newBoolean(nextFilter);
};
c.and = function(context, other) {
if (other === undefined) {
other = context;
context = null;
}
other = negotiateRawSqlFilter(context, other);
var nextFilter = negotiateNextAndFilter(filter, other);
var next = newBoolean(nextFilter);
for (var i = 2; i < arguments.length; i++) {
next = next.and(context, arguments[i]);
}
return next;
};
c.or = function(context, other) {
if (other === undefined) {
other = context;
context = null;
}
other = negotiateRawSqlFilter(context, other);
var nextFilter = negotiateNextOrFilter(filter, other);
var next = newBoolean(nextFilter);
for (var i = 2; i < arguments.length; i++) {
next = next.or(context, arguments[i]);
}
return next;
};
c.not = function(_context) {
var nextFilter = filter.prepend('NOT (').append(')');
return newBoolean(nextFilter);
};
return c;
}
function negotiateRawSqlFilter(context, filter, optionalTable, emptyArrayMeansFalse) {
if (Array.isArray(filter) && filter.length === 0) {
const sql = emptyArrayMeansFalse ? '1 = 2' : '1 = 1';
return newBoolean(newParameterized(sql));
}
else if (Array.isArray(filter)) {
let curFilter;
let curObjectFilter;
for (let i = 0; i < filter.length; i++) {
let nextFilter = negotiateRawSqlFilter(context,filter[i], optionalTable);
if (nextFilter.isObjectFilter)
curObjectFilter = curObjectFilter ? curObjectFilter.or(context, nextFilter) : nextFilter;
else
curFilter = curFilter ? curFilter.and(context, nextFilter) : nextFilter;
}
if (curFilter && curObjectFilter)
return curFilter.and(context, curObjectFilter);
else if (curFilter)
return curFilter;
else
return curObjectFilter;
}
else {
let params = [];
if (filter) {
if (filter.and)
return filter;
if (filter.sql) {
let sql = filter.sql;
if (typeof filter.sql === 'function') {
sql = filter.sql();
}
params.push(sql, filter.parameters);
}
else if (isObjectFilter(filter, optionalTable)) {
return newObjectFilter(context, filter, optionalTable);
}
else
params = [filter];
} else {
params = [filter];
}
let parameterized = newParameterized.apply(null, params);
return newBoolean(parameterized);
}
}
function isObjectFilter(object, optionalTable) {
return optionalTable && object;
}
function newObjectFilter(context, object, table) {
let primaryColumns = table._primaryColumns;
let filter;
for (let i = 0; i < primaryColumns.length; i++) {
let column = primaryColumns[i];
let colFilter = column.equal(context, object[column.alias]);
filter = filter ? filter.and(context, colFilter) : colFilter ;
}
filter.isObjectFilter = true;
return filter;
}
module.exports = { negotiateRawSqlFilter, newBoolean};