viyv-db-postgres 0.1.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 (98) hide show
  1. package/LICENSE +21 -0
  2. package/dist/config.d.ts +37 -0
  3. package/dist/config.d.ts.map +1 -0
  4. package/dist/config.js +15 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/db.d.ts +9 -0
  7. package/dist/db.d.ts.map +1 -0
  8. package/dist/db.js +13 -0
  9. package/dist/db.js.map +1 -0
  10. package/dist/error-mapper.d.ts +2 -0
  11. package/dist/error-mapper.d.ts.map +1 -0
  12. package/dist/error-mapper.js +24 -0
  13. package/dist/error-mapper.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +19 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/logical/cte-builder.d.ts +57 -0
  19. package/dist/logical/cte-builder.d.ts.map +1 -0
  20. package/dist/logical/cte-builder.js +167 -0
  21. package/dist/logical/cte-builder.js.map +1 -0
  22. package/dist/logical/data-ops.d.ts +19 -0
  23. package/dist/logical/data-ops.d.ts.map +1 -0
  24. package/dist/logical/data-ops.js +124 -0
  25. package/dist/logical/data-ops.js.map +1 -0
  26. package/dist/logical/embedding-ops.d.ts +24 -0
  27. package/dist/logical/embedding-ops.d.ts.map +1 -0
  28. package/dist/logical/embedding-ops.js +94 -0
  29. package/dist/logical/embedding-ops.js.map +1 -0
  30. package/dist/logical/migration-ops.d.ts +10 -0
  31. package/dist/logical/migration-ops.d.ts.map +1 -0
  32. package/dist/logical/migration-ops.js +201 -0
  33. package/dist/logical/migration-ops.js.map +1 -0
  34. package/dist/logical/query-ops.d.ts +18 -0
  35. package/dist/logical/query-ops.d.ts.map +1 -0
  36. package/dist/logical/query-ops.js +193 -0
  37. package/dist/logical/query-ops.js.map +1 -0
  38. package/dist/logical/registry.d.ts +27 -0
  39. package/dist/logical/registry.d.ts.map +1 -0
  40. package/dist/logical/registry.js +79 -0
  41. package/dist/logical/registry.js.map +1 -0
  42. package/dist/logical/schema-ops.d.ts +7 -0
  43. package/dist/logical/schema-ops.d.ts.map +1 -0
  44. package/dist/logical/schema-ops.js +311 -0
  45. package/dist/logical/schema-ops.js.map +1 -0
  46. package/dist/logical/sql-parser.d.ts +11 -0
  47. package/dist/logical/sql-parser.d.ts.map +1 -0
  48. package/dist/logical/sql-parser.js +37 -0
  49. package/dist/logical/sql-parser.js.map +1 -0
  50. package/dist/logical/sql-table-refs.d.ts +18 -0
  51. package/dist/logical/sql-table-refs.d.ts.map +1 -0
  52. package/dist/logical/sql-table-refs.js +203 -0
  53. package/dist/logical/sql-table-refs.js.map +1 -0
  54. package/dist/logical/sql-tokenizer.d.ts +20 -0
  55. package/dist/logical/sql-tokenizer.d.ts.map +1 -0
  56. package/dist/logical/sql-tokenizer.js +249 -0
  57. package/dist/logical/sql-tokenizer.js.map +1 -0
  58. package/dist/logical/type-utils.d.ts +11 -0
  59. package/dist/logical/type-utils.d.ts.map +1 -0
  60. package/dist/logical/type-utils.js +42 -0
  61. package/dist/logical/type-utils.js.map +1 -0
  62. package/dist/logical/where-builder.d.ts +6 -0
  63. package/dist/logical/where-builder.d.ts.map +1 -0
  64. package/dist/logical/where-builder.js +20 -0
  65. package/dist/logical/where-builder.js.map +1 -0
  66. package/dist/schema.d.ts +926 -0
  67. package/dist/schema.d.ts.map +1 -0
  68. package/dist/schema.js +78 -0
  69. package/dist/schema.js.map +1 -0
  70. package/dist/services/postgres-service.d.ts +40 -0
  71. package/dist/services/postgres-service.d.ts.map +1 -0
  72. package/dist/services/postgres-service.js +479 -0
  73. package/dist/services/postgres-service.js.map +1 -0
  74. package/dist/services/semantic-search-service.d.ts +16 -0
  75. package/dist/services/semantic-search-service.d.ts.map +1 -0
  76. package/dist/services/semantic-search-service.js +94 -0
  77. package/dist/services/semantic-search-service.js.map +1 -0
  78. package/dist/system-migrations/001_composite_pk.d.ts +4 -0
  79. package/dist/system-migrations/001_composite_pk.d.ts.map +1 -0
  80. package/dist/system-migrations/001_composite_pk.js +23 -0
  81. package/dist/system-migrations/001_composite_pk.js.map +1 -0
  82. package/dist/system-migrations/002_schema_log_index.d.ts +4 -0
  83. package/dist/system-migrations/002_schema_log_index.d.ts.map +1 -0
  84. package/dist/system-migrations/002_schema_log_index.js +13 -0
  85. package/dist/system-migrations/002_schema_log_index.js.map +1 -0
  86. package/dist/system-migrations/index.d.ts +9 -0
  87. package/dist/system-migrations/index.d.ts.map +1 -0
  88. package/dist/system-migrations/index.js +9 -0
  89. package/dist/system-migrations/index.js.map +1 -0
  90. package/dist/system-migrations/types.d.ts +18 -0
  91. package/dist/system-migrations/types.d.ts.map +1 -0
  92. package/dist/system-migrations/types.js +28 -0
  93. package/dist/system-migrations/types.js.map +1 -0
  94. package/dist/system-migrations.d.ts +25 -0
  95. package/dist/system-migrations.d.ts.map +1 -0
  96. package/dist/system-migrations.js +66 -0
  97. package/dist/system-migrations.js.map +1 -0
  98. package/package.json +44 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYzB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB1B,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiBvB,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc1B,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQ7B,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQrB,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASpB,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,78 @@
