Bladeren bron

[Sluggable] Use anchored regex query in ODM adapter

Using an anchored regex query will take advantage of MongoDB indexes. See: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

After implementing this fix on an older branch, I realized it builds upon: 96550fd512af1decc7042cfa8d77fd0f41f2111b. This commits adds the fix to replaceRelative() and also uses preg_quote() for escaping the slug in the MongoRegex pattern.
Jeremy Mikola 13 jaren geleden
bovenliggende
commit
9c86941467
1 gewijzigde bestanden met toevoegingen van 2 en 4 verwijderingen
  1. 2 4
      lib/Gedmo/Sluggable/Mapping/Event/Adapter/ODM.php

+ 2 - 4
lib/Gedmo/Sluggable/Mapping/Event/Adapter/ODM.php

@@ -30,7 +30,7 @@ final class ODM extends BaseAdapterODM implements SluggableAdapter
         if ($identifier && !$meta->isIdentifier($config['slug'])) {
             $qb->field($meta->identifier)->notEqual($identifier);
         }
-        $qb->field($config['slug'])->Equals(new \MongoRegex('/^' . str_replace('/', '\/', $slug) . '/'));
+        $qb->field($config['slug'])->equals(new \MongoRegex('/^' . preg_quote($slug, '/') . '/'));
         $q = $qb->getQuery();
         $q->setHydrate(false);
 
@@ -54,9 +54,7 @@ final class ODM extends BaseAdapterODM implements SluggableAdapter
 
         $q = $dm
             ->createQueryBuilder($config['useObjectClass'])
-            ->where("function() {
-                return this.{$config['slug']}.indexOf('{$target}') === 0;
-            }")
+            ->field($config['slug'])->equals(new \MongoRegex('/^' . preg_quote($target, '/') . '/'))
             ->getQuery()
         ;
         $q->setHydrate(false);