From 2e51659f3c0bcb36220f53d0c7e62458dbb10d0d Mon Sep 17 00:00:00 2001 From: John Flatness Date: Tue, 14 Oct 2014 00:52:11 -0400 Subject: [PATCH] Restrict added and modified separately. The previous implementation could return results as long as the added and modified dates just "straddled" the from and until params. Ref #8. --- .../OaiPmhRepository/ResponseGenerator.php | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/libraries/OaiPmhRepository/ResponseGenerator.php b/libraries/OaiPmhRepository/ResponseGenerator.php index 01ce745..940c316 100644 --- a/libraries/OaiPmhRepository/ResponseGenerator.php +++ b/libraries/OaiPmhRepository/ResponseGenerator.php @@ -419,19 +419,33 @@ private function resumeListResponse($token) private function listResponse($verb, $metadataPrefix, $cursor, $set, $from, $until) { $listLimit = $this->_listLimit; - $itemTable = get_db()->getTable('Item'); + $db = get_db(); + $itemTable = $db->getTable('Item'); $select = $itemTable->getSelect(); $alias = $itemTable->getTableAlias(); $itemTable->filterByPublic($select, true); if($set) $itemTable->filterByCollection($select, $set); + + $modifiedClause = $addedClause = ''; if($from) { - $select->where("$alias.modified >= ? OR $alias.added >= ?", $from); - $select->group("$alias.id"); + $quotedFromDate = $db->quote($from); + $modifiedClause = "$alias.modified >= $quotedFromDate"; + $addedClause = "$alias.added >= $quotedFromDate"; } if($until) { - $select->where("$alias.modified < ? OR $alias.added < ?", $until); - $select->group("$alias.id"); + if ($from) { + $modifiedClause .= ' AND '; + $addedClause .= ' AND '; + } + $quotedUntilDate = $db->quote($until); + $modifiedClause .= "$alias.modified < $quotedUntilDate"; + $addedClause .= "$alias.added < $quotedUntilDate"; + } + + + if ($from || $until) { + $select->where("($modifiedClause) OR ($addedClause)"); } // Total number of rows that would be returned