Skip to content

Commit b4d03fe

Browse files
committed
feat: move keys function to not generator
1 parent f07b133 commit b4d03fe

File tree

2 files changed

+16
-46
lines changed

2 files changed

+16
-46
lines changed

src/index.test.ts

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,9 @@ test.it("Async Iterator single element test", async (t) => {
5353

5454
test.it("Async Keys single element test", async (t) => {
5555
await sqliteKeyv.set("foo", "bar");
56-
const keys = sqliteKeyv.keys();
56+
const keys = await sqliteKeyv.keys();
5757

58-
for await (const key of keys) {
58+
for (const key of keys) {
5959
t.expect(key).toBe("foo");
6060
}
6161
});
@@ -85,9 +85,9 @@ test.it("Async Keys multiple element test", async (t) => {
8585
await sqliteKeyv.set("foo2", "bar2");
8686

8787
const expectedKeys = ["foo", "foo1", "foo2"];
88-
const keys = sqliteKeyv.keys();
88+
const keys = await sqliteKeyv.keys();
8989
let i = 0;
90-
for await (const key of keys) {
90+
for (const key of keys) {
9191
const expectedKey = expectedKeys[i++];
9292
t.expect(key).toBe(expectedKey);
9393
}
@@ -116,16 +116,8 @@ test.it("Async Keys multiple elements with limit=1 test", async (t) => {
116116
await sqliteKeyv.set("foo", "bar");
117117
await sqliteKeyv.set("foo1", "bar1");
118118
await sqliteKeyv.set("foo2", "bar2");
119-
const keys = sqliteKeyv.keys();
120-
let key = await keys.next();
121-
let k = key.value
122-
t.expect(k).toBe("foo");
123-
key = await keys.next();
124-
k = key.value
125-
t.expect(k).toBe("foo1");
126-
key = await keys.next();
127-
k = key.value
128-
t.expect(k).toBe("foo2");
119+
const keys = await sqliteKeyv.keys();
120+
t.expect(keys).toStrictEqual(["foo", "foo1", "foo2"]);
129121
});
130122

131123
test.it("Async Iterator 0 element test", async (t) => {
@@ -135,9 +127,8 @@ test.it("Async Iterator 0 element test", async (t) => {
135127
});
136128

137129
test.it("Async Keys 0 element test", async (t) => {
138-
const keys = sqliteKeyv.keys("keyv");
139-
const key = await keys.next();
140-
t.expect(key.value).toBe(undefined);
130+
const keys = await sqliteKeyv.keys("keyv");
131+
t.expect(keys.length).toBe(0);
141132
});
142133

143134
test.it("Async Keys with pattern test", async (t) => {
@@ -146,7 +137,7 @@ test.it("Async Keys with pattern test", async (t) => {
146137
await sqliteKeyv.set("foo2", "bar1");
147138
await sqliteKeyv.set("foo3", "bar2");
148139

149-
for await (const key of sqliteKeyv.keys("foo*")) {
140+
for (const key of await sqliteKeyv.keys("foo*")) {
150141
t.expect(key).not.toBe("other");
151142
}
152143
});

src/index.ts

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export class KeyvSqlite extends EventEmitter implements KeyvStoreAdapter {
3333
updateCatches: (args: [string, unknown][], ttl?: number) => void;
3434
emptyCaches: () => void;
3535
findCaches: (namespace: string | undefined, limit: number, offset: number, expiredAt: number) => CacheObject[];
36-
findKeys: (pattern: string | undefined, limit: number, offset: number, expiredAt: number) => CacheObject[];
36+
findKeys: (pattern: string | undefined, expiredAt: number) => CacheObject[];
3737

3838
constructor(options?: KeyvSqliteOptions) {
3939
super();
@@ -73,8 +73,8 @@ CREATE INDEX IF NOT EXISTS idx_expired_caches ON ${tableName}(expiredAt);
7373
const finderStatement = this.sqlite.prepare<[string, number, number, number], CacheObject>(
7474
`SELECT * FROM ${tableName} WHERE cacheKey LIKE ? AND (expiredAt = -1 OR expiredAt > ?) LIMIT ? OFFSET ?`,
7575
);
76-
const findKeysStatement = this.sqlite.prepare<[string, number, number, number], CacheObject>(
77-
`SELECT cacheKey FROM ${tableName} WHERE cacheKey LIKE ? AND (expiredAt = -1 OR expiredAt > ?) LIMIT ? OFFSET ?`,
76+
const findKeysStatement = this.sqlite.prepare<[string, number], CacheObject>(
77+
`SELECT cacheKey FROM ${tableName} WHERE cacheKey LIKE ? AND (expiredAt = -1 OR expiredAt > ?)`,
7878
);
7979
const purgeStatement = this.sqlite.prepare(`DELETE FROM ${tableName} WHERE expiredAt != -1 AND expiredAt < ?`);
8080
const emptyStatement = this.sqlite.prepare(`DELETE FROM ${tableName} WHERE cacheKey LIKE ?`);
@@ -145,10 +145,10 @@ CREATE INDEX IF NOT EXISTS idx_expired_caches ON ${tableName}(expiredAt);
145145
.filter((data) => data !== undefined);
146146
};
147147

148-
this.findKeys = (pattern, limit, offset, expiredAt) => {
148+
this.findKeys = (pattern, expiredAt) => {
149149
const _pattern = pattern?.replaceAll("*", "%") ?? ""
150150
return findKeysStatement
151-
.all(_pattern ? `%${pattern}%` : '%', expiredAt, limit, offset)
151+
.all(_pattern ? `%${pattern}%` : '%', expiredAt)
152152
.filter((data) => data !== undefined);
153153
};
154154
}
@@ -225,29 +225,8 @@ CREATE INDEX IF NOT EXISTS idx_expired_caches ON ${tableName}(expiredAt);
225225
yield* iterate(0);
226226
}
227227

228-
async *keys(pattern?: string) {
229-
const limit = Number.parseInt(this.opts.iterationLimit! as string, 10) || 10;
230-
const time = now();
231-
const find = this.findKeys;
232-
233-
// @ts-expect-error - iterate
234-
const iterate = async function* (offset: number) {
235-
const entries = find(pattern, limit, offset, time);
236-
237-
if (entries.length === 0) {
238-
return;
239-
}
240-
241-
for (const entry of entries) {
242-
// biome-ignore lint: <explanation>
243-
offset += 1;
244-
yield entry.cacheKey;
245-
}
246-
247-
yield* iterate(offset);
248-
};
249-
250-
yield* iterate(0);
228+
async keys(pattern?: string): Promise<string[]> {
229+
return this.findKeys(pattern, now()).map((entry) => entry.cacheKey);
251230
}
252231

253232
async disconnect() {

0 commit comments

Comments
 (0)