From 4e3dda271b3cd3d60b5f68cb4427661ddcb409e1 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Fri, 7 Apr 2023 15:24:50 +0300 Subject: [PATCH 1/8] pkp/pkp-lib#8700 Optimized DAOResultFactory instances --- classes/author/DAO.php | 70 ++++++++++++++++++++------------------ classes/submission/DAO.php | 51 ++++++++++++++------------- 2 files changed, 65 insertions(+), 56 deletions(-) diff --git a/classes/author/DAO.php b/classes/author/DAO.php index 056c46c33e..d8a7991f15 100644 --- a/classes/author/DAO.php +++ b/classes/author/DAO.php @@ -106,44 +106,48 @@ public function getAuthorsAlphabetizedByServer($serverId = null, $initial = null $initialSql .= ')'; } + $baseSql = ' + FROM authors a + JOIN user_groups ug ON (a.user_group_id = ug.user_group_id) + JOIN publications p ON (p.publication_id = a.publication_id) + JOIN submissions s ON (s.current_publication_id = p.publication_id) + LEFT JOIN author_settings agl ON (a.author_id = agl.author_id AND agl.setting_name = ? AND agl.locale = ?) + LEFT JOIN author_settings agpl ON (a.author_id = agpl.author_id AND agpl.setting_name = ? AND agpl.locale = s.locale) + LEFT JOIN author_settings afl ON (a.author_id = afl.author_id AND afl.setting_name = ? AND afl.locale = ?) + LEFT JOIN author_settings afpl ON (a.author_id = afpl.author_id AND afpl.setting_name = ? AND afpl.locale = s.locale) + JOIN ( + SELECT + MIN(aa.author_id) as author_id, + CONCAT( + ' . ($includeEmail ? 'aa.email, \' \', ' : '') . ' + ac.setting_value, + \' \' + ' . $sqlColumnsAuthorSettings . ' + ) as names + FROM authors aa + JOIN publications pp ON (pp.publication_id = aa.publication_id) + LEFT JOIN publication_settings ppss ON (ppss.publication_id = pp.publication_id) + JOIN submissions ss ON (ss.submission_id = pp.submission_id AND ss.current_publication_id = pp.publication_id AND ss.status = ' . PKPSubmission::STATUS_PUBLISHED . ') + JOIN servers j ON (ss.context_id = j.server_id) + LEFT JOIN author_settings ac ON (ac.author_id = aa.author_id AND ac.setting_name = \'country\') + ' . $sqlJoinAuthorSettings . ' + WHERE j.enabled = 1 + ' . (isset($serverId) ? ' AND j.server_id = ?' : '') + . $initialSql . ' + GROUP BY names + ) as t1 ON (t1.author_id = a.author_id)'; + $result = $this->deprecatedDao->retrieveRange( - $sql = 'SELECT a.*, ug.show_title, s.locale, + "SELECT + a.*, ug.show_title, s.locale, COALESCE(agl.setting_value, agpl.setting_value) AS author_given, - CASE WHEN agl.setting_value <> \'\' THEN afl.setting_value ELSE afpl.setting_value END AS author_family - FROM authors a - JOIN user_groups ug ON (a.user_group_id = ug.user_group_id) - JOIN publications p ON (p.publication_id = a.publication_id) - JOIN submissions s ON (s.current_publication_id = p.publication_id) - LEFT JOIN author_settings agl ON (a.author_id = agl.author_id AND agl.setting_name = ? AND agl.locale = ?) - LEFT JOIN author_settings agpl ON (a.author_id = agpl.author_id AND agpl.setting_name = ? AND agpl.locale = s.locale) - LEFT JOIN author_settings afl ON (a.author_id = afl.author_id AND afl.setting_name = ? AND afl.locale = ?) - LEFT JOIN author_settings afpl ON (a.author_id = afpl.author_id AND afpl.setting_name = ? AND afpl.locale = s.locale) - JOIN ( - SELECT - MIN(aa.author_id) as author_id, - CONCAT( - ' . ($includeEmail ? 'aa.email, \' \', ' : '') . ' - ac.setting_value, - \' \' - ' . $sqlColumnsAuthorSettings . ' - ) as names - FROM authors aa - JOIN publications pp ON (pp.publication_id = aa.publication_id) - LEFT JOIN publication_settings ppss ON (ppss.publication_id = pp.publication_id) - JOIN submissions ss ON (ss.submission_id = pp.submission_id AND ss.current_publication_id = pp.publication_id AND ss.status = ' . PKPSubmission::STATUS_PUBLISHED . ') - JOIN servers j ON (ss.context_id = j.server_id) - LEFT JOIN author_settings ac ON (ac.author_id = aa.author_id AND ac.setting_name = \'country\') - ' . $sqlJoinAuthorSettings . ' - WHERE j.enabled = 1 - ' . (isset($serverId) ? ' AND j.server_id = ?' : '') - . $initialSql . ' - GROUP BY names - ) as t1 ON (t1.author_id = a.author_id) - ORDER BY author_family, author_given', + CASE WHEN agl.setting_value <> '' THEN afl.setting_value ELSE afpl.setting_value END AS author_family + {$baseSql} + ORDER BY author_family, author_given", $params, $rangeInfo ); - return new DAOResultFactory($result, $this, 'fromRow', [], $sql, $params, $rangeInfo); + return new DAOResultFactory($result, $this, 'fromRow', [], "SELECT 0 {$baseSql}", $params, $rangeInfo); } } diff --git a/classes/submission/DAO.php b/classes/submission/DAO.php index 0f4237a148..d86ff29b57 100644 --- a/classes/submission/DAO.php +++ b/classes/submission/DAO.php @@ -76,29 +76,34 @@ public function getExportable( $params[] = $pubIdSettingValue; } - $sql = 'SELECT s.* - FROM submissions s - LEFT JOIN publications p ON s.current_publication_id = p.publication_id - LEFT JOIN publication_settings ps ON p.publication_id = ps.publication_id' - . ($pubIdType != null ? ' LEFT JOIN publication_settings pspidt ON (p.publication_id = pspidt.publication_id)' : '') - . ($title != null ? ' LEFT JOIN publication_settings pst ON (p.publication_id = pst.publication_id)' : '') - . ($author != null ? ' LEFT JOIN authors au ON (p.publication_id = au.publication_id) - LEFT JOIN author_settings asgs ON (asgs.author_id = au.author_id AND asgs.setting_name = \'' . Identity::IDENTITY_SETTING_GIVENNAME . '\') - LEFT JOIN author_settings asfs ON (asfs.author_id = au.author_id AND asfs.setting_name = \'' . Identity::IDENTITY_SETTING_FAMILYNAME . '\') - ' : '') - . ($pubIdSettingName != null ? ' LEFT JOIN submission_settings pss ON (s.submission_id = pss.submission_id AND pss.setting_name = ?)' : '') - . ' WHERE s.status = ? - AND s.context_id = ?' - . ($pubIdType != null ? ' AND pspidt.setting_name = ? AND pspidt.setting_value IS NOT NULL' : '') - . ($title != null ? ' AND (pst.setting_name = ? AND pst.setting_value LIKE ?)' : '') - . ($author != null ? ' AND (asgs.setting_value LIKE ? OR asfs.setting_value LIKE ?)' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value IS NULL' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value = ?' : '') - . (($pubIdSettingName != null && is_null($pubIdSettingValue)) ? ' AND (pss.setting_value IS NULL OR pss.setting_value = \'\')' : '') - . ' GROUP BY s.submission_id - ORDER BY MAX(p.date_published) DESC, s.submission_id DESC'; + $baseSql = ' + FROM submissions s + LEFT JOIN publications p ON s.current_publication_id = p.publication_id + LEFT JOIN publication_settings ps ON p.publication_id = ps.publication_id' + . ($pubIdType != null ? ' LEFT JOIN publication_settings pspidt ON (p.publication_id = pspidt.publication_id)' : '') + . ($title != null ? ' LEFT JOIN publication_settings pst ON (p.publication_id = pst.publication_id)' : '') + . ($author != null ? ' LEFT JOIN authors au ON (p.publication_id = au.publication_id) + LEFT JOIN author_settings asgs ON (asgs.author_id = au.author_id AND asgs.setting_name = \'' . Identity::IDENTITY_SETTING_GIVENNAME . '\') + LEFT JOIN author_settings asfs ON (asfs.author_id = au.author_id AND asfs.setting_name = \'' . Identity::IDENTITY_SETTING_FAMILYNAME . '\') + ' : '') + . ($pubIdSettingName != null ? ' LEFT JOIN submission_settings pss ON (s.submission_id = pss.submission_id AND pss.setting_name = ?)' : '') + . ' WHERE s.status = ? + AND s.context_id = ?' + . ($pubIdType != null ? ' AND pspidt.setting_name = ? AND pspidt.setting_value IS NOT NULL' : '') + . ($title != null ? ' AND (pst.setting_name = ? AND pst.setting_value LIKE ?)' : '') + . ($author != null ? ' AND (asgs.setting_value LIKE ? OR asfs.setting_value LIKE ?)' : '') + . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value IS NULL' : '') + . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value = ?' : '') + . (($pubIdSettingName != null && is_null($pubIdSettingValue)) ? ' AND (pss.setting_value IS NULL OR pss.setting_value = \'\')' : ''); - $rows = $this->deprecatedDao->retrieveRange($sql, $params, $rangeInfo); - return new DAOResultFactory($rows, $this, 'fromRow', [], $sql, $params, $rangeInfo); + $rows = $this->deprecatedDao->retrieveRange( + "SELECT s.* + {$baseSql} + GROUP BY s.submission_id + ORDER BY MAX(p.date_published) DESC, s.submission_id DESC", + $params, + $rangeInfo + ); + return new DAOResultFactory($rows, $this, 'fromRow', [], "SELECT 0 {$baseSql}", $params, $rangeInfo); } } From 68c5c37db88e956468c42af850b13a89e9688f94 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Fri, 7 Apr 2023 15:26:04 +0300 Subject: [PATCH 2/8] pkp/pkp-lib#8700 Updated code to make use of the new safeCount() macro --- classes/doi/Repository.php | 4 ++-- classes/services/queryBuilders/GalleyQueryBuilder.php | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/classes/doi/Repository.php b/classes/doi/Repository.php index 07edd80020..0c408ebc3f 100644 --- a/classes/doi/Repository.php +++ b/classes/doi/Repository.php @@ -160,8 +160,8 @@ public function isAssigned(int $doiId, string $pubObjectType): bool Repo::doi()::TYPE_REPRESENTATION => Repo::galley() ->getCollector() ->filterByDoiIds([$doiId]) - ->getIds() - ->count(), + ->getQueryBuilder() + ->safeCount() > 0, default => false, }; diff --git a/classes/services/queryBuilders/GalleyQueryBuilder.php b/classes/services/queryBuilders/GalleyQueryBuilder.php index 10cef3487b..f98423d5f1 100644 --- a/classes/services/queryBuilders/GalleyQueryBuilder.php +++ b/classes/services/queryBuilders/GalleyQueryBuilder.php @@ -60,9 +60,7 @@ public function getCount() { return $this ->getQuery() - ->select('g.galley_id') - ->get() - ->count(); + ->safeCount(); } /** From 9443cdc970b9ad51e0f548aab95e51b235acb2c3 Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Fri, 24 May 2024 00:21:49 +0300 Subject: [PATCH 3/8] pkp/pkp-lib#8700 Dropped safeCount() workaround in favor of getCountForPagination() --- classes/doi/Repository.php | 2 +- classes/services/queryBuilders/GalleyQueryBuilder.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/classes/doi/Repository.php b/classes/doi/Repository.php index 0c408ebc3f..b225ac8801 100644 --- a/classes/doi/Repository.php +++ b/classes/doi/Repository.php @@ -161,7 +161,7 @@ public function isAssigned(int $doiId, string $pubObjectType): bool ->getCollector() ->filterByDoiIds([$doiId]) ->getQueryBuilder() - ->safeCount() > 0, + ->getCountForPagination() > 0, default => false, }; diff --git a/classes/services/queryBuilders/GalleyQueryBuilder.php b/classes/services/queryBuilders/GalleyQueryBuilder.php index f98423d5f1..79f8d551a3 100644 --- a/classes/services/queryBuilders/GalleyQueryBuilder.php +++ b/classes/services/queryBuilders/GalleyQueryBuilder.php @@ -60,11 +60,11 @@ public function getCount() { return $this ->getQuery() - ->safeCount(); + ->getCountForPagination(); } /** - * @copydoc PKP\services\queryBuilders\interfaces\EntityQueryBuilderInterface::getCount() + * @copydoc PKP\services\queryBuilders\interfaces\EntityQueryBuilderInterface::getIds() */ public function getIds() { @@ -76,7 +76,7 @@ public function getIds() } /** - * @copydoc PKP\services\queryBuilders\interfaces\EntityQueryBuilderInterface::getCount() + * @copydoc PKP\services\queryBuilders\interfaces\EntityQueryBuilderInterface::getQuery() */ public function getQuery() { From 65a6f33b710d64f858ff038213d1f80a3c5fd39c Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Fri, 7 Apr 2023 15:29:16 +0300 Subject: [PATCH 4/8] pkp/pkp-lib#8700 Submodule update ##jonasraoni/feature/stable-3_4_0/8700-improve-slow-query## --- lib/pkp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pkp b/lib/pkp index 95e5632365..c1bcdc8d51 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 95e56323653fdc6a948e73940f7d537384bf5e82 +Subproject commit c1bcdc8d515e7b711c9a0e16c4a1a51d3eaf1414 From 8657b9838fc1676b553b0a21eea146511211d24e Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Thu, 30 May 2024 12:11:53 +0300 Subject: [PATCH 5/8] pkp/pkp-lib#8700 Namespaced PubObjectsExportPlugin constants --- classes/plugins/PubObjectsExportPlugin.php | 52 +++++++++++-------- classes/submission/DAO.php | 7 +-- ...ortRepresentationsListGridCellProvider.php | 3 +- ...IdExportRepresentationsListGridHandler.php | 2 +- ...blishedSubmissionsListGridCellProvider.php | 3 +- ...ortPublishedSubmissionsListGridHandler.php | 3 +- 6 files changed, 42 insertions(+), 28 deletions(-) diff --git a/classes/plugins/PubObjectsExportPlugin.php b/classes/plugins/PubObjectsExportPlugin.php index d09e2fa98a..37d50d7dc5 100644 --- a/classes/plugins/PubObjectsExportPlugin.php +++ b/classes/plugins/PubObjectsExportPlugin.php @@ -43,23 +43,20 @@ use PKP\submission\PKPSubmission; use PKP\user\User; -// The statuses. -define('EXPORT_STATUS_ANY', ''); -define('EXPORT_STATUS_NOT_DEPOSITED', 'notDeposited'); -define('EXPORT_STATUS_MARKEDREGISTERED', 'markedRegistered'); -define('EXPORT_STATUS_REGISTERED', 'registered'); - -// The actions. -define('EXPORT_ACTION_EXPORT', 'export'); -define('EXPORT_ACTION_MARKREGISTERED', 'markRegistered'); -define('EXPORT_ACTION_DEPOSIT', 'deposit'); - -// Configuration errors. -define('EXPORT_CONFIG_ERROR_SETTINGS', 0x02); - abstract class PubObjectsExportPlugin extends ImportExportPlugin { - /** @var PubObjectCache */ + // The statuses + public const EXPORT_STATUS_ANY = ''; + public const EXPORT_STATUS_NOT_DEPOSITED = 'notDeposited'; + public const EXPORT_STATUS_MARKEDREGISTERED = 'markedRegistered'; + public const EXPORT_STATUS_REGISTERED = 'registered'; + // The actions + public const EXPORT_ACTION_EXPORT = 'export'; + public const EXPORT_ACTION_MARKREGISTERED = 'markRegistered'; + public const EXPORT_ACTION_DEPOSIT = 'deposit'; + // Configuration errors. + public const EXPORT_CONFIG_ERROR_SETTINGS = 2; /** @var PubObjectCache */ + public $_cache; /** @@ -354,10 +351,10 @@ public function getRepresentationFilter() public function getStatusNames() { return [ - EXPORT_STATUS_ANY => __('plugins.importexport.common.status.any'), - EXPORT_STATUS_NOT_DEPOSITED => __('plugins.importexport.common.status.notDeposited'), - EXPORT_STATUS_MARKEDREGISTERED => __('plugins.importexport.common.status.markedRegistered'), - EXPORT_STATUS_REGISTERED => __('plugins.importexport.common.status.registered'), + PubObjectsExportPlugin::EXPORT_STATUS_ANY => __('plugins.importexport.common.status.any'), + PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED => __('plugins.importexport.common.status.notDeposited'), + PubObjectsExportPlugin::EXPORT_STATUS_MARKEDREGISTERED => __('plugins.importexport.common.status.markedRegistered'), + PubObjectsExportPlugin::EXPORT_STATUS_REGISTERED => __('plugins.importexport.common.status.registered'), ]; } @@ -458,7 +455,7 @@ public function exportXML($objects, $filter, $context, $noValidation = null, &$o public function markRegistered($context, $objects) { foreach ($objects as $object) { - $object->setData($this->getDepositStatusSettingName(), EXPORT_STATUS_MARKEDREGISTERED); + $object->setData($this->getDepositStatusSettingName(), PubObjectsExportPlugin::EXPORT_STATUS_MARKEDREGISTERED); $this->updateObject($object); } } @@ -567,7 +564,7 @@ public function getUnregisteredPreprints($context) null, null, $this->getDepositStatusSettingName(), - EXPORT_STATUS_NOT_DEPOSITED, + PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED, null ); return $preprints->toArray(); @@ -856,4 +853,17 @@ protected function _checkForExportAction(string $exportAction): bool if (!PKP_STRICT_MODE) { class_alias('\APP\plugins\PubObjectsExportPlugin', '\PubObjectExportsPlugin'); + + foreach ([ + 'EXPORT_STATUS_ANY', + 'EXPORT_STATUS_NOT_DEPOSITED', + 'EXPORT_STATUS_MARKEDREGISTERED', + 'EXPORT_STATUS_REGISTERED', + 'EXPORT_ACTION_EXPORT', + 'EXPORT_ACTION_MARKREGISTERED', + 'EXPORT_ACTION_DEPOSIT', + 'EXPORT_CONFIG_ERROR_SETTINGS', + ] as $constantName) { + define($constantName, constant('\PubObjectsExportPlugin::' . $constantName)); + } } diff --git a/classes/submission/DAO.php b/classes/submission/DAO.php index d86ff29b57..88d79fc2ca 100644 --- a/classes/submission/DAO.php +++ b/classes/submission/DAO.php @@ -13,6 +13,7 @@ namespace APP\submission; +use APP\plugins\PubObjectsExportPlugin; use PKP\db\DAOResultFactory; use PKP\db\DBResultRange; use PKP\identity\Identity; @@ -72,7 +73,7 @@ public function getExportable( if ($issueId) { $params[] = $issueId; } - if ($pubIdSettingName && $pubIdSettingValue && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) { + if ($pubIdSettingName && $pubIdSettingValue && $pubIdSettingValue != PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) { $params[] = $pubIdSettingValue; } @@ -92,8 +93,8 @@ public function getExportable( . ($pubIdType != null ? ' AND pspidt.setting_name = ? AND pspidt.setting_value IS NOT NULL' : '') . ($title != null ? ' AND (pst.setting_name = ? AND pst.setting_value LIKE ?)' : '') . ($author != null ? ' AND (asgs.setting_value LIKE ? OR asfs.setting_value LIKE ?)' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value IS NULL' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value = ?' : '') + . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value IS NULL' : '') + . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value = ?' : '') . (($pubIdSettingName != null && is_null($pubIdSettingValue)) ? ' AND (pss.setting_value IS NULL OR pss.setting_value = \'\')' : ''); $rows = $this->deprecatedDao->retrieveRange( diff --git a/controllers/grid/pubIds/PubIdExportRepresentationsListGridCellProvider.php b/controllers/grid/pubIds/PubIdExportRepresentationsListGridCellProvider.php index 5dcd5cf581..ecd955f7d4 100644 --- a/controllers/grid/pubIds/PubIdExportRepresentationsListGridCellProvider.php +++ b/controllers/grid/pubIds/PubIdExportRepresentationsListGridCellProvider.php @@ -17,6 +17,7 @@ namespace APP\controllers\grid\pubIds; use APP\facades\Repo; +use APP\plugins\PubObjectsExportPlugin; use PKP\controllers\grid\DataObjectGridCellProvider; use PKP\controllers\grid\GridHandler; use PKP\linkAction\LinkAction; @@ -134,7 +135,7 @@ public function getTemplateVarsFromRowColumn($row, $column) $label = $statusNames[$status]; } } else { - $label = $statusNames[EXPORT_STATUS_NOT_DEPOSITED]; + $label = $statusNames[PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED]; } return ['label' => $label]; } diff --git a/controllers/grid/pubIds/PubIdExportRepresentationsListGridHandler.php b/controllers/grid/pubIds/PubIdExportRepresentationsListGridHandler.php index cf029b7c1a..4856409626 100644 --- a/controllers/grid/pubIds/PubIdExportRepresentationsListGridHandler.php +++ b/controllers/grid/pubIds/PubIdExportRepresentationsListGridHandler.php @@ -285,7 +285,7 @@ protected function getFilterValues($filter) } else { $column = null; } - if (isset($filter['statusId']) && $filter['statusId'] != EXPORT_STATUS_ANY) { + if (isset($filter['statusId']) && $filter['statusId'] != PubObjectsExportPlugin::EXPORT_STATUS_ANY) { $statusId = $filter['statusId']; } else { $statusId = null; diff --git a/controllers/grid/submissions/ExportPublishedSubmissionsListGridCellProvider.php b/controllers/grid/submissions/ExportPublishedSubmissionsListGridCellProvider.php index ada73275e4..2fded81e25 100644 --- a/controllers/grid/submissions/ExportPublishedSubmissionsListGridCellProvider.php +++ b/controllers/grid/submissions/ExportPublishedSubmissionsListGridCellProvider.php @@ -17,6 +17,7 @@ namespace APP\controllers\grid\submissions; use APP\facades\Repo; +use APP\plugins\PubObjectsExportPlugin; use PKP\controllers\grid\DataObjectGridCellProvider; use PKP\controllers\grid\GridHandler; use PKP\linkAction\LinkAction; @@ -119,7 +120,7 @@ public function getTemplateVarsFromRowColumn($row, $column) $label = $statusNames[$status]; } } else { - $label = $statusNames[EXPORT_STATUS_NOT_DEPOSITED]; + $label = $statusNames[PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED]; } return ['label' => $label]; } diff --git a/controllers/grid/submissions/ExportPublishedSubmissionsListGridHandler.php b/controllers/grid/submissions/ExportPublishedSubmissionsListGridHandler.php index 8d927de919..0c0a5d29c3 100644 --- a/controllers/grid/submissions/ExportPublishedSubmissionsListGridHandler.php +++ b/controllers/grid/submissions/ExportPublishedSubmissionsListGridHandler.php @@ -18,6 +18,7 @@ use APP\core\Application; use APP\facades\Repo; +use APP\plugins\PubObjectsExportPlugin; use PKP\controllers\grid\feature\PagingFeature; use PKP\controllers\grid\feature\selectableItems\SelectableItemsFeature; use PKP\controllers\grid\GridColumn; @@ -262,7 +263,7 @@ protected function getFilterValues($filter) } else { $column = null; } - if (isset($filter['statusId']) && $filter['statusId'] != EXPORT_STATUS_ANY) { + if (isset($filter['statusId']) && $filter['statusId'] != PubObjectsExportPlugin::EXPORT_STATUS_ANY) { $statusId = $filter['statusId']; } else { $statusId = null; From 82a8dd436c7c467908ea24b68fd970533d240c3f Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Thu, 30 May 2024 12:18:10 +0300 Subject: [PATCH 6/8] pkp/pkp-lib#8700 Updated code to make use of the Laravel Builder --- classes/submission/DAO.php | 129 ++++++++++++++++++------------------- 1 file changed, 61 insertions(+), 68 deletions(-) diff --git a/classes/submission/DAO.php b/classes/submission/DAO.php index 88d79fc2ca..5fcefbbc2a 100644 --- a/classes/submission/DAO.php +++ b/classes/submission/DAO.php @@ -14,6 +14,9 @@ namespace APP\submission; use APP\plugins\PubObjectsExportPlugin; +use Illuminate\Database\Query\Builder; +use Illuminate\Database\Query\JoinClause; +use Illuminate\Support\Facades\DB; use PKP\db\DAOResultFactory; use PKP\db\DBResultRange; use PKP\identity\Identity; @@ -33,78 +36,68 @@ public function deleteById(int $id) /** * Get all published submissions (eventually with a pubId assigned and) matching the specified settings. * - * @param ?string $pubIdType - * @param ?string $title - * @param ?string $author - * @param ?int $issueId - * @param ?string $pubIdSettingName - * @param ?string $pubIdSettingValue + * @param null|mixed $pubIdType + * @param null|mixed $title + * @param null|mixed $author + * @param null|mixed $issueId + * @param null|mixed $pubIdSettingName + * @param null|mixed $pubIdSettingValue * @param ?DBResultRange $rangeInfo * * @return DAOResultFactory */ - public function getExportable( - $contextId, - $pubIdType = null, - $title = null, - $author = null, - $issueId = null, - $pubIdSettingName = null, - $pubIdSettingValue = null, - $rangeInfo = null - ) { - $params = []; - if ($pubIdSettingName) { - $params[] = $pubIdSettingName; - } - $params[] = Submission::STATUS_PUBLISHED; - $params[] = $contextId; - if ($pubIdType) { - $params[] = 'pub-id::' . $pubIdType; - } - if ($title) { - $params[] = 'title'; - $params[] = '%' . $title . '%'; - } - if ($author) { - $params[] = $author; - $params[] = $author; - } - if ($issueId) { - $params[] = $issueId; - } - if ($pubIdSettingName && $pubIdSettingValue && $pubIdSettingValue != PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) { - $params[] = $pubIdSettingValue; - } - - $baseSql = ' - FROM submissions s - LEFT JOIN publications p ON s.current_publication_id = p.publication_id - LEFT JOIN publication_settings ps ON p.publication_id = ps.publication_id' - . ($pubIdType != null ? ' LEFT JOIN publication_settings pspidt ON (p.publication_id = pspidt.publication_id)' : '') - . ($title != null ? ' LEFT JOIN publication_settings pst ON (p.publication_id = pst.publication_id)' : '') - . ($author != null ? ' LEFT JOIN authors au ON (p.publication_id = au.publication_id) - LEFT JOIN author_settings asgs ON (asgs.author_id = au.author_id AND asgs.setting_name = \'' . Identity::IDENTITY_SETTING_GIVENNAME . '\') - LEFT JOIN author_settings asfs ON (asfs.author_id = au.author_id AND asfs.setting_name = \'' . Identity::IDENTITY_SETTING_FAMILYNAME . '\') - ' : '') - . ($pubIdSettingName != null ? ' LEFT JOIN submission_settings pss ON (s.submission_id = pss.submission_id AND pss.setting_name = ?)' : '') - . ' WHERE s.status = ? - AND s.context_id = ?' - . ($pubIdType != null ? ' AND pspidt.setting_name = ? AND pspidt.setting_value IS NOT NULL' : '') - . ($title != null ? ' AND (pst.setting_name = ? AND pst.setting_value LIKE ?)' : '') - . ($author != null ? ' AND (asgs.setting_value LIKE ? OR asfs.setting_value LIKE ?)' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue == PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value IS NULL' : '') - . (($pubIdSettingName != null && $pubIdSettingValue != null && $pubIdSettingValue != PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED) ? ' AND pss.setting_value = ?' : '') - . (($pubIdSettingName != null && is_null($pubIdSettingValue)) ? ' AND (pss.setting_value IS NULL OR pss.setting_value = \'\')' : ''); + public function getExportable($contextId, $pubIdType = null, $title = null, $author = null, $issueId = null, $pubIdSettingName = null, $pubIdSettingValue = null, $rangeInfo = null) + { + $q = DB::table('submissions', 's') + ->leftJoin('publications AS p', 's.current_publication_id', '=', 'p.publication_id') + ->leftJoin('publication_settings AS ps', 'p.publication_id', '=', 'ps.publication_id') + ->when($pubIdType != null, fn (Builder $q) => $q->leftJoin('publication_settings AS pspidt', 'p.publication_id', '=', 'pspidt.publication_id')) + ->when($title != null, fn (Builder $q) => $q->leftJoin('publication_settings AS pst', 'p.publication_id', '=', 'pst.publication_id')) + ->when( + $author != null, + fn (Builder $q) => $q->leftJoin('authors AS au', 'p.publication_id', '=', 'au.publication_id') + ->leftJoin( + 'author_settings AS asgs', + fn (JoinClause $j) => $j->on('asgs.author_id', '=', 'au.author_id') + ->where('asgs.setting_name', '=', Identity::IDENTITY_SETTING_GIVENNAME) + ) + ->leftJoin( + 'author_settings AS asfs', + fn (JoinClause $j) => $j->on('asfs.author_id', '=', 'au.author_id') + ->where('asfs.setting_name', '=', Identity::IDENTITY_SETTING_FAMILYNAME) + ) + ) + ->when( + $pubIdSettingName, + fn (Builder $q) => $q->leftJoin( + 'submission_settings AS pss', + fn (JoinClause $j) => $j->on('s.submission_id', '=', 'pss.submission_id') + ->where('pss.setting_name', '=', $pubIdSettingName) + ) + ) + ->where('s.status', '=', Submission::STATUS_PUBLISHED) + ->where('s.context_id', '=', $contextId) + ->when($pubIdType != null, fn (Builder $q) => $q->where('pspidt.setting_name', '=', "pub-id::{$pubIdType}")->whereNotNull('pspidt.setting_value')) + ->when($title != null, fn (Builder $q) => $q->where('pst.setting_name', '=', 'title')->where('pst.setting_value', 'LIKE', "%{$title}%")) + ->when($author != null, fn (Builder $q) => $q->where(fn (Builder $q) => $q->whereRaw("CONCAT(COALESCE(asgs.setting_value, ''), ' ', COALESCE(asfs.setting_value, ''))", 'LIKE', $author))) + ->when( + $pubIdSettingName, + fn (Builder $q) => $q->when( + $pubIdSettingValue === null, + fn (Builder $q) => $q->whereRaw("COALESCE(pss.setting_value, '') = ''"), + fn (Builder $q) => $q->when( + $pubIdSettingValue != PubObjectsExportPlugin::EXPORT_STATUS_NOT_DEPOSITED, + fn (Builder $q) => $q->where('pss.setting_value', '=', $pubIdSettingValue), + fn (Builder $q) => $q->whereNull('pss.setting_value') + ) + ) + ) + ->groupBy('s.submission_id') + ->orderByRaw('MAX(p.date_published) DESC') + ->orderByDesc('s.submission_id') + ->select('s.*'); - $rows = $this->deprecatedDao->retrieveRange( - "SELECT s.* - {$baseSql} - GROUP BY s.submission_id - ORDER BY MAX(p.date_published) DESC, s.submission_id DESC", - $params, - $rangeInfo - ); - return new DAOResultFactory($rows, $this, 'fromRow', [], "SELECT 0 {$baseSql}", $params, $rangeInfo); + $rows = $this->deprecatedDao->retrieveRange($q, [], $rangeInfo); + return new DAOResultFactory($rows, $this, 'fromRow', [], $q, [], $rangeInfo); } } From 0f21a4fecea7989425d368299d730d0cd3ab6cef Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Thu, 30 May 2024 16:13:45 +0300 Subject: [PATCH 7/8] pkp/pkp-lib#8700 Fixed class_alias --- classes/plugins/PubObjectsExportPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/plugins/PubObjectsExportPlugin.php b/classes/plugins/PubObjectsExportPlugin.php index 37d50d7dc5..2b91ebb0ef 100644 --- a/classes/plugins/PubObjectsExportPlugin.php +++ b/classes/plugins/PubObjectsExportPlugin.php @@ -852,7 +852,7 @@ protected function _checkForExportAction(string $exportAction): bool } if (!PKP_STRICT_MODE) { - class_alias('\APP\plugins\PubObjectsExportPlugin', '\PubObjectExportsPlugin'); + class_alias('\APP\plugins\PubObjectsExportPlugin', '\PubObjectsExportPlugin'); foreach ([ 'EXPORT_STATUS_ANY', From 40e11cce8b72783a8762289f72dd11ae02d542ed Mon Sep 17 00:00:00 2001 From: Jonas Raoni Soares da Silva Date: Thu, 30 May 2024 12:19:12 +0300 Subject: [PATCH 8/8] pkp/pkp-lib#8700 Submodule update ##jonasraoni/feature-stable-3_4_0-8700-improve-slow-query## --- lib/pkp | 2 +- plugins/generic/googleScholar | 2 +- plugins/generic/orcidProfile | 2 +- plugins/generic/pdfJsViewer | 2 +- plugins/generic/webFeed | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/pkp b/lib/pkp index c1bcdc8d51..d9c1a6f7b7 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit c1bcdc8d515e7b711c9a0e16c4a1a51d3eaf1414 +Subproject commit d9c1a6f7b726d88310b486d5a22ce6b501c10a49 diff --git a/plugins/generic/googleScholar b/plugins/generic/googleScholar index 523e492760..2e9f7e3d3e 160000 --- a/plugins/generic/googleScholar +++ b/plugins/generic/googleScholar @@ -1 +1 @@ -Subproject commit 523e49276066624fc3c63ae45ad7f935f19079a7 +Subproject commit 2e9f7e3d3e29496424b096c071b34b587a467f1b diff --git a/plugins/generic/orcidProfile b/plugins/generic/orcidProfile index d57a9d6c54..05d51c8b45 160000 --- a/plugins/generic/orcidProfile +++ b/plugins/generic/orcidProfile @@ -1 +1 @@ -Subproject commit d57a9d6c542199071f41cead6a277f60bb31cbb5 +Subproject commit 05d51c8b4520229bb9f38ed92050b039fec0cd37 diff --git a/plugins/generic/pdfJsViewer b/plugins/generic/pdfJsViewer index e22f0688e5..5102e8383d 160000 --- a/plugins/generic/pdfJsViewer +++ b/plugins/generic/pdfJsViewer @@ -1 +1 @@ -Subproject commit e22f0688e568637a5c6bc8ab7f366428563695cf +Subproject commit 5102e8383d894c4ecd7ae5c9d132d4735f2d61ee diff --git a/plugins/generic/webFeed b/plugins/generic/webFeed index fb382b05c4..6c91be5860 160000 --- a/plugins/generic/webFeed +++ b/plugins/generic/webFeed @@ -1 +1 @@ -Subproject commit fb382b05c460acdece9825253dfd275e8d768e14 +Subproject commit 6c91be5860b77c837c0ddf1ec0c70f61e4ebb947