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)