131 lines
4.8 KiB
PHP
131 lines
4.8 KiB
PHP
<?php
|
|
/**
|
|
* @file classes/submission/Collector.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2000-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class Collector
|
|
*
|
|
* @brief A helper class to configure a Query Builder to get a collection of submissions
|
|
*/
|
|
|
|
namespace APP\submission;
|
|
|
|
use APP\facades\Repo;
|
|
use Illuminate\Database\Query\Builder;
|
|
use PKP\doi\Doi;
|
|
|
|
class Collector extends \PKP\submission\Collector
|
|
{
|
|
public ?array $issueIds = null;
|
|
|
|
public ?array $sectionIds = null;
|
|
|
|
public function __construct(DAO $dao)
|
|
{
|
|
$this->dao = $dao;
|
|
}
|
|
|
|
/**
|
|
* Limit results to submissions assigned to these issues
|
|
*/
|
|
public function filterByIssueIds(array $issueIds): self
|
|
{
|
|
$this->issueIds = $issueIds;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Limit results to submissions assigned to these sections
|
|
*/
|
|
public function filterBySectionIds(array $sectionIds): self
|
|
{
|
|
$this->sectionIds = $sectionIds;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @copydoc CollectorInterface::getQueryBuilder()
|
|
*/
|
|
public function getQueryBuilder(): Builder
|
|
{
|
|
$q = parent::getQueryBuilder();
|
|
|
|
// By issue IDs
|
|
if (is_array($this->issueIds)) {
|
|
$q->whereIn('s.submission_id', function ($query) {
|
|
$query->select('issue_p.submission_id')
|
|
->from('publications AS issue_p')
|
|
->join('publication_settings as issue_ps', 'issue_p.publication_id', '=', 'issue_ps.publication_id')
|
|
->where('issue_ps.setting_name', '=', 'issueId')
|
|
->whereIn('issue_ps.setting_value', array_map('strval', $this->issueIds));
|
|
});
|
|
}
|
|
|
|
// By section IDs
|
|
if (is_array($this->sectionIds)) {
|
|
$q->whereIn('s.submission_id', function ($query) {
|
|
$query->select('section_p.submission_id')
|
|
->from('publications AS section_p')
|
|
->whereIn('section_p.section_id', $this->sectionIds);
|
|
});
|
|
}
|
|
|
|
return $q;
|
|
}
|
|
|
|
/**
|
|
* Add APP-specific filtering methods for submission sub objects DOI statuses
|
|
*
|
|
*
|
|
*/
|
|
protected function addDoiStatusFilterToQuery(Builder $q)
|
|
{
|
|
$q->whereIn('s.current_publication_id', function (Builder $q) {
|
|
$q->select('current_p.publication_id')
|
|
->from('publications as current_p')
|
|
->leftJoin('publication_galleys as current_g', 'current_g.publication_id', '=', 'current_p.publication_id')
|
|
->leftJoin('dois as pd', 'pd.doi_id', '=', 'current_p.doi_id')
|
|
->leftJoin('dois as gd', 'gd.doi_id', '=', 'current_g.doi_id')
|
|
->whereIn('pd.status', $this->doiStatuses)
|
|
->orWhereIn('gd.status', $this->doiStatuses);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Add APP-specific filtering methods for checking if submission sub objects have DOIs assigned
|
|
*/
|
|
protected function addHasDoisFilterToQuery(Builder $q)
|
|
{
|
|
$q->whereIn('s.current_publication_id', function (Builder $q) {
|
|
$q->select('current_p.publication_id')
|
|
->from('publications', 'current_p')
|
|
->leftJoin('submissions as current_s', 'current_s.current_publication_id', '=', 'current_p.publication_id')
|
|
->leftJoin('publication_galleys as current_g', 'current_g.publication_id', '=', 'current_p.publication_id')
|
|
->where(function (Builder $q) {
|
|
$q->when($this->hasDois === true, function (Builder $q) {
|
|
$q->when(in_array(Repo::doi()::TYPE_PUBLICATION, $this->enabledDoiTypes), function (Builder $q) {
|
|
$q->whereNotNull('current_p.doi_id');
|
|
});
|
|
$q->when(in_array(Repo::doi()::TYPE_REPRESENTATION, $this->enabledDoiTypes), function (Builder $q) {
|
|
$q->orWhereNotNull('current_g.doi_id');
|
|
});
|
|
});
|
|
$q->when($this->hasDois === false, function (Builder $q) {
|
|
$q->when(in_array(Repo::doi()::TYPE_PUBLICATION, $this->enabledDoiTypes), function (Builder $q) {
|
|
$q->whereNull('current_p.doi_id');
|
|
});
|
|
$q->when(in_array(Repo::doi()::TYPE_REPRESENTATION, $this->enabledDoiTypes), function (Builder $q) {
|
|
$q->orWhere(function (Builder $q) {
|
|
$q->whereNull('current_g.doi_id');
|
|
$q->whereNotNull('current_g.galley_id');
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|