From 55694819aa4d42161df989888f1a31e67f026d89 Mon Sep 17 00:00:00 2001
From: Sebastian Castro <sebastian.castro@protonmail.com>
Date: Fri, 15 Jan 2021 14:51:04 +0100
Subject: [PATCH] refactor: use new Mongo ODM shortcuts

---
 config/packages/dev/web_profiler.yaml         |  2 +-
 config/routes/gogo_api.yaml                   |  2 +-
 src/Admin/Element/ElementAdminAbstract.php    |  8 +--
 src/Admin/Element/ElementAdminShowEdit.php    | 10 +--
 src/Block/MonitoringElementsBlockService.php  |  4 +-
 .../CheckExternalSourceToUpdateCommand.php    |  2 +-
 src/Command/ElementsRemoveOptionsCommand.php  |  4 +-
 src/Command/MigrationCommand.php              |  6 +-
 .../RemoveAbandonnedProjectsCommand.php       |  4 +-
 src/Command/UpdateElementsJsonCommand.php     |  2 +-
 src/Controller/APIController.php              |  8 +--
 .../BulkActionsAbstractController.php         |  7 +--
 .../DuplicatesActionsController.php           |  2 +-
 .../Admin/ElementAdminBulkController.php      | 31 +++++-----
 src/Controller/MailTestController.php         |  2 +-
 src/Controller/ProjectController.php          |  2 +-
 .../DatabaseIntegrityWatcher.php              | 62 ++++++++-----------
 src/EventListener/ElementJsonGenerator.php    |  7 +--
 src/Repository/CategoryRepository.php         |  2 +-
 src/Repository/ElementRepository.php          | 34 +++++-----
 src/Repository/OptionRepository.php           | 16 -----
 src/Repository/TaxonomyRepository.php         |  6 +-
 src/Repository/UserRepository.php             |  2 +-
 .../ElementImportMappingTaxonomyService.php   |  3 +-
 src/Services/ElementImportService.php         | 27 ++++----
 src/Services/GoGoCartoJsService.php           |  6 +-
 src/Services/WebhookService.php               |  2 +-
 .../custom-fields/form-builder.html.twig      |  3 +-
 28 files changed, 103 insertions(+), 163 deletions(-)

diff --git a/config/packages/dev/web_profiler.yaml b/config/packages/dev/web_profiler.yaml
index fd2242410..e92166a7f 100644
--- a/config/packages/dev/web_profiler.yaml
+++ b/config/packages/dev/web_profiler.yaml
@@ -1,6 +1,6 @@
 web_profiler:
     toolbar: true
-    intercept_redirects: true
+    intercept_redirects: false
 
 framework:
     profiler: { only_exceptions: false }
diff --git a/config/routes/gogo_api.yaml b/config/routes/gogo_api.yaml
index cd785e8d1..cd5bb2251 100644
--- a/config/routes/gogo_api.yaml
+++ b/config/routes/gogo_api.yaml
@@ -11,7 +11,7 @@ gogo_api_elements_from_text:
 
 gogo_api_element_names_from_text:
     path:     /api/element_names/search
-    defaults: { _controller: App\Controller\APIController::getElementNamessFromTextAction }
+    defaults: { _controller: App\Controller\APIController::getElementNamesFromTextAction }
     requirements:
         methods: GET
 
diff --git a/src/Admin/Element/ElementAdminAbstract.php b/src/Admin/Element/ElementAdminAbstract.php
index 53345dbc8..ebca5906e 100755
--- a/src/Admin/Element/ElementAdminAbstract.php
+++ b/src/Admin/Element/ElementAdminAbstract.php
@@ -65,14 +65,8 @@ class ElementAdminAbstract extends AbstractAdmin
     public function getOptionsChoices()
     {
       if ($this->optionsChoices == null) {
-        $this->optionsChoices = [];
         $dm = GoGoHelper::getDmFromAdmin($this);
-        $repo = $dm->get('Option');
-        $this->optionList = $repo->createQueryBuilder()->select('name')->hydrate(false)->getQuery()->execute()->toArray();
-
-        foreach ($this->optionList as $key => $value) {
-            $this->optionsChoices[$key] = array_key_exists('name', $value) ? $value['name'] : 'Nom inconnu';
-        }
+        $this->optionsChoices = $dm->query('Option')->select('name')->getArray();
       }
       return $this->optionsChoices;
     }
