@memberjunction/codegen-lib 6.1.0-edge.3 → 6.1.0-edge.5
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 +50 -21
- package/dist/Config/config.d.ts +290 -11
- package/dist/Config/config.d.ts.map +1 -1
- package/dist/Config/config.js +259 -9
- package/dist/Config/config.js.map +1 -1
- package/dist/Config/schema-output.d.ts +33 -0
- package/dist/Config/schema-output.d.ts.map +1 -0
- package/dist/Config/schema-output.js +52 -0
- package/dist/Config/schema-output.js.map +1 -0
- package/dist/Database/__tests__/exclude-schema-permissions.test.d.ts +2 -0
- package/dist/Database/__tests__/exclude-schema-permissions.test.d.ts.map +1 -0
- package/dist/Database/__tests__/exclude-schema-permissions.test.js +32 -0
- package/dist/Database/__tests__/exclude-schema-permissions.test.js.map +1 -0
- package/dist/Database/codeGenDatabaseProvider.d.ts +126 -2
- package/dist/Database/codeGenDatabaseProvider.d.ts.map +1 -1
- package/dist/Database/codeGenDatabaseProvider.js +203 -0
- package/dist/Database/codeGenDatabaseProvider.js.map +1 -1
- package/dist/Database/exclude-tables.d.ts +26 -0
- package/dist/Database/exclude-tables.d.ts.map +1 -0
- package/dist/Database/exclude-tables.js +38 -0
- package/dist/Database/exclude-tables.js.map +1 -0
- package/dist/Database/heal-schema-params.d.ts +33 -0
- package/dist/Database/heal-schema-params.d.ts.map +1 -0
- package/dist/Database/heal-schema-params.js +51 -0
- package/dist/Database/heal-schema-params.js.map +1 -0
- package/dist/Database/manage-metadata.d.ts +59 -0
- package/dist/Database/manage-metadata.d.ts.map +1 -1
- package/dist/Database/manage-metadata.js +157 -61
- package/dist/Database/manage-metadata.js.map +1 -1
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts +25 -35
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.d.ts.map +1 -1
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js +97 -51
- package/dist/Database/providers/postgresql/PostgreSQLCodeGenProvider.js.map +1 -1
- package/dist/Database/providers/postgresql/__tests__/SoftPrimaryKeyIndex.test.d.ts +2 -0
- package/dist/Database/providers/postgresql/__tests__/SoftPrimaryKeyIndex.test.d.ts.map +1 -0
- package/dist/Database/providers/postgresql/__tests__/SoftPrimaryKeyIndex.test.js +110 -0
- package/dist/Database/providers/postgresql/__tests__/SoftPrimaryKeyIndex.test.js.map +1 -0
- package/dist/Database/providers/postgresql/metadataSupportObjects.js +78 -10
- package/dist/Database/providers/postgresql/metadataSupportObjects.js.map +1 -1
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts +14 -0
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.d.ts.map +1 -1
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js +38 -0
- package/dist/Database/providers/sqlserver/SQLServerCodeGenProvider.js.map +1 -1
- package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.test.js +17 -0
- package/dist/Database/providers/sqlserver/__tests__/SQLServerCodeGenProvider.test.js.map +1 -1
- package/dist/Database/providers/sqlserver/__tests__/SoftPrimaryKeyIndex.test.d.ts +2 -0
- package/dist/Database/providers/sqlserver/__tests__/SoftPrimaryKeyIndex.test.d.ts.map +1 -0
- package/dist/Database/providers/sqlserver/__tests__/SoftPrimaryKeyIndex.test.js +195 -0
- package/dist/Database/providers/sqlserver/__tests__/SoftPrimaryKeyIndex.test.js.map +1 -0
- package/dist/Database/schema-filters.d.ts +23 -0
- package/dist/Database/schema-filters.d.ts.map +1 -0
- package/dist/Database/schema-filters.js +42 -0
- package/dist/Database/schema-filters.js.map +1 -0
- package/dist/Database/schema-scope.d.ts.map +1 -1
- package/dist/Database/schema-scope.js +4 -0
- package/dist/Database/schema-scope.js.map +1 -1
- package/dist/Database/sql_codegen.d.ts +33 -0
- package/dist/Database/sql_codegen.d.ts.map +1 -1
- package/dist/Database/sql_codegen.js +147 -56
- package/dist/Database/sql_codegen.js.map +1 -1
- package/dist/EntityNameScanner/EntityNameScanner.d.ts.map +1 -1
- package/dist/EntityNameScanner/EntityNameScanner.js +33 -2
- package/dist/EntityNameScanner/EntityNameScanner.js.map +1 -1
- package/dist/Manifest/GenerateClassRegistrationsManifest.d.ts +30 -4
- package/dist/Manifest/GenerateClassRegistrationsManifest.d.ts.map +1 -1
- package/dist/Manifest/GenerateClassRegistrationsManifest.js +175 -25
- package/dist/Manifest/GenerateClassRegistrationsManifest.js.map +1 -1
- package/dist/Misc/codegen-reporter.d.ts +3 -0
- package/dist/Misc/codegen-reporter.d.ts.map +1 -1
- package/dist/Misc/codegen-reporter.js +3 -0
- package/dist/Misc/codegen-reporter.js.map +1 -1
- package/dist/Misc/emit-stats.d.ts +28 -0
- package/dist/Misc/emit-stats.d.ts.map +1 -0
- package/dist/Misc/emit-stats.js +43 -0
- package/dist/Misc/emit-stats.js.map +1 -0
- package/dist/Misc/entity_subclasses_codegen.d.ts +42 -7
- package/dist/Misc/entity_subclasses_codegen.d.ts.map +1 -1
- package/dist/Misc/entity_subclasses_codegen.js +177 -52
- package/dist/Misc/entity_subclasses_codegen.js.map +1 -1
- package/dist/Misc/file-write.d.ts +15 -0
- package/dist/Misc/file-write.d.ts.map +1 -0
- package/dist/Misc/file-write.js +33 -0
- package/dist/Misc/file-write.js.map +1 -0
- package/dist/Misc/graphql_server_codegen.d.ts +12 -2
- package/dist/Misc/graphql_server_codegen.d.ts.map +1 -1
- package/dist/Misc/graphql_server_codegen.js +61 -12
- package/dist/Misc/graphql_server_codegen.js.map +1 -1
- package/dist/Misc/runCommand.d.ts +5 -0
- package/dist/Misc/runCommand.d.ts.map +1 -1
- package/dist/Misc/runCommand.js +43 -17
- package/dist/Misc/runCommand.js.map +1 -1
- package/dist/Misc/schema-emit.d.ts +123 -0
- package/dist/Misc/schema-emit.d.ts.map +1 -0
- package/dist/Misc/schema-emit.js +220 -0
- package/dist/Misc/schema-emit.js.map +1 -0
- package/dist/Misc/system_integrity.d.ts.map +1 -1
- package/dist/Misc/system_integrity.js +5 -0
- package/dist/Misc/system_integrity.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/runCodeGen.d.ts +20 -2
- package/dist/runCodeGen.d.ts.map +1 -1
- package/dist/runCodeGen.js +147 -21
- package/dist/runCodeGen.js.map +1 -1
- package/package.json +29 -29
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL side of the soft-primary-key index. The decisions about WHICH entities qualify and
|
|
3
|
+
* in what column order live in CodeGenDatabaseProvider as a template method — shared with SQL
|
|
4
|
+
* Server so they cannot drift. This pins the PG-visible output: quoting, the `IF NOT EXISTS`
|
|
5
|
+
* idempotency form, the lower-case name prefix, and the 63-character identifier limit.
|
|
6
|
+
*
|
|
7
|
+
* PG quoting: `QuoteIdentifier(x)` -> `"x"`; `QuoteSchema(s, o)` -> `"s"."o"`.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
10
|
+
import { EntityInfo } from '@memberjunction/core';
|
|
11
|
+
import { PostgreSQLCodeGenProvider } from '../PostgreSQLCodeGenProvider.js';
|
|
12
|
+
function createMockEntity(overrides = {}, fields = []) {
|
|
13
|
+
return new EntityInfo({
|
|
14
|
+
ID: 'entity-1',
|
|
15
|
+
Name: 'Totara Course Completions',
|
|
16
|
+
SchemaName: 'totara',
|
|
17
|
+
BaseTable: 'course_completions',
|
|
18
|
+
BaseTableCodeName: 'course_completions',
|
|
19
|
+
BaseView: 'vwcourse_completions',
|
|
20
|
+
IncludeInAPI: true,
|
|
21
|
+
AllowCreateAPI: true,
|
|
22
|
+
AllowUpdateAPI: true,
|
|
23
|
+
AllowDeleteAPI: true,
|
|
24
|
+
CascadeDeletes: false,
|
|
25
|
+
VirtualEntity: false,
|
|
26
|
+
EntityFields: fields,
|
|
27
|
+
...overrides,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
function softPKField(name, sequence, extra = {}) {
|
|
31
|
+
return {
|
|
32
|
+
ID: `spk-${name}`,
|
|
33
|
+
Name: name,
|
|
34
|
+
Type: 'varchar',
|
|
35
|
+
Length: 450,
|
|
36
|
+
Sequence: sequence,
|
|
37
|
+
IsPrimaryKey: true,
|
|
38
|
+
IsSoftPrimaryKey: true,
|
|
39
|
+
AllowsNull: false,
|
|
40
|
+
AllowUpdateAPI: true,
|
|
41
|
+
IsVirtual: false,
|
|
42
|
+
AutoIncrement: false,
|
|
43
|
+
DefaultValue: '',
|
|
44
|
+
RelatedEntityID: null,
|
|
45
|
+
...extra,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
describe('PostgreSQLCodeGenProvider — soft primary key index', () => {
|
|
49
|
+
let provider;
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
provider = new PostgreSQLCodeGenProvider();
|
|
52
|
+
});
|
|
53
|
+
it('emits a quoted, schema-qualified composite index in ordinal order', () => {
|
|
54
|
+
const entity = createMockEntity({}, [softPKField('user_id', 2), softPKField('course_id', 1)]);
|
|
55
|
+
const sql = provider.generateSoftPrimaryKeyIndex(entity);
|
|
56
|
+
expect(sql.length).toBe(1);
|
|
57
|
+
expect(sql[0]).toContain('"totara"."course_completions"');
|
|
58
|
+
expect(sql[0]).toContain('("course_id", "user_id")');
|
|
59
|
+
});
|
|
60
|
+
it('uses the lower-case PG name convention', () => {
|
|
61
|
+
const sql = provider.generateSoftPrimaryKeyIndex(createMockEntity({}, [softPKField('course_id', 1)]))[0];
|
|
62
|
+
expect(sql).toContain('"idx_auto_mj_softpk_course_completions"');
|
|
63
|
+
});
|
|
64
|
+
it('is idempotent via CREATE INDEX IF NOT EXISTS', () => {
|
|
65
|
+
const sql = provider.generateSoftPrimaryKeyIndex(createMockEntity({}, [softPKField('course_id', 1)]))[0];
|
|
66
|
+
expect(sql).toContain('CREATE INDEX IF NOT EXISTS');
|
|
67
|
+
expect(sql).not.toMatch(/CREATE\s+UNIQUE/i);
|
|
68
|
+
});
|
|
69
|
+
it('truncates the index name to 63 characters', () => {
|
|
70
|
+
const long = 'very_long_table_name_segment_padding_to_force_truncation_of_identifier';
|
|
71
|
+
const entity = createMockEntity({ BaseTable: long, BaseTableCodeName: long }, [
|
|
72
|
+
softPKField('course_id', 1),
|
|
73
|
+
]);
|
|
74
|
+
const sql = provider.generateSoftPrimaryKeyIndex(entity)[0];
|
|
75
|
+
const name = sql.match(/IF NOT EXISTS "([^"]+)"/)[1];
|
|
76
|
+
expect(name.length).toBeLessThanOrEqual(63);
|
|
77
|
+
});
|
|
78
|
+
it('refuses an unbounded key column rather than creating an index that fails at INSERT time', () => {
|
|
79
|
+
// PG accepts `text` in a btree key and then errors on whichever row exceeds ~1/8 of a
|
|
80
|
+
// page — long after the index was created, and on a row nobody can predict. Keeping the
|
|
81
|
+
// refusal at generation time means the message names the column instead.
|
|
82
|
+
const entity = createMockEntity({}, [softPKField('payload_key', 1, { Length: -1 })]);
|
|
83
|
+
const sql = provider.generateSoftPrimaryKeyIndex(entity);
|
|
84
|
+
expect(sql.length).toBe(1);
|
|
85
|
+
expect(sql[0]).not.toContain('CREATE INDEX');
|
|
86
|
+
expect(sql[0]).toContain('SKIPPED');
|
|
87
|
+
expect(sql[0]).toContain('payload_key');
|
|
88
|
+
});
|
|
89
|
+
it('emits nothing for an ordinary entity with a real primary key', () => {
|
|
90
|
+
const entity = createMockEntity({}, [
|
|
91
|
+
{
|
|
92
|
+
ID: 'pk-1',
|
|
93
|
+
Name: 'id',
|
|
94
|
+
Type: 'uuid',
|
|
95
|
+
Length: 16,
|
|
96
|
+
Sequence: 1,
|
|
97
|
+
IsPrimaryKey: true,
|
|
98
|
+
IsSoftPrimaryKey: false,
|
|
99
|
+
AllowsNull: false,
|
|
100
|
+
AllowUpdateAPI: true,
|
|
101
|
+
IsVirtual: false,
|
|
102
|
+
AutoIncrement: false,
|
|
103
|
+
DefaultValue: '',
|
|
104
|
+
RelatedEntityID: null,
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
expect(provider.generateSoftPrimaryKeyIndex(entity)).toEqual([]);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=SoftPrimaryKeyIndex.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SoftPrimaryKeyIndex.test.js","sourceRoot":"","sources":["../../../../../src/Database/providers/postgresql/__tests__/SoftPrimaryKeyIndex.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -195,9 +195,11 @@ FROM __mj."vwSQLTablesAndEntities" e
|
|
|
195
195
|
-- ----------------------------------------------------------------------------
|
|
196
196
|
DROP FUNCTION IF EXISTS __mj."spUpdateExistingEntityFieldsFromSchema"(TEXT);
|
|
197
197
|
DROP FUNCTION IF EXISTS __mj."spUpdateExistingEntityFieldsFromSchema"(TEXT, TEXT);
|
|
198
|
+
DROP FUNCTION IF EXISTS __mj."spUpdateExistingEntityFieldsFromSchema"(TEXT, TEXT, TEXT);
|
|
198
199
|
CREATE OR REPLACE FUNCTION __mj."spUpdateExistingEntityFieldsFromSchema"(
|
|
199
200
|
p_ExcludedSchemaNames TEXT,
|
|
200
|
-
p_EntityIDs TEXT DEFAULT NULL
|
|
201
|
+
p_EntityIDs TEXT DEFAULT NULL,
|
|
202
|
+
p_IncludedSchemaNames TEXT DEFAULT NULL
|
|
201
203
|
)
|
|
202
204
|
RETURNS TABLE(
|
|
203
205
|
"EntityID" UUID,
|
|
@@ -225,6 +227,7 @@ RETURNS TABLE(
|
|
|
225
227
|
LANGUAGE plpgsql AS $func$
|
|
226
228
|
DECLARE
|
|
227
229
|
v_is_scoped BOOLEAN := FALSE;
|
|
230
|
+
v_has_include BOOLEAN := FALSE;
|
|
228
231
|
BEGIN
|
|
229
232
|
-- [Large Schema Series] Force hash/merge joins for the catalog-introspection
|
|
230
233
|
-- reconciliation below. In the scoped Pass-2 codegen path this SP runs AFTER
|
|
@@ -241,6 +244,13 @@ BEGIN
|
|
|
241
244
|
FROM unnest(string_to_array(COALESCE(p_ExcludedSchemaNames, ''), ',')) AS s
|
|
242
245
|
WHERE TRIM(s) <> '';
|
|
243
246
|
|
|
247
|
+
DROP TABLE IF EXISTS _uef_included;
|
|
248
|
+
CREATE TEMP TABLE _uef_included AS
|
|
249
|
+
SELECT TRIM(s) AS schema_name
|
|
250
|
+
FROM unnest(string_to_array(COALESCE(p_IncludedSchemaNames, ''), ',')) AS s
|
|
251
|
+
WHERE TRIM(s) <> '';
|
|
252
|
+
v_has_include := EXISTS (SELECT 1 FROM _uef_included);
|
|
253
|
+
|
|
244
254
|
DROP TABLE IF EXISTS _uef_scope;
|
|
245
255
|
CREATE TEMP TABLE _uef_scope AS
|
|
246
256
|
SELECT DISTINCT TRIM(v)::uuid AS entity_id
|
|
@@ -355,6 +365,7 @@ BEGIN
|
|
|
355
365
|
LEFT JOIN _uef_excluded ex ON e."SchemaName"::text = ex.schema_name
|
|
356
366
|
WHERE e."VirtualEntity" = FALSE
|
|
357
367
|
AND ex.schema_name IS NULL
|
|
368
|
+
AND (NOT v_has_include OR e."SchemaName"::text IN (SELECT i.schema_name FROM _uef_included i))
|
|
358
369
|
AND (NOT v_is_scoped OR e."ID" IN (SELECT s.entity_id FROM _uef_scope s))
|
|
359
370
|
) chg
|
|
360
371
|
-- Single source of truth for "this row changed": derived from the two flag columns computed
|
|
@@ -414,6 +425,7 @@ BEGIN
|
|
|
414
425
|
DROP TABLE IF EXISTS _uef_filtered;
|
|
415
426
|
DROP TABLE IF EXISTS _uef_scope;
|
|
416
427
|
DROP TABLE IF EXISTS _uef_excluded;
|
|
428
|
+
DROP TABLE IF EXISTS _uef_included;
|
|
417
429
|
END;
|
|
418
430
|
$func$;
|
|
419
431
|
|
|
@@ -422,7 +434,11 @@ $func$;
|
|
|
422
434
|
-- (consumer reads "Name" from result rows)
|
|
423
435
|
-- ----------------------------------------------------------------------------
|
|
424
436
|
DROP FUNCTION IF EXISTS __mj."spUpdateExistingEntitiesFromSchema"(TEXT);
|
|
425
|
-
|
|
437
|
+
DROP FUNCTION IF EXISTS __mj."spUpdateExistingEntitiesFromSchema"(TEXT, TEXT);
|
|
438
|
+
CREATE OR REPLACE FUNCTION __mj."spUpdateExistingEntitiesFromSchema"(
|
|
439
|
+
p_ExcludedSchemaNames TEXT,
|
|
440
|
+
p_IncludedSchemaNames TEXT DEFAULT NULL
|
|
441
|
+
)
|
|
426
442
|
RETURNS TABLE(
|
|
427
443
|
"ID" UUID,
|
|
428
444
|
"Name" TEXT,
|
|
@@ -432,7 +448,16 @@ RETURNS TABLE(
|
|
|
432
448
|
"SchemaName" TEXT
|
|
433
449
|
)
|
|
434
450
|
LANGUAGE plpgsql AS $func$
|
|
451
|
+
DECLARE
|
|
452
|
+
v_has_include BOOLEAN := FALSE;
|
|
435
453
|
BEGIN
|
|
454
|
+
DROP TABLE IF EXISTS _ues_included;
|
|
455
|
+
CREATE TEMP TABLE _ues_included AS
|
|
456
|
+
SELECT TRIM(s) AS schema_name
|
|
457
|
+
FROM unnest(string_to_array(COALESCE(p_IncludedSchemaNames, ''), ',')) AS s
|
|
458
|
+
WHERE TRIM(s) <> '';
|
|
459
|
+
v_has_include := EXISTS (SELECT 1 FROM _ues_included);
|
|
460
|
+
|
|
436
461
|
DROP TABLE IF EXISTS _ues_filtered;
|
|
437
462
|
CREATE TEMP TABLE _ues_filtered AS
|
|
438
463
|
SELECT
|
|
@@ -448,6 +473,7 @@ BEGIN
|
|
|
448
473
|
ON sq."SchemaName"::text = TRIM(ex.v)
|
|
449
474
|
WHERE e."VirtualEntity" = FALSE
|
|
450
475
|
AND ex.v IS NULL
|
|
476
|
+
AND (NOT v_has_include OR sq."SchemaName"::text IN (SELECT i.schema_name FROM _ues_included i))
|
|
451
477
|
AND COALESCE(CASE WHEN e."AutoUpdateDescription" THEN sq."EntityDescription" ELSE e."Description" END, '')
|
|
452
478
|
<> COALESCE(e."Description", '');
|
|
453
479
|
|
|
@@ -463,6 +489,7 @@ BEGIN
|
|
|
463
489
|
FROM _ues_filtered fr;
|
|
464
490
|
|
|
465
491
|
DROP TABLE IF EXISTS _ues_filtered;
|
|
492
|
+
DROP TABLE IF EXISTS _ues_included;
|
|
466
493
|
END;
|
|
467
494
|
$func$;
|
|
468
495
|
|
|
@@ -474,9 +501,11 @@ $func$;
|
|
|
474
501
|
-- ----------------------------------------------------------------------------
|
|
475
502
|
DROP FUNCTION IF EXISTS __mj."spDeleteUnneededEntityFields"(TEXT);
|
|
476
503
|
DROP FUNCTION IF EXISTS __mj."spDeleteUnneededEntityFields"(TEXT, TEXT);
|
|
504
|
+
DROP FUNCTION IF EXISTS __mj."spDeleteUnneededEntityFields"(TEXT, TEXT, TEXT);
|
|
477
505
|
CREATE OR REPLACE FUNCTION __mj."spDeleteUnneededEntityFields"(
|
|
478
506
|
p_ExcludedSchemaNames TEXT,
|
|
479
|
-
p_EntityIDs TEXT DEFAULT NULL
|
|
507
|
+
p_EntityIDs TEXT DEFAULT NULL,
|
|
508
|
+
p_IncludedSchemaNames TEXT DEFAULT NULL
|
|
480
509
|
)
|
|
481
510
|
RETURNS TABLE(
|
|
482
511
|
"ID" UUID,
|
|
@@ -487,6 +516,7 @@ RETURNS TABLE(
|
|
|
487
516
|
LANGUAGE plpgsql AS $func$
|
|
488
517
|
DECLARE
|
|
489
518
|
v_is_scoped BOOLEAN := FALSE;
|
|
519
|
+
v_has_include BOOLEAN := FALSE;
|
|
490
520
|
BEGIN
|
|
491
521
|
-- [Large Schema Series] Force hash/merge joins for this reconciliation.
|
|
492
522
|
-- This SP runs in codegen Pass 2, immediately AFTER the SQL-generation phase
|
|
@@ -510,6 +540,13 @@ BEGIN
|
|
|
510
540
|
WHERE TRIM(v) ~* '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$';
|
|
511
541
|
v_is_scoped := EXISTS (SELECT 1 FROM _del_scope);
|
|
512
542
|
|
|
543
|
+
DROP TABLE IF EXISTS _del_included;
|
|
544
|
+
CREATE TEMP TABLE _del_included AS
|
|
545
|
+
SELECT TRIM(s) AS schema_name
|
|
546
|
+
FROM unnest(string_to_array(COALESCE(p_IncludedSchemaNames, ''), ',')) AS s
|
|
547
|
+
WHERE TRIM(s) <> '';
|
|
548
|
+
v_has_include := EXISTS (SELECT 1 FROM _del_included);
|
|
549
|
+
|
|
513
550
|
-- External-data-source entities must be excluded from the field prune (they are remote; they have no
|
|
514
551
|
-- physical table/view, so the orphan join would match every external EntityField and delete it). But
|
|
515
552
|
-- EDS is not yet ported to PostgreSQL, so vwEntities has no "ExternalDataSourceID" column here, and a
|
|
@@ -541,6 +578,7 @@ BEGIN
|
|
|
541
578
|
WHERE e."VirtualEntity" = FALSE
|
|
542
579
|
AND ef."EntityID" NOT IN (SELECT entity_id FROM _del_ext_entities) -- exclude external-data-source entities (see note above)
|
|
543
580
|
AND ex.v IS NULL
|
|
581
|
+
AND (NOT v_has_include OR e."SchemaName"::text IN (SELECT i.schema_name FROM _del_included i))
|
|
544
582
|
AND (NOT v_is_scoped OR ef."EntityID" IN (SELECT s.entity_id FROM _del_scope s));
|
|
545
583
|
-- [Large Schema Series] ANALYZE so the planner has real cardinalities for the
|
|
546
584
|
-- orphan join below. Without stats it estimates rows=1 and nested-loops.
|
|
@@ -582,6 +620,7 @@ BEGIN
|
|
|
582
620
|
DROP TABLE IF EXISTS _del_actual;
|
|
583
621
|
DROP TABLE IF EXISTS _del_ef;
|
|
584
622
|
DROP TABLE IF EXISTS _del_scope;
|
|
623
|
+
DROP TABLE IF EXISTS _del_included;
|
|
585
624
|
END;
|
|
586
625
|
$func$;
|
|
587
626
|
|
|
@@ -589,7 +628,11 @@ $func$;
|
|
|
589
628
|
-- 6. spSetDefaultColumnWidthWhereNeeded
|
|
590
629
|
-- ----------------------------------------------------------------------------
|
|
591
630
|
DROP FUNCTION IF EXISTS __mj."spSetDefaultColumnWidthWhereNeeded"(TEXT);
|
|
592
|
-
|
|
631
|
+
DROP FUNCTION IF EXISTS __mj."spSetDefaultColumnWidthWhereNeeded"(TEXT, TEXT);
|
|
632
|
+
CREATE OR REPLACE FUNCTION __mj."spSetDefaultColumnWidthWhereNeeded"(
|
|
633
|
+
p_ExcludedSchemaNames TEXT,
|
|
634
|
+
p_IncludedSchemaNames TEXT DEFAULT NULL
|
|
635
|
+
)
|
|
593
636
|
RETURNS void
|
|
594
637
|
LANGUAGE plpgsql AS $func$
|
|
595
638
|
BEGIN
|
|
@@ -608,7 +651,13 @@ BEGIN
|
|
|
608
651
|
ON e."SchemaName"::text = TRIM(ex.v)
|
|
609
652
|
WHERE ef."EntityID" = e."ID"
|
|
610
653
|
AND ef."DefaultColumnWidth" IS NULL
|
|
611
|
-
AND ex.v IS NULL
|
|
654
|
+
AND ex.v IS NULL
|
|
655
|
+
AND (
|
|
656
|
+
COALESCE(p_IncludedSchemaNames, '') = ''
|
|
657
|
+
OR e."SchemaName"::text IN (
|
|
658
|
+
SELECT TRIM(s) FROM unnest(string_to_array(p_IncludedSchemaNames, ',')) AS s WHERE TRIM(s) <> ''
|
|
659
|
+
)
|
|
660
|
+
);
|
|
612
661
|
END;
|
|
613
662
|
$func$;
|
|
614
663
|
|
|
@@ -617,9 +666,15 @@ $func$;
|
|
|
617
666
|
-- (consumer caches the returned SchemaInfo rows)
|
|
618
667
|
-- ----------------------------------------------------------------------------
|
|
619
668
|
DROP FUNCTION IF EXISTS __mj."spUpdateSchemaInfoFromDatabase"(TEXT);
|
|
620
|
-
|
|
669
|
+
DROP FUNCTION IF EXISTS __mj."spUpdateSchemaInfoFromDatabase"(TEXT, TEXT);
|
|
670
|
+
CREATE OR REPLACE FUNCTION __mj."spUpdateSchemaInfoFromDatabase"(
|
|
671
|
+
p_ExcludedSchemaNames TEXT DEFAULT NULL,
|
|
672
|
+
p_IncludedSchemaNames TEXT DEFAULT NULL
|
|
673
|
+
)
|
|
621
674
|
RETURNS SETOF __mj."SchemaInfo"
|
|
622
675
|
LANGUAGE plpgsql AS $func$
|
|
676
|
+
DECLARE
|
|
677
|
+
v_has_include BOOLEAN := FALSE;
|
|
623
678
|
BEGIN
|
|
624
679
|
DROP TABLE IF EXISTS _usi_excluded;
|
|
625
680
|
CREATE TEMP TABLE _usi_excluded AS
|
|
@@ -627,13 +682,21 @@ BEGIN
|
|
|
627
682
|
FROM unnest(string_to_array(COALESCE(p_ExcludedSchemaNames, ''), ',')) AS s
|
|
628
683
|
WHERE TRIM(s) <> '';
|
|
629
684
|
|
|
685
|
+
DROP TABLE IF EXISTS _usi_included;
|
|
686
|
+
CREATE TEMP TABLE _usi_included AS
|
|
687
|
+
SELECT TRIM(s) AS schema_name
|
|
688
|
+
FROM unnest(string_to_array(COALESCE(p_IncludedSchemaNames, ''), ',')) AS s
|
|
689
|
+
WHERE TRIM(s) <> '';
|
|
690
|
+
v_has_include := EXISTS (SELECT 1 FROM _usi_included);
|
|
691
|
+
|
|
630
692
|
UPDATE __mj."SchemaInfo" si SET
|
|
631
693
|
"Description" = ss."SchemaDescription",
|
|
632
694
|
"__mj_UpdatedAt" = now()
|
|
633
695
|
FROM __mj."vwSQLSchemas" ss
|
|
634
696
|
WHERE si."SchemaName" = ss."SchemaName"
|
|
635
697
|
AND (si."Description" IS NULL OR si."Description" <> COALESCE(ss."SchemaDescription", ''))
|
|
636
|
-
AND ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
698
|
+
AND ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
699
|
+
AND (NOT v_has_include OR ss."SchemaName" IN (SELECT i.schema_name FROM _usi_included i));
|
|
637
700
|
|
|
638
701
|
INSERT INTO __mj."SchemaInfo" ("SchemaName", "EntityIDMin", "EntityIDMax", "Comments", "Description")
|
|
639
702
|
SELECT
|
|
@@ -645,7 +708,8 @@ BEGIN
|
|
|
645
708
|
FROM __mj."vwSQLSchemas" ss
|
|
646
709
|
LEFT JOIN __mj."SchemaInfo" si ON ss."SchemaName" = si."SchemaName"
|
|
647
710
|
WHERE si."ID" IS NULL
|
|
648
|
-
AND ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
711
|
+
AND ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
712
|
+
AND (NOT v_has_include OR ss."SchemaName" IN (SELECT i.schema_name FROM _usi_included i));
|
|
649
713
|
|
|
650
714
|
-- Backfill the case-stable canonical schema name from the installed Open App record.
|
|
651
715
|
-- SchemaInfo.SchemaName is the physical (lowercased) name on PG; the app record carries
|
|
@@ -657,15 +721,19 @@ BEGIN
|
|
|
657
721
|
FROM __mj."OpenApp" app
|
|
658
722
|
WHERE LOWER(si."SchemaName") = LOWER(app."SchemaName")
|
|
659
723
|
AND si."CanonicalSchemaName" IS NULL
|
|
660
|
-
AND app."SchemaName" IS NOT NULL
|
|
724
|
+
AND app."SchemaName" IS NOT NULL
|
|
725
|
+
AND si."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
726
|
+
AND (NOT v_has_include OR si."SchemaName" IN (SELECT i.schema_name FROM _usi_included i));
|
|
661
727
|
|
|
662
728
|
RETURN QUERY
|
|
663
729
|
SELECT si.*
|
|
664
730
|
FROM __mj."SchemaInfo" si
|
|
665
731
|
INNER JOIN __mj."vwSQLSchemas" ss ON si."SchemaName" = ss."SchemaName"
|
|
666
|
-
WHERE ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
732
|
+
WHERE ss."SchemaName" NOT IN (SELECT x.schema_name FROM _usi_excluded x)
|
|
733
|
+
AND (NOT v_has_include OR ss."SchemaName" IN (SELECT i.schema_name FROM _usi_included i));
|
|
667
734
|
|
|
668
735
|
DROP TABLE IF EXISTS _usi_excluded;
|
|
736
|
+
DROP TABLE IF EXISTS _usi_included;
|
|
669
737
|
END;
|
|
670
738
|
$func$;
|
|
671
739
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadataSupportObjects.js","sourceRoot":"","sources":["../../../../src/Database/providers/postgresql/metadataSupportObjects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,8BAA8B,CAAC,YAAoB;IAC/D,OAAO,4BAA4B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACzE,CAAC;AACD,MAAM,4BAA4B,GAAW,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"metadataSupportObjects.js","sourceRoot":"","sources":["../../../../src/Database/providers/postgresql/metadataSupportObjects.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,8BAA8B,CAAC,YAAoB;IAC/D,OAAO,4BAA4B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACzE,CAAC;AACD,MAAM,4BAA4B,GAAW,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkyBtD,CAAC"}
|
|
@@ -122,6 +122,18 @@ export declare class SQLServerCodeGenProvider extends CodeGenDatabaseProvider {
|
|
|
122
122
|
protected tableToken(entity: EntityInfo): string;
|
|
123
123
|
protected columnToken(f: EntityFieldInfo): string;
|
|
124
124
|
protected formatIndexStatement(entity: EntityInfo, f: EntityFieldInfo, indexName: string): string;
|
|
125
|
+
protected softPrimaryKeyIndexPrefix(): string;
|
|
126
|
+
/**
|
|
127
|
+
* SQL Server refuses `NVARCHAR(MAX)` (and the other LOB types) as an index KEY column
|
|
128
|
+
* outright, regardless of the data it holds. `Length === -1` is how MJ spells MAX.
|
|
129
|
+
*
|
|
130
|
+
* Note the trap this closes: a source schema that declares a key column with no explicit
|
|
131
|
+
* length maps to `NVARCHAR(MAX)`, and the index then vanishes without complaint. The base
|
|
132
|
+
* class turns that into a comment in the generated file naming the offending columns,
|
|
133
|
+
* rather than an empty one.
|
|
134
|
+
*/
|
|
135
|
+
protected isIndexableKeyColumn(f: EntityFieldInfo): boolean;
|
|
136
|
+
protected formatCompositeIndexStatement(entity: EntityInfo, fields: EntityFieldInfo[], indexName: string): string;
|
|
125
137
|
/**
|
|
126
138
|
* Generates SQL Server full-text search infrastructure for an entity, conditionally
|
|
127
139
|
* producing up to three components based on entity metadata flags:
|
|
@@ -222,6 +234,8 @@ export declare class SQLServerCodeGenProvider extends CodeGenDatabaseProvider {
|
|
|
222
234
|
*/
|
|
223
235
|
generateTimestampColumns(schema: string, tableName: string): string;
|
|
224
236
|
/** @inheritdoc */
|
|
237
|
+
getRoutineNamesBySchemaSQL(schemas: string[]): string;
|
|
238
|
+
/** @inheritdoc */
|
|
225
239
|
getCRUDRoutineName(entity: EntityInfo, type: CRUDType): string;
|
|
226
240
|
/** @inheritdoc */
|
|
227
241
|
generateSQLFileHeader(entity: EntityInfo, itemName: string): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLServerCodeGenProvider.d.ts","sourceRoot":"","sources":["../../../../src/Database/providers/sqlserver/SQLServerCodeGenProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAA0C,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EACH,uBAAuB,EACvB,QAAQ,EACR,yBAAyB,EACzB,oBAAoB,EACpB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EACnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAoB,gBAAgB,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAc7F;;;;;;;;;;GAUG;AACH,qBACa,wBAAyB,SAAQ,uBAAuB;IACjE,kBAAkB;IAClB,IAAI,OAAO,IAAI,UAAU,CAExB;IAED,kBAAkB;IAClB,IAAI,WAAW,IAAI,gBAAgB,CAElC;IAED;;;;;;;;;;OAUG;IACG,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA8BlD;;;;;OAKG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAiBlH;;;;;;OAMG;IACH,gBAAgB,CAAC,OAAO,EAAE,yBAAyB,GAAG,MAAM;IA8B5D;;;;;;;;;OASG;IACH,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,sBAAsB,EAAE,GAAG,MAAM;IAkB1G;;;;;;;OAOG;IACH,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAO/F,gFAAgF;IAChF,kCAAkC,IAAI,MAAM;IAI5C;;;;;OAKG;IACH,sCAAsC,IAAI,MAAM;IAMhD;;;;;;;;;;;;;OAaG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAwJ9C;;;;;;;OAOG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IA4D9C;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IA6DlE;;;;;;OAMG;IACH,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAgCpD;;;;;OAKG;IACH,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM;IAIhD,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM;IAIjD,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"SQLServerCodeGenProvider.d.ts","sourceRoot":"","sources":["../../../../src/Database/providers/sqlserver/SQLServerCodeGenProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -541,6 +541,34 @@ IF NOT EXISTS (
|
|
|
541
541
|
AND object_id = OBJECT_ID('[${entity.SchemaName}].[${entity.BaseTable}]')
|
|
542
542
|
)
|
|
543
543
|
CREATE INDEX ${indexName} ON [${entity.SchemaName}].[${entity.BaseTable}] ([${f.Name}]);`;
|
|
544
|
+
}
|
|
545
|
+
softPrimaryKeyIndexPrefix() {
|
|
546
|
+
return 'IDX_AUTO_MJ_SOFTPK_';
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* SQL Server refuses `NVARCHAR(MAX)` (and the other LOB types) as an index KEY column
|
|
550
|
+
* outright, regardless of the data it holds. `Length === -1` is how MJ spells MAX.
|
|
551
|
+
*
|
|
552
|
+
* Note the trap this closes: a source schema that declares a key column with no explicit
|
|
553
|
+
* length maps to `NVARCHAR(MAX)`, and the index then vanishes without complaint. The base
|
|
554
|
+
* class turns that into a comment in the generated file naming the offending columns,
|
|
555
|
+
* rather than an empty one.
|
|
556
|
+
*/
|
|
557
|
+
isIndexableKeyColumn(f) {
|
|
558
|
+
return f.Length !== -1;
|
|
559
|
+
}
|
|
560
|
+
formatCompositeIndexStatement(entity, fields, indexName) {
|
|
561
|
+
const cols = fields.map(f => `[${f.Name}]`).join(', ');
|
|
562
|
+
return `-- Index for the soft primary key (${fields.map(f => f.Name).join(', ')}) in table ${entity.BaseTable}.
|
|
563
|
+
-- The key is metadata-only — no PRIMARY KEY constraint — so without this the per-record
|
|
564
|
+
-- existence check on the create path scans the whole table.
|
|
565
|
+
IF NOT EXISTS (
|
|
566
|
+
SELECT 1
|
|
567
|
+
FROM sys.indexes
|
|
568
|
+
WHERE name = '${indexName}'
|
|
569
|
+
AND object_id = OBJECT_ID('[${entity.SchemaName}].[${entity.BaseTable}]')
|
|
570
|
+
)
|
|
571
|
+
CREATE INDEX ${indexName} ON [${entity.SchemaName}].[${entity.BaseTable}] (${cols});`;
|
|
544
572
|
}
|
|
545
573
|
// ─── FULL-TEXT SEARCH ────────────────────────────────────────────────
|
|
546
574
|
/**
|
|
@@ -1135,6 +1163,16 @@ GO
|
|
|
1135
1163
|
// ─── PARAMETER / FIELD HELPERS ───────────────────────────────────────
|
|
1136
1164
|
// ─── ROUTINE NAMING ──────────────────────────────────────────────────
|
|
1137
1165
|
/** @inheritdoc */
|
|
1166
|
+
getRoutineNamesBySchemaSQL(schemas) {
|
|
1167
|
+
if (schemas.length === 0)
|
|
1168
|
+
return '';
|
|
1169
|
+
const inList = schemas.map(s => `'${s.replace(/'/g, "''")}'`).join(', ');
|
|
1170
|
+
return `SELECT s.name AS schema_name, p.name AS routine_name
|
|
1171
|
+
FROM sys.procedures p
|
|
1172
|
+
INNER JOIN sys.schemas s ON s.schema_id = p.schema_id
|
|
1173
|
+
WHERE s.name IN (${inList})`;
|
|
1174
|
+
}
|
|
1175
|
+
/** @inheritdoc */
|
|
1138
1176
|
getCRUDRoutineName(entity, type) {
|
|
1139
1177
|
switch (type) {
|
|
1140
1178
|
case 'Create':
|