From 4b2697169115b7e803c5ef3eafcac3798b7655a6 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Mon, 28 Dec 2020 16:07:59 +0100
Subject: [PATCH] FEAT #15673 TIME 0:10 added subentities_id keyword

---
 src/app/entity/models/EntityModelAbstract.php | 20 +++++++++++
 .../controllers/PreparedClauseController.php  | 35 +++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/src/app/entity/models/EntityModelAbstract.php b/src/app/entity/models/EntityModelAbstract.php
index a86b751dd53..93f81468a6c 100755
--- a/src/app/entity/models/EntityModelAbstract.php
+++ b/src/app/entity/models/EntityModelAbstract.php
@@ -242,6 +242,26 @@ abstract class EntityModelAbstract
         return $entities;
     }
 
+    public static function getEntityChildrenById(array $args)
+    {
+        ValidatorModel::notEmpty($args, ['id']);
+        ValidatorModel::intVal($args, ['id']);
+
+        $aReturn = DatabaseModel::select([
+            'select'    => ['id'],
+            'table'     => ['entities'],
+            'where'     => ['parent_entity_id in (select entity_id from entities where id = ?)'],
+            'data'      => [$args['id']]
+        ]);
+
+        $entities = [$args['id']];
+        foreach ($aReturn as $value) {
+            $entities = array_merge($entities, EntityModel::getEntityChildrenById(['id' => $value['id']]));
+        }
+
+        return $entities;
+    }
+
     public static function getEntityChildrenSubLevel(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['entitiesId']);
diff --git a/src/core/controllers/PreparedClauseController.php b/src/core/controllers/PreparedClauseController.php
index 0b51e434d2f..44535830569 100755
--- a/src/core/controllers/PreparedClauseController.php
+++ b/src/core/controllers/PreparedClauseController.php
@@ -118,6 +118,41 @@ class PreparedClauseController
             $clause = str_replace("@all_entities", $allEntitiesClause, $clause);
         }
 
+        $total = preg_match_all("|@subentities_id\[([^\]]*)\]|", $clause, $subEntities, PREG_PATTERN_ORDER);
+        if ($total > 0) {
+            for ($i = 0; $i < $total; $i++) {
+                $aEntities = [];
+                $tmpSubEntities = str_replace("'", '', $subEntities[1][$i]);
+                if (preg_match('/,/', $tmpSubEntities)) {
+                    $aEntities = preg_split('/,/', $tmpSubEntities);
+                } else {
+                    $aEntities[] = $tmpSubEntities;
+                }
+
+                $allSubEntities = [];
+                foreach ($aEntities as $entity) {
+                    if (!empty($entity)) {
+                        $subEntitiesForEntity = EntityModel::getEntityChildrenById(['id' => trim($entity)]);
+                        unset($subEntitiesForEntity[0]);
+                        $allSubEntities = array_merge($allSubEntities, $subEntitiesForEntity);
+                    }
+                }
+
+                $allSubEntitiesClause = '';
+                foreach ($allSubEntities as $key => $allSubEntity) {
+                    if ($key > 0) {
+                        $allSubEntitiesClause .= ", ";
+                    }
+                    $allSubEntitiesClause .= "'{$allSubEntity}'";
+                }
+                if (empty($allSubEntitiesClause)) {
+                    $allSubEntitiesClause = "''";
+                }
+
+                $clause = preg_replace("|@subentities_id\[[^\]]*\]|", $allSubEntitiesClause, $clause, 1);
+            }
+        }
+
         $total = preg_match_all("|@subentities\[('[^\]]*')\]|", $clause, $subEntities, PREG_PATTERN_ORDER);
         if ($total > 0) {
             for ($i = 0; $i < $total; $i++) {
-- 
GitLab