/**
  * Update models in read subscription table based on modelId and userId(userId is used implicitly in getSubsetIds)
  * @param string $modelClassName
  * @param User $user
  * @param bool $onlyOwnedModels
  * @param int $updateStartTimestamp
  * @param MessageLogger $messageLogger
  * @param array $arrayOfModelIdsToUpdate
  * permission subscription table just for account ids that exist in account temp build table
  */
 public static function updateReadSubscriptionTableByModelClassNameAndUser($modelClassName, User $user, $updateStartTimestamp, $onlyOwnedModels = false, MessageLogger $messageLogger, $arrayOfModelIdsToUpdate = array())
 {
     assert('$modelClassName === null || is_string($modelClassName) && $modelClassName != ""');
     assert('is_int($updateStartTimestamp)');
     $metadata = array();
     $startTime = microtime(true);
     $lastReadPermissionUpdateTimestamp = static::getLastReadPermissionUpdateTimestamp();
     $dateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($lastReadPermissionUpdateTimestamp);
     $updateDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($updateStartTimestamp);
     if ($modelClassName == 'Account' && !empty($arrayOfModelIdsToUpdate)) {
         $metadata['clauses'][1] = array('attributeName' => 'id', 'operatorType' => 'oneOf', 'value' => $arrayOfModelIdsToUpdate);
         $metadata['structure'] = "1";
     } else {
         $metadata['clauses'][1] = array('attributeName' => 'createdDateTime', 'operatorType' => 'lessThanOrEqualTo', 'value' => $updateDateTime);
         $metadata['structure'] = "1";
         if ($onlyOwnedModels) {
             $metadata['clauses'][2] = array('attributeName' => 'owner', 'operatorType' => 'equals', 'value' => $user->id);
             $metadata['structure'] .= " AND 2";
         }
     }
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter($modelClassName);
     $where = RedBeanModelDataProvider::makeWhere($modelClassName, $metadata, $joinTablesAdapter);
     $userModelIds = $modelClassName::getSubsetIds($joinTablesAdapter, null, null, $where);
     $endTime = microtime(true);
     $executionTimeMs = $endTime - $startTime;
     $messageLogger->addDebugMessage(Zurmo::t('ZurmoModule', 'SQL time {modelClassName}: {miliSeconds}', array('{modelClassName}' => $modelClassName, '{miliSeconds}' => $executionTimeMs)));
     // Get models from subscription table
     $tableName = static::getSubscriptionTableName($modelClassName);
     $sql = "SELECT modelid FROM {$tableName} WHERE userid = " . $user->id . " AND subscriptiontype = " . static::TYPE_ADD;
     if ($modelClassName == 'Account' && !empty($arrayOfModelIdsToUpdate)) {
         $accountIds = static::getAccountIdsArrayFromBuildTable();
         if (!empty($accountIds)) {
             $list = "'" . implode(", ", $accountIds) . "'";
             $sql .= " AND modelid in ({$list})";
         }
     }
     $permissionTableRows = ZurmoRedBean::getAll($sql);
     $permissionTableIds = array();
     if (is_array($permissionTableRows) && !empty($permissionTableRows)) {
         foreach ($permissionTableRows as $permissionTableRow) {
             $permissionTableIds[] = $permissionTableRow['modelid'];
         }
     }
     $modelIdsToAdd = array_diff($userModelIds, $permissionTableIds);
     $modelIdsToDelete = array_diff($permissionTableIds, $userModelIds);
     if (is_array($modelIdsToAdd) && !empty($modelIdsToAdd)) {
         foreach ($modelIdsToAdd as $modelId) {
             $sql = "DELETE FROM {$tableName} WHERE\n                                                    userid = '" . $user->id . "'\n                                                    AND modelid = '{$modelId}'\n                                                    AND subscriptiontype='" . self::TYPE_DELETE . "'";
             ZurmoRedBean::exec($sql);
             $sql = "SELECT * FROM {$tableName} WHERE\n                            userid = '" . $user->id . "'\n                            AND modelid = '{$modelId}'\n                            AND subscriptiontype='" . self::TYPE_ADD . "'";
             $results = ZurmoRedBean::getAll($sql);
             if (!is_array($results) || empty($results)) {
                 $sql = "INSERT INTO {$tableName} VALUES\n                                (null, '" . $user->id . "', '{$modelId}', '{$updateDateTime}', '" . self::TYPE_ADD . "')";
                 ZurmoRedBean::exec($sql);
             }
         }
     }
     if (is_array($modelIdsToDelete) && !empty($modelIdsToDelete)) {
         foreach ($modelIdsToDelete as $modelId) {
             $sql = "DELETE FROM {$tableName} WHERE\n                                                    userid = '" . $user->id . "'\n                                                    AND modelid = '{$modelId}'\n                                                    AND subscriptiontype='" . self::TYPE_ADD . "'";
             ZurmoRedBean::exec($sql);
             $sql = "SELECT * FROM {$tableName} WHERE\n                    userid = '" . $user->id . "'\n                    AND modelid = '{$modelId}'\n                    AND subscriptiontype='" . self::TYPE_DELETE . "'";
             $results = ZurmoRedBean::getAll($sql);
             if (!is_array($results) || empty($results)) {
                 $sql = "INSERT INTO {$tableName} VALUES\n                                                        (null, '" . $user->id . "', '{$modelId}', '{$updateDateTime}', '" . self::TYPE_DELETE . "')";
                 ZurmoRedBean::exec($sql);
             }
         }
     }
 }