// append an ascii-version of Insert into cachewa.qryText_
void Insert::generateCacheKey(CacheWA &cwa) const
{
  GenericUpdate::generateCacheKey(cwa);
  if (insertColTree_) { 
    cwa += " insCol:"; 
    insertColTree_->generateCacheKey(cwa); 
  }
  // order by clause is important
  ItemExpr *orderBy = orderByTree_ ? orderByTree_ :
    reqdOrder_.rebuildExprTree();
  if (orderBy) { 
    cwa += " order:"; 
    orderBy->generateCacheKey(cwa); 
  }

  const NATable *tbl;
  if (cwa.getPhase() >= CmpMain::BIND && 
      getTableDesc() && (tbl=getTableDesc()->getNATable()) != NULL) {
    // If PARTITION clause has been used we must reflect that in the key.
    if (tbl->isPartitionNameSpecified()) {
      cwa += " partition:";
      cwa += tbl->getClusteringIndex()->getFileSetName().getQualifiedNameAsString().data();
    }
    // If PARTITION range has been used we must reflect that in the key.
    else if (tbl->isPartitionRangeSpecified()) {
      cwa += " partition:";

      char str[100];
      sprintf(str, " from %d to %d", 
	      tbl->getExtendedQualName().getPartnClause().getBeginPartitionNumber() ,
	      tbl->getExtendedQualName().getPartnClause().getEndPartitionNumber());
      cwa += str;
    }
  }

  if (isUpsert())
    {
      cwa += " upsert:";
    }
}
    }

    TEST(FindAndModifyRequest, ParseWithUpdateOnlyRequiredFields) {
        BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 }
        })json"));

        auto parseStatus = FindAndModifyRequest::parseFromBSON(NamespaceString("a.b"), cmdObj);
        ASSERT_OK(parseStatus.getStatus());

        auto request = parseStatus.getValue();
        ASSERT_EQUALS(NamespaceString("a.b").toString(), request.getNamespaceString().toString());
        ASSERT_EQUALS(BSON("x" << 1), request.getQuery());
        ASSERT_EQUALS(BSON("y" << 1), request.getUpdateObj());
        ASSERT_EQUALS(false, request.isUpsert());
        ASSERT_EQUALS(false, request.isRemove());
        ASSERT_EQUALS(BSONObj(), request.getFields());
        ASSERT_EQUALS(BSONObj(), request.getSort());
        ASSERT_EQUALS(false, request.shouldReturnNew());
    }

    TEST(FindAndModifyRequest, ParseWithUpdateFullSpec) {
        BSONObj cmdObj(fromjson(R"json({
            query: { x: 1 },
            update: { y: 1 },
            upsert: true,
            fields: { x: 1, y: 1 },
            sort: { z: -1 },
            new: true
        })json"));