// operation should be either INSERT or UPDATE
 protected void trimModifyRow(AbstractRecord modifyRow, int operation) {
   if ((modifyRow == null) || modifyRow.isEmpty()) {
     return;
   }
   Collection fields = main[operation][RETURN_ONLY];
   if ((fields == null) || fields.isEmpty()) {
     return;
   }
   for (int i = modifyRow.size() - 1; i >= 0; i--) {
     DatabaseField field = modifyRow.getFields().get(i);
     if (fields.contains(field)) {
       modifyRow.remove(field);
     }
   }
 }
 /** INTERNAL: Build the result value for the row. */
 public Object buildObject(AbstractRecord row) {
   if (this.resultType == AUTO) {
     List values = row.getValues();
     if (values.size() == 1) {
       return row.getValues().get(0);
     } else {
       return row.getValues().toArray();
     }
   } else if (this.resultType == ARRAY) {
     return row.getValues().toArray();
   } else if (this.resultType == ATTRIBUTE) {
     // Use get with field for XML records.
     Object value = row.get(row.getFields().get(0));
     if (getValueConverter() != null) {
       value = getValueConverter().convertDataValueToObjectValue(value, this.session);
     }
     return value;
   }
   return row;
 }
 /**
  * INTERNAL: The results are *not* in a cursor, build the collection. Cache the results in
  * temporaryCachedQueryResults.
  */
 protected Object executeNonCursor() throws DatabaseException {
   Vector rows = getQueryMechanism().executeSelect();
   Object results = null;
   if (this.resultType == MAP) {
     results = getContainerPolicy().buildContainerFromVector(rows, this.session);
   } else if (this.resultType == VALUE) {
     if (!rows.isEmpty()) {
       AbstractRecord record = (AbstractRecord) rows.get(0);
       // Use get with field for XML records.
       results = record.get(record.getFields().get(0));
       if (getValueConverter() != null) {
         results = getValueConverter().convertDataValueToObjectValue(results, this.session);
       }
     }
   } else {
     int size = rows.size();
     ContainerPolicy containerPolicy = getContainerPolicy();
     results = containerPolicy.containerInstance(size);
     if (containerPolicy.shouldAddAll()) {
       if (size > 0) {
         List values = new ArrayList(size);
         for (int index = 0; index < size; index++) {
           AbstractRecord row = (AbstractRecord) rows.get(index);
           Object value = buildObject(row);
           values.add(value);
         }
         containerPolicy.addAll(values, results, this.session, rows, this);
       }
     } else {
       for (int index = 0; index < size; index++) {
         AbstractRecord row = (AbstractRecord) rows.get(index);
         Object value = buildObject(row);
         containerPolicy.addInto(value, results, this.session, row, this);
       }
     }
   }
   // Bug 6135563 - cache DataReadQuery results verbatim, as ObjectBuilder is not invoked
   cacheResult(results);
   return results;
 }
 /**
  * INTERNAL: Merge the provided row into this row. Existing field values in this row will be
  * replaced with values from the provided row. Fields not in this row will be added from provided
  * row. Values not in provided row will remain in this row.
  */
 public void mergeFrom(AbstractRecord row) {
   for (int index = 0; index < row.size(); ++index) {
     this.put(row.getFields().get(index), row.getValues().get(index));
   }
 }