@deepagents/text2sql 7.0.2 → 7.1.1
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 +63 -75
- package/dist/bin/sql.js +82 -599
- package/dist/eval/src/evals/models.d.ts +12 -0
- package/dist/eval/src/evals/models.d.ts.map +1 -0
- package/dist/eval/src/evals/sql-create-context/sql-create-context.eval.d.ts +2 -0
- package/dist/eval/src/evals/sql-create-context/sql-create-context.eval.d.ts.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +920 -706
- package/dist/index.js.map +4 -4
- package/dist/lib/adapter-index.d.ts +0 -2
- package/dist/lib/adapter-index.d.ts.map +1 -1
- package/dist/lib/adapters/adapter.d.ts +23 -1
- package/dist/lib/adapters/adapter.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts +0 -11
- package/dist/lib/adapters/bigquery/bigquery-fk.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts +22 -0
- package/dist/lib/adapters/bigquery/bigquery-rows.d.ts.map +1 -0
- package/dist/lib/adapters/bigquery/bigquery.d.ts +1 -1
- package/dist/lib/adapters/bigquery/bigquery.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/constraint.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.d.ts +6 -13
- package/dist/lib/adapters/bigquery/index.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/index.js +244 -51
- package/dist/lib/adapters/bigquery/index.js.map +4 -4
- package/dist/lib/adapters/bigquery/indexes.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/row-count.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/table.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/bigquery/view.bigquery.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts +7 -0
- package/dist/lib/adapters/clickhouse/clickhouse-rows.d.ts.map +1 -0
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts +1 -1
- package/dist/lib/adapters/clickhouse/clickhouse.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/constraint.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/index.js +133 -44
- package/dist/lib/adapters/clickhouse/index.js.map +4 -4
- package/dist/lib/adapters/clickhouse/indexes.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/info.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/row-count.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/table.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/clickhouse/view.clickhouse.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts +1 -1
- package/dist/lib/adapters/duckdb/duckdb.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/duckdb.groundings.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.d.ts +8 -10
- package/dist/lib/adapters/duckdb/index.d.ts.map +1 -1
- package/dist/lib/adapters/duckdb/index.js +1549 -1412
- package/dist/lib/adapters/duckdb/index.js.map +4 -4
- package/dist/lib/adapters/groundings/index.js.map +1 -1
- package/dist/lib/adapters/groundings/rows.d.ts +32 -0
- package/dist/lib/adapters/groundings/rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/column-stats.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/column-values.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/constraint.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.d.ts +2 -4
- package/dist/lib/adapters/mysql/index.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/index.js +230 -76
- package/dist/lib/adapters/mysql/index.js.map +4 -4
- package/dist/lib/adapters/mysql/indexes.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/info.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/mysql-rows.d.ts +11 -0
- package/dist/lib/adapters/mysql/mysql-rows.d.ts.map +1 -0
- package/dist/lib/adapters/mysql/mysql.d.ts +1 -1
- package/dist/lib/adapters/mysql/mysql.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/row-count.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts +3 -2
- package/dist/lib/adapters/mysql/table.mysql.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/mysql/view.mysql.grounding.d.ts +2 -2
- package/dist/lib/adapters/mysql/view.mysql.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.map +1 -1
- package/dist/lib/adapters/postgres/constraint.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.d.ts +2 -4
- package/dist/lib/adapters/postgres/index.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/index.js +266 -487
- package/dist/lib/adapters/postgres/index.js.map +4 -4
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts +1 -5
- package/dist/lib/adapters/postgres/indexes.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/info.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/postgres-rows.d.ts +7 -0
- package/dist/lib/adapters/postgres/postgres-rows.d.ts.map +1 -0
- package/dist/lib/adapters/postgres/postgres.d.ts +6 -1
- package/dist/lib/adapters/postgres/postgres.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/row-count.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts +5 -4
- package/dist/lib/adapters/postgres/table.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts +3 -3
- package/dist/lib/adapters/postgres/view.postgres.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/definitions.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.d.ts +4 -5
- package/dist/lib/adapters/posthog/index.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/index.js +349 -287
- package/dist/lib/adapters/posthog/index.js.map +4 -4
- package/dist/lib/adapters/posthog/posthog.d.ts +2 -2
- package/dist/lib/adapters/posthog/posthog.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/posthog.sql-policy.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/schema.posthog.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/transport.d.ts.map +1 -1
- package/dist/lib/adapters/posthog/types.d.ts +16 -6
- package/dist/lib/adapters/posthog/types.d.ts.map +1 -1
- package/dist/lib/adapters/spreadsheet/index.js +117 -38
- package/dist/lib/adapters/spreadsheet/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/column-stats.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/column-values.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/constraint.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/index.js +136 -52
- package/dist/lib/adapters/sqlite/index.js.map +4 -4
- package/dist/lib/adapters/sqlite/indexes.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/info.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/row-count.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts +41 -0
- package/dist/lib/adapters/sqlite/sqlite-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlite/sqlite.d.ts +1 -1
- package/dist/lib/adapters/sqlite/sqlite.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/table.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlite/view.sqlite.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-stats.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/column-values.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/constraint.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.d.ts +2 -4
- package/dist/lib/adapters/sqlserver/index.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/index.js +255 -503
- package/dist/lib/adapters/sqlserver/index.js.map +4 -4
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts +1 -5
- package/dist/lib/adapters/sqlserver/indexes.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/info.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/row-count.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts +7 -0
- package/dist/lib/adapters/sqlserver/sqlserver-rows.d.ts.map +1 -0
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts +6 -1
- package/dist/lib/adapters/sqlserver/sqlserver.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts +5 -4
- package/dist/lib/adapters/sqlserver/table.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts +3 -3
- package/dist/lib/adapters/sqlserver/view.sqlserver.grounding.d.ts.map +1 -1
- package/dist/lib/agents/question.agent.d.ts.map +1 -1
- package/dist/lib/agents/sql-transform-plugins.d.ts.map +1 -1
- package/dist/lib/agents/suggestions.agents.d.ts.map +1 -1
- package/dist/lib/checkpoint.d.ts +34 -21
- package/dist/lib/checkpoint.d.ts.map +1 -1
- package/dist/lib/file-cache.d.ts +6 -1
- package/dist/lib/file-cache.d.ts.map +1 -1
- package/dist/lib/fs/columns.d.ts +14 -0
- package/dist/lib/fs/columns.d.ts.map +1 -0
- package/dist/lib/fs/mssql/mssql-fs.d.ts +4 -4
- package/dist/lib/fs/mssql/mssql-fs.d.ts.map +1 -1
- package/dist/lib/fs/postgres/postgres-fs.d.ts +4 -4
- package/dist/lib/fs/postgres/postgres-fs.d.ts.map +1 -1
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts +4 -4
- package/dist/lib/fs/sqlite/sqlite-fs.d.ts.map +1 -1
- package/dist/lib/index-cache.d.ts +6 -6
- package/dist/lib/index-cache.d.ts.map +1 -1
- package/dist/lib/sql-command.d.ts +1 -4
- package/dist/lib/sql-command.d.ts.map +1 -1
- package/dist/lib/sql.d.ts +0 -5
- package/dist/lib/sql.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts +1 -2
- package/dist/lib/synthesis/decorators/deduplicated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts +0 -2
- package/dist/lib/synthesis/decorators/filtered-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/decorators/validated-producer.d.ts +1 -3
- package/dist/lib/synthesis/decorators/validated-producer.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/base-contextual-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/message-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/segmented-context-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/sql-extractor.d.ts.map +1 -1
- package/dist/lib/synthesis/extractors/tool-input.d.ts +6 -0
- package/dist/lib/synthesis/extractors/tool-input.d.ts.map +1 -0
- package/dist/lib/synthesis/index.js +124 -114
- package/dist/lib/synthesis/index.js.map +4 -4
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/breadth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts +0 -3
- package/dist/lib/synthesis/synthesizers/depth-evolver.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/persona-generator.d.ts.map +1 -1
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts +0 -2
- package/dist/lib/synthesis/synthesizers/schema-synthesizer.d.ts.map +1 -1
- package/dist/scripts/scripts/bigquery-test.d.ts +2 -0
- package/dist/scripts/scripts/bigquery-test.d.ts.map +1 -0
- package/package.json +4 -6
- package/dist/lib/index-lock.d.ts +0 -60
- package/dist/lib/index-lock.d.ts.map +0 -1
- package/dist/lib/prompt.d.ts +0 -2
- package/dist/lib/prompt.d.ts.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// packages/text2sql/src/lib/adapters/adapter.ts
|
|
2
2
|
import { format as formatSql } from "sql-formatter";
|
|
3
|
+
import { z } from "zod";
|
|
3
4
|
|
|
4
5
|
// packages/text2sql/src/lib/agents/exceptions.ts
|
|
5
6
|
var sqlValidationMarker = /* @__PURE__ */ Symbol("SQLValidationError");
|
|
@@ -172,6 +173,16 @@ function createGroundingContext(options = {}) {
|
|
|
172
173
|
}
|
|
173
174
|
|
|
174
175
|
// packages/text2sql/src/lib/adapters/adapter.ts
|
|
176
|
+
function groundingFor(adapterType, create) {
|
|
177
|
+
return (adapter) => {
|
|
178
|
+
if (!(adapter instanceof adapterType)) {
|
|
179
|
+
throw new Error(
|
|
180
|
+
`A ${adapterType.name} grounding needs a ${adapterType.name} adapter, not ${adapter.constructor.name}.`
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
return create(adapter);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
175
186
|
var Adapter = class {
|
|
176
187
|
#policyAnalyzer;
|
|
177
188
|
/**
|
|
@@ -432,6 +443,40 @@ var Adapter = class {
|
|
|
432
443
|
}
|
|
433
444
|
return decoded;
|
|
434
445
|
}
|
|
446
|
+
/**
|
|
447
|
+
* Run an introspection query and check every row against `row`, the shape
|
|
448
|
+
* the driver returns for that query. A row of any other shape throws.
|
|
449
|
+
*/
|
|
450
|
+
async runQuery(sql, row) {
|
|
451
|
+
const rows = z.array(row).safeParse(await this.queryRows(sql));
|
|
452
|
+
if (!rows.success) {
|
|
453
|
+
throw new Error(
|
|
454
|
+
`${this.constructor.name} introspection query returned rows of an unexpected shape:
|
|
455
|
+
${z.prettifyError(rows.error)}
|
|
456
|
+
SQL: ${sql.trim()}`,
|
|
457
|
+
{ cause: rows.error }
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
return rows.data;
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* The rows in a driver's execute() result: the result itself when it is an
|
|
464
|
+
* array, otherwise the first array found at one of `paths` (dot-separated,
|
|
465
|
+
* so `recordsets.0` reads `result.recordsets[0]`).
|
|
466
|
+
*/
|
|
467
|
+
rowsFrom(result, paths) {
|
|
468
|
+
if (Array.isArray(result)) return result;
|
|
469
|
+
for (const path of paths) {
|
|
470
|
+
const rows = path.split(".").reduce(
|
|
471
|
+
(value, key) => typeof value === "object" && value !== null ? Reflect.get(value, key) : void 0,
|
|
472
|
+
result
|
|
473
|
+
);
|
|
474
|
+
if (Array.isArray(rows)) return rows;
|
|
475
|
+
}
|
|
476
|
+
throw new Error(
|
|
477
|
+
`${this.constructor.name} execute() must return an array of rows or an object holding one at ${paths.map((path) => `result.${path}`).join(", ")}.`
|
|
478
|
+
);
|
|
479
|
+
}
|
|
435
480
|
/**
|
|
436
481
|
* Convert unknown database value to number.
|
|
437
482
|
* Handles number, bigint, and string types.
|
|
@@ -992,6 +1037,32 @@ var TableGrounding = class extends AbstractGrounding {
|
|
|
992
1037
|
};
|
|
993
1038
|
|
|
994
1039
|
// packages/text2sql/src/lib/adapters/sqlserver/column-stats.sqlserver.grounding.ts
|
|
1040
|
+
import { z as z3 } from "zod";
|
|
1041
|
+
|
|
1042
|
+
// packages/text2sql/src/lib/adapters/groundings/rows.ts
|
|
1043
|
+
import { z as z2 } from "zod";
|
|
1044
|
+
var nameRow = z2.object({ name: z2.string() });
|
|
1045
|
+
var versionRow = z2.object({ version: z2.string() });
|
|
1046
|
+
var databaseRow = z2.object({ db: z2.string() });
|
|
1047
|
+
var viewDefinitionRow = z2.object({
|
|
1048
|
+
definition: z2.string().nullable()
|
|
1049
|
+
});
|
|
1050
|
+
var distinctValueRow = z2.object({ value: z2.unknown() });
|
|
1051
|
+
var textValueRow = z2.object({ value: z2.string() });
|
|
1052
|
+
var numericValue = z2.union([z2.number(), z2.bigint(), z2.string()]);
|
|
1053
|
+
|
|
1054
|
+
// packages/text2sql/src/lib/adapters/sqlserver/column-stats.sqlserver.grounding.ts
|
|
1055
|
+
var nDistinctRow = z3.object({
|
|
1056
|
+
schema_name: z3.string().nullable(),
|
|
1057
|
+
table_name: z3.string().nullable(),
|
|
1058
|
+
column_name: z3.string().nullable(),
|
|
1059
|
+
approx_n_distinct: numericValue
|
|
1060
|
+
});
|
|
1061
|
+
var statsRow = z3.object({
|
|
1062
|
+
min_value: z3.string().nullable(),
|
|
1063
|
+
max_value: z3.string().nullable(),
|
|
1064
|
+
null_fraction: numericValue.nullable()
|
|
1065
|
+
});
|
|
995
1066
|
var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
|
|
996
1067
|
#adapter;
|
|
997
1068
|
#nDistinctCache = /* @__PURE__ */ new Map();
|
|
@@ -1010,7 +1081,8 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
|
|
|
1010
1081
|
return `OBJECT_ID('[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]')`;
|
|
1011
1082
|
});
|
|
1012
1083
|
try {
|
|
1013
|
-
const rows = await this.#adapter.runQuery(
|
|
1084
|
+
const rows = await this.#adapter.runQuery(
|
|
1085
|
+
`
|
|
1014
1086
|
SELECT
|
|
1015
1087
|
OBJECT_SCHEMA_NAME(s.object_id) AS schema_name,
|
|
1016
1088
|
OBJECT_NAME(s.object_id) AS table_name,
|
|
@@ -1026,8 +1098,12 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
|
|
|
1026
1098
|
WHERE sc.stats_column_id = 1
|
|
1027
1099
|
AND sp.rows > 0
|
|
1028
1100
|
AND s.object_id IN (${objectIds.join(", ")})
|
|
1029
|
-
|
|
1101
|
+
`,
|
|
1102
|
+
nDistinctRow
|
|
1103
|
+
);
|
|
1030
1104
|
for (const row of rows) {
|
|
1105
|
+
const nDistinct = this.#adapter.toNumber(row.approx_n_distinct);
|
|
1106
|
+
if (row.column_name === null || nDistinct === void 0) continue;
|
|
1031
1107
|
const tableName = ctx.tables.find((t) => {
|
|
1032
1108
|
const { schema, table: table2 } = this.#adapter.parseTableName(t.name);
|
|
1033
1109
|
return schema === row.schema_name && table2 === row.table_name;
|
|
@@ -1038,7 +1114,7 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
|
|
|
1038
1114
|
map = /* @__PURE__ */ new Map();
|
|
1039
1115
|
this.#nDistinctCache.set(tableName, map);
|
|
1040
1116
|
}
|
|
1041
|
-
map.set(row.column_name,
|
|
1117
|
+
map.set(row.column_name, nDistinct);
|
|
1042
1118
|
}
|
|
1043
1119
|
} catch {
|
|
1044
1120
|
}
|
|
@@ -1061,7 +1137,7 @@ var SqlServerColumnStatsGrounding = class extends ColumnStatsGrounding {
|
|
|
1061
1137
|
AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction
|
|
1062
1138
|
FROM ${tableIdentifier}
|
|
1063
1139
|
`;
|
|
1064
|
-
const rows = await this.#adapter.runQuery(sql);
|
|
1140
|
+
const rows = await this.#adapter.runQuery(sql, statsRow);
|
|
1065
1141
|
if (!rows.length) {
|
|
1066
1142
|
if (cachedNDistinct != null) {
|
|
1067
1143
|
return { nDistinct: cachedNDistinct };
|
|
@@ -1128,22 +1204,36 @@ var SqlServerColumnValuesGrounding = class extends ColumnValuesGrounding {
|
|
|
1128
1204
|
FROM ${tableIdentifier}
|
|
1129
1205
|
WHERE ${columnIdentifier} IS NOT NULL
|
|
1130
1206
|
`;
|
|
1131
|
-
const rows = await this.#adapter.runQuery(sql);
|
|
1207
|
+
const rows = await this.#adapter.runQuery(sql, textValueRow);
|
|
1132
1208
|
if (!rows.length || rows.length > this.lowCardinalityLimit) {
|
|
1133
1209
|
return void 0;
|
|
1134
1210
|
}
|
|
1135
|
-
|
|
1136
|
-
for (const row of rows) {
|
|
1137
|
-
if (row.value == null) {
|
|
1138
|
-
return void 0;
|
|
1139
|
-
}
|
|
1140
|
-
values.push(row.value);
|
|
1141
|
-
}
|
|
1142
|
-
return values.length ? values : void 0;
|
|
1211
|
+
return rows.map((row) => row.value);
|
|
1143
1212
|
}
|
|
1144
1213
|
};
|
|
1145
1214
|
|
|
1146
1215
|
// packages/text2sql/src/lib/adapters/sqlserver/constraint.sqlserver.grounding.ts
|
|
1216
|
+
import { z as z4 } from "zod";
|
|
1217
|
+
var keyColumnRow = z4.object({
|
|
1218
|
+
constraint_name: z4.string(),
|
|
1219
|
+
column_name: z4.string()
|
|
1220
|
+
});
|
|
1221
|
+
var foreignKeyRow = z4.object({
|
|
1222
|
+
constraint_name: z4.string(),
|
|
1223
|
+
column_name: z4.string(),
|
|
1224
|
+
ref_schema: z4.string(),
|
|
1225
|
+
ref_table: z4.string(),
|
|
1226
|
+
ref_column: z4.string()
|
|
1227
|
+
});
|
|
1228
|
+
var checkConstraintRow = z4.object({
|
|
1229
|
+
constraint_name: z4.string(),
|
|
1230
|
+
definition: z4.string().nullable()
|
|
1231
|
+
});
|
|
1232
|
+
var columnDefaultRow = z4.object({
|
|
1233
|
+
column_name: z4.string(),
|
|
1234
|
+
default_definition: z4.string().nullable(),
|
|
1235
|
+
is_nullable: z4.boolean()
|
|
1236
|
+
});
|
|
1147
1237
|
var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
1148
1238
|
#adapter;
|
|
1149
1239
|
constructor(adapter, config = {}) {
|
|
@@ -1153,7 +1243,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1153
1243
|
async getConstraints(tableName) {
|
|
1154
1244
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
1155
1245
|
const constraints2 = [];
|
|
1156
|
-
const pkRows = await this.#adapter.runQuery(
|
|
1246
|
+
const pkRows = await this.#adapter.runQuery(
|
|
1247
|
+
`
|
|
1157
1248
|
SELECT
|
|
1158
1249
|
kc.name AS constraint_name,
|
|
1159
1250
|
COL_NAME(ic.object_id, ic.column_id) AS column_name
|
|
@@ -1165,7 +1256,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1165
1256
|
AND t.name = '${this.#adapter.escapeString(table2)}'
|
|
1166
1257
|
AND kc.type = 'PK'
|
|
1167
1258
|
ORDER BY ic.key_ordinal
|
|
1168
|
-
|
|
1259
|
+
`,
|
|
1260
|
+
keyColumnRow
|
|
1261
|
+
);
|
|
1169
1262
|
if (pkRows.length > 0) {
|
|
1170
1263
|
constraints2.push({
|
|
1171
1264
|
name: pkRows[0].constraint_name,
|
|
@@ -1173,7 +1266,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1173
1266
|
columns: pkRows.map((r) => r.column_name)
|
|
1174
1267
|
});
|
|
1175
1268
|
}
|
|
1176
|
-
const fkRows = await this.#adapter.runQuery(
|
|
1269
|
+
const fkRows = await this.#adapter.runQuery(
|
|
1270
|
+
`
|
|
1177
1271
|
SELECT
|
|
1178
1272
|
fk.name AS constraint_name,
|
|
1179
1273
|
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name,
|
|
@@ -1189,7 +1283,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1189
1283
|
WHERE s.name = '${this.#adapter.escapeString(schema)}'
|
|
1190
1284
|
AND t.name = '${this.#adapter.escapeString(table2)}'
|
|
1191
1285
|
ORDER BY fk.name, fkc.constraint_column_id
|
|
1192
|
-
|
|
1286
|
+
`,
|
|
1287
|
+
foreignKeyRow
|
|
1288
|
+
);
|
|
1193
1289
|
const fkMap = /* @__PURE__ */ new Map();
|
|
1194
1290
|
for (const row of fkRows) {
|
|
1195
1291
|
const existing = fkMap.get(row.constraint_name);
|
|
@@ -1214,7 +1310,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1214
1310
|
referencedColumns: data.refColumns
|
|
1215
1311
|
});
|
|
1216
1312
|
}
|
|
1217
|
-
const checkRows = await this.#adapter.runQuery(
|
|
1313
|
+
const checkRows = await this.#adapter.runQuery(
|
|
1314
|
+
`
|
|
1218
1315
|
SELECT
|
|
1219
1316
|
cc.name AS constraint_name,
|
|
1220
1317
|
cc.definition
|
|
@@ -1223,7 +1320,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1223
1320
|
JOIN sys.schemas s ON t.schema_id = s.schema_id
|
|
1224
1321
|
WHERE s.name = '${this.#adapter.escapeString(schema)}'
|
|
1225
1322
|
AND t.name = '${this.#adapter.escapeString(table2)}'
|
|
1226
|
-
|
|
1323
|
+
`,
|
|
1324
|
+
checkConstraintRow
|
|
1325
|
+
);
|
|
1227
1326
|
for (const row of checkRows) {
|
|
1228
1327
|
constraints2.push({
|
|
1229
1328
|
name: row.constraint_name,
|
|
@@ -1231,7 +1330,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1231
1330
|
definition: row.definition?.replace(/^\(/, "").replace(/\)$/, "")
|
|
1232
1331
|
});
|
|
1233
1332
|
}
|
|
1234
|
-
const uniqueRows = await this.#adapter.runQuery(
|
|
1333
|
+
const uniqueRows = await this.#adapter.runQuery(
|
|
1334
|
+
`
|
|
1235
1335
|
SELECT
|
|
1236
1336
|
i.name AS constraint_name,
|
|
1237
1337
|
COL_NAME(ic.object_id, ic.column_id) AS column_name
|
|
@@ -1243,7 +1343,9 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1243
1343
|
AND t.name = '${this.#adapter.escapeString(table2)}'
|
|
1244
1344
|
AND i.is_unique_constraint = 1
|
|
1245
1345
|
ORDER BY i.name, ic.key_ordinal
|
|
1246
|
-
|
|
1346
|
+
`,
|
|
1347
|
+
keyColumnRow
|
|
1348
|
+
);
|
|
1247
1349
|
const uniqueMap = /* @__PURE__ */ new Map();
|
|
1248
1350
|
for (const row of uniqueRows) {
|
|
1249
1351
|
const existing = uniqueMap.get(row.constraint_name);
|
|
@@ -1260,7 +1362,8 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1260
1362
|
columns
|
|
1261
1363
|
});
|
|
1262
1364
|
}
|
|
1263
|
-
const columnRows = await this.#adapter.runQuery(
|
|
1365
|
+
const columnRows = await this.#adapter.runQuery(
|
|
1366
|
+
`
|
|
1264
1367
|
SELECT
|
|
1265
1368
|
c.name AS column_name,
|
|
1266
1369
|
dc.definition AS default_definition,
|
|
@@ -1271,11 +1374,13 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1271
1374
|
LEFT JOIN sys.default_constraints dc ON c.default_object_id = dc.object_id
|
|
1272
1375
|
WHERE s.name = '${this.#adapter.escapeString(schema)}'
|
|
1273
1376
|
AND t.name = '${this.#adapter.escapeString(table2)}'
|
|
1274
|
-
|
|
1377
|
+
`,
|
|
1378
|
+
columnDefaultRow
|
|
1379
|
+
);
|
|
1275
1380
|
const pkConstraint = constraints2.find((c) => c.type === "PRIMARY_KEY");
|
|
1276
1381
|
const pkColumns = new Set(pkConstraint?.columns ?? []);
|
|
1277
1382
|
for (const col of columnRows) {
|
|
1278
|
-
if (col.is_nullable
|
|
1383
|
+
if (!col.is_nullable && !pkColumns.has(col.column_name)) {
|
|
1279
1384
|
constraints2.push({
|
|
1280
1385
|
name: `${table2}_${col.column_name}_notnull`,
|
|
1281
1386
|
type: "NOT_NULL",
|
|
@@ -1296,17 +1401,24 @@ var SqlServerConstraintGrounding = class extends ConstraintGrounding {
|
|
|
1296
1401
|
};
|
|
1297
1402
|
|
|
1298
1403
|
// packages/text2sql/src/lib/adapters/sqlserver/indexes.sqlserver.grounding.ts
|
|
1404
|
+
import { z as z5 } from "zod";
|
|
1405
|
+
var indexRow = z5.object({
|
|
1406
|
+
index_name: z5.string(),
|
|
1407
|
+
column_name: z5.string(),
|
|
1408
|
+
is_unique: z5.boolean(),
|
|
1409
|
+
index_type: z5.string(),
|
|
1410
|
+
key_ordinal: z5.number()
|
|
1411
|
+
});
|
|
1299
1412
|
var SqlServerIndexesGrounding = class extends IndexesGrounding {
|
|
1300
1413
|
#adapter;
|
|
1301
|
-
#schemas;
|
|
1302
1414
|
constructor(adapter, config = {}) {
|
|
1303
1415
|
super(config);
|
|
1304
1416
|
this.#adapter = adapter;
|
|
1305
|
-
this.#schemas = config.schemas;
|
|
1306
1417
|
}
|
|
1307
1418
|
async getIndexes(tableName) {
|
|
1308
1419
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
1309
|
-
const rows = await this.#adapter.runQuery(
|
|
1420
|
+
const rows = await this.#adapter.runQuery(
|
|
1421
|
+
`
|
|
1310
1422
|
SELECT
|
|
1311
1423
|
i.name AS index_name,
|
|
1312
1424
|
COL_NAME(ic.object_id, ic.column_id) AS column_name,
|
|
@@ -1326,7 +1438,9 @@ var SqlServerIndexesGrounding = class extends IndexesGrounding {
|
|
|
1326
1438
|
AND i.name IS NOT NULL
|
|
1327
1439
|
AND ic.is_included_column = 0
|
|
1328
1440
|
ORDER BY i.name, ic.key_ordinal
|
|
1329
|
-
|
|
1441
|
+
`,
|
|
1442
|
+
indexRow
|
|
1443
|
+
);
|
|
1330
1444
|
return this.#groupIndexes(rows);
|
|
1331
1445
|
}
|
|
1332
1446
|
#groupIndexes(rows) {
|
|
@@ -1358,10 +1472,8 @@ var SqlServerInfoGrounding = class extends InfoGrounding {
|
|
|
1358
1472
|
}
|
|
1359
1473
|
async collectInfo() {
|
|
1360
1474
|
const [versionRows, dbRows] = await Promise.all([
|
|
1361
|
-
this.#adapter.runQuery(
|
|
1362
|
-
|
|
1363
|
-
),
|
|
1364
|
-
this.#adapter.runQuery("SELECT DB_NAME() AS db")
|
|
1475
|
+
this.#adapter.runQuery("SELECT @@VERSION AS version", versionRow),
|
|
1476
|
+
this.#adapter.runQuery("SELECT DB_NAME() AS db", databaseRow)
|
|
1365
1477
|
]);
|
|
1366
1478
|
return {
|
|
1367
1479
|
dialect: "sqlserver",
|
|
@@ -1376,6 +1488,8 @@ var SqlServerInfoGrounding = class extends InfoGrounding {
|
|
|
1376
1488
|
};
|
|
1377
1489
|
|
|
1378
1490
|
// packages/text2sql/src/lib/adapters/sqlserver/row-count.sqlserver.grounding.ts
|
|
1491
|
+
import { z as z6 } from "zod";
|
|
1492
|
+
var countRow = z6.object({ count: numericValue });
|
|
1379
1493
|
var SqlServerRowCountGrounding = class extends RowCountGrounding {
|
|
1380
1494
|
#adapter;
|
|
1381
1495
|
constructor(adapter, config = {}) {
|
|
@@ -1386,7 +1500,8 @@ var SqlServerRowCountGrounding = class extends RowCountGrounding {
|
|
|
1386
1500
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
1387
1501
|
const tableIdentifier = `[${this.#adapter.escape(schema)}].[${this.#adapter.escape(table2)}]`;
|
|
1388
1502
|
const rows = await this.#adapter.runQuery(
|
|
1389
|
-
`SELECT COUNT(*) as count FROM ${tableIdentifier}
|
|
1503
|
+
`SELECT COUNT(*) as count FROM ${tableIdentifier}`,
|
|
1504
|
+
countRow
|
|
1390
1505
|
);
|
|
1391
1506
|
return this.#adapter.toNumber(rows[0]?.count);
|
|
1392
1507
|
}
|
|
@@ -1760,9 +1875,6 @@ var SQL_SERVER_ERROR_MAP = {
|
|
|
1760
1875
|
hint: "The query violates a constraint. Re-check join logic and filtering."
|
|
1761
1876
|
}
|
|
1762
1877
|
};
|
|
1763
|
-
var LOW_CARDINALITY_LIMIT = 20;
|
|
1764
|
-
var noopProgress2 = () => {
|
|
1765
|
-
};
|
|
1766
1878
|
function getErrorCode(error) {
|
|
1767
1879
|
if (typeof error === "object" && error !== null && "number" in error && typeof error.number === "number") {
|
|
1768
1880
|
return String(error.number);
|
|
@@ -1823,9 +1935,6 @@ var SqlServer = class extends Adapter {
|
|
|
1823
1935
|
return JSON.stringify(formatSqlServerError(sql, error));
|
|
1824
1936
|
}
|
|
1825
1937
|
}
|
|
1826
|
-
async runQuery(sql) {
|
|
1827
|
-
return this.#runIntrospectionQuery(sql);
|
|
1828
|
-
}
|
|
1829
1938
|
quoteIdentifier(name) {
|
|
1830
1939
|
return `[${name.replace(/]/g, "]]")}]`;
|
|
1831
1940
|
}
|
|
@@ -1838,435 +1947,75 @@ var SqlServer = class extends Adapter {
|
|
|
1838
1947
|
const columnList = columns?.length ? columns.map((c) => this.quoteIdentifier(c)).join(", ") : "*";
|
|
1839
1948
|
return `SELECT TOP ${limit} ${columnList} FROM ${tableIdentifier}`;
|
|
1840
1949
|
}
|
|
1841
|
-
async #loadTables() {
|
|
1842
|
-
const rows = await this.#runIntrospectionQuery(`
|
|
1843
|
-
SELECT
|
|
1844
|
-
c.TABLE_SCHEMA AS table_schema,
|
|
1845
|
-
c.TABLE_NAME AS table_name,
|
|
1846
|
-
c.COLUMN_NAME AS column_name,
|
|
1847
|
-
c.DATA_TYPE AS data_type
|
|
1848
|
-
FROM INFORMATION_SCHEMA.COLUMNS AS c
|
|
1849
|
-
JOIN INFORMATION_SCHEMA.TABLES AS t
|
|
1850
|
-
ON c.TABLE_SCHEMA = t.TABLE_SCHEMA
|
|
1851
|
-
AND c.TABLE_NAME = t.TABLE_NAME
|
|
1852
|
-
WHERE t.TABLE_TYPE = 'BASE TABLE'
|
|
1853
|
-
${this.#buildSchemaFilter("c.TABLE_SCHEMA")}
|
|
1854
|
-
ORDER BY c.TABLE_SCHEMA, c.TABLE_NAME, c.ORDINAL_POSITION
|
|
1855
|
-
`);
|
|
1856
|
-
const tables2 = /* @__PURE__ */ new Map();
|
|
1857
|
-
for (const row of rows) {
|
|
1858
|
-
if (!row.table_name) {
|
|
1859
|
-
continue;
|
|
1860
|
-
}
|
|
1861
|
-
const schema = row.table_schema ?? "dbo";
|
|
1862
|
-
const tableName = row.table_name;
|
|
1863
|
-
const qualifiedName = `${schema}.${tableName}`;
|
|
1864
|
-
const table2 = tables2.get(qualifiedName) ?? {
|
|
1865
|
-
name: qualifiedName,
|
|
1866
|
-
schema,
|
|
1867
|
-
rawName: tableName,
|
|
1868
|
-
columns: []
|
|
1869
|
-
};
|
|
1870
|
-
table2.columns.push({
|
|
1871
|
-
name: row.column_name ?? "unknown",
|
|
1872
|
-
type: row.data_type ?? "unknown"
|
|
1873
|
-
});
|
|
1874
|
-
tables2.set(qualifiedName, table2);
|
|
1875
|
-
}
|
|
1876
|
-
return Array.from(tables2.values());
|
|
1877
|
-
}
|
|
1878
|
-
async #loadRelationships(filterTableNames) {
|
|
1879
|
-
const tableFilter = this.#buildTableNamesFilter(filterTableNames);
|
|
1880
|
-
const rows = await this.#runIntrospectionQuery(`
|
|
1881
|
-
SELECT
|
|
1882
|
-
fk.CONSTRAINT_NAME AS constraint_name,
|
|
1883
|
-
fk.TABLE_SCHEMA AS table_schema,
|
|
1884
|
-
fk.TABLE_NAME AS table_name,
|
|
1885
|
-
fk.COLUMN_NAME AS column_name,
|
|
1886
|
-
pk.TABLE_SCHEMA AS referenced_table_schema,
|
|
1887
|
-
pk.TABLE_NAME AS referenced_table_name,
|
|
1888
|
-
pk.COLUMN_NAME AS referenced_column_name
|
|
1889
|
-
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
|
|
1890
|
-
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS fk
|
|
1891
|
-
ON fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
|
|
1892
|
-
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS pk
|
|
1893
|
-
ON pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
|
|
1894
|
-
AND pk.ORDINAL_POSITION = fk.ORDINAL_POSITION
|
|
1895
|
-
WHERE 1 = 1
|
|
1896
|
-
${this.#buildSchemaFilter("fk.TABLE_SCHEMA")}
|
|
1897
|
-
${tableFilter}
|
|
1898
|
-
ORDER BY fk.TABLE_SCHEMA, fk.TABLE_NAME, fk.CONSTRAINT_NAME, fk.ORDINAL_POSITION
|
|
1899
|
-
`);
|
|
1900
|
-
const relationships = /* @__PURE__ */ new Map();
|
|
1901
|
-
for (const row of rows) {
|
|
1902
|
-
if (!row.constraint_name || !row.table_name || !row.referenced_table_name) {
|
|
1903
|
-
continue;
|
|
1904
|
-
}
|
|
1905
|
-
const schema = row.table_schema ?? "dbo";
|
|
1906
|
-
const referencedSchema = row.referenced_table_schema ?? "dbo";
|
|
1907
|
-
const key = `${schema}.${row.table_name}:${row.constraint_name}`;
|
|
1908
|
-
const relationship2 = relationships.get(key) ?? {
|
|
1909
|
-
table: `${schema}.${row.table_name}`,
|
|
1910
|
-
from: [],
|
|
1911
|
-
referenced_table: `${referencedSchema}.${row.referenced_table_name}`,
|
|
1912
|
-
to: []
|
|
1913
|
-
};
|
|
1914
|
-
relationship2.from.push(row.column_name ?? "unknown");
|
|
1915
|
-
relationship2.to.push(row.referenced_column_name ?? "unknown");
|
|
1916
|
-
relationships.set(key, relationship2);
|
|
1917
|
-
}
|
|
1918
|
-
return Array.from(relationships.values());
|
|
1919
|
-
}
|
|
1920
|
-
async #annotateRowCounts(tables2, onProgress = noopProgress2) {
|
|
1921
|
-
const total = tables2.length;
|
|
1922
|
-
for (let i = 0; i < tables2.length; i++) {
|
|
1923
|
-
const table2 = tables2[i];
|
|
1924
|
-
const tableIdentifier = this.#formatQualifiedTableName(table2);
|
|
1925
|
-
onProgress({
|
|
1926
|
-
type: "phase:progress",
|
|
1927
|
-
phase: "row_counts",
|
|
1928
|
-
table: table2.name,
|
|
1929
|
-
message: `Counting rows in ${table2.name}...`,
|
|
1930
|
-
current: i + 1,
|
|
1931
|
-
total
|
|
1932
|
-
});
|
|
1933
|
-
try {
|
|
1934
|
-
const rows = await this.#runIntrospectionQuery(`SELECT COUNT(*) as count FROM ${tableIdentifier}`);
|
|
1935
|
-
const rowCount2 = this.#toNumber(rows[0]?.count);
|
|
1936
|
-
if (rowCount2 != null) {
|
|
1937
|
-
table2.rowCount = rowCount2;
|
|
1938
|
-
table2.sizeHint = this.#classifyRowCount(rowCount2);
|
|
1939
|
-
}
|
|
1940
|
-
} catch {
|
|
1941
|
-
continue;
|
|
1942
|
-
}
|
|
1943
|
-
}
|
|
1944
|
-
}
|
|
1945
|
-
async #annotateIndexes(tables2) {
|
|
1946
|
-
if (!tables2.length) {
|
|
1947
|
-
return;
|
|
1948
|
-
}
|
|
1949
|
-
const tableMap = new Map(tables2.map((table2) => [table2.name, table2]));
|
|
1950
|
-
const rows = await this.#runIntrospectionQuery(`
|
|
1951
|
-
SELECT
|
|
1952
|
-
sch.name AS schema_name,
|
|
1953
|
-
t.name AS table_name,
|
|
1954
|
-
ind.name AS index_name,
|
|
1955
|
-
col.name AS column_name,
|
|
1956
|
-
ind.is_unique,
|
|
1957
|
-
ind.is_primary_key,
|
|
1958
|
-
ind.type_desc,
|
|
1959
|
-
ic.is_included_column
|
|
1960
|
-
FROM sys.indexes AS ind
|
|
1961
|
-
JOIN sys.tables AS t ON ind.object_id = t.object_id
|
|
1962
|
-
JOIN sys.schemas AS sch ON t.schema_id = sch.schema_id
|
|
1963
|
-
JOIN sys.index_columns AS ic
|
|
1964
|
-
ON ind.object_id = ic.object_id
|
|
1965
|
-
AND ind.index_id = ic.index_id
|
|
1966
|
-
JOIN sys.columns AS col
|
|
1967
|
-
ON ic.object_id = col.object_id
|
|
1968
|
-
AND ic.column_id = col.column_id
|
|
1969
|
-
WHERE ind.is_hypothetical = 0
|
|
1970
|
-
AND ind.name IS NOT NULL
|
|
1971
|
-
${this.#buildSchemaFilter("sch.name")}
|
|
1972
|
-
ORDER BY sch.name, t.name, ind.name, ic.key_ordinal
|
|
1973
|
-
`);
|
|
1974
|
-
const indexMap = /* @__PURE__ */ new Map();
|
|
1975
|
-
for (const row of rows) {
|
|
1976
|
-
if (!row.table_name || !row.index_name) {
|
|
1977
|
-
continue;
|
|
1978
|
-
}
|
|
1979
|
-
const schema = row.schema_name ?? "dbo";
|
|
1980
|
-
const tableKey = `${schema}.${row.table_name}`;
|
|
1981
|
-
const table2 = tableMap.get(tableKey);
|
|
1982
|
-
if (!table2) {
|
|
1983
|
-
continue;
|
|
1984
|
-
}
|
|
1985
|
-
const indexKey = `${tableKey}:${row.index_name}`;
|
|
1986
|
-
let index2 = indexMap.get(indexKey);
|
|
1987
|
-
if (!index2) {
|
|
1988
|
-
index2 = {
|
|
1989
|
-
name: row.index_name,
|
|
1990
|
-
columns: [],
|
|
1991
|
-
unique: Boolean(row.is_unique),
|
|
1992
|
-
type: row.type_desc ?? void 0
|
|
1993
|
-
};
|
|
1994
|
-
indexMap.set(indexKey, index2);
|
|
1995
|
-
if (!table2.indexes) {
|
|
1996
|
-
table2.indexes = [];
|
|
1997
|
-
}
|
|
1998
|
-
table2.indexes.push(index2);
|
|
1999
|
-
}
|
|
2000
|
-
if (row.is_included_column) {
|
|
2001
|
-
continue;
|
|
2002
|
-
}
|
|
2003
|
-
if (row.column_name) {
|
|
2004
|
-
index2.columns.push(row.column_name);
|
|
2005
|
-
const column2 = table2.columns.find(
|
|
2006
|
-
(col) => col.name === row.column_name
|
|
2007
|
-
);
|
|
2008
|
-
if (column2) {
|
|
2009
|
-
column2.isIndexed = true;
|
|
2010
|
-
}
|
|
2011
|
-
}
|
|
2012
|
-
}
|
|
2013
|
-
}
|
|
2014
|
-
async #annotateColumnStats(tables2, onProgress = noopProgress2) {
|
|
2015
|
-
if (!tables2.length) {
|
|
2016
|
-
return;
|
|
2017
|
-
}
|
|
2018
|
-
const total = tables2.length;
|
|
2019
|
-
for (let i = 0; i < tables2.length; i++) {
|
|
2020
|
-
const table2 = tables2[i];
|
|
2021
|
-
const tableIdentifier = this.#formatQualifiedTableName(table2);
|
|
2022
|
-
onProgress({
|
|
2023
|
-
type: "phase:progress",
|
|
2024
|
-
phase: "column_stats",
|
|
2025
|
-
table: table2.name,
|
|
2026
|
-
message: `Collecting stats for ${table2.name}...`,
|
|
2027
|
-
current: i + 1,
|
|
2028
|
-
total
|
|
2029
|
-
});
|
|
2030
|
-
for (const column2 of table2.columns) {
|
|
2031
|
-
if (!this.#shouldCollectStats(column2.type)) {
|
|
2032
|
-
continue;
|
|
2033
|
-
}
|
|
2034
|
-
const columnIdentifier = this.#quoteIdentifier(column2.name);
|
|
2035
|
-
const sql = `
|
|
2036
|
-
SELECT
|
|
2037
|
-
CONVERT(NVARCHAR(4000), MIN(${columnIdentifier})) AS min_value,
|
|
2038
|
-
CONVERT(NVARCHAR(4000), MAX(${columnIdentifier})) AS max_value,
|
|
2039
|
-
AVG(CASE WHEN ${columnIdentifier} IS NULL THEN 1.0 ELSE 0.0 END) AS null_fraction
|
|
2040
|
-
FROM ${tableIdentifier}
|
|
2041
|
-
`;
|
|
2042
|
-
try {
|
|
2043
|
-
const rows = await this.#runIntrospectionQuery(sql);
|
|
2044
|
-
if (!rows.length) {
|
|
2045
|
-
continue;
|
|
2046
|
-
}
|
|
2047
|
-
const nullFraction = this.#toNumber(rows[0]?.null_fraction);
|
|
2048
|
-
if (rows[0]?.min_value != null || rows[0]?.max_value != null || nullFraction != null) {
|
|
2049
|
-
column2.stats = {
|
|
2050
|
-
min: rows[0]?.min_value ?? void 0,
|
|
2051
|
-
max: rows[0]?.max_value ?? void 0,
|
|
2052
|
-
nullFraction: nullFraction != null && Number.isFinite(nullFraction) ? Math.max(0, Math.min(1, nullFraction)) : void 0
|
|
2053
|
-
};
|
|
2054
|
-
}
|
|
2055
|
-
} catch {
|
|
2056
|
-
continue;
|
|
2057
|
-
}
|
|
2058
|
-
}
|
|
2059
|
-
}
|
|
2060
|
-
}
|
|
2061
|
-
async #annotateLowCardinalityColumns(tables2, onProgress = noopProgress2) {
|
|
2062
|
-
const total = tables2.length;
|
|
2063
|
-
for (let i = 0; i < tables2.length; i++) {
|
|
2064
|
-
const table2 = tables2[i];
|
|
2065
|
-
const tableIdentifier = this.#formatQualifiedTableName(table2);
|
|
2066
|
-
onProgress({
|
|
2067
|
-
type: "phase:progress",
|
|
2068
|
-
phase: "low_cardinality",
|
|
2069
|
-
table: table2.name,
|
|
2070
|
-
message: `Analyzing cardinality in ${table2.name}...`,
|
|
2071
|
-
current: i + 1,
|
|
2072
|
-
total
|
|
2073
|
-
});
|
|
2074
|
-
for (const column2 of table2.columns) {
|
|
2075
|
-
const columnIdentifier = this.#quoteIdentifier(column2.name);
|
|
2076
|
-
const limit = LOW_CARDINALITY_LIMIT + 1;
|
|
2077
|
-
const sql = `
|
|
2078
|
-
SELECT DISTINCT TOP (${limit}) ${columnIdentifier} AS value
|
|
2079
|
-
FROM ${tableIdentifier}
|
|
2080
|
-
WHERE ${columnIdentifier} IS NOT NULL
|
|
2081
|
-
`;
|
|
2082
|
-
let rows = [];
|
|
2083
|
-
try {
|
|
2084
|
-
rows = await this.#runIntrospectionQuery(sql);
|
|
2085
|
-
} catch {
|
|
2086
|
-
continue;
|
|
2087
|
-
}
|
|
2088
|
-
if (!rows.length || rows.length > LOW_CARDINALITY_LIMIT) {
|
|
2089
|
-
continue;
|
|
2090
|
-
}
|
|
2091
|
-
const values = [];
|
|
2092
|
-
let shouldSkip = false;
|
|
2093
|
-
for (const row of rows) {
|
|
2094
|
-
const formatted = this.#normalizeValue(row.value);
|
|
2095
|
-
if (formatted == null) {
|
|
2096
|
-
shouldSkip = true;
|
|
2097
|
-
break;
|
|
2098
|
-
}
|
|
2099
|
-
values.push(formatted);
|
|
2100
|
-
}
|
|
2101
|
-
if (shouldSkip || !values.length) {
|
|
2102
|
-
continue;
|
|
2103
|
-
}
|
|
2104
|
-
column2.kind = "LowCardinality";
|
|
2105
|
-
column2.values = values;
|
|
2106
|
-
}
|
|
2107
|
-
}
|
|
2108
|
-
}
|
|
2109
|
-
#buildSchemaFilter(columnName) {
|
|
2110
|
-
if (this.#options.schemas && this.#options.schemas.length > 0) {
|
|
2111
|
-
const values = this.#options.schemas.map((schema) => `'${schema.replace(/'/g, "''")}'`).join(", ");
|
|
2112
|
-
return `AND ${columnName} IN (${values})`;
|
|
2113
|
-
}
|
|
2114
|
-
return `AND ${columnName} NOT IN ('INFORMATION_SCHEMA', 'sys')`;
|
|
2115
|
-
}
|
|
2116
1950
|
/**
|
|
2117
|
-
*
|
|
2118
|
-
*
|
|
1951
|
+
* The schemas introspection is limited to; table and view discovery use
|
|
1952
|
+
* them unless a grounding lists its own.
|
|
2119
1953
|
*/
|
|
2120
|
-
|
|
2121
|
-
|
|
2122
|
-
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
|
|
2128
|
-
|
|
2129
|
-
const tableName = rest.join(".");
|
|
2130
|
-
const escapedSchema = schema.replace(/'/g, "''");
|
|
2131
|
-
const escapedTable = tableName.replace(/'/g, "''");
|
|
2132
|
-
conditions.push(
|
|
2133
|
-
`(fk.TABLE_SCHEMA = '${escapedSchema}' AND fk.TABLE_NAME = '${escapedTable}')`
|
|
2134
|
-
);
|
|
2135
|
-
conditions.push(
|
|
2136
|
-
`(pk.TABLE_SCHEMA = '${escapedSchema}' AND pk.TABLE_NAME = '${escapedTable}')`
|
|
2137
|
-
);
|
|
2138
|
-
} else {
|
|
2139
|
-
conditions.push(`fk.TABLE_NAME = '${escaped}'`);
|
|
2140
|
-
conditions.push(`pk.TABLE_NAME = '${escaped}'`);
|
|
2141
|
-
}
|
|
2142
|
-
}
|
|
2143
|
-
return `AND (${conditions.join(" OR ")})`;
|
|
2144
|
-
}
|
|
2145
|
-
async #runIntrospectionQuery(sql) {
|
|
2146
|
-
const result = await this.#options.execute(sql);
|
|
2147
|
-
if (Array.isArray(result)) {
|
|
2148
|
-
return result;
|
|
2149
|
-
}
|
|
2150
|
-
if (result && typeof result === "object") {
|
|
2151
|
-
if ("rows" in result && Array.isArray(result.rows)) {
|
|
2152
|
-
return result.rows;
|
|
2153
|
-
}
|
|
2154
|
-
if ("recordset" in result && Array.isArray(result.recordset)) {
|
|
2155
|
-
return result.recordset;
|
|
2156
|
-
}
|
|
2157
|
-
if ("recordsets" in result && Array.isArray(result.recordsets) && Array.isArray(result.recordsets[0])) {
|
|
2158
|
-
return result.recordsets[0];
|
|
2159
|
-
}
|
|
2160
|
-
}
|
|
2161
|
-
throw new Error(
|
|
2162
|
-
"SqlServer adapter execute() must return an array of rows or an object with rows/recordset properties when introspecting."
|
|
2163
|
-
);
|
|
2164
|
-
}
|
|
2165
|
-
#quoteIdentifier(name) {
|
|
2166
|
-
return `[${name.replace(/]/g, "]]")}]`;
|
|
2167
|
-
}
|
|
2168
|
-
#formatQualifiedTableName(table2) {
|
|
2169
|
-
if (table2.schema && table2.rawName) {
|
|
2170
|
-
return `${this.#quoteIdentifier(table2.schema)}.${this.#quoteIdentifier(table2.rawName)}`;
|
|
2171
|
-
}
|
|
2172
|
-
if (table2.name.includes(".")) {
|
|
2173
|
-
const [schemaPart, ...rest] = table2.name.split(".");
|
|
2174
|
-
const tablePart = rest.join(".") || schemaPart;
|
|
2175
|
-
if (rest.length === 0) {
|
|
2176
|
-
return this.#quoteIdentifier(schemaPart);
|
|
2177
|
-
}
|
|
2178
|
-
return `${this.#quoteIdentifier(schemaPart)}.${this.#quoteIdentifier(tablePart)}`;
|
|
2179
|
-
}
|
|
2180
|
-
return this.#quoteIdentifier(table2.name);
|
|
2181
|
-
}
|
|
2182
|
-
#toNumber(value) {
|
|
2183
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
2184
|
-
return value;
|
|
2185
|
-
}
|
|
2186
|
-
if (typeof value === "bigint") {
|
|
2187
|
-
return Number(value);
|
|
2188
|
-
}
|
|
2189
|
-
if (typeof value === "string" && value.trim() !== "") {
|
|
2190
|
-
const parsed = Number(value);
|
|
2191
|
-
return Number.isFinite(parsed) ? parsed : null;
|
|
2192
|
-
}
|
|
2193
|
-
return null;
|
|
2194
|
-
}
|
|
2195
|
-
#classifyRowCount(count) {
|
|
2196
|
-
if (count < 100) {
|
|
2197
|
-
return "tiny";
|
|
2198
|
-
}
|
|
2199
|
-
if (count < 1e3) {
|
|
2200
|
-
return "small";
|
|
2201
|
-
}
|
|
2202
|
-
if (count < 1e4) {
|
|
2203
|
-
return "medium";
|
|
2204
|
-
}
|
|
2205
|
-
if (count < 1e5) {
|
|
2206
|
-
return "large";
|
|
2207
|
-
}
|
|
2208
|
-
return "huge";
|
|
2209
|
-
}
|
|
2210
|
-
#shouldCollectStats(type) {
|
|
2211
|
-
if (!type) {
|
|
2212
|
-
return false;
|
|
2213
|
-
}
|
|
2214
|
-
const normalized = type.toLowerCase();
|
|
2215
|
-
return /int|numeric|decimal|float|real|money|date|time|timestamp|bool/.test(
|
|
2216
|
-
normalized
|
|
2217
|
-
);
|
|
2218
|
-
}
|
|
2219
|
-
#normalizeValue(value) {
|
|
2220
|
-
if (value === null || value === void 0) {
|
|
2221
|
-
return null;
|
|
2222
|
-
}
|
|
2223
|
-
if (typeof value === "string") {
|
|
2224
|
-
return value;
|
|
2225
|
-
}
|
|
2226
|
-
if (typeof value === "number" || typeof value === "bigint") {
|
|
2227
|
-
return String(value);
|
|
2228
|
-
}
|
|
2229
|
-
if (typeof value === "boolean") {
|
|
2230
|
-
return value ? "true" : "false";
|
|
2231
|
-
}
|
|
2232
|
-
if (value instanceof Date) {
|
|
2233
|
-
return value.toISOString();
|
|
2234
|
-
}
|
|
2235
|
-
if (typeof Buffer !== "undefined" && Buffer.isBuffer(value)) {
|
|
2236
|
-
return value.toString("utf-8");
|
|
2237
|
-
}
|
|
2238
|
-
return null;
|
|
1954
|
+
get schemas() {
|
|
1955
|
+
return this.#options.schemas;
|
|
1956
|
+
}
|
|
1957
|
+
async queryRows(sql) {
|
|
1958
|
+
return this.rowsFrom(await this.#options.execute(sql), [
|
|
1959
|
+
"rows",
|
|
1960
|
+
"recordset",
|
|
1961
|
+
"recordsets.0"
|
|
1962
|
+
]);
|
|
2239
1963
|
}
|
|
2240
1964
|
};
|
|
2241
1965
|
|
|
2242
1966
|
// packages/text2sql/src/lib/adapters/sqlserver/table.sqlserver.grounding.ts
|
|
1967
|
+
import { z as z8 } from "zod";
|
|
1968
|
+
|
|
1969
|
+
// packages/text2sql/src/lib/adapters/sqlserver/sqlserver-rows.ts
|
|
1970
|
+
import { z as z7 } from "zod";
|
|
1971
|
+
var columnRow = z7.object({
|
|
1972
|
+
column_name: z7.string().nullable(),
|
|
1973
|
+
data_type: z7.string().nullable()
|
|
1974
|
+
});
|
|
1975
|
+
|
|
1976
|
+
// packages/text2sql/src/lib/adapters/sqlserver/table.sqlserver.grounding.ts
|
|
1977
|
+
var relationshipRow = z8.object({
|
|
1978
|
+
constraint_name: z8.string(),
|
|
1979
|
+
table_schema: z8.string(),
|
|
1980
|
+
table_name: z8.string(),
|
|
1981
|
+
column_name: z8.string(),
|
|
1982
|
+
referenced_table_schema: z8.string(),
|
|
1983
|
+
referenced_table_name: z8.string(),
|
|
1984
|
+
referenced_column_name: z8.string()
|
|
1985
|
+
});
|
|
2243
1986
|
var SqlServerTableGrounding = class extends TableGrounding {
|
|
2244
1987
|
#adapter;
|
|
2245
1988
|
#schemas;
|
|
2246
1989
|
constructor(adapter, config = {}) {
|
|
2247
1990
|
super(config);
|
|
2248
1991
|
this.#adapter = adapter;
|
|
2249
|
-
this.#schemas = config.schemas;
|
|
1992
|
+
this.#schemas = config.schemas ?? adapter.schemas;
|
|
2250
1993
|
}
|
|
2251
1994
|
async getAllTableNames() {
|
|
2252
|
-
const rows = await this.#adapter.runQuery(
|
|
1995
|
+
const rows = await this.#adapter.runQuery(
|
|
1996
|
+
`
|
|
2253
1997
|
SELECT TABLE_SCHEMA + '.' + TABLE_NAME AS name
|
|
2254
1998
|
FROM INFORMATION_SCHEMA.TABLES
|
|
2255
1999
|
WHERE TABLE_TYPE = 'BASE TABLE'
|
|
2256
2000
|
${this.#adapter.buildSchemaFilter("TABLE_SCHEMA", this.#schemas)}
|
|
2257
2001
|
ORDER BY name
|
|
2258
|
-
|
|
2002
|
+
`,
|
|
2003
|
+
nameRow
|
|
2004
|
+
);
|
|
2259
2005
|
return rows.map((r) => r.name);
|
|
2260
2006
|
}
|
|
2261
2007
|
async getTable(tableName) {
|
|
2262
2008
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
2263
|
-
const columns = await this.#adapter.runQuery(
|
|
2009
|
+
const columns = await this.#adapter.runQuery(
|
|
2010
|
+
`
|
|
2264
2011
|
SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type
|
|
2265
2012
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
2266
2013
|
WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
|
|
2267
2014
|
AND TABLE_NAME = '${this.#adapter.escapeString(table2)}'
|
|
2268
2015
|
ORDER BY ORDINAL_POSITION
|
|
2269
|
-
|
|
2016
|
+
`,
|
|
2017
|
+
columnRow
|
|
2018
|
+
);
|
|
2270
2019
|
return {
|
|
2271
2020
|
name: tableName,
|
|
2272
2021
|
schema,
|
|
@@ -2279,68 +2028,58 @@ var SqlServerTableGrounding = class extends TableGrounding {
|
|
|
2279
2028
|
}
|
|
2280
2029
|
async findOutgoingRelations(tableName) {
|
|
2281
2030
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
fk.TABLE_NAME AS table_name,
|
|
2287
|
-
fk.COLUMN_NAME AS column_name,
|
|
2288
|
-
pk.TABLE_SCHEMA AS referenced_table_schema,
|
|
2289
|
-
pk.TABLE_NAME AS referenced_table_name,
|
|
2290
|
-
pk.COLUMN_NAME AS referenced_column_name
|
|
2291
|
-
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc
|
|
2292
|
-
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS fk
|
|
2293
|
-
ON fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
|
|
2294
|
-
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS pk
|
|
2295
|
-
ON pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME
|
|
2296
|
-
AND pk.ORDINAL_POSITION = fk.ORDINAL_POSITION
|
|
2297
|
-
WHERE fk.TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
|
|
2298
|
-
AND fk.TABLE_NAME = '${this.#adapter.escapeString(table2)}'
|
|
2299
|
-
ORDER BY fk.CONSTRAINT_NAME, fk.ORDINAL_POSITION
|
|
2300
|
-
`);
|
|
2301
|
-
return this.#groupRelationships(rows);
|
|
2031
|
+
return this.#foreignKeys(
|
|
2032
|
+
`s.name = '${this.#adapter.escapeString(schema)}'
|
|
2033
|
+
AND t.name = '${this.#adapter.escapeString(table2)}'`
|
|
2034
|
+
);
|
|
2302
2035
|
}
|
|
2303
2036
|
async findIncomingRelations(tableName) {
|
|
2304
2037
|
const { schema, table: table2 } = this.#adapter.parseTableName(tableName);
|
|
2305
|
-
|
|
2038
|
+
return this.#foreignKeys(
|
|
2039
|
+
`ref_s.name = '${this.#adapter.escapeString(schema)}'
|
|
2040
|
+
AND ref_t.name = '${this.#adapter.escapeString(table2)}'`
|
|
2041
|
+
);
|
|
2042
|
+
}
|
|
2043
|
+
/**
|
|
2044
|
+
* The foreign keys matching `where`. sys.foreign_key_columns holds one row
|
|
2045
|
+
* per column pair in the key's own order, and every join goes by object id,
|
|
2046
|
+
* so a key comes back whole even when it references a unique index or
|
|
2047
|
+
* another schema repeats its constraint names.
|
|
2048
|
+
*/
|
|
2049
|
+
async #foreignKeys(where) {
|
|
2050
|
+
const rows = await this.#adapter.runQuery(
|
|
2051
|
+
`
|
|
2306
2052
|
SELECT
|
|
2307
|
-
fk.
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
FROM
|
|
2315
|
-
JOIN
|
|
2316
|
-
|
|
2317
|
-
JOIN
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
WHERE
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
}
|
|
2326
|
-
#groupRelationships(rows) {
|
|
2053
|
+
fk.name AS constraint_name,
|
|
2054
|
+
s.name AS table_schema,
|
|
2055
|
+
t.name AS table_name,
|
|
2056
|
+
COL_NAME(fkc.parent_object_id, fkc.parent_column_id) AS column_name,
|
|
2057
|
+
ref_s.name AS referenced_table_schema,
|
|
2058
|
+
ref_t.name AS referenced_table_name,
|
|
2059
|
+
COL_NAME(fkc.referenced_object_id, fkc.referenced_column_id) AS referenced_column_name
|
|
2060
|
+
FROM sys.foreign_keys AS fk
|
|
2061
|
+
JOIN sys.foreign_key_columns AS fkc ON fkc.constraint_object_id = fk.object_id
|
|
2062
|
+
JOIN sys.tables AS t ON t.object_id = fk.parent_object_id
|
|
2063
|
+
JOIN sys.schemas AS s ON s.schema_id = t.schema_id
|
|
2064
|
+
JOIN sys.tables AS ref_t ON ref_t.object_id = fk.referenced_object_id
|
|
2065
|
+
JOIN sys.schemas AS ref_s ON ref_s.schema_id = ref_t.schema_id
|
|
2066
|
+
WHERE ${where}
|
|
2067
|
+
ORDER BY s.name, t.name, fk.name, fkc.constraint_column_id
|
|
2068
|
+
`,
|
|
2069
|
+
relationshipRow
|
|
2070
|
+
);
|
|
2327
2071
|
const relationships = /* @__PURE__ */ new Map();
|
|
2328
|
-
const defaultSchema = this.#adapter.defaultSchema ?? "dbo";
|
|
2329
2072
|
for (const row of rows) {
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
}
|
|
2333
|
-
const schema = row.table_schema ?? defaultSchema;
|
|
2334
|
-
const referencedSchema = row.referenced_table_schema ?? defaultSchema;
|
|
2335
|
-
const key = `${schema}.${row.table_name}:${row.constraint_name}`;
|
|
2073
|
+
const table2 = `${row.table_schema}.${row.table_name}`;
|
|
2074
|
+
const key = `${table2}:${row.constraint_name}`;
|
|
2336
2075
|
const relationship2 = relationships.get(key) ?? {
|
|
2337
|
-
table:
|
|
2076
|
+
table: table2,
|
|
2338
2077
|
from: [],
|
|
2339
|
-
referenced_table: `${
|
|
2078
|
+
referenced_table: `${row.referenced_table_schema}.${row.referenced_table_name}`,
|
|
2340
2079
|
to: []
|
|
2341
2080
|
};
|
|
2342
|
-
relationship2.from.push(row.column_name
|
|
2343
|
-
relationship2.to.push(row.referenced_column_name
|
|
2081
|
+
relationship2.from.push(row.column_name);
|
|
2082
|
+
relationship2.to.push(row.referenced_column_name);
|
|
2344
2083
|
relationships.set(key, relationship2);
|
|
2345
2084
|
}
|
|
2346
2085
|
return Array.from(relationships.values());
|
|
@@ -2409,39 +2148,48 @@ var SqlServerViewGrounding = class extends ViewGrounding {
|
|
|
2409
2148
|
constructor(adapter, config = {}) {
|
|
2410
2149
|
super(config);
|
|
2411
2150
|
this.#adapter = adapter;
|
|
2412
|
-
this.#schemas = config.schemas;
|
|
2151
|
+
this.#schemas = config.schemas ?? adapter.schemas;
|
|
2413
2152
|
}
|
|
2414
2153
|
async getAllViewNames() {
|
|
2415
|
-
const rows = await this.#adapter.runQuery(
|
|
2154
|
+
const rows = await this.#adapter.runQuery(
|
|
2155
|
+
`
|
|
2416
2156
|
SELECT TABLE_SCHEMA + '.' + TABLE_NAME AS name
|
|
2417
2157
|
FROM INFORMATION_SCHEMA.VIEWS
|
|
2418
2158
|
WHERE 1=1
|
|
2419
2159
|
${this.#adapter.buildSchemaFilter("TABLE_SCHEMA", this.#schemas)}
|
|
2420
2160
|
ORDER BY name
|
|
2421
|
-
|
|
2161
|
+
`,
|
|
2162
|
+
nameRow
|
|
2163
|
+
);
|
|
2422
2164
|
return rows.map((r) => r.name);
|
|
2423
2165
|
}
|
|
2424
2166
|
async getView(viewName) {
|
|
2425
2167
|
const { schema, table: view2 } = this.#adapter.parseTableName(viewName);
|
|
2426
2168
|
let definition;
|
|
2427
2169
|
if (this.includeDefinition) {
|
|
2428
|
-
const defRows = await this.#adapter.runQuery(
|
|
2170
|
+
const defRows = await this.#adapter.runQuery(
|
|
2171
|
+
`
|
|
2429
2172
|
SELECT m.definition
|
|
2430
2173
|
FROM sys.views v
|
|
2431
2174
|
JOIN sys.schemas s ON v.schema_id = s.schema_id
|
|
2432
2175
|
JOIN sys.sql_modules m ON v.object_id = m.object_id
|
|
2433
2176
|
WHERE s.name = '${this.#adapter.escapeString(schema)}'
|
|
2434
2177
|
AND v.name = '${this.#adapter.escapeString(view2)}'
|
|
2435
|
-
|
|
2178
|
+
`,
|
|
2179
|
+
viewDefinitionRow
|
|
2180
|
+
);
|
|
2436
2181
|
definition = defRows[0]?.definition ?? void 0;
|
|
2437
2182
|
}
|
|
2438
|
-
const columns = await this.#adapter.runQuery(
|
|
2183
|
+
const columns = await this.#adapter.runQuery(
|
|
2184
|
+
`
|
|
2439
2185
|
SELECT COLUMN_NAME AS column_name, DATA_TYPE AS data_type
|
|
2440
2186
|
FROM INFORMATION_SCHEMA.COLUMNS
|
|
2441
2187
|
WHERE TABLE_SCHEMA = '${this.#adapter.escapeString(schema)}'
|
|
2442
2188
|
AND TABLE_NAME = '${this.#adapter.escapeString(view2)}'
|
|
2443
2189
|
ORDER BY ORDINAL_POSITION
|
|
2444
|
-
|
|
2190
|
+
`,
|
|
2191
|
+
columnRow
|
|
2192
|
+
);
|
|
2445
2193
|
return {
|
|
2446
2194
|
name: viewName,
|
|
2447
2195
|
schema,
|
|
@@ -2457,15 +2205,19 @@ var SqlServerViewGrounding = class extends ViewGrounding {
|
|
|
2457
2205
|
|
|
2458
2206
|
// packages/text2sql/src/lib/adapters/sqlserver/index.ts
|
|
2459
2207
|
function tables(config = {}) {
|
|
2460
|
-
return (
|
|
2208
|
+
return groundingFor(
|
|
2209
|
+
SqlServer,
|
|
2210
|
+
(adapter) => new SqlServerTableGrounding(adapter, config)
|
|
2211
|
+
);
|
|
2461
2212
|
}
|
|
2462
2213
|
function info(config = {}) {
|
|
2463
2214
|
return (adapter) => new SqlServerInfoGrounding(adapter, config);
|
|
2464
2215
|
}
|
|
2465
2216
|
function views(config = {}) {
|
|
2466
|
-
return (
|
|
2467
|
-
|
|
2468
|
-
|
|
2217
|
+
return groundingFor(
|
|
2218
|
+
SqlServer,
|
|
2219
|
+
(adapter) => new SqlServerViewGrounding(adapter, config)
|
|
2220
|
+
);
|
|
2469
2221
|
}
|
|
2470
2222
|
function columnStats(config = {}) {
|
|
2471
2223
|
return (adapter) => {
|