diff --git a/src/Admin/Element/ElementAdminShowEdit.php b/src/Admin/Element/ElementAdminShowEdit.php
index d2dbe4e53..8623d54eb 100755
--- a/src/Admin/Element/ElementAdminShowEdit.php
+++ b/src/Admin/Element/ElementAdminShowEdit.php
@@ -26,13 +26,9 @@ class ElementAdminShowEdit extends ElementAdminList
     {
         $dm = GoGoHelper::getDmFromAdmin($this);
         $this->config = $dm->get('Configuration')->findConfiguration();  
-        $categories = $dm->query('Option')->select('name')
-                      ->hydrate(false)->getQuery()->execute();
-        $categoriesChoices = [];
-        foreach ($categories as $id => $object) {
-            $categoriesChoices[$object['name']] = $id;
-        }
-
+        $categories = $dm->query('Option')->select('name')->getArray();
+        $categoriesChoices = array_flip($categories);
+        
         $formMapper
           ->with('Informations générales', ['class' => 'col-md-6'])
             ->add('name', null, ['required' => true, 'label' => "Nom / Titre"])
diff --git a/src/Block/MonitoringElementsBlockService.php b/src/Block/MonitoringElementsBlockService.php
index 76cd1d3c4..b6226a8ec 100755
--- a/src/Block/MonitoringElementsBlockService.php
+++ b/src/Block/MonitoringElementsBlockService.php
@@ -47,9 +47,9 @@ class MonitoringElementsBlockService extends AbstractBlockService
         $validateElements = $this->dm->get('Element')->findValidated(true);
         $allVisibleElements = $this->dm->get('Element')->findVisibles(true, false);
         $visibleNonImportedElements = $this->dm->get('Element')->findVisibles(true, true);
-        $activeUsersCount = $this->dm->query('User')->field('enabled')->equals(true)->count()->getQuery()->execute();
+        $activeUsersCount = $this->dm->query('User')->field('enabled')->equals(true)->count()->execute();
         $activeUsersNewsletterCount = $this->dm->query('User')->field('enabled')->equals(true)
-                                                                                        ->field('newsletterFrequency')->gt(NewsletterFrequencyOptions::Never)->count()->getQuery()->execute();
+                                                                                        ->field('newsletterFrequency')->gt(NewsletterFrequencyOptions::Never)->count()->execute();
 
         $errors = $this->dm->get('GoGoLog')->findBy(['level' => 'error', 'hidden' => false]);
         usort($errors, function ($a, $b) { return $b->getCreatedAt()->getTimestamp() - $a->getCreatedAt()->getTimestamp(); });
diff --git a/src/Command/CheckExternalSourceToUpdateCommand.php b/src/Command/CheckExternalSourceToUpdateCommand.php
index 67ec86ed4..424d029d2 100755
--- a/src/Command/CheckExternalSourceToUpdateCommand.php
+++ b/src/Command/CheckExternalSourceToUpdateCommand.php
@@ -34,7 +34,7 @@ class CheckExternalSourceToUpdateCommand extends GoGoAbstractCommand
 
         $dynamicImports = $qb->field('refreshFrequencyInDays')->gt(0)
                 ->field('nextRefresh')->lte(new \DateTime())
-                ->getQuery()->execute();
+                ->execute();
 
         $this->log('CheckExternalSourceToUpdate : Nombre de sources à mettre à jour : '.$dynamicImports->count());
 
diff --git a/src/Command/ElementsRemoveOptionsCommand.php b/src/Command/ElementsRemoveOptionsCommand.php
index 9e4ea6b7d..2c9cab677 100755
--- a/src/Command/ElementsRemoveOptionsCommand.php
+++ b/src/Command/ElementsRemoveOptionsCommand.php
@@ -24,8 +24,8 @@ class ElementsRemoveOptionsCommand extends GoGoAbstractCommand
             $this->log('Elements remove options begin, options ids to remove : '.$input->getArgument('ids'));
             $optionsIdDeleted = array_map(function ($string) { return (int) $string; }, explode(',', $input->getArgument('ids')));
 
-            $qb = $dm->get('Element')->createQueryBuilder();
-            $elements = $qb->field('optionValues.optionId')->in($optionsIdDeleted)->getQuery()->execute();
+            $qb = $dm->query('Element');
+            $elements = $qb->field('optionValues.optionId')->in($optionsIdDeleted)->execute();
             $this->log($elements->count().' element to proceed');
 
             if ($elements->count() > 0) {
diff --git a/src/Command/MigrationCommand.php b/src/Command/MigrationCommand.php
index e3869f8fb..329d30330 100644
--- a/src/Command/MigrationCommand.php
+++ b/src/Command/MigrationCommand.php
@@ -101,10 +101,8 @@ class MigrationCommand extends GoGoAbstractCommand
         try {
             // Collecting the Database to be updated
             $dbs = [$_ENV['DATABASE_NAME']]; // default DB
-            $dbNames = $dm->query('Project')->select('domainName')->hydrate(false)->getQuery()->execute()->toArray();
-            foreach ($dbNames as $object) {
-                $dbs[] = $object['domainName'];
-            }
+            $dbNames = $dm->query('Project')->select('domainName')->getArray();
+            foreach ($dbNames as $dbName) $dbs[] = $dbName;
 
             if (count(self::$migrations) > $migrationState->getMigrationIndex()) {
                 $migrationsToRun = array_slice(self::$migrations, $migrationState->getMigrationIndex());
diff --git a/src/Command/RemoveAbandonnedProjectsCommand.php b/src/Command/RemoveAbandonnedProjectsCommand.php
index 75fec4820..23d542624 100755
--- a/src/Command/RemoveAbandonnedProjectsCommand.php
+++ b/src/Command/RemoveAbandonnedProjectsCommand.php
@@ -42,7 +42,7 @@ final class RemoveAbandonnedProjectsCommand extends GoGoAbstractCommand
         $projectsToWarn = $dm->query('Project')
                         ->field('lastLogin')->lte($date->setTimestamp(strtotime("-12 month")))
                         ->field('warningToDeleteProjectSentAt')->exists(false)
-                        ->getQuery()->execute();
+                        ->execute();
 
         if ($projectsToWarn->count() > 0)
             $this->log('Nombre de projets avertis de la suppression : '. $projectsToWarn->count());
@@ -67,7 +67,7 @@ final class RemoveAbandonnedProjectsCommand extends GoGoAbstractCommand
         $projectsToDelete = $dm->query('Project')
                         ->field('lastLogin')->lte($date->setTimestamp(strtotime("-12 month")))
                         ->field('warningToDeleteProjectSentAt')->lte($date->setTimestamp(strtotime("-4 month")))
-                        ->getQuery()->execute();
+                        ->execute();
 
         $message = "Les projets suivants sont probablement à supprimer : ";
         foreach ($projectsToDelete as $project) {
diff --git a/src/Command/UpdateElementsJsonCommand.php b/src/Command/UpdateElementsJsonCommand.php
index 4f1532018..35f55e861 100755
--- a/src/Command/UpdateElementsJsonCommand.php
+++ b/src/Command/UpdateElementsJsonCommand.php
@@ -37,7 +37,7 @@ class UpdateElementsJsonCommand extends GoGoAbstractCommand
             } else {
                 $qb = $dm->query('Element');
                 $qb->field('id')->in(explode(',', $input->getArgument('ids')));
-                $elements = $qb->getQuery()->execute();
+                $elements = $qb->execute();
             }
 
             $count = $elements->count();
diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php
index d41cbe901..e1ea2f94b 100644
--- a/src/Controller/APIController.php
+++ b/src/Controller/APIController.php
@@ -155,10 +155,8 @@ class APIController extends GoGoController
     }
 
     /* Use is elements field (linking elements betwwen each others) */
-    public function getElementNamessFromTextAction(Request $request, DocumentManager $dm)
+    public function getElementNamesFromTextAction(Request $request, DocumentManager $dm)
     {
-        $isAdmin = $this->isUserAdmin();
-
         $elements = $dm->get('Element')->findElementNamesWithText($request->get('text'), $request->get('excludeId'));
 
         $responseJson = json_encode($elements);
@@ -330,7 +328,7 @@ class APIController extends GoGoController
         $qb->updateMany()
        ->field('type')->notEqual('update')
        ->field('hidden')->equals(false)
-       ->field('hidden')->set(true)->getQuery()->execute();
+       ->field('hidden')->set(true)->execute();
 
         return $this->redirectToRoute('sonata_admin_dashboard');
     }
@@ -341,7 +339,7 @@ class APIController extends GoGoController
         $qb->updateMany()
        ->field('type')->equals('update')
        ->field('hidden')->equals(false)
-       ->field('hidden')->set(true)->getQuery()->execute();
+       ->field('hidden')->set(true)->execute();
 
         return $this->redirectToRoute('sonata_admin_dashboard');
     }
diff --git a/src/Controller/Admin/BulkActions/BulkActionsAbstractController.php b/src/Controller/Admin/BulkActions/BulkActionsAbstractController.php
index ff737785c..4133b03e1 100755
--- a/src/Controller/Admin/BulkActions/BulkActionsAbstractController.php
+++ b/src/Controller/Admin/BulkActions/BulkActionsAbstractController.php
@@ -14,15 +14,10 @@ class BulkActionsAbstractController extends Controller
 
     protected function elementsBulkAction($functionToExecute, $dm, $request, $session)
     {
-        $elementsLeft = null;
-        $elementLeftCount = 0;
         $isStillElementsToProceed = false;
 
         $elementRepo = $dm->get('Element');
-
-        $optionsRepo = $dm->get('Option');
-        $this->optionList = $optionsRepo->createQueryBuilder()->hydrate(false)->getQuery()->execute()->toArray();
-
+        
         if (!$this->fromBeginning && $request->get('batchFromStep')) {
             $batchFromStep = $request->get('batchFromStep');
         } else {
diff --git a/src/Controller/Admin/BulkActions/DuplicatesActionsController.php b/src/Controller/Admin/BulkActions/DuplicatesActionsController.php
index a488552c2..8d3bfe494 100755
--- a/src/Controller/Admin/BulkActions/DuplicatesActionsController.php
+++ b/src/Controller/Admin/BulkActions/DuplicatesActionsController.php
@@ -43,7 +43,7 @@ class DuplicatesActionsController extends BulkActionsAbstractController
             // properly the elements
             $duplicates = $dm->query('Element')
                              ->field('id')->in($duplicateIds)
-                             ->getQuery()->execute()->toArray();
+                             ->getArray();
             $perfectMatches = array_filter($duplicates, function ($duplicate) use ($element) { return slugify($duplicate->getName()) == slugify($element->getName()); });
             $otherDuplicates = array_diff($duplicates, $perfectMatches);
             $duplicates[] = $element;
diff --git a/src/Controller/Admin/ElementAdminBulkController.php b/src/Controller/Admin/ElementAdminBulkController.php
index 5c9d49354..d0f256bee 100755
--- a/src/Controller/Admin/ElementAdminBulkController.php
+++ b/src/Controller/Admin/ElementAdminBulkController.php
@@ -62,10 +62,9 @@ class ElementAdminBulkController extends Controller
         $this->admin->checkAccess('edit');
 
         $request = $this->get('request_stack')->getCurrentRequest()->request;
-        $modelManager = $this->admin->getModelManager();
 
         $qb = clone $selectedModelQuery;
-        $elementIds = array_keys($qb->select('id')->hydrate(false)->getQuery()->execute()->toArray());
+        $elementIds = $qb->getIds();
         $elementIdsString = '"'.implode(',', $elementIds).'"';
         $queryArray = $selectedModelQuery->getQuery()->getQuery()['query'];
         // if query is "get all elements", no need to specify all ids
@@ -115,7 +114,7 @@ class ElementAdminBulkController extends Controller
                    ->field('type')->equals($contrib->getType())
                    ->field('elements.id')->in($elementIds)
                    ->field('webhookPosts')->unsetField()->exists(true)
-                   ->getQuery()->execute();
+                   ->execute();
 
                 $contrib->setElementIds($elementIds);
                 $this->dm->persist($contrib);
@@ -137,7 +136,7 @@ class ElementAdminBulkController extends Controller
                     $qb = $qb->field('moderationState')->set(ModerationState::NotNeeded);
                 }
 
-                $qb->getQuery()->execute();
+                $qb->execute();
 
                 // BATCH RESOLVE REPORTS
                 if ('resolveReports' == $actionName) {
@@ -149,7 +148,7 @@ class ElementAdminBulkController extends Controller
                        ->field('resolvedMessage')->set($comment)
                        ->field('resolvedBy')->set($this->getUser()->getEmail())
                        ->field('updatedAt')->set(new \DateTime())
-                       ->getQuery()->execute();
+                       ->execute();
                 }
 
                 $this->dm->flush();
@@ -178,6 +177,7 @@ class ElementAdminBulkController extends Controller
                 $this->dm->clear();
             }
         } catch (\Exception $e) {
+            dump($e);
             $this->addFlash('sonata_flash_error', 'Une erreur est survenue :'.$e->getMessage());
 
             return new RedirectResponse($this->admin->generateUrl('list', ['filter' => $this->admin->getFilterParameters()]));
@@ -194,7 +194,7 @@ class ElementAdminBulkController extends Controller
     {
         // Add contribution for webhook - Get elements visible, no need to add a contirbution if element where already soft deleted for example
         $selectedModels = clone $selectedModelQuery;
-        $elementIds = array_keys($selectedModels->select('id')->field('status')->gte(-1)->hydrate(false)->getQuery()->execute()->toArray());
+        $elementIds = $selectedModels->field('status')->gte(-1)->getIds();
         if (count($elementIds)) {
             $contribution = $this->interactionService->createContribution(null, null, InteractType::Deleted, ElementStatus::Deleted);
             $contribution->setElementIds($elementIds);
@@ -204,19 +204,19 @@ class ElementAdminBulkController extends Controller
         // Add element id to ignore to sources
         $selectedModels = clone $selectedModelQuery;
         $elements = $selectedModels
-            ->select('id', 'source.$id')
+            ->select('oldId', 'source.$id')
             ->field('source.$id')->exists(true)
-            ->hydrate(false)->getQuery()->execute()->toArray();
+            ->getArray();
         $elementsIdsGroupedBySource = [];
         foreach($elements as $element) {
-            $elementsIdsGroupedBySource[$element['source']['$id']][] = $element['_id'];
+            $elementsIdsGroupedBySource[$element['source']['$id']][] = $element['oldId'];
         }
         foreach ($elementsIdsGroupedBySource as $sourceId => $elementIds) {
-            $qb = $this->dm->createQueryBuilder(Import::class);
+            $qb = $this->dm->query('Import');
             $qb->updateOne()
                ->field('id')->equals($sourceId)
                ->field('idsToIgnore')->addToSet($qb->expr()->each($elementIds))
-               ->getQuery()->execute();
+               ->execute();
         }
 
         // Perform remove
@@ -235,9 +235,9 @@ class ElementAdminBulkController extends Controller
                 $this->trans('flash_batch_delete_error', [], 'SonataAdminBundle')
             );
         }
-        // $selectedModelQuery->findAndRemove()->getQuery()->execute();
+        // $selectedModelQuery->findAndRemove()->execute();
 
-        $this->dm->createQueryBuilder(UserInteractionContribution::class)->field('element.id')->in($elementIds)->remove()->getQuery()->execute();
+        $this->dm->createQueryBuilder(UserInteractionContribution::class)->field('element.id')->in($elementIds)->remove()->execute();
 
         $this->dm->flush();
 
@@ -313,7 +313,6 @@ class ElementAdminBulkController extends Controller
         $this->admin->checkAccess('edit');
 
         $request = $this->get('request_stack')->getCurrentRequest()->request;
-        $modelManager = $this->admin->getModelManager();
 
         $selectedModels = $selectedModelQuery->execute();
         $nbreModelsToProceed = $selectedModels->count();
@@ -330,7 +329,7 @@ class ElementAdminBulkController extends Controller
                 $optionsValues = $selectedModel->getOptionValues()->toArray();
                 if ($optionstoRemoveIds && count($optionstoRemoveIds) > 0) {
                     $optionsToRemove = $this->dm->query('Option')->field('id')->in($optionstoRemoveIds)
-                                                       ->getQuery()->execute()->toArray();
+                                                       ->getArray();
                     $optionstoRemoveIds = array_map(function ($opt) { return $opt->getIdAndChildrenOptionIds(); }, $optionsToRemove);
                     $optionstoRemoveIds = array_unique($this->flatten($optionstoRemoveIds));
 
@@ -342,7 +341,7 @@ class ElementAdminBulkController extends Controller
                 }
 
                 if ($optionstoAddIds && count($optionstoAddIds) > 0) {
-                    $optionsToAdd = $this->dm->query('Option')->field('id')->in($optionstoAddIds)->getQuery()->execute()->toArray();
+                    $optionsToAdd = $this->dm->query('Option')->field('id')->in($optionstoAddIds)->getArray();
                     $optionstoAddIds = array_map(function ($opt) { return $opt->getIdAndParentOptionIds(); }, $optionsToAdd);
                     $optionstoAddIds = array_unique($this->flatten($optionstoAddIds));
 
diff --git a/src/Controller/MailTestController.php b/src/Controller/MailTestController.php
index 8c929c749..d7691c443 100755
--- a/src/Controller/MailTestController.php
+++ b/src/Controller/MailTestController.php
@@ -79,7 +79,7 @@ class MailTestController extends Controller
             $qb = $this->dm->query('Element');
             $qb->field('status')->gte(ElementStatus::AdminRefused);
             $qb->field('moderationState')->notIn([ModerationState::GeolocError, ModerationState::NoOptionProvided]);
-            $options = $qb->limit(30)->getQuery()->execute();
+            $options = $qb->limit(30)->execute();
         } else {
             $element = $this->dm->get('Element')->findVisibles()->getSingleResult();
         }
diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php
index 42903a1e9..0a6807183 100755
--- a/src/Controller/ProjectController.php
+++ b/src/Controller/ProjectController.php
@@ -140,7 +140,7 @@ class ProjectController extends Controller
                         ->field('published')->equals(true)
                         ->field('dataSize')->gte(10)
                         ->sort('publishedAt', 'desc')
-                        ->getQuery()->execute();
+                        ->execute();
         $pinnedProjects = $repository->findBy(['pinned' => true]);
 
         foreach ($projects as $project) {
diff --git a/src/EventListener/DatabaseIntegrityWatcher.php b/src/EventListener/DatabaseIntegrityWatcher.php
index d68d70820..c7531772f 100755
--- a/src/EventListener/DatabaseIntegrityWatcher.php
+++ b/src/EventListener/DatabaseIntegrityWatcher.php
@@ -44,7 +44,7 @@ class DatabaseIntegrityWatcher
         if ($document instanceof Group) {
             $group = $document;
             $qb = $dm->get('User')->createQueryBuilder();
-            $users = $qb->field('groups.id')->in([$group->getId()])->getQuery()->execute();
+            $users = $qb->field('groups.id')->in([$group->getId()])->execute();
             if ($users->count() > 0) {
                 foreach ($users as $user) {
                     $user->removeGroup($group);
@@ -52,13 +52,13 @@ class DatabaseIntegrityWatcher
             }
         } elseif ($document instanceof Import || $document instanceof ImportDynamic) {
             $import = $document;
-            $qb = $dm->get('Element')->createQueryBuilder();
-            $qb->remove()->field('source')->references($import)->getQuery()->execute();
+            $qb = $dm->query('Element');
+            $qb->remove()->field('source')->references($import)->execute();
         } elseif ($document instanceof Webhook) {
             $webhook = $document;
             $contributions = $dm->query('UserInteractionContribution')
                                 ->field('webhookPosts.webhook.$id')->equals($webhook->getId())
-                                ->getQuery()->execute();
+                                ->execute();
 
             foreach ($contributions as $contrib) {
                 $contrib->getElement()->setPreventJsonUpdate(true);
@@ -73,7 +73,7 @@ class DatabaseIntegrityWatcher
             $qb = $dm->query('Element');
             $qb->addOr($qb->expr()->field('nonDuplicates.$id')->equals($document->getId()));
             $qb->addOr($qb->expr()->field('potentialDuplicates.$id')->equals($document->getId()));
-            $dependantElements = $qb->getQuery()->execute();
+            $dependantElements = $qb->execute();
             foreach ($dependantElements as $element) {
                 $element->removeNonDuplicate($document);
                 $element->removePotentialDuplicate($document);
@@ -88,16 +88,12 @@ class DatabaseIntegrityWatcher
             if (count($elementsFields)) {
                 foreach ($elementsFields as $fieldName) {
                     $fieldPath = "data.$fieldName.{$document->getId()}";
-                    $dependantElementsIds = array_keys(
-                        $dm->get('Element')->createQueryBuilder()
-                             ->field($fieldPath)->exists(true)
-                             ->select('id')->hydrate(false)->getQuery()->execute()->toArray());
+                    $dependantElementsIds = $dm->query('Element')->field($fieldPath)->exists(true)->getIds();
 
                     if (count($dependantElementsIds)) {
-                        $dm->get('Element')->createQueryBuilder()
-                                 ->updateMany()
-                                 ->field($fieldPath)->unsetField()->exists(true)
-                                 ->getQuery()->execute();
+                        $dm->query('Element')->updateMany()
+                           ->field($fieldPath)->unsetField()->exists(true)
+                           ->execute();
                         $elementIdsString = '"'.implode(',', $dependantElementsIds).'"';
                         $this->asyncService->callCommand('app:elements:updateJson', ['ids' => $elementIdsString]);
                     }
@@ -123,8 +119,9 @@ class DatabaseIntegrityWatcher
             $uow->computeChangeSets();
             $changeset = $uow->getDocumentChangeSet($document);
             if (array_key_exists('name', $changeset)) {
-                $query = $dm->query('Element')->field('optionValues.optionId')->in([$document->getId()]);
-                $elementIds = array_keys($query->select('id')->hydrate(false)->getQuery()->execute()->toArray());
+                $elementIds = $dm->query('Element')
+                                 ->field('optionValues.optionId')->in([$document->getId()])
+                                 ->getIds();
                 if (count($elementIds)) {
                     $elementIdsString = '"'.implode(',', $elementIds).'"';
                     $this->asyncService->callCommand('app:elements:updateJson', ['ids' => $elementIdsString]);
@@ -156,22 +153,19 @@ class DatabaseIntegrityWatcher
                     $uow = $dm->getUnitOfWork();
                     $uow->computeChangeSets();
                     $changeset = $uow->getDocumentChangeSet($element);
-                    $elementToUpdates = [];
-                    $privateProps = $config->getApi()->getPublicApiPrivateProperties();
+                    $elementIdsToUpdate = [];
 
                     // If name have changed, update element which reference this element
                     if (array_key_exists('name', $changeset)) {
                         $newName = $changeset['name'][1];
                         foreach ($elementsFields as $fieldName) {
                             $fieldPath = "data.$fieldName.{$element->getId()}";
-                            $dm->get('Element')->createQueryBuilder()
-                                     ->updateMany()
+                            $dm->query('Element')->updateMany()
                                      ->field($fieldPath)->set($newName)
                                      ->field($fieldPath)->exists(true)
-                                     ->getQuery()->execute();
-                            $elementToUpdates = $elementToUpdates + $dm->get('Element')->createQueryBuilder()
-                                     ->field($fieldPath)->exists(true)
-                                     ->select('id')->hydrate(false)->getQuery()->execute()->toArray();
+                                     ->execute();
+                            $elementIdsToUpdate = array_merge($elementIdsToUpdate, $dm->query('Element')
+                                     ->field($fieldPath)->exists(true)->getIds());
 
                         }
                     }
@@ -189,29 +183,27 @@ class DatabaseIntegrityWatcher
 
                             // Updates elements throught reverse relation
                             if (count($addedElements) > 0) {
-                                $dm->get('Element')->createQueryBuilder()
+                                $dm->query('Element')
                                      ->updateMany()
                                      ->field('id')->in($addedElements)
                                      ->field($fieldPath)->set($element->getName())
-                                     ->getQuery()->execute();
-                                $elementToUpdates = $elementToUpdates + $dm->get('Element')->createQueryBuilder()
-                                     ->field('id')->in($addedElements)
-                                     ->select('id')->hydrate(false)->getQuery()->execute()->toArray();
+                                     ->execute();
+                                $elementIdsToUpdate = array_merge($elementIdsToUpdate, $dm->query('Element')
+                                     ->field('id')->in($addedElements)->getIds());
                             }
                             if (count($removedElements) > 0) {
-                                $dm->get('Element')->createQueryBuilder()
+                                $dm->query('Element')
                                      ->updateMany()
                                      ->field('id')->in($removedElements)
                                      ->field($fieldPath)->unsetField()->exists(true)
-                                     ->getQuery()->execute();
-                                $elementToUpdates = $elementToUpdates + $dm->get('Element')->createQueryBuilder()
-                                     ->field('id')->in($removedElements)
-                                     ->select('id')->hydrate(false)->getQuery()->execute()->toArray();
+                                     ->execute();
+                                $elementIdsToUpdate = array_merge($elementIdsToUpdate, $dm->query('Element')
+                                     ->field('id')->in($removedElements)->getIds());
                             }
                         }
                     }
-                    if (count($elementToUpdates)) {
-                        $ids = array_unique(array_keys($elementToUpdates));
+                    if (count($elementIdsToUpdate)) {
+                        $ids = array_unique($elementIdsToUpdate);
                         $elementIdsString = '"'.implode(',', $ids).'"';
                         $this->asyncService->callCommand('app:elements:updateJson', ['ids' => $elementIdsString]);
                     }
diff --git a/src/EventListener/ElementJsonGenerator.php b/src/EventListener/ElementJsonGenerator.php
index d559dcd0f..47f5ed4e1 100644
--- a/src/EventListener/ElementJsonGenerator.php
+++ b/src/EventListener/ElementJsonGenerator.php
@@ -2,9 +2,7 @@
 
 namespace App\EventListener;
 
-use App\Document\Element;
 use App\Document\ElementStatus;
-use App\Document\ModerationState;
 use Doctrine\ODM\MongoDB\DocumentManager;
 
 class ElementJsonGenerator
@@ -30,8 +28,7 @@ class ElementJsonGenerator
     {
         // load all options so we don't need to do a query on each element being modified
         if (!$this->options) {
-            $this->options = $this->dm->get('Option')->createQueryBuilder()
-                                             ->select('name')->hydrate(false)->getQuery()->execute()->toArray();
+            $this->options = $this->dm->query('Option')->select('name')->getArray();
         }
 
         return $this->options;
@@ -102,7 +99,7 @@ class ElementJsonGenerator
             for ($i = 0; $i < $optValuesLength; ++$i) {
                 $optionValue = $sortedOptionsValues[$i];
                 if (isset($options[$optionValue->getOptionId()])) {
-                    $optionName = $options[$optionValue->getOptionId()]['name'];
+                    $optionName = $options[$optionValue->getOptionId()];
                     $elementOptions[] = $optionName;
                     $optionsFullJson[] = $sortedOptionsValues[$i]->toJson(json_encode($optionName));
                 } else {
diff --git a/src/Repository/CategoryRepository.php b/src/Repository/CategoryRepository.php
index 28eb1c7d9..1d971831f 100755
--- a/src/Repository/CategoryRepository.php
+++ b/src/Repository/CategoryRepository.php
@@ -17,6 +17,6 @@ class CategoryRepository extends DocumentRepository
         $qb = $this->query('Category');
         $qb->field('isRootCategory')->equals(true)->sort('index', 'asc');
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 }
diff --git a/src/Repository/ElementRepository.php b/src/Repository/ElementRepository.php
index 6b84f9fec..421d29ca5 100755
--- a/src/Repository/ElementRepository.php
+++ b/src/Repository/ElementRepository.php
@@ -55,7 +55,7 @@ class ElementRepository extends DocumentRepository
 
         $qb->limit(6);
 
-        return $this->queryToArray($qb);
+        return $qb->hydrate(false)->getArray();
     }
 
     public function findWhithinBoxes($bounds, $request, $getFullRepresentation, $isAdmin = false)
@@ -98,7 +98,7 @@ class ElementRepository extends DocumentRepository
             }
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
 
@@ -123,7 +123,7 @@ class ElementRepository extends DocumentRepository
         $qb->field('id')->notEqual($excludeId);
         $qb->select('name')->limit(20);
 
-        return $this->queryToArray($qb);
+        return $qb->getArray();
     }
 
     public function findPendings($getCount = false)
@@ -135,7 +135,7 @@ class ElementRepository extends DocumentRepository
             $qb->count();
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findModerationNeeded($getCount = false, $moderationState = null)
@@ -153,7 +153,7 @@ class ElementRepository extends DocumentRepository
             $qb->count();
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findValidated($getCount = false)
@@ -165,7 +165,7 @@ class ElementRepository extends DocumentRepository
             $qb->count();
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findVisibles($getCount = false, $excludeImported = false, $limit = null, $skip = null)
@@ -186,7 +186,7 @@ class ElementRepository extends DocumentRepository
             $qb->count();
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findAllPublics($getFullRepresentation, $isAdmin, $request = null)
@@ -218,7 +218,7 @@ class ElementRepository extends DocumentRepository
             $qb->count();
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findModerationElementToNotifyToUser($user)
@@ -237,12 +237,12 @@ class ElementRepository extends DocumentRepository
             $qb->field('address.postalCode')->equals(new \MongoRegex($regexp));
         }
             
-        return $qb->count()->getQuery()->execute();
+        return $qb->count()->execute();
     }
 
     private function queryToArray($qb)
     {
-        return $qb->hydrate(false)->getQuery()->execute()->toArray();
+        return $qb->hydrate(false)->execute()->toArray();
     }
 
     private function filterWithRequest($qb, $request)
@@ -314,7 +314,7 @@ class ElementRepository extends DocumentRepository
         $qb->field('status')->notEqual(ElementStatus::ModifiedPendingVersion);
         $qb->sort('updatedAt', 'DESC');
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     // Used by newsletter
@@ -329,16 +329,14 @@ class ElementRepository extends DocumentRepository
             $qb->limit($limit);
         }
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findStampedWithId($stampId)
     {
-        $qb = $this->query('Element');
-        $qb->field('stamps.id')->in([(float) $stampId]);
-        $qb->select('id');
-
-        return $this->queryToArray($qb);
+        return $this->query('Element')
+            ->field('stamps.id')->in([(float) $stampId])
+            ->getIds();
     }
 
     public function findPotentialDuplicateOwner($element)
@@ -346,7 +344,7 @@ class ElementRepository extends DocumentRepository
         $qb = $this->query('Element');
         $qb->field('potentialDuplicates')->includesReferenceTo($element);
 
-        return $qb->getQuery()->execute();
+        return $qb->execute();
     }
 
     public function findOriginalElementOfModifiedPendingVersion($element)
diff --git a/src/Repository/OptionRepository.php b/src/Repository/OptionRepository.php
index 7baf17a86..518e4bd36 100755
--- a/src/Repository/OptionRepository.php
+++ b/src/Repository/OptionRepository.php
@@ -4,22 +4,6 @@ namespace App\Repository;
 
 use Doctrine\ODM\MongoDB\Repository\DocumentRepository;
 
-/**
- * OptionRepository.
- *
- * This class was generated by the Doctrine ORM. Add your own custom
- * repository methods below.
- */
 class OptionRepository extends DocumentRepository
 {
-    public function findOptionsIdsWithText($text)
-    {
-        $qbOption = $this->query('Option');
-        $expr = $qbOption->expr()->operator('$text', ['$search' => (string) $text]);
-        $qbOption  //->limit(50)
-        ->equals($expr->getQuery())
-        ->select('id');
-
-        return $qbOption->hydrate(false)->getQuery()->execute()->toArray();
-    }
 }
diff --git a/src/Repository/TaxonomyRepository.php b/src/Repository/TaxonomyRepository.php
index 435d72c39..4fa02d267 100755
--- a/src/Repository/TaxonomyRepository.php
+++ b/src/Repository/TaxonomyRepository.php
@@ -8,15 +8,13 @@ class TaxonomyRepository extends DocumentRepository
 {
     public function findTaxonomy()
     {
-        $qb = $this->query('Taxonomy');
-
-        return $qb->getQuery()->getSingleResult();
+        return $this->query('Taxonomy')->getOne();
     }
 
     public function findTaxonomyJson($getOnlyOptions = false)
     {
         $qb = $this->query('Taxonomy');
-        $taxonomy = $qb->hydrate(false)->getQuery()->getSingleResult();
+        $taxonomy = $qb->hydrate(false)->getOne();
 
         return $getOnlyOptions ? $taxonomy['optionsJson'] : $taxonomy['taxonomyJson'];
     }
diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php
index 7ad949d55..8e11a2e71 100755
--- a/src/Repository/UserRepository.php
+++ b/src/Repository/UserRepository.php
@@ -20,6 +20,6 @@ class UserRepository extends DocumentRepository
         return $qb->field('newsletterFrequency')->gt(NewsletterFrequencyOptions::Never)
                 ->field('nextNewsletterDate')->lte(new \DateTime())
                 ->limit(70)
-                ->getQuery()->execute();
+                ->execute();
     }
 }
diff --git a/src/Services/ElementImportMappingTaxonomyService.php b/src/Services/ElementImportMappingTaxonomyService.php
index 7bc85c749..6542f08ec 100644
--- a/src/Services/ElementImportMappingTaxonomyService.php
+++ b/src/Services/ElementImportMappingTaxonomyService.php
@@ -18,8 +18,7 @@ class ElementImportMappingTaxonomyService
     {
         $taxonomyMapping = $import->getTaxonomyMapping();
         // delete obsolte mapping (if an option have been deleted, but is still in the mapping)
-        $allOptionsIds = array_keys($this->dm->query('Option')->select('id')
-                                ->hydrate(false)->getQuery()->execute()->toArray());
+        $allOptionsIds = $this->dm->query('Option')->getIds();
         foreach ($taxonomyMapping as $key => $mappedObject) {
             $taxonomyMapping[$key]['mappedCategoryIds'] = array_filter($mappedObject['mappedCategoryIds'], function ($el) use ($allOptionsIds) {
                 return in_array($el, $allOptionsIds);
diff --git a/src/Services/ElementImportService.php b/src/Services/ElementImportService.php
index afe3b92f8..5e7b77c92 100755
--- a/src/Services/ElementImportService.php
+++ b/src/Services/ElementImportService.php
@@ -152,12 +152,10 @@ class ElementImportService
                 $import->updateNextRefreshDate();
 
                 // before updating the source, we collect all elements ids
-                $previouslyImportedElementIds = array_keys($qb->field('source')->references($import)
-                   ->select('id')->hydrate(false)
-                   ->getQuery()->execute()->toArray());
+                $previouslyImportedElementIds = $qb->field('source')->references($import)->getIds();
             } else {
                 // before re importing a static source, we delete all previous items
-                $qb->remove()->field('source')->references($import)->getQuery()->execute();
+                $qb->remove()->field('source')->references($import)->execute();
             }
 
             $this->importOneService->initialize($import);
@@ -225,7 +223,7 @@ class ElementImportService
                         $qb->field('source')->references($import)
                            ->updateMany()
                            ->field("data.$field->reversedBy")->unsetField()
-                           ->getQuery()->execute();
+                           ->execute();
                     }
                 }
             }
@@ -234,7 +232,7 @@ class ElementImportService
                 // Go through each individual imported elements, and link elements from each other
                 $importedElements = $this->dm->query('Element')
                     ->field('source')->references($import)
-                    ->getQuery()->execute();
+                    ->execute();
                 $i = 0;
                 $size = count($importedElements);
                 foreach ($elementsLinkedFields as $linkField) {
@@ -250,10 +248,7 @@ class ElementImportService
                                 $qb->field('source')->references($import);
                                 $qb->addOr($qb->expr()->field('name')->in($values));
                                 $qb->addOr($qb->expr()->field('oldId')->in($values));
-                                $result = $qb->select('name')->hydrate(false)->getQuery()->execute()->toArray();
-                                $result = array_map(function($el) {
-                                    return $el['name'];
-                                }, $result);
+                                $result = $qb->select('name')->getArray();
                                 if (count($result) > 0) $element->setCustomProperty($linkField, $result);
                             }
                         }
@@ -283,26 +278,26 @@ class ElementImportService
                 $countElemenDeleted = $qb->field('source')->references($import)
                                          ->field('status')->notEqual(ElementStatus::ModifiedPendingVersion)
                                          ->field('id')->in($elementIdsToDelete)
-                                         ->count()->getQuery()->execute();
+                                         ->count()->execute();
                 // delete elements
                 $qb = $this->dm->query('Element');
                 $qb->field('source')->references($import)
                    ->field('id')->in($elementIdsToDelete)
-                   ->remove()->getQuery()->execute();
+                   ->remove()->execute();
                 // delete linked object cause doctrine cascading do not work when deleting with queryBuilder
                 $qb = $this->dm->createQueryBuilder(UserInteraction::class);
-                $qb->field('element.id')->in($elementIdsToDelete)->remove()->getQuery()->execute();
+                $qb->field('element.id')->in($elementIdsToDelete)->remove()->execute();
             }
 
             $qb = $this->dm->query('Element');
             $totalCount = $qb->field('status')->notEqual(ElementStatus::ModifiedPendingVersion)
                              ->field('source')->references($import)
-                             ->count()->getQuery()->execute();
+                             ->count()->execute();
 
             $qb = $this->dm->query('Element');
-            $elementsMissingGeoCount = $qb->field('source')->references($import)->field('moderationState')->equals(ModerationState::GeolocError)->count()->getQuery()->execute();
+            $elementsMissingGeoCount = $qb->field('source')->references($import)->field('moderationState')->equals(ModerationState::GeolocError)->count()->execute();
             $qb = $this->dm->query('Element');
-            $elementsMissingTaxoCount = $qb->field('source')->references($import)->field('moderationState')->equals(ModerationState::NoOptionProvided)->count()->getQuery()->execute();
+            $elementsMissingTaxoCount = $qb->field('source')->references($import)->field('moderationState')->equals(ModerationState::NoOptionProvided)->count()->execute();
 
             $logData = [
                 'elementsCount' => $totalCount,
diff --git a/src/Services/GoGoCartoJsService.php b/src/Services/GoGoCartoJsService.php
index 7f9e4fea0..f1363b915 100644
--- a/src/Services/GoGoCartoJsService.php
+++ b/src/Services/GoGoCartoJsService.php
@@ -40,11 +40,7 @@ class GoGoCartoJsService
         if ($config->getStampFeature()->getActive()) {
             $allowedStamps = is_object($user) ? $user->getAllowedStamps()->toArray() : [];
             foreach ($allowedStamps as $stamp) {
-                $result = $elementsRep->findStampedWithId($stamp->getId());
-                $elementIds = [];
-                foreach ($result as $obj) {
-                    $elementIds[] = $obj['_id'];
-                }
+                $elementIds = $elementsRep->findStampedWithId($stamp->getId());
                 $stamp->setElementIds($elementIds);
             }
         }
diff --git a/src/Services/WebhookService.php b/src/Services/WebhookService.php
index 7ecc0450d..89e675486 100755
--- a/src/Services/WebhookService.php
+++ b/src/Services/WebhookService.php
@@ -43,7 +43,7 @@ class WebhookService
             ->field('webhookPosts.numAttempts')->lte(6) // ignore posts with 6 failures
             ->field('webhookPosts.nextAttemptAt')->lte(new \DateTime())
             ->limit($limit)
-            ->getQuery()->execute();
+            ->execute();
         
         if (!$contributions || 0 == $contributions->count()) {
             return 0;
diff --git a/templates/admin/core_custom/custom-fields/form-builder.html.twig b/templates/admin/core_custom/custom-fields/form-builder.html.twig
index 714c37782..a46fd4a35 100644
--- a/templates/admin/core_custom/custom-fields/form-builder.html.twig
+++ b/templates/admin/core_custom/custom-fields/form-builder.html.twig
@@ -170,7 +170,8 @@
         });
 
         let dataProperties = {{ form.vars.attr["data-props"]|raw }};
-        
+        if (typeof dataProperties == 'object') 
+          dataProperties = Object.values(dataProperties)
         let propNameOptions = []
         for(let prop of dataProperties) {
           propNameOptions.push({
-- 
GitLab