viyv-db-postgres 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/error-mapper.d.ts.map +1 -1
- package/dist/error-mapper.js +4 -2
- package/dist/error-mapper.js.map +1 -1
- package/dist/index.d.ts +18 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -5
- package/dist/index.js.map +1 -1
- package/dist/logical/data-ops.d.ts.map +1 -1
- package/dist/logical/data-ops.js +21 -5
- package/dist/logical/data-ops.js.map +1 -1
- package/dist/logical/default-evaluator.d.ts +9 -0
- package/dist/logical/default-evaluator.d.ts.map +1 -0
- package/dist/logical/default-evaluator.js +45 -0
- package/dist/logical/default-evaluator.js.map +1 -0
- package/dist/logical/registry.d.ts +3 -0
- package/dist/logical/registry.d.ts.map +1 -1
- package/dist/logical/registry.js +9 -2
- package/dist/logical/registry.js.map +1 -1
- package/dist/logical/row-preprocessor.d.ts +25 -0
- package/dist/logical/row-preprocessor.d.ts.map +1 -0
- package/dist/logical/row-preprocessor.js +111 -0
- package/dist/logical/row-preprocessor.js.map +1 -0
- package/dist/logical/type-utils.d.ts +1 -0
- package/dist/logical/type-utils.d.ts.map +1 -1
- package/dist/logical/type-utils.js +16 -1
- package/dist/logical/type-utils.js.map +1 -1
- package/dist/schema-name.d.ts +6 -0
- package/dist/schema-name.d.ts.map +1 -0
- package/dist/schema-name.js +21 -0
- package/dist/schema-name.js.map +1 -0
- package/dist/schema-notifier.d.ts +30 -0
- package/dist/schema-notifier.d.ts.map +1 -0
- package/dist/schema-notifier.js +90 -0
- package/dist/schema-notifier.js.map +1 -0
- package/dist/schema.d.ts +17 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -1
- package/dist/schema.js.map +1 -1
- package/dist/services/postgres-service.d.ts +20 -4
- package/dist/services/postgres-service.d.ts.map +1 -1
- package/dist/services/postgres-service.js +42 -9
- package/dist/services/postgres-service.js.map +1 -1
- package/dist/system-migrations/003_serial_hwm.d.ts +4 -0
- package/dist/system-migrations/003_serial_hwm.d.ts.map +1 -0
- package/dist/system-migrations/003_serial_hwm.js +13 -0
- package/dist/system-migrations/003_serial_hwm.js.map +1 -0
- package/dist/system-migrations/index.d.ts.map +1 -1
- package/dist/system-migrations/index.js +2 -1
- package/dist/system-migrations/index.js.map +1 -1
- package/package.json +46 -43
- package/LICENSE +0 -21
package/dist/config.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export declare const PostgresConfigSchema: z.ZodObject<{
|
|
|
10
10
|
poolMax: z.ZodDefault<z.ZodNumber>;
|
|
11
11
|
embeddingDimensions: z.ZodOptional<z.ZodNumber>;
|
|
12
12
|
insertBatchSize: z.ZodDefault<z.ZodNumber>;
|
|
13
|
+
schemaIsolation: z.ZodDefault<z.ZodBoolean>;
|
|
13
14
|
}, "strip", z.ZodTypeAny, {
|
|
14
15
|
postgresUrl: string;
|
|
15
16
|
tenantId: string;
|
|
@@ -20,6 +21,7 @@ export declare const PostgresConfigSchema: z.ZodObject<{
|
|
|
20
21
|
poolMin: number;
|
|
21
22
|
poolMax: number;
|
|
22
23
|
insertBatchSize: number;
|
|
24
|
+
schemaIsolation: boolean;
|
|
23
25
|
embeddingDimensions?: number | undefined;
|
|
24
26
|
}, {
|
|
25
27
|
postgresUrl: string;
|
|
@@ -32,6 +34,7 @@ export declare const PostgresConfigSchema: z.ZodObject<{
|
|
|
32
34
|
poolMax?: number | undefined;
|
|
33
35
|
embeddingDimensions?: number | undefined;
|
|
34
36
|
insertBatchSize?: number | undefined;
|
|
37
|
+
schemaIsolation?: boolean | undefined;
|
|
35
38
|
}>;
|
|
36
39
|
export type PostgresConfig = z.infer<typeof PostgresConfigSchema>;
|
|
37
40
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAY/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -11,5 +11,6 @@ export const PostgresConfigSchema = z.object({
|
|
|
11
11
|
poolMax: z.number().positive().default(10),
|
|
12
12
|
embeddingDimensions: z.number().positive().optional(),
|
|
13
13
|
insertBatchSize: z.number().int().min(100).max(5000).default(2000),
|
|
14
|
+
schemaIsolation: z.boolean().default(false),
|
|
14
15
|
});
|
|
15
16
|
//# sourceMappingURL=config.js.map
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACvC,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IACvC,WAAW,EAAE,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC;IAChD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC9C,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1C,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrD,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IAClE,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CAC3C,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../src/error-mapper.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"error-mapper.d.ts","sourceRoot":"","sources":["../src/error-mapper.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAyBhD"}
|
package/dist/error-mapper.js
CHANGED
|
@@ -8,13 +8,15 @@ export function mapPgError(error) {
|
|
|
8
8
|
case '23503': // foreign_key_violation
|
|
9
9
|
throw new SqlValidationError(`Foreign key violation: ${pgError.detail ?? ''}`);
|
|
10
10
|
case '42P01': // undefined_table
|
|
11
|
-
throw new TableNotFoundError(pgError.detail ?? 'unknown');
|
|
11
|
+
throw new TableNotFoundError(pgError.detail ?? error.message ?? 'unknown');
|
|
12
12
|
case '42703': // undefined_column
|
|
13
|
-
throw new SqlValidationError(`Undefined column: ${pgError.detail ??
|
|
13
|
+
throw new SqlValidationError(`Undefined column: ${pgError.detail ?? error.message}`);
|
|
14
14
|
case '42601': // syntax_error
|
|
15
15
|
throw new SqlValidationError(`SQL syntax error: ${error.message}`);
|
|
16
16
|
case '40001': // serialization_failure
|
|
17
17
|
throw new MigrationError(`Serialization failure: ${error.message}`);
|
|
18
|
+
case '40P01': // deadlock_detected
|
|
19
|
+
throw new SqlValidationError(`Deadlock detected: ${error.message}`);
|
|
18
20
|
case '57014': // query_canceled (timeout)
|
|
19
21
|
throw new SqlValidationError('Query timed out');
|
|
20
22
|
}
|
package/dist/error-mapper.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-mapper.js","sourceRoot":"","sources":["../src/error-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEtF,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAA+D,CAAC;QAChF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,OAAO,EAAE,mBAAmB;gBAChC,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,KAAK,OAAO,EAAE,wBAAwB;gBACrC,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YAChF,KAAK,OAAO,EAAE,kBAAkB;gBAC/B,MAAM,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"error-mapper.js","sourceRoot":"","sources":["../src/error-mapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEtF,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,KAA+D,CAAC;QAChF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,OAAO,EAAE,mBAAmB;gBAChC,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YACxE,KAAK,OAAO,EAAE,wBAAwB;gBACrC,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YAChF,KAAK,OAAO,EAAE,kBAAkB;gBAC/B,MAAM,IAAI,kBAAkB,CAAC,OAAO,CAAC,MAAM,IAAK,KAAe,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;YACvF,KAAK,OAAO,EAAE,mBAAmB;gBAChC,MAAM,IAAI,kBAAkB,CAC3B,qBAAqB,OAAO,CAAC,MAAM,IAAK,KAAe,CAAC,OAAO,EAAE,CACjE,CAAC;YACH,KAAK,OAAO,EAAE,eAAe;gBAC5B,MAAM,IAAI,kBAAkB,CAAC,qBAAsB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,KAAK,OAAO,EAAE,wBAAwB;gBACrC,MAAM,IAAI,cAAc,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAChF,KAAK,OAAO,EAAE,oBAAoB;gBACjC,MAAM,IAAI,kBAAkB,CAAC,sBAAuB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAChF,KAAK,OAAO,EAAE,2BAA2B;gBACxC,MAAM,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,MAAM,KAAK,CAAC;AACb,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,25 @@
|
|
|
1
1
|
import type { IEmbeddingProvider } from 'viyv-db-core';
|
|
2
2
|
import type { PostgresConfig } from './config.js';
|
|
3
|
+
import type { DrizzleDb } from './db.js';
|
|
3
4
|
import { PostgresService } from './services/postgres-service.js';
|
|
4
5
|
export type { PostgresConfig } from './config.js';
|
|
5
6
|
export { PostgresConfigSchema } from './config.js';
|
|
6
7
|
export { PostgresService } from './services/postgres-service.js';
|
|
7
|
-
export
|
|
8
|
+
export { SchemaNotifier } from './schema-notifier.js';
|
|
9
|
+
export { createDb } from './db.js';
|
|
10
|
+
export type { DrizzleDb } from './db.js';
|
|
11
|
+
/** Resources for sharing a single pg.Pool across multiple tenant services. */
|
|
12
|
+
export interface SharedPoolResources {
|
|
13
|
+
pool: import('pg').Pool;
|
|
14
|
+
db: DrizzleDb;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Global schema initialization for shared pool mode.
|
|
18
|
+
* Creates system tables (7 tables) + runs system migrations + embedding table.
|
|
19
|
+
* Idempotent (IF NOT EXISTS). Call once at shared pool startup.
|
|
20
|
+
*/
|
|
21
|
+
export declare function initializeGlobalSchema(db: DrizzleDb, options?: {
|
|
22
|
+
embeddingDimensions?: number;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
export declare function createPostgresService(config: PostgresConfig, embeddingProvider?: IEmbeddingProvider, shared?: SharedPoolResources): Promise<PostgresService>;
|
|
8
25
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIzC,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IACnC,IAAI,EAAE,OAAO,IAAI,EAAE,IAAI,CAAC;IACxB,EAAE,EAAE,SAAS,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC3C,EAAE,EAAE,SAAS,EACb,OAAO,CAAC,EAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,kBAAkB,EACtC,MAAM,CAAC,EAAE,mBAAmB,GAC1B,OAAO,CAAC,eAAe,CAAC,CAuC1B"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,54 @@
|
|
|
1
1
|
import { createDb } from './db.js';
|
|
2
|
+
import { initializeEmbeddingTable } from './logical/embedding-ops.js';
|
|
2
3
|
import { LogicalTableRegistry } from './logical/registry.js';
|
|
4
|
+
import { SchemaNotifier } from './schema-notifier.js';
|
|
3
5
|
import { PostgresService } from './services/postgres-service.js';
|
|
4
6
|
export { PostgresConfigSchema } from './config.js';
|
|
5
7
|
export { PostgresService } from './services/postgres-service.js';
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
+
export { SchemaNotifier } from './schema-notifier.js';
|
|
9
|
+
export { createDb } from './db.js';
|
|
10
|
+
/**
|
|
11
|
+
* Global schema initialization for shared pool mode.
|
|
12
|
+
* Creates system tables (7 tables) + runs system migrations + embedding table.
|
|
13
|
+
* Idempotent (IF NOT EXISTS). Call once at shared pool startup.
|
|
14
|
+
*/
|
|
15
|
+
export async function initializeGlobalSchema(db, options) {
|
|
16
|
+
await PostgresService.createSystemTables(db);
|
|
17
|
+
if (options?.embeddingDimensions) {
|
|
18
|
+
await initializeEmbeddingTable(db, options.embeddingDimensions);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function createPostgresService(config, embeddingProvider, shared) {
|
|
22
|
+
let db;
|
|
23
|
+
let pool;
|
|
24
|
+
let ownsPool;
|
|
25
|
+
if (shared) {
|
|
26
|
+
db = shared.db;
|
|
27
|
+
pool = shared.pool;
|
|
28
|
+
ownsPool = false;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const created = createDb(config.postgresUrl, config.poolMin, config.poolMax);
|
|
32
|
+
db = created.db;
|
|
33
|
+
pool = created.pool;
|
|
34
|
+
ownsPool = true;
|
|
35
|
+
}
|
|
8
36
|
const registry = new LogicalTableRegistry();
|
|
37
|
+
// Shared pool mode: set NOTIFY callback for cross-process cache invalidation
|
|
38
|
+
if (shared) {
|
|
39
|
+
registry.setOnInvalidate(() => {
|
|
40
|
+
SchemaNotifier.notify(shared.db, config.tenantId).catch(() => { });
|
|
41
|
+
});
|
|
42
|
+
}
|
|
9
43
|
const service = new PostgresService(db, registry, config, config.tenantId);
|
|
10
|
-
service.setPool(pool);
|
|
44
|
+
service.setPool(pool, { ownsPool });
|
|
11
45
|
if (config.autoInitialize) {
|
|
12
|
-
await service.initialize();
|
|
46
|
+
await service.initialize({ skipGlobalInit: !!shared });
|
|
13
47
|
}
|
|
14
48
|
if (embeddingProvider) {
|
|
15
|
-
await service.enableEmbedding(embeddingProvider, config.embeddingDimensions ?? 384
|
|
49
|
+
await service.enableEmbedding(embeddingProvider, config.embeddingDimensions ?? 384, {
|
|
50
|
+
skipInit: !!shared,
|
|
51
|
+
});
|
|
16
52
|
}
|
|
17
53
|
return service;
|
|
18
54
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASnC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC3C,EAAa,EACb,OAA0C;IAE1C,MAAM,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,mBAAmB,EAAE,CAAC;QAClC,MAAM,wBAAwB,CAAC,EAAE,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACjE,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,MAAsB,EACtB,iBAAsC,EACtC,MAA4B;IAE5B,IAAI,EAAa,CAAC;IAClB,IAAI,IAAuB,CAAC;IAC5B,IAAI,QAAiB,CAAC;IAEtB,IAAI,MAAM,EAAE,CAAC;QACZ,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;QACf,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACnB,QAAQ,GAAG,KAAK,CAAC;IAClB,CAAC;SAAM,CAAC;QACP,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QAChB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACpB,QAAQ,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAE5C,6EAA6E;IAC7E,IAAI,MAAM,EAAE,CAAC;QACZ,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE;YAC7B,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAEpC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,IAAI,GAAG,EAAE;YACnF,QAAQ,EAAE,CAAC,CAAC,MAAM;SAClB,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-ops.d.ts","sourceRoot":"","sources":["../../src/logical/data-ops.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"data-ops.d.ts","sourceRoot":"","sources":["../../src/logical/data-ops.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAI1D,MAAM,WAAW,oBAAoB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACtB;AAkBD,wBAAsB,MAAM,CAC3B,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,OAAO,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAqC/B;AAED,MAAM,WAAW,sBAAsB;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,MAAM,CAC3B,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAsBjC;AAED,wBAAsB,UAAU,CAC/B,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,sBAAsB,CAAC,CAkBjC;AAED,wBAAsB,MAAM,CAC3B,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAC/B,eAAe,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,oBAAoB,CAAC,CAqE/B"}
|
package/dist/logical/data-ops.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { and, eq, sql } from 'drizzle-orm';
|
|
2
2
|
import { TableNotFoundError } from 'viyv-db-core';
|
|
3
3
|
import { logicalRows } from '../schema.js';
|
|
4
|
+
import { preprocessRows } from './row-preprocessor.js';
|
|
4
5
|
import { buildWhereConditions } from './where-builder.js';
|
|
5
6
|
/**
|
|
6
7
|
* Expand GIN pending list for large bulk inserts.
|
|
@@ -17,18 +18,21 @@ async function bulkInsertHint(tx, rowCount) {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
export async function insert(db, registry, tenantId, table, rows, options) {
|
|
20
|
-
const
|
|
21
|
-
if (!
|
|
21
|
+
const entry = registry.getTable(table);
|
|
22
|
+
if (!entry)
|
|
22
23
|
throw new TableNotFoundError(table);
|
|
23
24
|
if (rows.length === 0)
|
|
24
25
|
return { insertedCount: 0, rowIds: [] };
|
|
26
|
+
const tableId = entry.id;
|
|
25
27
|
const batchSize = options?.batchSize ?? 2000;
|
|
26
28
|
const needsRowIds = options?.needsRowIds ?? true;
|
|
27
29
|
const allIds = [];
|
|
28
30
|
await db.transaction(async (tx) => {
|
|
29
31
|
await bulkInsertHint(tx, rows.length);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
// SERIAL 採番 + DEFAULT 適用 + 型変換
|
|
33
|
+
const processedRows = await preprocessRows(tx, tenantId, tableId, entry.columns, rows);
|
|
34
|
+
for (let i = 0; i < processedRows.length; i += batchSize) {
|
|
35
|
+
const batch = processedRows.slice(i, i + batchSize);
|
|
32
36
|
const values = batch.map((row) => ({
|
|
33
37
|
tenantId,
|
|
34
38
|
tableId,
|
|
@@ -84,12 +88,24 @@ export async function upsert(db, registry, tenantId, table, rows, conflictColumn
|
|
|
84
88
|
let affected = 0;
|
|
85
89
|
const allIds = [];
|
|
86
90
|
await db.transaction(async (tx) => {
|
|
87
|
-
|
|
91
|
+
// SERIAL 採番 + DEFAULT 適用 + 型変換
|
|
92
|
+
const processedRows = await preprocessRows(tx, tenantId, entry.id, entry.columns, rows);
|
|
93
|
+
for (const row of processedRows) {
|
|
88
94
|
const conflictWhere = {};
|
|
89
95
|
for (const col of conflictColumns) {
|
|
90
96
|
conflictWhere[col] = row[col];
|
|
91
97
|
}
|
|
92
98
|
const whereConditions = buildWhereConditions(conflictWhere, entry.columns);
|
|
99
|
+
// 並行 upsert の排他制御(conflict key 単位、トランザクション終了時に自動解放)
|
|
100
|
+
const conflictKey = conflictColumns
|
|
101
|
+
.slice()
|
|
102
|
+
.sort()
|
|
103
|
+
.map((col) => `${col}=${JSON.stringify(row[col] ?? null)}`)
|
|
104
|
+
.join('\x1f');
|
|
105
|
+
await tx.execute(sql `SELECT pg_advisory_xact_lock(
|
|
106
|
+
hashtext(${`upsert:${tenantId}\x1f${entry.id}`}),
|
|
107
|
+
hashtext(${conflictKey})
|
|
108
|
+
)`);
|
|
93
109
|
const existing = await tx
|
|
94
110
|
.select({ id: logicalRows.id })
|
|
95
111
|
.from(logicalRows)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-ops.js","sourceRoot":"","sources":["../../src/logical/data-ops.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAY1D;;;GAGG;AACH,KAAK,UAAU,cAAc,CAC5B,EAAqC,EACrC,QAAgB;IAEhB,IAAI,QAAQ,GAAG,IAAI;QAAE,OAAO;IAC5B,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,2CAA2C,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACR,+CAA+C;IAChD,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,EAAa,EACb,QAA8B,EAC9B,QAAgB,EAChB,KAAa,EACb,IAA+B,EAC/B,OAAuB;IAEvB,MAAM,
|
|
1
|
+
{"version":3,"file":"data-ops.js","sourceRoot":"","sources":["../../src/logical/data-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** DEFAULT 式を JS 値に解釈する純粋関数(DB 依存ゼロ) */
|
|
2
|
+
/**
|
|
3
|
+
* DEFAULT 式を JavaScript の値に変換する。
|
|
4
|
+
* 型変換(string → number 等)は行わない — coerceValueForJsonb() に委譲する。
|
|
5
|
+
*
|
|
6
|
+
* @returns 解決された値。認識不能な式の場合は undefined(スキップ)。
|
|
7
|
+
*/
|
|
8
|
+
export declare function evaluateDefault(defaultExpr: string): string | boolean | null | undefined;
|
|
9
|
+
//# sourceMappingURL=default-evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-evaluator.d.ts","sourceRoot":"","sources":["../../src/logical/default-evaluator.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAyCxF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** DEFAULT 式を JS 値に解釈する純粋関数(DB 依存ゼロ) */
|
|
2
|
+
/**
|
|
3
|
+
* DEFAULT 式を JavaScript の値に変換する。
|
|
4
|
+
* 型変換(string → number 等)は行わない — coerceValueForJsonb() に委譲する。
|
|
5
|
+
*
|
|
6
|
+
* @returns 解決された値。認識不能な式の場合は undefined(スキップ)。
|
|
7
|
+
*/
|
|
8
|
+
export function evaluateDefault(defaultExpr) {
|
|
9
|
+
const trimmed = defaultExpr.trim();
|
|
10
|
+
if (trimmed === '')
|
|
11
|
+
return undefined;
|
|
12
|
+
const upper = trimmed.toUpperCase();
|
|
13
|
+
// NULL リテラル
|
|
14
|
+
if (upper === 'NULL')
|
|
15
|
+
return null;
|
|
16
|
+
// タイムスタンプ関数
|
|
17
|
+
if (upper === 'NOW()' || upper === 'CURRENT_TIMESTAMP' || upper === 'NOW()::TIMESTAMPTZ') {
|
|
18
|
+
return new Date().toISOString();
|
|
19
|
+
}
|
|
20
|
+
// UUID 生成関数
|
|
21
|
+
if (upper === 'GEN_RANDOM_UUID()' || upper === 'UUID_GENERATE_V4()') {
|
|
22
|
+
return crypto.randomUUID();
|
|
23
|
+
}
|
|
24
|
+
// Boolean リテラル
|
|
25
|
+
if (upper === 'TRUE')
|
|
26
|
+
return true;
|
|
27
|
+
if (upper === 'FALSE')
|
|
28
|
+
return false;
|
|
29
|
+
// 引用符付き文字列: 'screening' → "screening"
|
|
30
|
+
// PostgreSQL エスケープ '' → ' も処理
|
|
31
|
+
if (trimmed.startsWith("'") && trimmed.endsWith("'") && trimmed.length >= 2) {
|
|
32
|
+
return trimmed.slice(1, -1).replace(/''/g, "'");
|
|
33
|
+
}
|
|
34
|
+
// 数値リテラル → 文字列のまま返す(coerceValueForJsonb が型変換を担当)
|
|
35
|
+
if (/^-?\d+(\.\d+)?$/.test(trimmed)) {
|
|
36
|
+
return trimmed;
|
|
37
|
+
}
|
|
38
|
+
// 非引用符の単純文字列(例: screening — 引用符なしで保存されたケース)
|
|
39
|
+
if (/^[a-zA-Z_]\w*$/.test(trimmed)) {
|
|
40
|
+
return trimmed;
|
|
41
|
+
}
|
|
42
|
+
// 認識不能な複合式(例: nextval('seq'), array[]::text[])→ スキップ
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=default-evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-evaluator.js","sourceRoot":"","sources":["../../src/logical/default-evaluator.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IAClD,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAEpC,YAAY;IACZ,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAElC,YAAY;IACZ,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,mBAAmB,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;QAC1F,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACjC,CAAC;IAED,YAAY;IACZ,IAAI,KAAK,KAAK,mBAAmB,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;QACrE,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED,eAAe;IACf,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IAEpC,sCAAsC;IACtC,8BAA8B;IAC9B,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,iDAAiD;IACjD,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,4CAA4C;IAC5C,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,qDAAqD;IACrD,OAAO,SAAS,CAAC;AAClB,CAAC"}
|
|
@@ -16,6 +16,9 @@ export declare class LogicalTableRegistry {
|
|
|
16
16
|
private cache;
|
|
17
17
|
private lastRefreshedAt;
|
|
18
18
|
private static readonly REFRESH_COOLDOWN_MS;
|
|
19
|
+
private onInvalidateCallback;
|
|
20
|
+
/** Set a callback invoked on invalidate() (e.g., to trigger NOTIFY). */
|
|
21
|
+
setOnInvalidate(callback: () => void): void;
|
|
19
22
|
refreshIfMissing(db: DrizzleDb, tenantId: string, name: string): Promise<boolean>;
|
|
20
23
|
ensureLoaded(db: DrizzleDb, tenantId: string): Promise<void>;
|
|
21
24
|
getTableId(name: string): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/logical/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACH;AAED,qBAAa,oBAAoB;IAChC,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/logical/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACH;AAED,qBAAa,oBAAoB;IAChC,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IACpD,OAAO,CAAC,oBAAoB,CAA6B;IAEzD,wEAAwE;IACxE,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAIrC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAajF,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDlE,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIvC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAI9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;IAI1C,UAAU,IAAI,IAAI;CAIlB"}
|
package/dist/logical/registry.js
CHANGED
|
@@ -3,7 +3,12 @@ import { logicalColumns, logicalTables } from '../schema.js';
|
|
|
3
3
|
export class LogicalTableRegistry {
|
|
4
4
|
cache = null;
|
|
5
5
|
lastRefreshedAt = 0;
|
|
6
|
-
static REFRESH_COOLDOWN_MS =
|
|
6
|
+
static REFRESH_COOLDOWN_MS = 1_000;
|
|
7
|
+
onInvalidateCallback = null;
|
|
8
|
+
/** Set a callback invoked on invalidate() (e.g., to trigger NOTIFY). */
|
|
9
|
+
setOnInvalidate(callback) {
|
|
10
|
+
this.onInvalidateCallback = callback;
|
|
11
|
+
}
|
|
7
12
|
async refreshIfMissing(db, tenantId, name) {
|
|
8
13
|
if (this.has(name))
|
|
9
14
|
return true;
|
|
@@ -11,7 +16,8 @@ export class LogicalTableRegistry {
|
|
|
11
16
|
if (now - this.lastRefreshedAt < LogicalTableRegistry.REFRESH_COOLDOWN_MS) {
|
|
12
17
|
return false;
|
|
13
18
|
}
|
|
14
|
-
this
|
|
19
|
+
// Local-only invalidation (no NOTIFY — this is a cache refresh, not a DDL change)
|
|
20
|
+
this.cache = null;
|
|
15
21
|
await this.ensureLoaded(db, tenantId);
|
|
16
22
|
this.lastRefreshedAt = now;
|
|
17
23
|
return this.has(name);
|
|
@@ -74,6 +80,7 @@ export class LogicalTableRegistry {
|
|
|
74
80
|
}
|
|
75
81
|
invalidate() {
|
|
76
82
|
this.cache = null;
|
|
83
|
+
this.onInvalidateCallback?.();
|
|
77
84
|
}
|
|
78
85
|
}
|
|
79
86
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/logical/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAgB7D,MAAM,OAAO,oBAAoB;IACxB,KAAK,GAAwC,IAAI,CAAC;IAClD,eAAe,GAAG,CAAC,CAAC;IACpB,MAAM,CAAU,mBAAmB,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/logical/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行前処理: SERIAL 採番・DEFAULT 適用・型変換。
|
|
3
|
+
* where-builder.ts と同パターンの DB 依存ユーティリティ。
|
|
4
|
+
*/
|
|
5
|
+
import type { DrizzleDb } from '../db.js';
|
|
6
|
+
import type { TableCacheEntry } from './registry.js';
|
|
7
|
+
/**
|
|
8
|
+
* SERIAL カラムの次の値を取得する。
|
|
9
|
+
* トランザクション内で呼び出すこと。
|
|
10
|
+
* 内部で pg_advisory_xact_lock を取得し、並行 SERIAL 採番の排他制御を行う。
|
|
11
|
+
* ロックはトランザクション終了時に自動解放される。
|
|
12
|
+
* @internal
|
|
13
|
+
*/
|
|
14
|
+
export declare function getNextSerialValue(tx: {
|
|
15
|
+
execute: DrizzleDb['execute'];
|
|
16
|
+
}, tenantId: string, tableId: string, columnName: string): Promise<number>;
|
|
17
|
+
/**
|
|
18
|
+
* 行データの前処理: SERIAL 採番 + DEFAULT 適用 + 型変換。
|
|
19
|
+
* 入力行は変更せず、新しい配列を返却する。
|
|
20
|
+
* @internal
|
|
21
|
+
*/
|
|
22
|
+
export declare function preprocessRows(tx: {
|
|
23
|
+
execute: DrizzleDb['execute'];
|
|
24
|
+
}, tenantId: string, tableId: string, columns: TableCacheEntry['columns'], rows: ReadonlyArray<Record<string, unknown>>): Promise<Record<string, unknown>[]>;
|
|
25
|
+
//# sourceMappingURL=row-preprocessor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-preprocessor.d.ts","sourceRoot":"","sources":["../../src/logical/row-preprocessor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACvC,EAAE,EAAE;IAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAAE,EACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CA8BjB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CACnC,EAAE,EAAE;IAAE,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;CAAE,EACrC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,CAAC,SAAS,CAAC,EACnC,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CA+EpC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 行前処理: SERIAL 採番・DEFAULT 適用・型変換。
|
|
3
|
+
* where-builder.ts と同パターンの DB 依存ユーティリティ。
|
|
4
|
+
*/
|
|
5
|
+
import { sql } from 'drizzle-orm';
|
|
6
|
+
import { isValidIdentifier } from 'viyv-db-core';
|
|
7
|
+
import { logicalRows } from '../schema.js';
|
|
8
|
+
import { evaluateDefault } from './default-evaluator.js';
|
|
9
|
+
import { coerceValueForJsonb, isSerialType } from './type-utils.js';
|
|
10
|
+
/**
|
|
11
|
+
* SERIAL カラムの次の値を取得する。
|
|
12
|
+
* トランザクション内で呼び出すこと。
|
|
13
|
+
* 内部で pg_advisory_xact_lock を取得し、並行 SERIAL 採番の排他制御を行う。
|
|
14
|
+
* ロックはトランザクション終了時に自動解放される。
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export async function getNextSerialValue(tx, tenantId, tableId, columnName) {
|
|
18
|
+
if (!isValidIdentifier(columnName)) {
|
|
19
|
+
throw new Error(`Invalid column name for SERIAL: "${columnName}"`);
|
|
20
|
+
}
|
|
21
|
+
// 並行 SERIAL 採番の排他制御(トランザクション終了時に自動解放)
|
|
22
|
+
await tx.execute(sql `SELECT pg_advisory_xact_lock(
|
|
23
|
+
hashtext(${`serial:${tenantId}\x1f${tableId}`}),
|
|
24
|
+
hashtext(${columnName})
|
|
25
|
+
)`);
|
|
26
|
+
const result = await tx.execute(sql `SELECT GREATEST(
|
|
27
|
+
COALESCE(MAX((${logicalRows.data}->>${columnName})::bigint), 0),
|
|
28
|
+
COALESCE(
|
|
29
|
+
(SELECT serial_hwm FROM _viyv_logical_columns
|
|
30
|
+
WHERE table_id = ${tableId} AND name = ${columnName}),
|
|
31
|
+
0
|
|
32
|
+
)
|
|
33
|
+
) + 1 AS next_val
|
|
34
|
+
FROM ${logicalRows}
|
|
35
|
+
WHERE ${logicalRows.tenantId} = ${tenantId}
|
|
36
|
+
AND ${logicalRows.tableId} = ${tableId}
|
|
37
|
+
AND (${logicalRows.data}->>${columnName}) ~ ${'^[0-9]+$'}`);
|
|
38
|
+
const rows = (result.rows ?? []);
|
|
39
|
+
return rows.length > 0 && rows[0].next_val != null ? Number(rows[0].next_val) : 1;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 行データの前処理: SERIAL 採番 + DEFAULT 適用 + 型変換。
|
|
43
|
+
* 入力行は変更せず、新しい配列を返却する。
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
export async function preprocessRows(tx, tenantId, tableId, columns, rows) {
|
|
47
|
+
if (rows.length === 0)
|
|
48
|
+
return [];
|
|
49
|
+
// SERIAL カラムを特定
|
|
50
|
+
const serialColumns = columns.filter((c) => isSerialType(c.type) && rows.some((r) => r[c.name] === undefined || r[c.name] === null));
|
|
51
|
+
// SERIAL カラムごとに次の開始値を取得(カラムあたり 1 クエリ)
|
|
52
|
+
const serialNextValues = new Map();
|
|
53
|
+
for (const col of serialColumns) {
|
|
54
|
+
const nextVal = await getNextSerialValue(tx, tenantId, tableId, col.name);
|
|
55
|
+
serialNextValues.set(col.name, nextVal);
|
|
56
|
+
}
|
|
57
|
+
// DEFAULT カラムを特定(SERIAL 以外で defaultValue が設定されているもの)
|
|
58
|
+
const defaultColumns = columns.filter((c) => !isSerialType(c.type) && c.defaultValue !== null);
|
|
59
|
+
// 全カラムの型マップ(ユーザー値の型変換用)
|
|
60
|
+
const typeMap = new Map(columns.map((c) => [c.name, c.type]));
|
|
61
|
+
// 各 SERIAL カラムの割り当て数を追跡(HWM 更新用)
|
|
62
|
+
const serialAssignedCount = new Map();
|
|
63
|
+
for (const col of serialColumns) {
|
|
64
|
+
serialAssignedCount.set(col.name, 0);
|
|
65
|
+
}
|
|
66
|
+
const processedRows = rows.map((row) => {
|
|
67
|
+
const result = { ...row };
|
|
68
|
+
// Step B: SERIAL 採番
|
|
69
|
+
for (const col of serialColumns) {
|
|
70
|
+
if (result[col.name] === undefined || result[col.name] === null) {
|
|
71
|
+
const nextVal = serialNextValues.get(col.name) ?? 1;
|
|
72
|
+
result[col.name] = nextVal;
|
|
73
|
+
serialNextValues.set(col.name, nextVal + 1);
|
|
74
|
+
serialAssignedCount.set(col.name, (serialAssignedCount.get(col.name) ?? 0) + 1);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Step C: DEFAULT 適用(undefined のみ — 明示的 null は保持)
|
|
78
|
+
for (const col of defaultColumns) {
|
|
79
|
+
if (result[col.name] === undefined && col.defaultValue !== null) {
|
|
80
|
+
const rawValue = evaluateDefault(col.defaultValue);
|
|
81
|
+
if (rawValue !== undefined) {
|
|
82
|
+
result[col.name] = coerceValueForJsonb(rawValue, col.type);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Step D: ユーザー提供値の型変換
|
|
87
|
+
for (const [key, value] of Object.entries(result)) {
|
|
88
|
+
if (value !== null && value !== undefined) {
|
|
89
|
+
const colType = typeMap.get(key);
|
|
90
|
+
if (colType) {
|
|
91
|
+
result[key] = coerceValueForJsonb(value, colType);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
});
|
|
97
|
+
// HWM update: SERIAL カラムの最大割り当て値を記録(同一トランザクション内)
|
|
98
|
+
for (const col of serialColumns) {
|
|
99
|
+
const count = serialAssignedCount.get(col.name) ?? 0;
|
|
100
|
+
if (count > 0) {
|
|
101
|
+
const startVal = serialNextValues.get(col.name) ?? 1;
|
|
102
|
+
// serialNextValues は最後の割り当て後に +1 済みなので、最大割り当て値は startVal - 1
|
|
103
|
+
const maxAssigned = startVal - 1;
|
|
104
|
+
await tx.execute(sql `UPDATE _viyv_logical_columns
|
|
105
|
+
SET serial_hwm = GREATEST(COALESCE(serial_hwm, 0), ${maxAssigned})
|
|
106
|
+
WHERE table_id = ${tableId} AND name = ${col.name}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return processedRows;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=row-preprocessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-preprocessor.js","sourceRoot":"","sources":["../../src/logical/row-preprocessor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** JSONB 型判定・値変換ユーティリティ(純粋関数) */
|
|
2
2
|
export declare function isNumericType(type: string): boolean;
|
|
3
|
+
export declare function isSerialType(type: string): boolean;
|
|
3
4
|
export declare function isBooleanType(type: string): boolean;
|
|
4
5
|
/** 論理カラム型に対応する PostgreSQL キャスト式を返す。TEXT 系はキャスト不要。 */
|
|
5
6
|
export declare function pgCastForType(type: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/logical/type-utils.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/logical/type-utils.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcnD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAiB/E"}
|
|
@@ -1,7 +1,22 @@
|
|
|
1
1
|
/** JSONB 型判定・値変換ユーティリティ(純粋関数) */
|
|
2
2
|
export function isNumericType(type) {
|
|
3
3
|
const upper = type.toUpperCase();
|
|
4
|
-
return [
|
|
4
|
+
return [
|
|
5
|
+
'INTEGER',
|
|
6
|
+
'INT',
|
|
7
|
+
'BIGINT',
|
|
8
|
+
'SMALLINT',
|
|
9
|
+
'SERIAL',
|
|
10
|
+
'REAL',
|
|
11
|
+
'FLOAT',
|
|
12
|
+
'NUMERIC',
|
|
13
|
+
'DECIMAL',
|
|
14
|
+
'DOUBLE',
|
|
15
|
+
].some((t) => upper.includes(t));
|
|
16
|
+
}
|
|
17
|
+
export function isSerialType(type) {
|
|
18
|
+
const upper = type.toUpperCase();
|
|
19
|
+
return upper === 'SERIAL' || upper === 'BIGSERIAL' || upper === 'SMALLSERIAL';
|
|
5
20
|
}
|
|
6
21
|
export function isBooleanType(type) {
|
|
7
22
|
const upper = type.toUpperCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../src/logical/type-utils.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"type-utils.js","sourceRoot":"","sources":["../../src/logical/type-utils.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAEjC,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO;QACN,SAAS;QACT,KAAK;QACL,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,MAAM;QACN,OAAO;QACP,SAAS;QACT,SAAS;QACT,QAAQ;KACR,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,aAAa,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,CAAC;AAChD,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,aAAa,CAAC,IAAY;IACzC,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IAC5C,IAAI,aAAa,CAAC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC;IAC5C,OAAO,EAAE,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,UAAkB;IACrE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5C,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACtC,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACd,CAAC"}
|