in jones-mysql/impl/MySQLConnection.js [1346:1436]
exports.DBSession.prototype.buildScanOperation = function(queryDomainType, parameterValues, transaction, callback) {
if (udebug.is_debug()) { udebug.log_detail('dbSession.buildScanOperation with queryDomainType:\n', queryDomainType,
'\nparameterValues:', parameterValues); }
var dbTableHandler = queryDomainType.jones_query_domain_type.dbTableHandler;
var queryHandler = queryDomainType.jones_query_domain_type.queryHandler;
var predicate = queryDomainType.jones_query_domain_type.predicate;
var projection;
var order = parameterValues.order;
var skip = parameterValues.skip;
var limit = parameterValues.limit;
var err;
var parameterName, value;
getMetadata(dbTableHandler);
var scanSQL = '';
var whereSQL = '';
var sql = {};
var sqlParameters = [];
// resolve parameters if predicate is specified
if (predicate !== undefined) {
sql = predicate.getSQL();
udebug.log_detail('buildScanOperation with sql:', sql.formalParameters, '\n', predicate);
var formalParameters = sql.formalParameters;
var i;
for (i = 0; i < formalParameters.length; ++i) {
parameterName = formalParameters[i].name;
value = parameterValues[parameterName];
sqlParameters.push(value);
}
}
// projection scans use SELECT and FROM from Projection and construct WHERE differently
if (queryDomainType.isQueryProjectionDomainType) {
projection = queryDomainType.projection;
// process the projection object if it has not been processed since it was last changed
if (!projection.mysql || (projection.mysql.id !== projection.id)) {
// we need to (re-)initialize the projection object for use with mysql adapter
initializeProjection(projection);
}
if (predicate !== undefined) {
whereSQL = ' WHERE ' + sql.sqlText;
}
return new ReadProjectionOperation(this, dbTableHandler, projection, whereSQL, sqlParameters, true, callback);
}
// non-projection scan
scanSQL = dbTableHandler.mysql.selectTableScanSQL;
// add the WHERE clause to the sql if the user specified a predicate
if (queryDomainType.jones_query_domain_type.predicate !== undefined) {
whereSQL = ' WHERE ' + sql.sqlText;
scanSQL += whereSQL;
udebug.log_detail('dbSession.buildScanOperation sql:', scanSQL, '\nparameter values:', parameterValues);
// handle order: must be an index scan and specify ignoreCase 'Asc' or 'Desc'
if (order) {
// validate this is an index scan
if (queryHandler.queryType !== 2) {
err = new Error('Bad order parameter; must be used only with index scans');
return new ErrorOperation(err, callback);
}
// validate parameter; must be ignoreCase Asc or Desc
if (typeof order === 'string') {
if (order.toUpperCase() === 'ASC') {
scanSQL += ' ORDER BY ';
scanSQL += queryHandler.dbIndexHandler.getColumnMetadata(0).name;
scanSQL += ' ASC ';
} else if (order.toUpperCase() === 'DESC') {
scanSQL += ' ORDER BY ';
scanSQL += queryHandler.dbIndexHandler.getColumnMetadata(0).name;
scanSQL += ' DESC ';
} else {
err = new Error('Bad order parameter \'' + order + '\'; order must be ignoreCase asc or desc.');
return new ErrorOperation(err, callback);
}
} else {
// bad order parameter; not ASC or DESC
err = new Error('Bad order parameter \'' + order + '\'; order must be ignoreCase asc or desc.');
return new ErrorOperation(err, callback);
}
}
}
// handle SKIP and LIMIT; must use index or table scan
if (skip !== undefined || limit !== undefined) {
if (skip !== undefined && (queryHandler.queryType < 2)) {
err = new Error('Bad skip parameter \'' + skip + '\'; must be used only with index or table scan.');
return new ErrorOperation(err, callback);
}
// set default values if not provided
if (skip === undefined) {skip = 0;}
if (limit === undefined) {limit = MAX_LIMIT;}
scanSQL += ' LIMIT ' + skip + ' , ' + limit;
}
return new ScanOperation(this, dbTableHandler, scanSQL, sqlParameters, callback);
};