DBTableHandler.prototype.chooseIndex = function()

in database-jones/Adapter/common/DBTableHandler.js [782:827]


DBTableHandler.prototype.chooseIndex = function(keys, allowUnique, allowScan) {
  var indexHandler, fieldName, mask, predicate, ncol, pkcol0;

  udebug.log("chooseIndex for:", keys);
  indexHandler = null;
  ncol = this.getNumberOfColumns();

  /* Create bitmasks over the key columns */
  predicate = {
    "usedColumnMask"  : new BitMask(ncol),   // all keys
    "equalColumnMask" : new BitMask(ncol)    // only non-null keys
  };

  if((typeof keys === 'number' || typeof keys === 'string')) {
    /* A simple key value represents first column of primary key */
    pkcol0 = this.dbIndexHandlers[0].indexColumnNumbers[0];
    predicate.usedColumnMask.set(pkcol0);
    predicate.equalColumnMask.set(pkcol0);
  }
  else {
    for (fieldName in keys) {
      if (keys.hasOwnProperty(fieldName) && keys[fieldName] !== undefined ) {
        mask = this.getColumnMaskForField(fieldName);
        if(mask) {
          predicate.usedColumnMask.orWith(mask);
          if(keys[fieldName] !== null) {
            predicate.equalColumnMask.orWith(mask);
          }
        }
      }
    }
  }
  udebug.log("KeyMasks:", predicate);

  /* Look for a unique index */
  if(allowUnique) {
    indexHandler = this.chooseUniqueIndexForPredicate(predicate);
  }

  /* Look for an ordered index */
  if(allowScan && ! indexHandler) {
    indexHandler = this.chooseOrderedIndexForPredicate(predicate);
  }

  return indexHandler;
};