From 106468fab17fca98aa26007417a026077970e226 Mon Sep 17 00:00:00 2001
From: Daniel Berthereau <Daniel.github@Berthereau.net>
Date: Mon, 23 Sep 2019 00:00:00 +0200
Subject: [PATCH] Added a method to filter list of metadata.

---
 src/OaiPmh/Metadata/AbstractMetadata.php | 12 ++++++++++++
 src/OaiPmh/ResponseGenerator.php         | 20 ++++++++++++--------
 2 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/OaiPmh/Metadata/AbstractMetadata.php b/src/OaiPmh/Metadata/AbstractMetadata.php
index d1428c5..c8a3b61 100644
--- a/src/OaiPmh/Metadata/AbstractMetadata.php
+++ b/src/OaiPmh/Metadata/AbstractMetadata.php
@@ -8,6 +8,7 @@
  */
 namespace OaiPmhRepository\OaiPmh\Metadata;
 
+use ArrayObject;
 use DOMElement;
 use OaiPmhRepository\OaiPmh\AbstractXmlGenerator;
 use OaiPmhRepository\OaiPmh\OaiSet\OaiSetInterface;
@@ -79,6 +80,17 @@ abstract class AbstractMetadata
         $this->createElementWithChildren($parent, 'metadataFormat', $elements);
     }
 
+    /**
+     * Filter the query for the two main List verbs.
+     *
+     * @see \OaiPmhRepository\OaiPmh\ResponseGenerator::listResponse()
+     *
+     * @param ArrayObject $query
+     */
+    public function filterList(ArrayObject $query)
+    {
+    }
+
     public function appendRecord(DOMElement $parent, ItemRepresentation $item)
     {
         $document = $parent->ownerDocument;
diff --git a/src/OaiPmh/ResponseGenerator.php b/src/OaiPmh/ResponseGenerator.php
index f28b858..e105c1f 100644
--- a/src/OaiPmh/ResponseGenerator.php
+++ b/src/OaiPmh/ResponseGenerator.php
@@ -8,6 +8,7 @@
  */
 namespace OaiPmhRepository\OaiPmh;
 
+use ArrayObject;
 use DateTime;
 use DomDocument;
 use Doctrine\ORM\Tools\Pagination\Paginator;
@@ -622,8 +623,9 @@ class ResponseGenerator extends AbstractXmlGenerator
 
         $itemRepository = $entityManager->getRepository('Omeka\Entity\Item');
         $qb = $itemRepository->createQueryBuilder('Omeka\Entity\Item');
+        $qb->select('Omeka\Entity\Item');
 
-        $query = [];
+        $query = new ArrayObject;
 
         // Public/private is automatically managed for anonymous requests.
 
@@ -652,8 +654,15 @@ class ResponseGenerator extends AbstractXmlGenerator
             }
         }
 
+        $metadataFormatManager = $this->serviceLocator->get(\OaiPmhRepository\OaiPmh\MetadataFormatManager::class);
+        $metadataFormat = $metadataFormatManager->get($metadataPrefix);
+        $metadataFormat->setOaiSet($this->oaiSet);
+
+        $metadataFormat->filterList($query);
+
+        /** @var \Omeka\Api\Adapter\ItemAdapter $itemAdapter */
         $itemAdapter = $apiAdapterManager->get('items');
-        $itemAdapter->buildQuery($qb, $query);
+        $itemAdapter->buildQuery($qb, $query->getArrayCopy());
 
         if ($from) {
             $qb->andWhere($qb->expr()->orX(
@@ -683,9 +692,8 @@ class ResponseGenerator extends AbstractXmlGenerator
             $qb->setParameter('until_1', $until);
             $qb->setParameter('until_2', $until);
         }
-        $qb->groupBy('Omeka\Entity\Item.id');
 
-        $qb->select('Omeka\Entity\Item');
+        $qb->groupBy('Omeka\Entity\Item.id');
 
         // This limit call will form the basis of the flow control
         $qb->setMaxResults($this->_listLimit);
@@ -703,14 +711,10 @@ class ResponseGenerator extends AbstractXmlGenerator
                 $method = 'appendRecord';
             }
 
-            $metadataFormatManager = $this->serviceLocator->get(\OaiPmhRepository\OaiPmh\MetadataFormatManager::class);
-
             $verbElement = $this->document->createElement($verb);
             $this->document->documentElement->appendChild($verbElement);
             foreach ($paginator as $itemEntity) {
                 $item = $itemAdapter->getRepresentation($itemEntity);
-                $metadataFormat = $metadataFormatManager->get($metadataPrefix);
-                $metadataFormat->setOaiSet($this->oaiSet);
                 $metadataFormat->$method($verbElement, $item);
             }
             if ($rows > ($cursor + $this->_listLimit)) {
-- 
GitLab