function getQueryResults()

in jones-ndb/impl/ndb/NdbOperation.js [718:801]


function getQueryResults(op, userCallback) {
  var i = 0;
  var sectors = [];
  var ndbProjection = op.query;

  while(ndbProjection) {
    sectors[i++] = ndbProjection;
    ndbProjection = ndbProjection.next;
  }

  op.scanOp.fetchAllResults(function(err, nresults) {
    var wrapper, level, current, parentLevel, resultObject;
    current = [];   // current values for each sector
    current[0] = null;
    wrapper = {};  // the wrapper is reused in each call to getResult()

    function setValueInRelatedTable(relatedField, resultValue) {
      if(relatedField.toMany) {
        if(current[parentLevel][relatedField.fieldName] === undefined) {
          current[parentLevel][relatedField.fieldName] = [];
        }
        if(resultValue !== null) {
          current[parentLevel][relatedField.fieldName].push(resultValue);
        }
      } else {  // toOne
        current[parentLevel][relatedField.fieldName] = resultValue;
      }
    }

    function assemble() {
      current[level] = resultObject;
      if(level > 0) {
        setValueInRelatedTable(sectors[level].relatedField, resultObject);
      }
    }

    function assembleSpecial(tag) {
      udebug.log_detail("assembleSpecial table", level, "tag", tag);
      if(tag & 2) {   /* This row came from a many-to-many join table but
                         is not itself part of the user's result object.  */
        current[level] = current[parentLevel];
      }
      if(tag & 1) {   /* Row is null */
        current[level] = null;
        if(level > 0) {
          setValueInRelatedTable(sectors[level].relatedField, null);
        }
      }
      if(tag & 8) {
        udebug.log_detail("Filtered - row is duplicate");
      }
    }

    udebug.log("fetchAllResults returns", err, nresults);
    if(err) {
      op.result.success = false;
      op.result.error = new DBOperationError().fromNdbError(err);
    } else if (nresults == 0) {
      op.result.success = false;
      op.result.error = new DBOperationError().fromSqlState("02000");
    } else {
      for(i = 0 ; i < nresults ; i++) {
        op.scanOp.getResult(i, wrapper);
        level = wrapper.level;
        if(level > 0) { parentLevel = sectors[level].parent.serial; }
        if(udebug.is_detail) {
          udebug.log("TABLE", level, sectors[level].tableHandler.dbTable.name,
                     "PARENT TABLE", parentLevel);
        }
        if(wrapper.tag) {
          assembleSpecial(wrapper.tag);
        } else {
          resultObject = getResultValue(op, sectors[level].tableHandler,
                                        wrapper.data, null);
          assemble();
        }
      }
      op.result.success = true;
      op.result.value = current[0];
    }
    udebug.log("Join result:", current[0]);
    userCallback(err, op.result.value);
  });
}