exports.DBSession.prototype.buildScanOperation = function()

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);
};