From 3c3a90b9e5c78f89027169a33e80cfa76b6f6c62 Mon Sep 17 00:00:00 2001 From: Ilya Biryukov Date: Tue, 25 Dec 2012 22:46:10 +0000 Subject: [PATCH] [Security][Acl] Reduce query size when Select ACL entries for many instances of the same Type at once --- .../Security/Acl/Dbal/AclProvider.php | 52 ++++++++++++++----- 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/src/Symfony/Component/Security/Acl/Dbal/AclProvider.php b/src/Symfony/Component/Security/Acl/Dbal/AclProvider.php index 1b6eb0ab9c..55d7bd7277 100644 --- a/src/Symfony/Component/Security/Acl/Dbal/AclProvider.php +++ b/src/Symfony/Component/Security/Acl/Dbal/AclProvider.php @@ -257,19 +257,47 @@ SELECTCLAUSE; 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 .= ')'; @@ -417,7 +445,7 @@ QUERY; * @param array $oidLookup * * @return \SplObjectStorage mapping object identities to ACL instances - * + * * @throws AclNotFoundException */ private function lookupObjectIdentities(array $batch, array $sids, array $oidLookup)