Skip to content

Commit bc7d1fa

Browse files
committed
feat(cache): readItems new limit option
1 parent 04c4e34 commit bc7d1fa

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

packages/shared/src/types/cache.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ export interface Cache<
6565
* Filter the items to include.
6666
*/
6767
filter?: (item: WrappedItem<TModel, TModelDefaults, TSchema>) => boolean
68+
/**
69+
* Limit the number of items returned.
70+
*/
71+
limit?: number
6872
}) => Array<WrappedItem<TModel, TModelDefaults, TSchema>>
6973

7074
writeItems: <TModel extends Model = Model>(params: {

packages/vue/src/cache.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ export function createCache<
5252
readItem({ model, key }) {
5353
return getWrappedItem(model, state.value[model.name]?.[key])
5454
},
55-
readItems({ model, marker, filter }) {
55+
readItems({ model, marker, filter, limit }) {
5656
if (marker && !state.value._markers?.[marker]) {
5757
return []
5858
}
5959
const data: Array<ResolvedModelItemBase<any, any, any>> = Object.values(state.value[model.name] ?? {})
6060
const result: Array<WrappedItem<any, any, any>> = []
61+
let count = 0
6162
for (const item of data) {
6263
if (item) {
6364
if (filter && !filter(item)) {
@@ -66,6 +67,10 @@ export function createCache<
6667
const wrappedItem = getWrappedItem(model, item)
6768
if (wrappedItem) {
6869
result.push(wrappedItem)
70+
count++
71+
if (limit != null && count >= limit) {
72+
break
73+
}
6974
}
7075
}
7176
}

packages/vue/test/cache.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,27 @@ describe('cache', () => {
147147
expect(items2).toHaveLength(1)
148148
expect(items2[0]).toEqual({ id: 2, label: 'Woof' })
149149
})
150+
151+
it('should limit the number of items', () => {
152+
const cache = createCache({ getStore })
153+
cache.writeItem({ model: mockModel, key: 1, item: { id: 1, label: 'Item 1' }, marker: 'testMarker' })
154+
cache.writeItem({ model: mockModel, key: 2, item: { id: 2, label: 'Item 2' }, marker: 'testMarker' })
155+
cache.writeItem({ model: mockModel, key: 3, item: { id: 3, label: 'Item 3' }, marker: 'testMarker' })
156+
157+
const items = cache.readItems({ model: mockModel, marker: 'testMarker', limit: 2 })
158+
expect(items).toHaveLength(2)
159+
expect(items[0]).toEqual({ id: 1, label: 'Item 1' })
160+
expect(items[1]).toEqual({ id: 2, label: 'Item 2' })
161+
})
162+
163+
it('should filter and limit the items', () => {
164+
const cache = createCache({ getStore })
165+
cache.writeItem({ model: mockModel, key: 1, item: { id: 1, label: 'Meow' }, marker: 'testMarker' })
166+
cache.writeItem({ model: mockModel, key: 2, item: { id: 2, label: 'Woof' }, marker: 'testMarker' })
167+
cache.writeItem({ model: mockModel, key: 3, item: { id: 3, label: 'Meow' }, marker: 'testMarker' })
168+
169+
const items = cache.readItems({ model: mockModel, marker: 'testMarker', filter: item => item.label === 'Meow', limit: 1 })
170+
expect(items).toHaveLength(1)
171+
expect(items[0]).toEqual({ id: 1, label: 'Meow' })
172+
})
150173
})

0 commit comments

Comments
 (0)