1
+ import { bigserial, boolean, index, integer, jsonb, pgTable, primaryKey, text, timestamp, uniqueIndex, uuid, } from 'drizzle-orm/pg-core';
2
+ export const logicalTables = pgTable('_viyv_logical_tables', {
3
+ id: uuid('id').primaryKey().defaultRandom(),
4
+ tenantId: text('tenant_id').notNull(),
5
+ name: text('name').notNull(),
6
+ purpose: text('purpose'),
7
+ createdBy: text('created_by'),
8
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
9
+ updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
10
+ }, (table) => [uniqueIndex('uq_logical_tables_tenant_name').on(table.tenantId, table.name)]);
11
+ export const logicalColumns = pgTable('_viyv_logical_columns', {
12
+ id: uuid('id').primaryKey().defaultRandom(),
13
+ tableId: uuid('table_id')
14
+ .notNull()
15
+ .references(() => logicalTables.id, { onDelete: 'cascade' }),
16
+ name: text('name').notNull(),
17
+ type: text('type').notNull().default('TEXT'),
18
+ nullable: boolean('nullable').notNull().default(true),
19
+ defaultValue: text('default_value'),
20
+ primaryKey: boolean('primary_key').notNull().default(false),
21
+ uniqueCol: boolean('unique_col').notNull().default(false),
22
+ description: text('description'),
23
+ position: integer('position').notNull().default(0),
24
+ }, (table) => [uniqueIndex('uq_logical_columns_table_name').on(table.tableId, table.name)]);
25
+ export const logicalRows = pgTable('_viyv_logical_rows', {
26
+ id: uuid('id').notNull().defaultRandom(),
27
+ tenantId: text('tenant_id').notNull(),
28
+ tableId: uuid('table_id')
29
+ .notNull()
30
+ .references(() => logicalTables.id, { onDelete: 'cascade' }),
31
+ data: jsonb('data').notNull().default({}),
32
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
33
+ updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
34
+ }, (table) => [
35
+ primaryKey({ columns: [table.id, table.tenantId] }),
36
+ index('idx_logical_rows_scope').on(table.tenantId, table.tableId),
37
+ index('idx_logical_rows_data_gin').using('gin', table.data),
38
+ ]);
39
+ export const logicalIndexes = pgTable('_viyv_logical_indexes', {
40
+ id: uuid('id').primaryKey().defaultRandom(),
41
+ tableId: uuid('table_id')
42
+ .notNull()
43
+ .references(() => logicalTables.id, { onDelete: 'cascade' }),
44
+ name: text('name').notNull(),
45
+ columns: text('columns').array().notNull(),
46
+ uniqueIdx: boolean('unique_idx').notNull().default(false),
47
+ pgIndex: text('pg_index'),
48
+ createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
49
+ }, (table) => [uniqueIndex('uq_logical_indexes_table_name').on(table.tableId, table.name)]);
50
+ export const logicalForeignKeys = pgTable('_viyv_logical_foreign_keys', {
51
+ id: uuid('id').primaryKey().defaultRandom(),
52
+ tableId: uuid('table_id')
53
+ .notNull()
54
+ .references(() => logicalTables.id, { onDelete: 'cascade' }),
55
+ columnName: text('column_name').notNull(),
56
+ refTableName: text('ref_table_name').notNull(),
57
+ refColumnName: text('ref_column_name').notNull(),
58
+ });
59
+ export const migrations = pgTable('_viyv_migrations', {
60
+ version: text('version').primaryKey(),
61
+ description: text('description').notNull(),
62
+ upSql: text('up_sql').notNull(),
63
+ downSql: text('down_sql').notNull(),
64
+ appliedAt: timestamp('applied_at', { withTimezone: true }).notNull().defaultNow(),
65
+ appliedBy: text('applied_by'),
66
+ reason: text('reason').notNull().default(''),
67
+ });
68
+ export const schemaLog = pgTable('_viyv_schema_log', {
69
+ id: bigserial('id', { mode: 'number' }).primaryKey(),
70
+ tableName: text('table_name').notNull(),
71
+ operation: text('operation').notNull(),
72
+ sqlExecuted: text('sql_executed').notNull(),
73
+ reason: text('reason').notNull().default(''),
74
+ appliedBy: text('applied_by'),
75
+ appliedAt: timestamp('applied_at', { withTimezone: true }).notNull().defaultNow(),
76
+ migrationVersion: text('migration_version').notNull().default(''),
77
+ });
78
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import type { AlterAction, CreateTableDef, IDatabaseService, IEmbeddingProvider, ISemanticSearchService, InsertResult, Migration, MutationResult, QueryResult, QueryTableOptions, SchemaMode, SchemaOptions, SchemaResult, SemanticSearchOptions, SemanticSearchResult } from 'viyv-db-core';
2
+ import type { PostgresConfig } from '../config.js';
3
+ import type { DrizzleDb } from '../db.js';
4
+ import type { LogicalTableRegistry } from '../logical/registry.js';
5
+ export declare class PostgresService implements IDatabaseService {
6
+ private readonly db;
7
+ private readonly registry;
8
+ private readonly config;
9
+ private readonly tenantId;
10
+ private pool;
11
+ private semanticSearchService;
12
+ constructor(db: DrizzleDb, registry: LogicalTableRegistry, config: PostgresConfig, tenantId: string);
13
+ enableEmbedding(provider: IEmbeddingProvider, dimensions: number): Promise<void>;
14
+ getSemanticSearch(): ISemanticSearchService | null;
15
+ /** Set the pg Pool so close() can shut it down */
16
+ setPool(pool: import('pg').Pool): void;
17
+ initialize(): Promise<void>;
18
+ close(): Promise<void>;
19
+ getSchema(mode: SchemaMode, options?: SchemaOptions): Promise<SchemaResult>;
20
+ createTable(def: CreateTableDef, reason: string, appliedBy?: string): Promise<void>;
21
+ alterTable(table: string, action: AlterAction, reason: string, appliedBy?: string): Promise<void>;
22
+ dropTable(table: string, reason: string, appliedBy?: string): Promise<void>;
23
+ insert(table: string, rows: Record<string, unknown>[]): Promise<InsertResult>;
24
+ update(table: string, set: Record<string, unknown>, where: Record<string, unknown>): Promise<MutationResult>;
25
+ delete(table: string, where: Record<string, unknown>): Promise<MutationResult>;
26
+ upsert(table: string, rows: Record<string, unknown>[], conflictColumns: string[]): Promise<InsertResult>;
27
+ queryTable(table: string, options?: QueryTableOptions): Promise<QueryResult>;
28
+ query(sqlStr: string, params?: unknown[]): Promise<QueryResult>;
29
+ executeSql(sqlStr: string, params?: unknown[], accessLevel?: string): Promise<QueryResult>;
30
+ getMigrationInfo(): Promise<Migration[]>;
31
+ rollbackMigration(targetVersion: string): Promise<void>;
32
+ semanticSearch(options: SemanticSearchOptions): Promise<SemanticSearchResult[]>;
33
+ private tryEmbed;
34
+ private tryDeleteEmbeddings;
35
+ private listTables;
36
+ private getTableDetail;
37
+ private getOverview;
38
+ private getChangelog;
39
+ }
40
+ //# sourceMappingURL=postgres-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-service.d.ts","sourceRoot":"","sources":["../../src/services/postgres-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,479 @@
1
+ import { and, eq, inArray, sql } from 'drizzle-orm';
2
+ import { SemanticSearchNotEnabledError, SqlValidationError, TableNotFoundError, guardSystemTable, validateIdentifier, validateTableName, } from 'viyv-db-core';
3
+ import { mapPgError } from '../error-mapper.js';
4
+ import * as dataOps from '../logical/data-ops.js';
5
+ import * as migrationOps from '../logical/migration-ops.js';
6
+ import * as queryOps from '../logical/query-ops.js';
7
+ import * as schemaOps from '../logical/schema-ops.js';
8
+ import { logicalColumns, logicalForeignKeys, logicalIndexes, logicalRows, logicalTables, schemaLog, } from '../schema.js';
9
+ import { runSystemMigrations, systemMigrations } from '../system-migrations/index.js';
10
+ import { PostgresSemanticSearchService } from './semantic-search-service.js';
11
+ export class PostgresService {
12
+ db;
13
+ registry;
14
+ config;
15
+ tenantId;
16
+ pool = null;
17
+ semanticSearchService = null;
18
+ constructor(db, registry, config, tenantId) {
19
+ this.db = db;
20
+ this.registry = registry;
21
+ this.config = config;
22
+ this.tenantId = tenantId;
23
+ }
24
+ async enableEmbedding(provider, dimensions) {
25
+ this.semanticSearchService = new PostgresSemanticSearchService(this.db, this.registry, provider, this.tenantId, dimensions);
26
+ await this.semanticSearchService.initialize();
27
+ }
28
+ getSemanticSearch() {
29
+ return this.semanticSearchService;
30
+ }
31
+ /** Set the pg Pool so close() can shut it down */
32
+ setPool(pool) {
33
+ this.pool = pool;
34
+ }
35
+ async initialize() {
36
+ // Create all system tables in a single transaction for atomicity
37
+ await this.db.transaction(async (tx) => {
38
+ await tx.execute(sql `
39
+ CREATE TABLE IF NOT EXISTS _viyv_logical_tables (
40
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
41
+ tenant_id TEXT NOT NULL,
42
+ name TEXT NOT NULL,
43
+ purpose TEXT,
44
+ created_by TEXT,
45
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
46
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
47
+ UNIQUE (tenant_id, name)
48
+ )
49
+ `);
50
+ await tx.execute(sql `
51
+ CREATE TABLE IF NOT EXISTS _viyv_logical_columns (
52
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
53
+ table_id UUID NOT NULL REFERENCES _viyv_logical_tables(id) ON DELETE CASCADE,
54
+ name TEXT NOT NULL,
55
+ type TEXT NOT NULL DEFAULT 'TEXT',
56
+ nullable BOOLEAN NOT NULL DEFAULT true,
57
+ default_value TEXT,
58
+ primary_key BOOLEAN NOT NULL DEFAULT false,
59
+ unique_col BOOLEAN NOT NULL DEFAULT false,
60
+ description TEXT,
61
+ position INTEGER NOT NULL DEFAULT 0,
62
+ UNIQUE (table_id, name)
63
+ )
64
+ `);
65
+ await tx.execute(sql `
66
+ CREATE TABLE IF NOT EXISTS _viyv_logical_rows (
67
+ id UUID NOT NULL DEFAULT gen_random_uuid(),
68
+ tenant_id TEXT NOT NULL,
69
+ table_id UUID NOT NULL REFERENCES _viyv_logical_tables(id) ON DELETE CASCADE,
70
+ data JSONB NOT NULL DEFAULT '{}',
71
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
72
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
73
+ PRIMARY KEY (id, tenant_id)
74
+ )
75
+ `);
76
+ await tx.execute(sql `
77
+ CREATE INDEX IF NOT EXISTS idx_logical_rows_scope
78
+ ON _viyv_logical_rows (tenant_id, table_id)
79
+ `);
80
+ await tx.execute(sql `
81
+ CREATE INDEX IF NOT EXISTS idx_logical_rows_data_gin
82
+ ON _viyv_logical_rows USING gin (data jsonb_path_ops)
83
+ `);
84
+ await tx.execute(sql `
85
+ CREATE TABLE IF NOT EXISTS _viyv_logical_indexes (
86
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
87
+ table_id UUID NOT NULL REFERENCES _viyv_logical_tables(id) ON DELETE CASCADE,
88
+ name TEXT NOT NULL,
89
+ columns TEXT[] NOT NULL,
90
+ unique_idx BOOLEAN NOT NULL DEFAULT false,
91
+ pg_index TEXT,
92
+ created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
93
+ UNIQUE (table_id, name)
94
+ )
95
+ `);
96
+ await tx.execute(sql `
97
+ CREATE TABLE IF NOT EXISTS _viyv_logical_foreign_keys (
98
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
99
+ table_id UUID NOT NULL REFERENCES _viyv_logical_tables(id) ON DELETE CASCADE,
100
+ column_name TEXT NOT NULL,
101
+ ref_table_name TEXT NOT NULL,
102
+ ref_column_name TEXT NOT NULL
103
+ )
104
+ `);
105
+ await tx.execute(sql `
106
+ CREATE TABLE IF NOT EXISTS _viyv_migrations (
107
+ version TEXT PRIMARY KEY,
108
+ description TEXT NOT NULL,
109
+ up_sql TEXT NOT NULL,
110
+ down_sql TEXT NOT NULL,
111
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT now(),
112
+ applied_by TEXT,
113
+ reason TEXT NOT NULL DEFAULT ''
114
+ )
115
+ `);
116
+ await tx.execute(sql `
117
+ CREATE TABLE IF NOT EXISTS _viyv_schema_log (
118
+ id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
119
+ table_name TEXT NOT NULL,
120
+ operation TEXT NOT NULL,
121
+ sql_executed TEXT NOT NULL,
122
+ reason TEXT NOT NULL DEFAULT '',
123
+ applied_by TEXT,
124
+ applied_at TIMESTAMPTZ NOT NULL DEFAULT now(),
125
+ migration_version TEXT NOT NULL DEFAULT ''
126
+ )
127
+ `);
128
+ // Run versioned system migrations (PK upgrades, index additions, etc.)
129
+ await runSystemMigrations(tx, systemMigrations);
130
+ });
131
+ await this.registry.ensureLoaded(this.db, this.tenantId);
132
+ }
133
+ async close() {
134
+ if (this.pool) {
135
+ await this.pool.end();
136
+ }
137
+ }
138
+ // ── Schema Operations ──
139
+ async getSchema(mode, options = {}) {
140
+ await this.registry.ensureLoaded(this.db, this.tenantId);
141
+ switch (mode) {
142
+ case 'list':
143
+ return { mode: 'list', tables: await this.listTables() };
144
+ case 'detail': {
145
+ if (!options.tableName) {
146
+ throw new SqlValidationError('tableName is required for detail mode');
147
+ }
148
+ return { mode: 'detail', table: await this.getTableDetail(options.tableName) };
149
+ }
150
+ case 'overview':
151
+ return { mode: 'overview', tables: await this.getOverview() };
152
+ case 'changelog':
153
+ return { mode: 'changelog', entries: await this.getChangelog(options.limit) };
154
+ }
155
+ }
156
+ async createTable(def, reason, appliedBy) {
157
+ validateTableName(def.name);
158
+ await this.registry.ensureLoaded(this.db, this.tenantId);
159
+ try {
160
+ await schemaOps.createTable(this.db, this.registry, this.tenantId, def, reason, appliedBy);
161
+ }
162
+ catch (e) {
163
+ mapPgError(e);
164
+ }
165
+ }
166
+ async alterTable(table, action, reason, appliedBy) {
167
+ guardSystemTable(table);
168
+ await this.registry.ensureLoaded(this.db, this.tenantId);
169
+ try {
170
+ await schemaOps.alterTable(this.db, this.registry, this.tenantId, table, action, reason, appliedBy);
171
+ }
172
+ catch (e) {
173
+ mapPgError(e);
174
+ }
175
+ }
176
+ async dropTable(table, reason, appliedBy) {
177
+ guardSystemTable(table);
178
+ await this.registry.ensureLoaded(this.db, this.tenantId);
179
+ try {
180
+ await schemaOps.dropTable(this.db, this.registry, this.tenantId, table, reason, appliedBy);
181
+ }
182
+ catch (e) {
183
+ mapPgError(e);
184
+ }
185
+ }
186
+ // ── DML Operations ──
187
+ async insert(table, rows) {
188
+ guardSystemTable(table);
189
+ validateIdentifier(table);
190
+ await this.registry.ensureLoaded(this.db, this.tenantId);
191
+ try {
192
+ const needsRowIds = this.semanticSearchService !== null;
193
+ const result = await dataOps.insert(this.db, this.registry, this.tenantId, table, rows, {
194
+ batchSize: this.config.insertBatchSize,
195
+ needsRowIds,
196
+ });
197
+ await this.tryEmbed(table, result.rowIds);
198
+ return { insertedCount: result.insertedCount };
199
+ }
200
+ catch (e) {
201
+ mapPgError(e);
202
+ }
203
+ }
204
+ async update(table, set, where) {
205
+ guardSystemTable(table);
206
+ validateIdentifier(table);
207
+ await this.registry.ensureLoaded(this.db, this.tenantId);
208
+ try {
209
+ const result = await dataOps.update(this.db, this.registry, this.tenantId, table, set, where);
210
+ await this.tryEmbed(table, result.rowIds);
211
+ return { affectedRows: result.affectedRows };
212
+ }
213
+ catch (e) {
214
+ mapPgError(e);
215
+ }
216
+ }
217
+ async delete(table, where) {
218
+ guardSystemTable(table);
219
+ validateIdentifier(table);
220
+ await this.registry.ensureLoaded(this.db, this.tenantId);
221
+ try {
222
+ const result = await dataOps.deleteRows(this.db, this.registry, this.tenantId, table, where);
223
+ await this.tryDeleteEmbeddings(result.rowIds);
224
+ return { affectedRows: result.affectedRows };
225
+ }
226
+ catch (e) {
227
+ mapPgError(e);
228
+ }
229
+ }
230
+ async upsert(table, rows, conflictColumns) {
231
+ guardSystemTable(table);
232
+ validateIdentifier(table);
233
+ await this.registry.ensureLoaded(this.db, this.tenantId);
234
+ try {
235
+ const result = await dataOps.upsert(this.db, this.registry, this.tenantId, table, rows, conflictColumns);
236
+ await this.tryEmbed(table, result.rowIds);
237
+ return { insertedCount: result.insertedCount };
238
+ }
239
+ catch (e) {
240
+ mapPgError(e);
241
+ }
242
+ }
243
+ // ── Structured Query ──
244
+ async queryTable(table, options) {
245
+ guardSystemTable(table);
246
+ validateIdentifier(table);
247
+ await this.registry.ensureLoaded(this.db, this.tenantId);
248
+ try {
249
+ return await queryOps.queryTableStructured(this.db, this.registry, this.tenantId, this.config, table, options);
250
+ }
251
+ catch (e) {
252
+ mapPgError(e);
253
+ }
254
+ }
255
+ // ── Query Operations ──
256
+ async query(sqlStr, params) {
257
+ await this.registry.ensureLoaded(this.db, this.tenantId);
258
+ try {
259
+ return await queryOps.query(this.db, this.registry, this.tenantId, this.config, sqlStr, params);
260
+ }
261
+ catch (e) {
262
+ mapPgError(e);
263
+ }
264
+ }
265
+ async executeSql(sqlStr, params, accessLevel) {
266
+ await this.registry.ensureLoaded(this.db, this.tenantId);
267
+ try {
268
+ return await queryOps.executeSql(this.db, this.registry, this.tenantId, this.config, sqlStr, params, accessLevel);
269
+ }
270
+ catch (e) {
271
+ mapPgError(e);
272
+ }
273
+ }
274
+ // ── Migration Operations ──
275
+ async getMigrationInfo() {
276
+ try {
277
+ return await migrationOps.getMigrationInfo(this.db);
278
+ }
279
+ catch (e) {
280
+ mapPgError(e);
281
+ }
282
+ }
283
+ async rollbackMigration(targetVersion) {
284
+ try {
285
+ await migrationOps.rollbackMigration(this.db, this.registry, this.tenantId, targetVersion);
286
+ }
287
+ catch (e) {
288
+ mapPgError(e);
289
+ }
290
+ }
291
+ // ── Semantic Search ──
292
+ async semanticSearch(options) {
293
+ if (!this.semanticSearchService) {
294
+ throw new SemanticSearchNotEnabledError();
295
+ }
296
+ return this.semanticSearchService.semanticSearch(options);
297
+ }
298
+ // ── Embedding helpers (best-effort, never block DML) ──
299
+ async tryEmbed(table, rowIds) {
300
+ if (!this.semanticSearchService || rowIds.length === 0)
301
+ return;
302
+ try {
303
+ await this.semanticSearchService.embedRows(table, rowIds);
304
+ }
305
+ catch {
306
+ // Embedding failure should not block data operations
307
+ }
308
+ }
309
+ async tryDeleteEmbeddings(rowIds) {
310
+ if (!this.semanticSearchService || rowIds.length === 0)
311
+ return;
312
+ try {
313
+ await this.semanticSearchService.deleteEmbeddings(rowIds);
314
+ }
315
+ catch {
316
+ // Embedding cleanup failure should not block data operations
317
+ }
318
+ }
319
+ // ── Private helpers ──
320
+ async listTables() {
321
+ const rows = await this.db
322
+ .select({
323
+ name: logicalTables.name,
324
+ purpose: logicalTables.purpose,
325
+ rowCount: sql `count(${logicalRows.id})`,
326
+ })
327
+ .from(logicalTables)
328
+ .leftJoin(logicalRows, and(eq(logicalRows.tableId, logicalTables.id), eq(logicalRows.tenantId, this.tenantId)))
329
+ .where(eq(logicalTables.tenantId, this.tenantId))
330
+ .groupBy(logicalTables.id, logicalTables.name, logicalTables.purpose);
331
+ return rows.map((r) => ({
332
+ name: r.name,
333
+ purpose: r.purpose ?? null,
334
+ columnCount: this.registry.getTable(r.name)?.columns.length ?? 0,
335
+ rowCount: Number(r.rowCount ?? 0),
336
+ }));
337
+ }
338
+ async getTableDetail(tableName) {
339
+ const entry = this.registry.getTable(tableName);
340
+ if (!entry) {
341
+ throw new TableNotFoundError(tableName);
342
+ }
343
+ // Get table metadata
344
+ const [tableRow] = await this.db
345
+ .select()
346
+ .from(logicalTables)
347
+ .where(eq(logicalTables.id, entry.id));
348
+ // Get row count
349
+ const [countResult] = await this.db
350
+ .select({ count: sql `count(*)` })
351
+ .from(logicalRows)
352
+ .where(and(eq(logicalRows.tenantId, this.tenantId), eq(logicalRows.tableId, entry.id)));
353
+ // Get indexes
354
+ const indexes = await this.db
355
+ .select()
356
+ .from(logicalIndexes)
357
+ .where(eq(logicalIndexes.tableId, entry.id));
358
+ // Get foreign keys
359
+ const fks = await this.db
360
+ .select()
361
+ .from(logicalForeignKeys)
362
+ .where(eq(logicalForeignKeys.tableId, entry.id));
363
+ // Build columns from cache (sorted by position)
364
+ const sortedCols = [...entry.columns].sort((a, b) => a.position - b.position);
365
+ return {
366
+ name: tableName,
367
+ purpose: tableRow?.purpose ?? null,
368
+ columns: sortedCols.map((c) => ({
369
+ name: c.name,
370
+ type: c.type,
371
+ nullable: c.nullable,
372
+ defaultValue: c.defaultValue,
373
+ primaryKey: c.primaryKey,
374
+ unique: c.uniqueCol,
375
+ description: c.description,
376
+ })),
377
+ indexes: indexes.map((idx) => ({
378
+ name: idx.name,
379
+ columns: idx.columns,
380
+ unique: idx.uniqueIdx,
381
+ })),
382
+ foreignKeys: fks.map((fk) => ({
383
+ from: fk.columnName,
384
+ table: fk.refTableName,
385
+ to: fk.refColumnName,
386
+ })),
387
+ rowCount: Number(countResult?.count ?? 0),
388
+ };
389
+ }
390
+ async getOverview() {
391
+ const tables = this.registry.listTables();
392
+ if (tables.size === 0)
393
+ return [];
394
+ const tableIds = [...tables.values()].map((e) => e.id);
395
+ // Batch: table metadata, row counts, indexes, foreign keys (4 queries total)
396
+ const [tableRows, rowCounts, allIndexes, allFks] = await Promise.all([
397
+ this.db.select().from(logicalTables).where(eq(logicalTables.tenantId, this.tenantId)),
398
+ this.db
399
+ .select({
400
+ tableId: logicalRows.tableId,
401
+ count: sql `count(*)`,
402
+ })
403
+ .from(logicalRows)
404
+ .where(and(eq(logicalRows.tenantId, this.tenantId), inArray(logicalRows.tableId, tableIds)))
405
+ .groupBy(logicalRows.tableId),
406
+ this.db.select().from(logicalIndexes).where(inArray(logicalIndexes.tableId, tableIds)),
407
+ this.db
408
+ .select()
409
+ .from(logicalForeignKeys)
410
+ .where(inArray(logicalForeignKeys.tableId, tableIds)),
411
+ ]);
412
+ // Build lookup maps
413
+ const countMap = new Map(rowCounts.map((r) => [r.tableId, Number(r.count)]));
414
+ const idxMap = new Map();
415
+ for (const idx of allIndexes) {
416
+ const list = idxMap.get(idx.tableId) ?? [];
417
+ list.push(idx);
418
+ idxMap.set(idx.tableId, list);
419
+ }
420
+ const fkMap = new Map();
421
+ for (const fk of allFks) {
422
+ const list = fkMap.get(fk.tableId) ?? [];
423
+ list.push(fk);
424
+ fkMap.set(fk.tableId, list);
425
+ }
426
+ const metaMap = new Map(tableRows.map((t) => [t.id, t]));
427
+ const result = [];
428
+ for (const [name, entry] of tables) {
429
+ const meta = metaMap.get(entry.id);
430
+ const sortedCols = [...entry.columns].sort((a, b) => a.position - b.position);
431
+ const indexes = idxMap.get(entry.id) ?? [];
432
+ const fks = fkMap.get(entry.id) ?? [];
433
+ result.push({
434
+ name,
435
+ purpose: meta?.purpose ?? null,
436
+ columns: sortedCols.map((c) => ({
437
+ name: c.name,
438
+ type: c.type,
439
+ nullable: c.nullable,
440
+ defaultValue: c.defaultValue,
441
+ primaryKey: c.primaryKey,
442
+ unique: c.uniqueCol,
443
+ description: c.description,
444
+ })),
445
+ indexes: indexes.map((idx) => ({
446
+ name: idx.name,
447
+ columns: idx.columns,
448
+ unique: idx.uniqueIdx,
449
+ })),
450
+ foreignKeys: fks.map((fk) => ({
451
+ from: fk.columnName,
452
+ table: fk.refTableName,
453
+ to: fk.refColumnName,
454
+ })),
455
+ rowCount: countMap.get(entry.id) ?? 0,
456
+ });
457
+ }
458
+ return result;
459
+ }
460
+ async getChangelog(limit) {
461
+ const effectiveLimit = limit ?? 100;
462
+ const rows = await this.db
463
+ .select()
464
+ .from(schemaLog)
465
+ .orderBy(sql `${schemaLog.id} DESC`)
466
+ .limit(effectiveLimit);
467
+ return rows.map((row) => ({
468
+ id: Number(row.id),
469
+ tableName: row.tableName,
470
+ operation: row.operation,
471
+ sqlExecuted: row.sqlExecuted,
472
+ reason: row.reason,
473
+ appliedBy: row.appliedBy,
474
+ appliedAt: row.appliedAt.toISOString(),
475
+ migrationVersion: row.migrationVersion,
476
+ }));
477
+ }
478
+ }
479
+ //# sourceMappingURL=postgres-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-service.js","sourceRoot":"","sources":["../../src/services/postgres-service.ts"],"names":[],"mappings":"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"}