protected static function rebuildViaSlowWay($modelClassName) { // The slow way will remain here as documentation // for what the optimized way is doing. $mungeTableName = self::getMungeTableName($modelClassName); self::recreateTable($mungeTableName); //Specifically call RedBeanModel to avoid the use of the security in OwnedSecurableItem since for //rebuild it needs to look at all models regardless of permissions of the current user. $modelCount = RedBeanModel::getCount(null, null, $modelClassName); $subset = intval($modelCount / 20); if ($subset < 100) { $subset = 100; } elseif ($subset > 1000) { $subset = 1000; } $users = User::getAll(); $groups = Group::getAll(); $roles = Role::getAll(); for ($i = 0; $i < $modelCount; $i += $subset) { //Specifically call RedBeanModel to avoid the use of the security in OwnedSecurableItem since for //rebuild it needs to look at all models regardless of permissions of the current user. $models = RedBeanModel::getSubset(null, $i, $subset, null, null, $modelClassName); foreach ($models as $model) { assert('$model instanceof SecurableItem'); $securableItemId = $model->getClassId('SecurableItem'); foreach ($users as $user) { list($allowPermissions, $denyPermissions) = $model->getExplicitActualPermissions($user); $effectiveExplicitPermissions = $allowPermissions & ~$denyPermissions; if (($effectiveExplicitPermissions & Permission::READ) == Permission::READ) { self::incrementCount($mungeTableName, $securableItemId, $user); } } foreach ($groups as $group) { list($allowPermissions, $denyPermissions) = $model->getExplicitActualPermissions($group); $effectiveExplicitPermissions = $allowPermissions & ~$denyPermissions; if (($effectiveExplicitPermissions & Permission::READ) == Permission::READ) { self::incrementCount($mungeTableName, $securableItemId, $group); foreach ($group->users as $user) { if ($user->role->id > 0) { self::incrementParentRolesCounts($mungeTableName, $securableItemId, $user->role); } } foreach ($group->groups as $subGroup) { self::processNestedGroupWhereParentHasReadPermissionOnSecurableItem($mungeTableName, $securableItemId, $subGroup); } } } foreach ($roles as $role) { $count = self::getRoleMungeCount($model, $role); assert('$count >= 0'); if ($count > 0) { self::setCount($mungeTableName, $securableItemId, $role, $count); } } } } }