code: protected <T> long processUpdateGroup(T obj, String groupType, String groupName, Collection<CpoWhere> wheres, Collection<CpoOrderBy> orderBy, Collection<CpoNativeFunction> nativeExpressions, Session sess) throws CpoException {
      Logger localLogger = obj == null ? logger : LoggerFactory.getLogger(obj.getClass());
      CpoClass cpoClass;
  
      if (obj == null) {
        throw new CpoException("NULL Object passed into insertObject, deleteObject, updateObject, or persistObject");
      }
  
      try {
        cpoClass = metaDescriptor.getMetaClass(obj);
        List<CpoFunction> cpoFunctions = cpoClass.getFunctionGroup(getGroupType(obj, groupType, groupName, sess), groupName).getFunctions();
        localLogger.info("=================== Class=<" + obj.getClass() + "> Type=<" + groupType + "> Name=<" + groupName + "> =========================");
  
        for (CpoFunction cpoFunction : cpoFunctions) {
          CassandraBoundStatementFactory boundStatementFactory = new CassandraBoundStatementFactory(sess, this, cpoClass, cpoFunction, obj, wheres, orderBy, nativeExpressions);
          executeBoundStatement(sess, boundStatementFactory);
        }
        localLogger.info("=================== " + " Updates - Class=<" + obj.getClass() + "> Type=<" + groupType + "> Name=<" + groupName + "> =========================");
      } catch (Throwable t) {
        String msg = "ProcessUpdateGroup failed:" + groupType + "," + groupName + "," + obj.getClass().getName();
        // TODO FIX THIS
        // localLogger.error("bound values:" + this.parameterToString(jq));
        localLogger.error(msg, t);
        throw new CpoException(msg, t);
      }
  
      return unknownModifyCount;
    }
docs: DOCUMENT ME!
  
  @param obj       DOCUMENT ME!
  @param groupType DOCUMENT ME!
  @param groupName DOCUMENT ME!
  @param sess       DOCUMENT ME!
  @return DOCUMENT ME!
  @throws CpoException DOCUMENT ME!