Skip to content

Commit abc663b

Browse files
committed
fix(tests): update ScopedStorage tests for type safety
1 parent 7a1c2ec commit abc663b

File tree

3 files changed

+22
-23
lines changed

3 files changed

+22
-23
lines changed

packages/knowledge-base/src/knowledge-base/SharedTableSchemas.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,14 @@ export type SharedChunkPrimaryKey = typeof SharedChunkPrimaryKey;
7878
* Index definitions for efficient KB-scoped queries on shared document table.
7979
*/
8080
export const SharedDocumentIndexes = [["kb_id"]] as const satisfies readonly (
81-
keyof any | readonly (keyof any)[]
81+
| keyof any
82+
| readonly (keyof any)[]
8283
)[];
8384

8485
/**
8586
* Index definitions for efficient KB-scoped queries on shared chunk table.
8687
*/
87-
export const SharedChunkIndexes = [
88-
["kb_id"],
89-
["kb_id", "doc_id"],
90-
] as const satisfies readonly (keyof any | readonly (keyof any)[])[];
88+
export const SharedChunkIndexes = [["kb_id"], ["kb_id", "doc_id"]] as const satisfies readonly (
89+
| keyof any
90+
| readonly (keyof any)[]
91+
)[];

packages/storage/src/tabular/BaseTabularStorage.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import { DataPortSchemaObject, FromSchema, TypedArraySchemaOptions } from "@workglow/util/schema";
87
import { createServiceToken, EventEmitter, makeFingerprint } from "@workglow/util";
8+
import { DataPortSchemaObject, FromSchema, TypedArraySchemaOptions } from "@workglow/util/schema";
99
import {
1010
AnyTabularStorage,
1111
AutoGeneratedKeys,
@@ -70,7 +70,7 @@ export abstract class BaseTabularStorage<
7070
protected primaryKeySchema: DataPortSchemaObject;
7171
protected valueSchema: DataPortSchemaObject;
7272

73-
/** Name of the auto-generated key column (only first primary key column can be auto-generated) */
73+
/** Name of the auto-generated key column (at most one primary key column may be auto-generated) */
7474
protected autoGeneratedKeyName: keyof Entity | null = null;
7575
/** Strategy for generating the auto-generated key */
7676
protected autoGeneratedKeyStrategy: KeyGenerationStrategy | null = null;
@@ -165,8 +165,8 @@ export abstract class BaseTabularStorage<
165165
}
166166
}
167167

168-
// Detect and validate auto-generated keys
169-
// Only the first primary key column can be auto-generated
168+
// Detect and validate auto-generated keys (at most one PK column; any PK position is allowed).
169+
// Composite keys often put a scope column first (e.g. kb_id) and auto-generate a second id.
170170
const autoGeneratedKeys: string[] = [];
171171
for (const key of primaryKeyNames) {
172172
const keyStr = String(key);
@@ -181,20 +181,12 @@ export abstract class BaseTabularStorage<
181181
if (autoGeneratedKeys.length > 1) {
182182
throw new Error(
183183
`Multiple auto-generated keys detected: ${autoGeneratedKeys.join(", ")}. ` +
184-
`Only the first primary key column can be auto-generated.`
184+
`At most one primary key column can be auto-generated.`
185185
);
186186
}
187187

188188
if (autoGeneratedKeys.length > 0) {
189189
const autoGenKeyName = autoGeneratedKeys[0];
190-
const firstPrimaryKey = String(primaryKeyNames[0]);
191-
192-
if (autoGenKeyName !== firstPrimaryKey) {
193-
throw new Error(
194-
`Auto-generated key "${autoGenKeyName}" must be the first primary key column. ` +
195-
`Current first primary key is "${firstPrimaryKey}".`
196-
);
197-
}
198190

199191
this.autoGeneratedKeyName = autoGenKeyName as keyof Entity;
200192
this.autoGeneratedKeyStrategy = this.determineGenerationStrategy(

packages/test/src/test/rag/ScopedStorage.test.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,11 @@
44
* SPDX-License-Identifier: Apache-2.0
55
*/
66

7-
import { InMemoryTabularStorage, InMemoryVectorStorage } from "@workglow/storage";
87
import {
98
createKnowledgeBase,
9+
getGlobalKnowledgeBaseRepository,
1010
isSharedTableMode,
1111
registerKnowledgeBase,
12-
getGlobalKnowledgeBaseRepository,
1312
ScopedTabularStorage,
1413
ScopedVectorStorage,
1514
SharedChunkIndexes,
@@ -19,11 +18,15 @@ import {
1918
SharedDocumentPrimaryKey,
2019
SharedDocumentStorageSchema,
2120
} from "@workglow/knowledge-base";
21+
import { InMemoryTabularStorage, InMemoryVectorStorage } from "@workglow/storage";
2222
import { uuid4 } from "@workglow/util";
2323
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
2424

2525
describe("ScopedTabularStorage", () => {
26-
let sharedStorage: InstanceType<typeof InMemoryTabularStorage>;
26+
let sharedStorage: InMemoryTabularStorage<
27+
typeof SharedDocumentStorageSchema,
28+
typeof SharedDocumentPrimaryKey
29+
>;
2730
let scopeA: ScopedTabularStorage<any, any>;
2831
let scopeB: ScopedTabularStorage<any, any>;
2932

@@ -244,7 +247,10 @@ describe("ScopedTabularStorage", () => {
244247
});
245248

246249
describe("ScopedVectorStorage", () => {
247-
let sharedStorage: InstanceType<typeof InMemoryVectorStorage>;
250+
let sharedStorage: InMemoryVectorStorage<
251+
typeof SharedChunkVectorStorageSchema,
252+
typeof SharedChunkPrimaryKey
253+
>;
248254
let scopeA: ScopedVectorStorage<any, any>;
249255
let scopeB: ScopedVectorStorage<any, any>;
250256

@@ -261,7 +267,7 @@ describe("ScopedVectorStorage", () => {
261267
});
262268

263269
afterEach(() => {
264-
sharedStorage.destroy();
270+
sharedStorage?.destroy?.();
265271
});
266272

267273
test("getVectorDimensions delegates to inner", () => {

0 commit comments

Comments
 (0)