Skip to content

Commit

Permalink
[Security][Acl] Reduce query size when Select ACL entries for many in…
Browse files Browse the repository at this point in the history
…stances of the same Type at once
  • Loading branch information
iBiryukov authored and stloyd committed Jan 7, 2013
1 parent dc4a10e commit 3c3a90b
Showing 1 changed file with 40 additions and 12 deletions.
52 changes: 40 additions & 12 deletions src/Symfony/Component/Security/Acl/Dbal/AclProvider.php
Expand Up @@ -257,19 +257,47 @@ protected function getAncestorLookupSql(array $batch)
INNER JOIN {$this->options['oid_ancestors_table_name']} a ON a.object_identity_id = o.id
WHERE (
SELECTCLAUSE;

$where = '(o.object_identifier = %s AND c.class_type = %s)';
$types = array();
for ($i=0,$c=count($batch); $i<$c; $i++) {
$sql .= sprintf(
$where,
$this->connection->quote($batch[$i]->getIdentifier()),
$this->connection->quote($batch[$i]->getType())
);

if ($i+1 < $c) {
$sql .= ' OR ';
}
if(!isset($types[$batch[$i]->getType()])) {
$types[$batch[$i]->getType()] = true;
if(count($batch) > 1) {
break;
}
}
}

if(count($types) === 1) {

$where = '(o.object_identifier IN (%s) AND c.class_type = %s)';
$ids = array();
for ($i=0,$c=count($batch); $i<$c; $i++) {
$ids[] = $this->connection->quote($batch[$i]->getIdentifier());
}

$sql .= sprintf(
$where,
implode(',', $ids),
$this->connection->quote($batch[0]->getType())
);

} else {

$where = '(o.object_identifier = %s AND c.class_type = %s)';
for ($i=0,$c=count($batch); $i<$c; $i++) {
$sql .= sprintf(
$where,
$this->connection->quote($batch[$i]->getIdentifier()),
$this->connection->quote($batch[$i]->getType())
);

if ($i+1 < $c) {
$sql .= ' OR ';
}
}
}


$sql .= ')';

Expand Down Expand Up @@ -417,7 +445,7 @@ private function doUpdateAceIdentityMap(array &$aces)
* @param array $oidLookup
*
* @return \SplObjectStorage mapping object identities to ACL instances
*
*
* @throws AclNotFoundException
*/
private function lookupObjectIdentities(array $batch, array $sids, array $oidLookup)
Expand Down

0 comments on commit 3c3a90b

Please sign in to comment.