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.
Files changed (55) hide show
  1. package/dist/config.d.ts +3 -0
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/error-mapper.d.ts.map +1 -1
  6. package/dist/error-mapper.js +4 -2
  7. package/dist/error-mapper.js.map +1 -1
  8. package/dist/index.d.ts +18 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +41 -5
  11. package/dist/index.js.map +1 -1
  12. package/dist/logical/data-ops.d.ts.map +1 -1
  13. package/dist/logical/data-ops.js +21 -5
  14. package/dist/logical/data-ops.js.map +1 -1
  15. package/dist/logical/default-evaluator.d.ts +9 -0
  16. package/dist/logical/default-evaluator.d.ts.map +1 -0
  17. package/dist/logical/default-evaluator.js +45 -0
  18. package/dist/logical/default-evaluator.js.map +1 -0
  19. package/dist/logical/registry.d.ts +3 -0
  20. package/dist/logical/registry.d.ts.map +1 -1
  21. package/dist/logical/registry.js +9 -2
  22. package/dist/logical/registry.js.map +1 -1
  23. package/dist/logical/row-preprocessor.d.ts +25 -0
  24. package/dist/logical/row-preprocessor.d.ts.map +1 -0
  25. package/dist/logical/row-preprocessor.js +111 -0
  26. package/dist/logical/row-preprocessor.js.map +1 -0
  27. package/dist/logical/type-utils.d.ts +1 -0
  28. package/dist/logical/type-utils.d.ts.map +1 -1
  29. package/dist/logical/type-utils.js +16 -1
  30. package/dist/logical/type-utils.js.map +1 -1
  31. package/dist/schema-name.d.ts +6 -0
  32. package/dist/schema-name.d.ts.map +1 -0
  33. package/dist/schema-name.js +21 -0
  34. package/dist/schema-name.js.map +1 -0
  35. package/dist/schema-notifier.d.ts +30 -0
  36. package/dist/schema-notifier.d.ts.map +1 -0
  37. package/dist/schema-notifier.js +90 -0
  38. package/dist/schema-notifier.js.map +1 -0
  39. package/dist/schema.d.ts +17 -0
  40. package/dist/schema.d.ts.map +1 -1
  41. package/dist/schema.js +2 -1
  42. package/dist/schema.js.map +1 -1
  43. package/dist/services/postgres-service.d.ts +20 -4
  44. package/dist/services/postgres-service.d.ts.map +1 -1
  45. package/dist/services/postgres-service.js +42 -9
  46. package/dist/services/postgres-service.js.map +1 -1
  47. package/dist/system-migrations/003_serial_hwm.d.ts +4 -0
  48. package/dist/system-migrations/003_serial_hwm.d.ts.map +1 -0
  49. package/dist/system-migrations/003_serial_hwm.js +13 -0
  50. package/dist/system-migrations/003_serial_hwm.js.map +1 -0
  51. package/dist/system-migrations/index.d.ts.map +1 -1
  52. package/dist/system-migrations/index.js +2 -1
  53. package/dist/system-migrations/index.js.map +1 -1
  54. package/package.json +46 -43
  55. 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
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAW/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
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
@@ -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;CAClE,CAAC,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,CAqBhD"}
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"}
@@ -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
  }
@@ -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;YAC3D,KAAK,OAAO,EAAE,mBAAmB;gBAChC,MAAM,IAAI,kBAAkB,CAAC,qBAAqB,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;YAC3E,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,2BAA2B;gBACxC,MAAM,IAAI,kBAAkB,CAAC,iBAAiB,CAAC,CAAC;QAClD,CAAC;IACF,CAAC;IACD,MAAM,KAAK,CAAC;AACb,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 declare function createPostgresService(config: PostgresConfig, embeddingProvider?: IEmbeddingProvider): Promise<PostgresService>;
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
@@ -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;AAGlD,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;AAEjE,wBAAsB,qBAAqB,CAC1C,MAAM,EAAE,cAAc,EACtB,iBAAiB,CAAC,EAAE,kBAAkB,GACpC,OAAO,CAAC,eAAe,CAAC,CAe1B"}
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 async function createPostgresService(config, embeddingProvider) {
7
- const { db, pool } = createDb(config.postgresUrl, config.poolMin, config.poolMax);
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;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,MAAsB,EACtB,iBAAsC;IAEtC,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,QAAQ,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC3E,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtB,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACvB,MAAM,OAAO,CAAC,eAAe,CAAC,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,IAAI,GAAG,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,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;AAG1D,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,CAiC/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,CAqD/B"}
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"}
@@ -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 tableId = registry.getTableId(table);
21
- if (!tableId)
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
- for (let i = 0; i < rows.length; i += batchSize) {
31
- const batch = rows.slice(i, i + batchSize);
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
- for (const row of rows) {
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":"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"}
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;IAE9C,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYjF,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;CAGlB"}
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"}
@@ -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 = 5_000;
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.invalidate();
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":"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"}
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,CAKnD;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
+ {"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 ['INTEGER', 'INT', 'BIGINT', 'REAL', 'FLOAT', 'NUMERIC', 'DECIMAL', 'DOUBLE'].some((t) => upper.includes(t));
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,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC/F,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjB,CAAC;AACH,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"}
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"}