From bf216d6c545f4f2106e18c14c6bbd228d1a5af26 Mon Sep 17 00:00:00 2001 From: MaximilianoTabacman Date: Fri, 22 Mar 2024 17:55:53 -0300 Subject: [PATCH] Improvements to pagination --- source/Sagan-Core/InMemoryRepository.class.st | 8 ++++++- .../GemStoneRepositoryProviderTest.class.st | 12 +++++----- .../GemStoneRepository.class.st | 22 ++++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/source/Sagan-Core/InMemoryRepository.class.st b/source/Sagan-Core/InMemoryRepository.class.st index 1b23c19..d667095 100644 --- a/source/Sagan-Core/InMemoryRepository.class.st +++ b/source/Sagan-Core/InMemoryRepository.class.st @@ -38,6 +38,12 @@ InMemoryRepository >> conflictCheckingStrategy [ ^ conflictCheckingStrategy ] +{ #category : 'querying' } +InMemoryRepository >> countAll [ + + ^ contents size +] + { #category : 'querying' } InMemoryRepository >> countMatching: aCriteriaOrBlockClosure [ @@ -51,7 +57,7 @@ InMemoryRepository >> findAll [ ] { #category : 'querying' } -InMemoryRepository >> findAllFrom: aFromIndex to: aToIndex sortedBy: anIndexName [ +InMemoryRepository >> findAllFrom: aFromIndex upTo: aToIndex sortedBy: anIndexName [ | from to | diff --git a/source/Sagan-GemStone-Tests/GemStoneRepositoryProviderTest.class.st b/source/Sagan-GemStone-Tests/GemStoneRepositoryProviderTest.class.st index d1a55ac..41f1eef 100644 --- a/source/Sagan-GemStone-Tests/GemStoneRepositoryProviderTest.class.st +++ b/source/Sagan-GemStone-Tests/GemStoneRepositoryProviderTest.class.st @@ -195,27 +195,27 @@ GemStoneRepositoryProviderTest >> testQueryingInterval [ store: self silvesterStallone ]. - result := self extraterrestrials findAllFrom: 1000 to: 1001 sortedBy: 'lastName'. + result := self extraterrestrials findAllFrom: 1000 upTo: 1001 sortedBy: 'lastName'. self assert: result size equals: 2. self assert: ( result first firstName = 'John' and: [ result first lastName = 'Lock' ] ). self assert: ( result last firstName = 'Silvester' and: [ result last lastName = 'Stallone' ] ). - result := self extraterrestrials findAllFrom: 4000 to: 4005 sortedBy: 'lastName'. + result := self extraterrestrials findAllFrom: 4000 upTo: 4005 sortedBy: 'lastName'. self withTheOnlyOneIn: result do: [ :extraterrestrial | self assert: extraterrestrial lastName equals: 'Travolta' ]. - result := self extraterrestrials findAllFrom: 4000 to: 4005 sortedBy: 'firstName'. + result := self extraterrestrials findAllFrom: 4000 upTo: 4005 sortedBy: 'firstName'. self withTheOnlyOneIn: result do: [ :extraterrestrial | self assert: extraterrestrial firstName equals: 'Silvester'; assert: extraterrestrial lastName equals: 'Stallone' ]. - result := self extraterrestrials findAllFrom: -50 to: 0 sortedBy: 'lastName'. + result := self extraterrestrials findAllFrom: -50 upTo: 0 sortedBy: 'lastName'. self assert: result isEmpty. - result := self extraterrestrials findAllFrom: 6 to: -2 sortedBy: 'lastName'. + result := self extraterrestrials findAllFrom: 6 upTo: -2 sortedBy: 'lastName'. self assert: result isEmpty. - result := self extraterrestrials findAllFrom: 5000 to: 10000 sortedBy: 'lastName'. + result := self extraterrestrials findAllFrom: 5000 upTo: 10000 sortedBy: 'lastName'. self assert: result isEmpty ] diff --git a/source/Sagan-GemStone/GemStoneRepository.class.st b/source/Sagan-GemStone/GemStoneRepository.class.st index ccd3d7d..48053a5 100644 --- a/source/Sagan-GemStone/GemStoneRepository.class.st +++ b/source/Sagan-GemStone/GemStoneRepository.class.st @@ -38,6 +38,12 @@ GemStoneRepository >> conflictCheckingStrategy [ ^ conflictCheckingStrategy ] +{ #category : 'querying' } +GemStoneRepository >> countAll [ + + ^ contents size +] + { #category : 'querying' } GemStoneRepository >> countMatching: aCriteriaOrBlockClosure [ @@ -51,19 +57,23 @@ GemStoneRepository >> findAll [ ] { #category : 'querying' } -GemStoneRepository >> findAllFrom: aFromIndex to: aToIndex sortedBy: anIndexName [ +GemStoneRepository >> findAllFrom: aStartingPosition upTo: aMaximumPosition sortedBy: anIndexName [ | results | results := OrderedCollection new. self withQueryFrom: ( 'each.<1s> >= ''''' expandMacrosWith: anIndexName asString ) do: [ :query | - | stream start limit | + | stream skipped limit | stream := query readStream. - start := aFromIndex - 1 max: 0. - limit := aToIndex - start max: 0. - stream skip: start. - limit timesRepeat: [ stream atEnd ifFalse: [ results add: stream next ] ] + skipped := aStartingPosition - 1 max: 0. + limit := aMaximumPosition - skipped max: 0. + stream skip: skipped. + limit timesRepeat: [ + stream atEnd + ifTrue: [ ^ results ] + ifFalse: [ results add: stream next ] + ] ]. ^ results ]