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); } } } } }
/** * This function is made public for unit testing. Calculates the total for each of the select statements * and adds them up. Setting $selectDistinct to true when calling getCount since this is always true * when counting ids. * @return integer - total count across select statements. */ public function calculateTotalItemCount() { $totalCount = 0; foreach ($this->modelClassNamesAndSearchAttributeData as $identifier => $modelClassNameAndSearchAttributeData) { foreach ($modelClassNameAndSearchAttributeData as $modelClassName => $searchAttributeData) { $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter($modelClassName); $where = ModelDataProviderUtil::makeWhere($modelClassName, $searchAttributeData, $joinTablesAdapter); $totalCount = $totalCount + RedBeanModel::getCount($joinTablesAdapter, $where, $modelClassName, true); } } return $totalCount; }
public static function getCountByModelClassName($modelClassName, $relationItemIds, $ownedByFilter) { assert('is_string($modelClassName)'); assert('is_array($relationItemIds)'); assert('$ownedByFilter == LatestActivitiesConfigurationForm::OWNED_BY_FILTER_ALL || $ownedByFilter == LatestActivitiesConfigurationForm::OWNED_BY_FILTER_USER || is_int($ownedByFilter)'); $searchAttributeDataArray = static::getSearchAttributesDataByModelClassNamesAndRelatedItemIds(array($modelClassName), $relationItemIds, $ownedByFilter); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter($modelClassName); $where = ModelDataProviderUtil::makeWhere($modelClassName, $searchAttributeDataArray[0][$modelClassName], $joinTablesAdapter); $count = RedBeanModel::getCount($joinTablesAdapter, $where, $modelClassName, true); if (isset($searchAttributeDataArray[1][$modelClassName])) { $where = ModelDataProviderUtil::makeWhere($modelClassName, $searchAttributeDataArray[1][$modelClassName], $joinTablesAdapter); return $count + RedBeanModel::getCount($joinTablesAdapter, $where, $modelClassName, true); } return $count; }