From 416fce733a3d1bc02bb71820f206152029269981 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Wed, 3 Apr 2024 15:53:50 +0200
Subject: [PATCH] =?UTF-8?q?refactor:=20splitter=20la=20fonction=20`calcule?=
 =?UTF-8?q?r=5Fselect()`=20en=20`preparer=5Fcalculer=5Fselect()`=20puis=20?=
 =?UTF-8?q?`executer=5Fcalculer=5Fselect()`=20permettant=20de=20r=C3=A9cup?=
 =?UTF-8?q?=C3=A9rer=20le=20r=C3=A9sultat=20interm=C3=A9diaire=20qui=20peu?=
 =?UTF-8?q?t=20aussi=20=C3=AAtre=20fourni=20a=20une=20nouvelle=20fonction?=
 =?UTF-8?q?=20`compter=5Fcalculer=5Fselect()`=20pour=20obtenir=20le=20nomb?=
 =?UTF-8?q?re=20de=20lignes=20de=20la=20requete.=20`calculer=5Fselect()`?=
 =?UTF-8?q?=20peut=20toujours=20etre=20appel=C3=A9e=20directement,=20sans?=
 =?UTF-8?q?=20rupture=20de=20compatibilite?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/public/composer.php               | 60 +++++++++++++++++++-----
 ecrire/src/Compilateur/Iterateur/Sql.php | 26 ++--------
 2 files changed, 54 insertions(+), 32 deletions(-)

diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 2552d904e6..824e11a206 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -675,6 +675,12 @@ function trouver_sous_requetes($where) {
 	return [$where_simples, $where_sous];
 }
 
+/**
+ * @see preparer_calculer_select()
+ */
+function calculer_select(...$args) {
+	return executer_calculer_select(preparer_calculer_select(...$args));
+}
 
 /**
  * Calcule une requête et l’exécute
@@ -697,7 +703,7 @@ function trouver_sous_requetes($where) {
  * @param bool|array|string $requeter
  * @return resource
  */
-function calculer_select(
+function preparer_calculer_select(
 	$select = [],
 	$from = [],
 	$from_type = [],
@@ -970,23 +976,55 @@ function calculer_select(
 			$GLOBALS['debug']['debug'] = true;
 		}
 	}
-	$GLOBALS['debug']['aucasou'] = [$table, $id, $serveur, $requeter];
+
+	$requete = [
+		'select' => $select,
+		'from' => $from,
+		'where' => $where,
+		'groupby' => $groupby,
+		'orderby' => array_filter($orderby),
+		'limit' => $limit,
+		'having' => $having,
+		'serveur' => $serveur,
+		'requeter' => $requeter,
+		'debug' => [$table, $id, $serveur, $requeter]
+	];
+	return $requete;
+}
+
+function executer_calculer_select($requete) {
+	$GLOBALS['debug']['aucasou'] = $requete['debug'];
 	$r = sql_select(
-		$select,
-		$from,
-		$where,
-		$groupby,
-		array_filter($orderby),
-		$limit,
-		$having,
-		$serveur,
-		$requeter
+		$requete['select'],
+		$requete['from'],
+		$requete['where'],
+		$requete['groupby'],
+		$requete['orderby'],
+		$requete['limit'],
+		$requete['having'],
+		$requete['serveur'],
+		$requete['requeter']
 	);
 	unset($GLOBALS['debug']['aucasou']);
 
 	return $r;
 }
 
+function compter_calculer_select($requete) {
+	$GLOBALS['debug']['aucasou'] = $requete['debug'];
+	$count = sql_countsel(
+		$requete['from'],
+		$requete['where'],
+		$requete['groupby'],
+		$requete['having'],
+		$requete['serveur'],
+		$requete['requeter']
+	);
+	unset($GLOBALS['debug']['aucasou']);
+
+	return $count;
+}
+
 /**
  * Analogue a calculer_mysql_expression et autre (a unifier ?)
  *
diff --git a/ecrire/src/Compilateur/Iterateur/Sql.php b/ecrire/src/Compilateur/Iterateur/Sql.php
index 25223b3b6c..d877e6ccf6 100644
--- a/ecrire/src/Compilateur/Iterateur/Sql.php
+++ b/ecrire/src/Compilateur/Iterateur/Sql.php
@@ -181,7 +181,8 @@ class Sql extends AbstractIterateur implements Iterator
 				$count_total_from_query = true;
 			}
 		}
-		$this->sqlresult = calculer_select(
+
+		$requete = preparer_calculer_select(
 			$v['select'],
 			$v['from'],
 			$v['type'],
@@ -197,28 +198,11 @@ class Sql extends AbstractIterateur implements Iterator
 			$this->info
 		);
 
+		$this->sqlresult = executer_calculer_select($requete);
 		$this->err = !$this->sqlresult;
+
 		if ($count_total_from_query && !$this->err) {
-			$query = calculer_select(
-				$v['select'],
-				$v['from'],
-				$v['type'],
-				$v['where'],
-				$v['join'],
-				$v['groupby'],
-				$v['orderby'],
-				'',
-				$v['having'],
-				$v['table'],
-				$v['id'],
-				$v['connect'],
-				false
-			);
-			$query_parts = explode('FROM', $query, 2);
-			$query = 'SELECT count(*) FROM ' . end($query_parts);
-			$res = sql_query($query, $v['connect']);
-			$row = sql_fetch($res);
-			$this->total = reset($row);
+			$this->total = compter_calculer_select($requete);
 		}
 		$this->firstseek = false;
 		$this->pos = -1;
-- 
GitLab