@deepagents/text2sql 0.3.0 → 0.6.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/README.md +167 -0
- package/dist/finetune/convert-to-gguf.d.ts +18 -0
- package/dist/finetune/convert-to-gguf.d.ts.map +1 -0
- package/dist/finetune/run-finetune.d.ts +23 -0
- package/dist/finetune/run-finetune.d.ts.map +1 -0
- package/dist/finetune/run-mlx.d.ts +22 -0
- package/dist/finetune/run-mlx.d.ts.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1795 -284
- package/dist/index.js.map +4 -4
- package/dist/lib/adapters/adapter.d.ts +8 -3
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/{grounding.ticket.d.ts → groundings/abstract.grounding.d.ts} +2 -2
- package/dist/lib/adapters/groundings/abstract.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/column-stats.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/column-stats.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/column-values.grounding.d.ts +76 -0
- package/dist/lib/adapters/groundings/column-values.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/constraint.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/constraint.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/context.d.ts +1 -1
- package/dist/lib/adapters/groundings/context.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/{grounding.d.ts → index.d.ts} +8 -5
- package/dist/lib/adapters/groundings/index.d.ts.map +1 -0
- package/dist/lib/adapters/groundings/{grounding.js → index.js} +411 -206
- package/dist/lib/adapters/groundings/index.js.map +7 -0
- package/dist/lib/adapters/groundings/indexes.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/indexes.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/info.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/info.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/report.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/report.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/row-count.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/row-count.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/table.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/table.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/groundings/view.grounding.d.ts +1 -1
- package/dist/lib/adapters/groundings/view.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-stats.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts +17 -0
- package/dist/lib/adapters/postgres/column-values.postgres.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/index.d.ts +4 -4
- package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +239 -33
- package/dist/lib/adapters/postgres/index.js.map +4 -4
- package/dist/lib/adapters/postgres/postgres.d.ts +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts +17 -0
- package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/index.d.ts +4 -4
- package/dist/lib/adapters/sqlite/index.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/index.js +218 -46
- package/dist/lib/adapters/sqlite/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts +17 -0
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/index.d.ts +4 -4
- package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +185 -32
- package/dist/lib/adapters/sqlserver/index.js.map +4 -4
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
- package/dist/lib/agents/chat1.agent.d.ts +50 -0
- package/dist/lib/agents/chat1.agent.d.ts.map +1 -0
- package/dist/lib/agents/chat2.agent.d.ts +68 -0
- package/dist/lib/agents/chat2.agent.d.ts.map +1 -0
- package/dist/lib/agents/chat3.agent.d.ts +80 -0
- package/dist/lib/agents/chat3.agent.d.ts.map +1 -0
- package/dist/lib/agents/chat4.agent.d.ts +88 -0
- package/dist/lib/agents/chat4.agent.d.ts.map +1 -0
- package/dist/lib/agents/question.agent.d.ts +23 -0
- package/dist/lib/agents/question.agent.d.ts.map +1 -0
- package/dist/lib/agents/sql.agent.d.ts +62 -0
- package/dist/lib/agents/sql.agent.d.ts.map +1 -0
- package/dist/lib/agents/teachables.agent.d.ts +8 -9
- package/dist/lib/agents/teachables.agent.d.ts.map +1 -1
- package/dist/lib/agents/text2sql.agent.d.ts +0 -1
- package/dist/lib/agents/text2sql.agent.d.ts.map +1 -1
- package/dist/lib/checkpoint.d.ts +99 -0
- package/dist/lib/checkpoint.d.ts.map +1 -0
- package/dist/lib/instructions.js +50 -21
- package/dist/lib/instructions.js.map +2 -2
- package/dist/lib/sql.d.ts +83 -3
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/syntheize.d.ts +2 -0
- package/dist/lib/syntheize.d.ts.map +1 -0
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +26 -0
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -0
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts +26 -0
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -0
- package/dist/lib/synthesis/decorators/index.d.ts +7 -0
- package/dist/lib/synthesis/decorators/index.d.ts.map +1 -0
- package/dist/lib/synthesis/decorators/validated-producer.d.ts +33 -0
- package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts +76 -0
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/full-context-extractor.d.ts +25 -0
- package/dist/lib/synthesis/extractors/full-context-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/index.d.ts +8 -0
- package/dist/lib/synthesis/extractors/index.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/last-query-extractor.d.ts +30 -0
- package/dist/lib/synthesis/extractors/last-query-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/message-extractor.d.ts +27 -0
- package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/segmented-context-extractor.d.ts +48 -0
- package/dist/lib/synthesis/extractors/segmented-context-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/sql-extractor.d.ts +27 -0
- package/dist/lib/synthesis/extractors/sql-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/extractors/windowed-context-extractor.d.ts +30 -0
- package/dist/lib/synthesis/extractors/windowed-context-extractor.d.ts.map +1 -0
- package/dist/lib/synthesis/index.d.ts +6 -0
- package/dist/lib/synthesis/index.d.ts.map +1 -0
- package/dist/lib/synthesis/index.js +2069 -0
- package/dist/lib/synthesis/index.js.map +7 -0
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +34 -0
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +41 -0
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/index.d.ts +7 -0
- package/dist/lib/synthesis/synthesizers/index.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/persona-generator.d.ts +34 -0
- package/dist/lib/synthesis/synthesizers/persona-generator.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +39 -0
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/styles.d.ts +8 -0
- package/dist/lib/synthesis/synthesizers/styles.d.ts.map +1 -0
- package/dist/lib/synthesis/synthesizers/teachings-generator.d.ts +32 -0
- package/dist/lib/synthesis/synthesizers/teachings-generator.d.ts.map +1 -0
- package/dist/lib/synthesis/types.d.ts +26 -0
- package/dist/lib/synthesis/types.d.ts.map +1 -0
- package/dist/lib/teach/teachables.d.ts +18 -3
- package/dist/lib/teach/teachables.d.ts.map +1 -1
- package/dist/lib/teach/teachings.d.ts +9 -2
- package/dist/lib/teach/teachings.d.ts.map +1 -1
- package/package.json +32 -15
- package/dist/lib/adapters/grounding.ticket.d.ts.map +0 -1
- package/dist/lib/adapters/groundings/grounding.d.ts.map +0 -1
- package/dist/lib/adapters/groundings/grounding.js.map +0 -7
- package/dist/lib/adapters/groundings/low-cardinality.grounding.d.ts +0 -35
- package/dist/lib/adapters/groundings/low-cardinality.grounding.d.ts.map +0 -1
- package/dist/lib/adapters/postgres/low-cardinality.postgres.grounding.d.ts +0 -14
- package/dist/lib/adapters/postgres/low-cardinality.postgres.grounding.d.ts.map +0 -1
- package/dist/lib/adapters/sqlite/low-cardinality.sqlite.grounding.d.ts +0 -14
- package/dist/lib/adapters/sqlite/low-cardinality.sqlite.grounding.d.ts.map +0 -1
- package/dist/lib/adapters/sqlserver/low-cardinality.sqlserver.grounding.d.ts +0 -14
- package/dist/lib/adapters/sqlserver/low-cardinality.sqlserver.grounding.d.ts.map +0 -1
|
@@ -10,9 +10,8 @@ function createGroundingContext() {
|
|
|
10
10
|
|
|
11
11
|
// packages/text2sql/src/lib/adapters/adapter.ts
|
|
12
12
|
var Adapter = class {
|
|
13
|
-
async introspect() {
|
|
13
|
+
async introspect(ctx = createGroundingContext()) {
|
|
14
14
|
const lines = [];
|
|
15
|
-
const ctx = createGroundingContext();
|
|
16
15
|
for (const fn of this.grounding) {
|
|
17
16
|
const grounding = fn(this);
|
|
18
17
|
lines.push({
|
|
@@ -82,7 +81,7 @@ ${description}
|
|
|
82
81
|
}
|
|
83
82
|
};
|
|
84
83
|
|
|
85
|
-
// packages/text2sql/src/lib/adapters/grounding.
|
|
84
|
+
// packages/text2sql/src/lib/adapters/groundings/abstract.grounding.ts
|
|
86
85
|
var AbstractGrounding = class {
|
|
87
86
|
tag;
|
|
88
87
|
constructor(tag) {
|
|
@@ -196,31 +195,108 @@ var InfoGrounding = class extends AbstractGrounding {
|
|
|
196
195
|
}
|
|
197
196
|
};
|
|
198
197
|
|
|
199
|
-
// packages/text2sql/src/lib/adapters/groundings/
|
|
200
|
-
var
|
|
198
|
+
// packages/text2sql/src/lib/adapters/groundings/column-values.grounding.ts
|
|
199
|
+
var ColumnValuesGrounding = class extends AbstractGrounding {
|
|
200
|
+
lowCardinalityLimit;
|
|
201
201
|
constructor(config = {}) {
|
|
202
|
-
super("
|
|
202
|
+
super("column_values");
|
|
203
|
+
this.lowCardinalityLimit = config.lowCardinalityLimit ?? 20;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get values for native ENUM type columns.
|
|
207
|
+
* Return undefined if column is not an ENUM type.
|
|
208
|
+
* Default implementation returns undefined (no native ENUM support).
|
|
209
|
+
*/
|
|
210
|
+
async collectEnumValues(_tableName, _column) {
|
|
211
|
+
return void 0;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Parse CHECK constraint for enum-like IN clause.
|
|
215
|
+
* Extracts values from patterns like:
|
|
216
|
+
* - CHECK (status IN ('active', 'inactive'))
|
|
217
|
+
* - CHECK ((status)::text = ANY (ARRAY['a'::text, 'b'::text]))
|
|
218
|
+
* - CHECK (status = 'active' OR status = 'inactive')
|
|
219
|
+
*/
|
|
220
|
+
parseCheckConstraint(constraint, columnName) {
|
|
221
|
+
if (constraint.type !== "CHECK" || !constraint.definition) {
|
|
222
|
+
return void 0;
|
|
223
|
+
}
|
|
224
|
+
if (constraint.columns && !constraint.columns.includes(columnName)) {
|
|
225
|
+
return void 0;
|
|
226
|
+
}
|
|
227
|
+
const def = constraint.definition;
|
|
228
|
+
const escapedCol = this.escapeRegex(columnName);
|
|
229
|
+
const colPattern = `(?:\\(?\\(?${escapedCol}\\)?(?:::(?:text|varchar|character varying))?\\)?)`;
|
|
230
|
+
const inMatch = def.match(
|
|
231
|
+
new RegExp(`${colPattern}\\s+IN\\s*\\(([^)]+)\\)`, "i")
|
|
232
|
+
);
|
|
233
|
+
if (inMatch) {
|
|
234
|
+
return this.extractStringValues(inMatch[1]);
|
|
235
|
+
}
|
|
236
|
+
const anyMatch = def.match(
|
|
237
|
+
new RegExp(
|
|
238
|
+
`${colPattern}\\s*=\\s*ANY\\s*\\(\\s*(?:ARRAY)?\\s*\\[([^\\]]+)\\]`,
|
|
239
|
+
"i"
|
|
240
|
+
)
|
|
241
|
+
);
|
|
242
|
+
if (anyMatch) {
|
|
243
|
+
return this.extractStringValues(anyMatch[1]);
|
|
244
|
+
}
|
|
245
|
+
const orPattern = new RegExp(
|
|
246
|
+
`\\b${this.escapeRegex(columnName)}\\b\\s*=\\s*'([^']*)'`,
|
|
247
|
+
"gi"
|
|
248
|
+
);
|
|
249
|
+
const orMatches = [...def.matchAll(orPattern)];
|
|
250
|
+
if (orMatches.length >= 2) {
|
|
251
|
+
return orMatches.map((m) => m[1]);
|
|
252
|
+
}
|
|
253
|
+
return void 0;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Extract string values from a comma-separated list.
|
|
257
|
+
*/
|
|
258
|
+
extractStringValues(input) {
|
|
259
|
+
const values = [];
|
|
260
|
+
const matches = input.matchAll(/'([^']*)'/g);
|
|
261
|
+
for (const match of matches) {
|
|
262
|
+
values.push(match[1]);
|
|
263
|
+
}
|
|
264
|
+
return values.length > 0 ? values : void 0;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Escape special regex characters in a string.
|
|
268
|
+
*/
|
|
269
|
+
escapeRegex(str) {
|
|
270
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Get the table from context by name.
|
|
274
|
+
*/
|
|
275
|
+
getTable(ctx, name) {
|
|
276
|
+
return ctx.tables.find((t) => t.name === name);
|
|
203
277
|
}
|
|
204
278
|
/**
|
|
205
279
|
* Execute the grounding process.
|
|
206
|
-
* Annotates columns in ctx.tables and ctx.views with
|
|
280
|
+
* Annotates columns in ctx.tables and ctx.views with values.
|
|
207
281
|
*/
|
|
208
282
|
async execute(ctx) {
|
|
209
283
|
const allContainers = [...ctx.tables, ...ctx.views];
|
|
210
284
|
for (const container of allContainers) {
|
|
285
|
+
const table = this.getTable(ctx, container.name);
|
|
211
286
|
for (const column of container.columns) {
|
|
212
287
|
try {
|
|
213
|
-
const
|
|
288
|
+
const result = await this.resolveColumnValues(
|
|
214
289
|
container.name,
|
|
215
|
-
column
|
|
290
|
+
column,
|
|
291
|
+
table?.constraints
|
|
216
292
|
);
|
|
217
|
-
if (
|
|
218
|
-
column.kind =
|
|
219
|
-
column.values =
|
|
293
|
+
if (result) {
|
|
294
|
+
column.kind = result.kind;
|
|
295
|
+
column.values = result.values;
|
|
220
296
|
}
|
|
221
297
|
} catch (error) {
|
|
222
298
|
console.warn(
|
|
223
|
-
"Error collecting
|
|
299
|
+
"Error collecting column values for",
|
|
224
300
|
container.name,
|
|
225
301
|
column.name,
|
|
226
302
|
error
|
|
@@ -230,6 +306,28 @@ var LowCardinalityGrounding = class extends AbstractGrounding {
|
|
|
230
306
|
}
|
|
231
307
|
return () => this.#describe();
|
|
232
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Resolve column values from all sources in priority order.
|
|
311
|
+
*/
|
|
312
|
+
async resolveColumnValues(tableName, column, constraints2) {
|
|
313
|
+
const enumValues = await this.collectEnumValues(tableName, column);
|
|
314
|
+
if (enumValues?.length) {
|
|
315
|
+
return { kind: "Enum", values: enumValues };
|
|
316
|
+
}
|
|
317
|
+
if (constraints2) {
|
|
318
|
+
for (const constraint of constraints2) {
|
|
319
|
+
const checkValues = this.parseCheckConstraint(constraint, column.name);
|
|
320
|
+
if (checkValues?.length) {
|
|
321
|
+
return { kind: "Enum", values: checkValues };
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const lowCardValues = await this.collectLowCardinality(tableName, column);
|
|
326
|
+
if (lowCardValues?.length) {
|
|
327
|
+
return { kind: "LowCardinality", values: lowCardValues };
|
|
328
|
+
}
|
|
329
|
+
return void 0;
|
|
330
|
+
}
|
|
233
331
|
#describe() {
|
|
234
332
|
return null;
|
|
235
333
|
}
|
|
@@ -478,18 +576,61 @@ var TableGrounding = class extends AbstractGrounding {
|
|
|
478
576
|
}
|
|
479
577
|
return tables2.map((table) => {
|
|
480
578
|
const rowCountInfo = table.rowCount != null ? ` [rows: ${table.rowCount}${table.sizeHint ? `, size: ${table.sizeHint}` : ""}]` : "";
|
|
481
|
-
const pkConstraint = table.constraints?.find(
|
|
579
|
+
const pkConstraint = table.constraints?.find(
|
|
580
|
+
(c) => c.type === "PRIMARY_KEY"
|
|
581
|
+
);
|
|
482
582
|
const pkColumns = new Set(pkConstraint?.columns ?? []);
|
|
583
|
+
const notNullColumns = new Set(
|
|
584
|
+
table.constraints?.filter((c) => c.type === "NOT_NULL").flatMap((c) => c.columns ?? []) ?? []
|
|
585
|
+
);
|
|
586
|
+
const defaultByColumn = /* @__PURE__ */ new Map();
|
|
587
|
+
for (const c of table.constraints?.filter(
|
|
588
|
+
(c2) => c2.type === "DEFAULT"
|
|
589
|
+
) ?? []) {
|
|
590
|
+
for (const col of c.columns ?? []) {
|
|
591
|
+
if (c.defaultValue != null) {
|
|
592
|
+
defaultByColumn.set(col, c.defaultValue);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
const uniqueColumns = new Set(
|
|
597
|
+
table.constraints?.filter((c) => c.type === "UNIQUE" && c.columns?.length === 1).flatMap((c) => c.columns ?? []) ?? []
|
|
598
|
+
);
|
|
599
|
+
const fkByColumn = /* @__PURE__ */ new Map();
|
|
600
|
+
for (const c of table.constraints?.filter(
|
|
601
|
+
(c2) => c2.type === "FOREIGN_KEY"
|
|
602
|
+
) ?? []) {
|
|
603
|
+
const cols = c.columns ?? [];
|
|
604
|
+
const refCols = c.referencedColumns ?? [];
|
|
605
|
+
for (let i = 0; i < cols.length; i++) {
|
|
606
|
+
const refCol = refCols[i] ?? refCols[0] ?? cols[i];
|
|
607
|
+
fkByColumn.set(cols[i], `${c.referencedTable}.${refCol}`);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
483
610
|
const columns = table.columns.map((column) => {
|
|
484
611
|
const annotations = [];
|
|
485
612
|
const isPrimaryKey = pkColumns.has(column.name);
|
|
486
613
|
if (isPrimaryKey) {
|
|
487
614
|
annotations.push("PK");
|
|
488
615
|
}
|
|
616
|
+
if (fkByColumn.has(column.name)) {
|
|
617
|
+
annotations.push(`FK -> ${fkByColumn.get(column.name)}`);
|
|
618
|
+
}
|
|
619
|
+
if (uniqueColumns.has(column.name)) {
|
|
620
|
+
annotations.push("UNIQUE");
|
|
621
|
+
}
|
|
622
|
+
if (notNullColumns.has(column.name)) {
|
|
623
|
+
annotations.push("NOT NULL");
|
|
624
|
+
}
|
|
625
|
+
if (defaultByColumn.has(column.name)) {
|
|
626
|
+
annotations.push(`DEFAULT: ${defaultByColumn.get(column.name)}`);
|
|
627
|
+
}
|
|
489
628
|
if (column.isIndexed && !isPrimaryKey) {
|
|
490
629
|
annotations.push("Indexed");
|
|
491
630
|
}
|
|
492
|
-
if (column.kind === "
|
|
631
|
+
if (column.kind === "Enum" && column.values?.length) {
|
|
632
|
+
annotations.push(`Enum: ${column.values.join(", ")}`);
|
|
633
|
+
} else if (column.kind === "LowCardinality" && column.values?.length) {
|
|
493
634
|
annotations.push(`LowCardinality: ${column.values.join(", ")}`);
|
|
494
635
|
}
|
|
495
636
|
if (column.stats) {
|
|
@@ -524,9 +665,19 @@ ${table.indexes.map((index) => {
|
|
|
524
665
|
const columnsText = index.columns?.length ? index.columns.join(", ") : "expression";
|
|
525
666
|
return ` - ${index.name}${propsText}: ${columnsText}`;
|
|
526
667
|
}).join("\n")}` : "";
|
|
668
|
+
const multiColumnUniques = table.constraints?.filter(
|
|
669
|
+
(c) => c.type === "UNIQUE" && (c.columns?.length ?? 0) > 1
|
|
670
|
+
) ?? [];
|
|
671
|
+
const uniqueConstraints = multiColumnUniques.length ? `
|
|
672
|
+
Unique Constraints:
|
|
673
|
+
${multiColumnUniques.map((c) => ` - ${c.name}: (${c.columns?.join(", ")})`).join("\n")}` : "";
|
|
674
|
+
const checkConstraints = table.constraints?.filter((c) => c.type === "CHECK") ?? [];
|
|
675
|
+
const checks = checkConstraints.length ? `
|
|
676
|
+
Check Constraints:
|
|
677
|
+
${checkConstraints.map((c) => ` - ${c.name}: ${c.definition}`).join("\n")}` : "";
|
|
527
678
|
return `- Table: ${table.name}${rowCountInfo}
|
|
528
679
|
Columns:
|
|
529
|
-
${columns}${indexes2}`;
|
|
680
|
+
${columns}${indexes2}${uniqueConstraints}${checks}`;
|
|
530
681
|
}).join("\n\n");
|
|
531
682
|
}
|
|
532
683
|
#formatTableLabel = (tableName) => {
|
|
@@ -847,9 +998,8 @@ var SqlServerInfoGrounding = class extends InfoGrounding {
|
|
|
847
998
|
}
|
|
848
999
|
};
|
|
849
1000
|
|
|
850
|
-
// packages/text2sql/src/lib/adapters/sqlserver/
|
|
851
|
-
var
|
|
852
|
-
var SqlServerLowCardinalityGrounding = class extends LowCardinalityGrounding {
|
|
1001
|
+
// packages/text2sql/src/lib/adapters/sqlserver/column-values.sqlserver.grounding.ts
|
|
1002
|
+
var SqlServerColumnValuesGrounding = class extends ColumnValuesGrounding {
|
|
853
1003
|
#adapter;
|
|
854
1004
|
constructor(adapter, config = {}) {
|
|
855
1005
|
super(config);
|
|
@@ -859,14 +1009,14 @@ var SqlServerLowCardinalityGrounding = class extends LowCardinalityGrounding {
|
|
|
859
1009
|
const { schema, table } = this.#adapter.parseTableName(tableName);
|
|
860
1010
|
const tableIdentifier = `[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table)}]`;
|
|
861
1011
|
const columnIdentifier = `[${this.#adapter.escape(column.name)}]`;
|
|
862
|
-
const limit =
|
|
1012
|
+
const limit = this.lowCardinalityLimit + 1;
|
|
863
1013
|
const sql = `
|
|
864
1014
|
SELECT DISTINCT TOP ${limit} CAST(${columnIdentifier} AS NVARCHAR(MAX)) AS value
|
|
865
1015
|
FROM ${tableIdentifier}
|
|
866
1016
|
WHERE ${columnIdentifier} IS NOT NULL
|
|
867
1017
|
`;
|
|
868
1018
|
const rows = await this.#adapter.runQuery(sql);
|
|
869
|
-
if (!rows.length || rows.length >
|
|
1019
|
+
if (!rows.length || rows.length > this.lowCardinalityLimit) {
|
|
870
1020
|
return void 0;
|
|
871
1021
|
}
|
|
872
1022
|
const values = [];
|
|
@@ -876,10 +1026,7 @@ var SqlServerLowCardinalityGrounding = class extends LowCardinalityGrounding {
|
|
|
876
1026
|
}
|
|
877
1027
|
values.push(row.value);
|
|
878
1028
|
}
|
|
879
|
-
|
|
880
|
-
return void 0;
|
|
881
|
-
}
|
|
882
|
-
return { kind: "LowCardinality", values };
|
|
1029
|
+
return values.length ? values : void 0;
|
|
883
1030
|
}
|
|
884
1031
|
};
|
|
885
1032
|
|
|
@@ -923,7 +1070,7 @@ var SQL_SERVER_ERROR_MAP = {
|
|
|
923
1070
|
hint: "The query violates a constraint. Re-check join logic and filtering."
|
|
924
1071
|
}
|
|
925
1072
|
};
|
|
926
|
-
var
|
|
1073
|
+
var LOW_CARDINALITY_LIMIT = 20;
|
|
927
1074
|
function getErrorCode(error) {
|
|
928
1075
|
if (typeof error === "object" && error !== null && "number" in error && typeof error.number === "number") {
|
|
929
1076
|
return String(error.number);
|
|
@@ -992,6 +1139,12 @@ var SqlServer = class extends Adapter {
|
|
|
992
1139
|
escape(value) {
|
|
993
1140
|
return value.replace(/]/g, "]]");
|
|
994
1141
|
}
|
|
1142
|
+
buildSampleRowsQuery(tableName, columns, limit) {
|
|
1143
|
+
const { schema, table } = this.parseTableName(tableName);
|
|
1144
|
+
const tableIdentifier = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(table)}`;
|
|
1145
|
+
const columnList = columns?.length ? columns.map((c) => this.quoteIdentifier(c)).join(", ") : "*";
|
|
1146
|
+
return `SELECT TOP ${limit} ${columnList} FROM ${tableIdentifier}`;
|
|
1147
|
+
}
|
|
995
1148
|
async #loadTables() {
|
|
996
1149
|
const rows = await this.#runIntrospectionQuery(`
|
|
997
1150
|
SELECT
|
|
@@ -1227,7 +1380,7 @@ var SqlServer = class extends Adapter {
|
|
|
1227
1380
|
});
|
|
1228
1381
|
for (const column of table.columns) {
|
|
1229
1382
|
const columnIdentifier = this.#quoteIdentifier(column.name);
|
|
1230
|
-
const limit =
|
|
1383
|
+
const limit = LOW_CARDINALITY_LIMIT + 1;
|
|
1231
1384
|
const sql = `
|
|
1232
1385
|
SELECT DISTINCT TOP (${limit}) ${columnIdentifier} AS value
|
|
1233
1386
|
FROM ${tableIdentifier}
|
|
@@ -1239,7 +1392,7 @@ var SqlServer = class extends Adapter {
|
|
|
1239
1392
|
} catch {
|
|
1240
1393
|
continue;
|
|
1241
1394
|
}
|
|
1242
|
-
if (!rows.length || rows.length >
|
|
1395
|
+
if (!rows.length || rows.length > LOW_CARDINALITY_LIMIT) {
|
|
1243
1396
|
continue;
|
|
1244
1397
|
}
|
|
1245
1398
|
const values = [];
|
|
@@ -1641,9 +1794,9 @@ function columnStats(config = {}) {
|
|
|
1641
1794
|
return new SqlServerColumnStatsGrounding(adapter, config);
|
|
1642
1795
|
};
|
|
1643
1796
|
}
|
|
1644
|
-
function
|
|
1797
|
+
function columnValues(config = {}) {
|
|
1645
1798
|
return (adapter) => {
|
|
1646
|
-
return new
|
|
1799
|
+
return new SqlServerColumnValuesGrounding(adapter, config);
|
|
1647
1800
|
};
|
|
1648
1801
|
}
|
|
1649
1802
|
function indexes(config = {}) {
|
|
@@ -1669,7 +1822,7 @@ var sqlserver_default = {
|
|
|
1669
1822
|
info,
|
|
1670
1823
|
views,
|
|
1671
1824
|
columnStats,
|
|
1672
|
-
|
|
1825
|
+
columnValues,
|
|
1673
1826
|
indexes,
|
|
1674
1827
|
rowCount,
|
|
1675
1828
|
constraints,
|
|
@@ -1679,12 +1832,12 @@ var sqlserver_default = {
|
|
|
1679
1832
|
export {
|
|
1680
1833
|
SqlServer,
|
|
1681
1834
|
columnStats,
|
|
1835
|
+
columnValues,
|
|
1682
1836
|
constraints,
|
|
1683
1837
|
sqlserver_default as default,
|
|
1684
1838
|
formatSqlServerError,
|
|
1685
1839
|
indexes,
|
|
1686
1840
|
info,
|
|
1687
|
-
lowCardinality,
|
|
1688
1841
|
report,
|
|
1689
1842
|
rowCount,
|
|
1690
1843
|
tables,
|