@memberjunction/core-entities-server 6.2.0-edge.5 → 6.2.0-edge.6
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/dist/custom/MJAIAgentSessionEntityServer.server.d.ts +9 -26
- package/dist/custom/MJAIAgentSessionEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJAIAgentSessionEntityServer.server.js +21 -44
- package/dist/custom/MJAIAgentSessionEntityServer.server.js.map +1 -1
- package/dist/custom/MJComponentEntityServer.server.d.ts +9 -0
- package/dist/custom/MJComponentEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJComponentEntityServer.server.js +25 -1
- package/dist/custom/MJComponentEntityServer.server.js.map +1 -1
- package/dist/custom/MJConversationEntityServer.server.d.ts +13 -0
- package/dist/custom/MJConversationEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJConversationEntityServer.server.js +33 -0
- package/dist/custom/MJConversationEntityServer.server.js.map +1 -0
- package/dist/custom/MJDashboardEntityServer.server.d.ts +14 -0
- package/dist/custom/MJDashboardEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJDashboardEntityServer.server.js +38 -0
- package/dist/custom/MJDashboardEntityServer.server.js.map +1 -0
- package/dist/custom/MJDuplicateRunEntityServer.server.d.ts +34 -2
- package/dist/custom/MJDuplicateRunEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJDuplicateRunEntityServer.server.js +103 -23
- package/dist/custom/MJDuplicateRunEntityServer.server.js.map +1 -1
- package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.d.ts +73 -0
- package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.d.ts.map +1 -0
- package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.js +391 -0
- package/dist/custom/MJEntityAlternateBaseViewEntityServer.server.js.map +1 -0
- package/dist/custom/MJEntityFieldPermissionEntityServer.server.d.ts +96 -22
- package/dist/custom/MJEntityFieldPermissionEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJEntityFieldPermissionEntityServer.server.js +239 -55
- package/dist/custom/MJEntityFieldPermissionEntityServer.server.js.map +1 -1
- package/dist/custom/MJQueryEntityServer.server.d.ts +8 -0
- package/dist/custom/MJQueryEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJQueryEntityServer.server.js +45 -2
- package/dist/custom/MJQueryEntityServer.server.js.map +1 -1
- package/dist/custom/MJUserRoleEntityServer.server.d.ts +74 -7
- package/dist/custom/MJUserRoleEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJUserRoleEntityServer.server.js +206 -20
- package/dist/custom/MJUserRoleEntityServer.server.js.map +1 -1
- package/dist/custom/MJUserViewEntityServer.server.d.ts +17 -1
- package/dist/custom/MJUserViewEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJUserViewEntityServer.server.js +95 -7
- package/dist/custom/MJUserViewEntityServer.server.js.map +1 -1
- package/dist/custom/MJVectorIndexEntityServer.server.d.ts +2 -0
- package/dist/custom/MJVectorIndexEntityServer.server.d.ts.map +1 -1
- package/dist/custom/MJVectorIndexEntityServer.server.js +33 -0
- package/dist/custom/MJVectorIndexEntityServer.server.js.map +1 -1
- package/dist/custom/anonymousOwnershipKeyGuard.d.ts +42 -0
- package/dist/custom/anonymousOwnershipKeyGuard.d.ts.map +1 -0
- package/dist/custom/anonymousOwnershipKeyGuard.js +36 -0
- package/dist/custom/anonymousOwnershipKeyGuard.js.map +1 -0
- package/dist/custom/approvalStamp.d.ts +37 -0
- package/dist/custom/approvalStamp.d.ts.map +1 -0
- package/dist/custom/approvalStamp.js +67 -0
- package/dist/custom/approvalStamp.js.map +1 -0
- package/dist/custom/fieldPermissionAccess.d.ts +31 -0
- package/dist/custom/fieldPermissionAccess.d.ts.map +1 -0
- package/dist/custom/fieldPermissionAccess.js +38 -0
- package/dist/custom/fieldPermissionAccess.js.map +1 -0
- package/dist/custom/fieldPermissionReconciler.d.ts.map +1 -1
- package/dist/custom/fieldPermissionReconciler.js +12 -2
- package/dist/custom/fieldPermissionReconciler.js.map +1 -1
- package/dist/custom/query-extraction/resolve.d.ts.map +1 -1
- package/dist/custom/query-extraction/resolve.js +25 -7
- package/dist/custom/query-extraction/resolve.js.map +1 -1
- package/dist/custom/query-extraction/sync.d.ts +1 -1
- package/dist/custom/query-extraction/sync.d.ts.map +1 -1
- package/dist/custom/query-extraction/sync.js +84 -21
- package/dist/custom/query-extraction/sync.js.map +1 -1
- package/dist/custom/query-extraction/types.d.ts +4 -0
- package/dist/custom/query-extraction/types.d.ts.map +1 -1
- package/dist/custom/systemUserGuardState.d.ts +73 -0
- package/dist/custom/systemUserGuardState.d.ts.map +1 -0
- package/dist/custom/systemUserGuardState.js +161 -0
- package/dist/custom/systemUserGuardState.js.map +1 -0
- package/dist/custom/template-extraction/parser.js +5 -2
- package/dist/custom/template-extraction/parser.js.map +1 -1
- package/dist/custom/template-extraction/types.d.ts +1 -1
- package/dist/custom/template-extraction/types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/package.json +30 -30
|
@@ -5,10 +5,42 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { BaseEntity, LogError, LogStatus, PotentialDuplicateRequest, RunView } from "@memberjunction/core";
|
|
8
|
-
import { RegisterClass, GetGlobalObjectStore } from "@memberjunction/global";
|
|
8
|
+
import { RegisterClass, GetGlobalObjectStore, EscapeSQLString, UUIDsEqual } from "@memberjunction/global";
|
|
9
9
|
import { MJDuplicateRunEntity } from "@memberjunction/core-entities";
|
|
10
10
|
import { DuplicateRecordDetector } from "@memberjunction/ai-vector-dupe";
|
|
11
11
|
const PIPELINE_PROGRESS_TOPIC = 'PIPELINE_PROGRESS';
|
|
12
|
+
/** Entity Document Type name of documents built for duplicate detection. */
|
|
13
|
+
const RECORD_DUPLICATE_DOCUMENT_TYPE = 'Record Duplicate';
|
|
14
|
+
/**
|
|
15
|
+
* Chooses the default entity document for a new duplicate run that was created without one, from
|
|
16
|
+
* the entity's active documents ordered newest-updated first. A 'Record Duplicate' document wins
|
|
17
|
+
* over any other type: an entity can also have a Search document (MJ ships one for several core
|
|
18
|
+
* entities), whose template and vectors are built for search, not for matching records. Without a
|
|
19
|
+
* 'Record Duplicate' document, the newest active document is used.
|
|
20
|
+
*
|
|
21
|
+
* Only callers that name no document get this default; the Duplicates tab always names the one
|
|
22
|
+
* the user picked.
|
|
23
|
+
*
|
|
24
|
+
* @param activeDocuments the entity's active documents, newest `__mj_UpdatedAt` first
|
|
25
|
+
* @returns the document to use, or null when there is none
|
|
26
|
+
*/
|
|
27
|
+
export function PickDuplicateDetectionDocument(activeDocuments) {
|
|
28
|
+
const recordDuplicate = activeDocuments.find(d => d.Type === RECORD_DUPLICATE_DOCUMENT_TYPE);
|
|
29
|
+
return recordDuplicate ?? activeDocuments[0] ?? null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Checks that the entity document a run names belongs to the run's entity.
|
|
33
|
+
*
|
|
34
|
+
* @param entityDocument the run's document
|
|
35
|
+
* @param entityID the run's EntityID
|
|
36
|
+
* @returns why the document cannot be used, or null when it can
|
|
37
|
+
*/
|
|
38
|
+
export function CheckRunEntityDocument(entityDocument, entityID) {
|
|
39
|
+
if (!UUIDsEqual(entityDocument.EntityID, entityID)) {
|
|
40
|
+
return `Entity Document "${entityDocument.Name}" belongs to a different entity than this duplicate run`;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
12
44
|
/**
|
|
13
45
|
* Key under which we stash the "detection in flight" set in the MJ global object
|
|
14
46
|
* store. Using the global store (rather than a plain module-level variable) keeps
|
|
@@ -40,13 +72,21 @@ function detectionInFlightSet() {
|
|
|
40
72
|
const PHASE_TO_STAGE = {
|
|
41
73
|
'Loading': 'extract',
|
|
42
74
|
'Vectorizing': 'vectorize',
|
|
43
|
-
'Embedding': '
|
|
75
|
+
'Embedding': 'extract',
|
|
44
76
|
'Querying': 'extract',
|
|
45
77
|
'Matching': 'autotag',
|
|
46
|
-
'Merging': '
|
|
78
|
+
'Merging': 'autotag'
|
|
47
79
|
};
|
|
48
80
|
let MJDuplicateRunEntityServer = class MJDuplicateRunEntityServer extends MJDuplicateRunEntity {
|
|
49
81
|
async Save(options) {
|
|
82
|
+
// A run must name its entity document. Server-side callers that create a run without one
|
|
83
|
+
// (GetRecordDuplicates, scripts) get the entity's default duplicate-detection document.
|
|
84
|
+
if (!this.IsSaved && !this.EntityDocumentID) {
|
|
85
|
+
const defaultDocument = await this.findDefaultEntityDocument();
|
|
86
|
+
if (defaultDocument) {
|
|
87
|
+
this.EntityDocumentID = defaultDocument.ID;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
50
90
|
const saveResult = await super.Save(options);
|
|
51
91
|
// Only kick off detection on the INITIAL save of an unfinished run, and never
|
|
52
92
|
// while a detection pass for this run is already in flight. The detector saves
|
|
@@ -68,7 +108,7 @@ let MJDuplicateRunEntityServer = class MJDuplicateRunEntityServer extends MJDupl
|
|
|
68
108
|
}
|
|
69
109
|
/**
|
|
70
110
|
* Run duplicate detection asynchronously. On failure, updates the run's
|
|
71
|
-
* ProcessingStatus to '
|
|
111
|
+
* ProcessingStatus to 'Failed' with ProcessingErrorMessage so the UI can surface the problem.
|
|
72
112
|
*/
|
|
73
113
|
async runDetectionAsync() {
|
|
74
114
|
const startTime = Date.now();
|
|
@@ -81,23 +121,15 @@ let MJDuplicateRunEntityServer = class MJDuplicateRunEntityServer extends MJDupl
|
|
|
81
121
|
const request = new PotentialDuplicateRequest();
|
|
82
122
|
request.EntityID = this.EntityID;
|
|
83
123
|
request.ListID = this.SourceListID || undefined; // Optional — if not set, scans all entity records
|
|
84
|
-
//
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
EntityName: 'MJ: Entity Documents',
|
|
88
|
-
ExtraFilter: `EntityID='${this.EntityID}' AND Status='Active'`,
|
|
89
|
-
MaxRows: 1,
|
|
90
|
-
ResultType: 'entity_object'
|
|
91
|
-
}, this.ContextCurrentUser);
|
|
92
|
-
if (edResult.Success && edResult.Results.length > 0) {
|
|
93
|
-
request.EntityDocumentID = edResult.Results[0].ID;
|
|
94
|
-
}
|
|
124
|
+
// The run's entity document supplies the template, vectors and thresholds.
|
|
125
|
+
const entityDocument = await this.loadRunEntityDocument();
|
|
126
|
+
request.EntityDocumentID = entityDocument.ID;
|
|
95
127
|
// Build detection options with threshold normalization.
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
const potentialThreshold = this.normalizeThreshold(
|
|
128
|
+
// A threshold left at 1.0 (100%) matches nothing, so treat it as unconfigured and use
|
|
129
|
+
// the fallback instead.
|
|
130
|
+
const potentialThreshold = this.normalizeThreshold(entityDocument.PotentialMatchThreshold, 0.70 // fallback: 70% for potential matches
|
|
99
131
|
);
|
|
100
|
-
const absoluteThreshold = this.normalizeThreshold(
|
|
132
|
+
const absoluteThreshold = this.normalizeThreshold(entityDocument.AbsoluteMatchThreshold, 0.95 // fallback: 95% for absolute matches
|
|
101
133
|
);
|
|
102
134
|
const detectionOptions = {
|
|
103
135
|
DuplicateRunID: this.ID,
|
|
@@ -109,19 +141,25 @@ let MJDuplicateRunEntityServer = class MJDuplicateRunEntityServer extends MJDupl
|
|
|
109
141
|
};
|
|
110
142
|
request.Options = detectionOptions;
|
|
111
143
|
// Publish initial progress
|
|
112
|
-
this.publishPipelineNotification('
|
|
113
|
-
await detector.GetDuplicateRecords(request, this.ContextCurrentUser);
|
|
144
|
+
this.publishPipelineNotification('extract', 0, 0, 0, startTime, 'Starting duplicate detection...');
|
|
145
|
+
const response = await detector.GetDuplicateRecords(request, this.ContextCurrentUser);
|
|
146
|
+
if (response.Status === 'Error') {
|
|
147
|
+
throw new Error(response.ErrorMessage || 'Duplicate detection failed');
|
|
148
|
+
}
|
|
114
149
|
LogStatus(`Duplicate detection completed for run ${this.ID}`);
|
|
115
150
|
// Publish completion
|
|
116
151
|
this.publishPipelineNotification('complete', 100, 100, 100, startTime);
|
|
117
152
|
}
|
|
118
153
|
catch (error) {
|
|
119
|
-
|
|
154
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
155
|
+
LogError(`Duplicate detection error for run ${this.ID}: ${errorMsg}`, undefined, error);
|
|
120
156
|
// Publish error
|
|
121
|
-
this.publishPipelineNotification('error', 0, 0, 0, startTime,
|
|
157
|
+
this.publishPipelineNotification('error', 0, 0, 0, startTime, errorMsg);
|
|
122
158
|
// Update the run record to reflect the error
|
|
123
159
|
try {
|
|
160
|
+
await this.Load(this.ID);
|
|
124
161
|
this.ProcessingStatus = 'Failed';
|
|
162
|
+
this.ProcessingErrorMessage = errorMsg;
|
|
125
163
|
this.EndedAt = new Date();
|
|
126
164
|
await super.Save();
|
|
127
165
|
}
|
|
@@ -130,6 +168,48 @@ let MJDuplicateRunEntityServer = class MJDuplicateRunEntityServer extends MJDupl
|
|
|
130
168
|
}
|
|
131
169
|
}
|
|
132
170
|
}
|
|
171
|
+
/**
|
|
172
|
+
* The entity's default duplicate-detection document (see {@link PickDuplicateDetectionDocument}),
|
|
173
|
+
* or null when the entity has no active document.
|
|
174
|
+
*/
|
|
175
|
+
async findDefaultEntityDocument() {
|
|
176
|
+
const rv = new RunView(this.RunViewProviderToUse);
|
|
177
|
+
const result = await rv.RunView({
|
|
178
|
+
EntityName: 'MJ: Entity Documents',
|
|
179
|
+
ExtraFilter: `EntityID='${EscapeSQLString(this.EntityID)}' AND Status='Active'`,
|
|
180
|
+
OrderBy: '__mj_UpdatedAt DESC',
|
|
181
|
+
ResultType: 'entity_object'
|
|
182
|
+
}, this.ContextCurrentUser);
|
|
183
|
+
if (!result.Success) {
|
|
184
|
+
LogError(`Duplicate run: could not load entity documents for entity ${this.EntityID}: ${result.ErrorMessage}`);
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
return PickDuplicateDetectionDocument(result.Results);
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Loads the entity document this run names. Throws when it is missing or belongs to another
|
|
191
|
+
* entity, which fails the run with that message.
|
|
192
|
+
*/
|
|
193
|
+
async loadRunEntityDocument() {
|
|
194
|
+
const rv = new RunView(this.RunViewProviderToUse);
|
|
195
|
+
const result = await rv.RunView({
|
|
196
|
+
EntityName: 'MJ: Entity Documents',
|
|
197
|
+
ExtraFilter: `ID='${EscapeSQLString(this.EntityDocumentID)}'`,
|
|
198
|
+
ResultType: 'entity_object'
|
|
199
|
+
}, this.ContextCurrentUser);
|
|
200
|
+
if (!result.Success) {
|
|
201
|
+
throw new Error(`Could not load Entity Document ${this.EntityDocumentID}: ${result.ErrorMessage}`);
|
|
202
|
+
}
|
|
203
|
+
const entityDocument = result.Results[0];
|
|
204
|
+
if (!entityDocument) {
|
|
205
|
+
throw new Error(`Entity Document ${this.EntityDocumentID} was not found`);
|
|
206
|
+
}
|
|
207
|
+
const problem = CheckRunEntityDocument(entityDocument, this.EntityID);
|
|
208
|
+
if (problem) {
|
|
209
|
+
throw new Error(problem);
|
|
210
|
+
}
|
|
211
|
+
return entityDocument;
|
|
212
|
+
}
|
|
133
213
|
/**
|
|
134
214
|
* Convert a DuplicateDetectionProgress callback into a PipelineProgress notification.
|
|
135
215
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MJDuplicateRunEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJDuplicateRunEntityServer.server.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAA+F,QAAQ,EAAE,SAAS,EAAE,yBAAyB,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACxM,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"MJDuplicateRunEntityServer.server.js","sourceRoot":"","sources":["../../src/custom/MJDuplicateRunEntityServer.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { EntitySaveOptions, ValidationResult } from "@memberjunction/core";
|
|
2
|
+
import { MJEntityAlternateBaseViewEntity } from "@memberjunction/core-entities";
|
|
3
|
+
/**
|
|
4
|
+
* Server-side entity subclass for `MJ: Entity Alternate Base Views`.
|
|
5
|
+
*
|
|
6
|
+
* Enforces:
|
|
7
|
+
* - Immutability of `EntityID` on existing saved records
|
|
8
|
+
* - Logical `Name` format (`IsValidAlternateBaseViewName` — non-empty, no `|`, `:`, or leading `//`)
|
|
9
|
+
* - Physical `ViewName` and optional `SchemaName` identifier format (`IsValidSQLIdentifier`)
|
|
10
|
+
* - Same-entity logical `Name` uniqueness
|
|
11
|
+
* - Cross-entity `(EffectiveSchemaName, ViewName)` uniqueness against every entity's
|
|
12
|
+
* `BaseView`, `BaseTable`, and registered `AlternateBaseViews` (D13)
|
|
13
|
+
* - Same-entity `ParentID` hierarchy validation and cycle detection (D15)
|
|
14
|
+
* - Live database row and physical SQL view existence verification in `ValidateAsync`
|
|
15
|
+
* - Automatic AST inference of `ParentID` on save when `ParentID` is unset and
|
|
16
|
+
* the view's SQL definition references a single sibling alternate base view on the same entity (D15)
|
|
17
|
+
*/
|
|
18
|
+
export declare class MJEntityAlternateBaseViewEntityServer extends MJEntityAlternateBaseViewEntity {
|
|
19
|
+
Validate(): ValidationResult;
|
|
20
|
+
ValidateAsync(): Promise<ValidationResult>;
|
|
21
|
+
Save(options?: EntitySaveOptions): Promise<boolean>;
|
|
22
|
+
private validateEntityIDImmutability;
|
|
23
|
+
/**
|
|
24
|
+
* Validates `Name`, `ViewName`, and optional `SchemaName` using zero-dependency
|
|
25
|
+
* validators from `@memberjunction/core`.
|
|
26
|
+
*/
|
|
27
|
+
private validateNameAndIdentifiers;
|
|
28
|
+
/**
|
|
29
|
+
* Validates:
|
|
30
|
+
* 1. Same-entity logical `Name` uniqueness
|
|
31
|
+
* 2. Cross-entity `(EffectiveSchemaName, ViewName)` uniqueness against every entity's
|
|
32
|
+
* `BaseView`, `BaseTable`, and registered `AlternateBaseViews` (D13)
|
|
33
|
+
*/
|
|
34
|
+
private validateUniquenessAndCollisions;
|
|
35
|
+
private checkSameEntityLogicalNameDuplicate;
|
|
36
|
+
private checkCrossEntityPhysicalCollision;
|
|
37
|
+
private checkExistingAlternateViewCollisionsOnEntity;
|
|
38
|
+
/**
|
|
39
|
+
* Validates `ParentID` (when set):
|
|
40
|
+
* - Cannot self-reference (`ParentID === ID`)
|
|
41
|
+
* - Parent must exist and belong to the same `EntityID`
|
|
42
|
+
* - Parent chain must be acyclic
|
|
43
|
+
*/
|
|
44
|
+
private validateParentHierarchy;
|
|
45
|
+
private checkCrossEntityParentOwner;
|
|
46
|
+
private checkParentChainForCycle;
|
|
47
|
+
/**
|
|
48
|
+
* Queries `MJ: Entity Alternate Base Views` with `BypassCache: true` so uniqueness,
|
|
49
|
+
* cross-entity collision, and `ParentID` hierarchy checks also catch rows created
|
|
50
|
+
* since the last metadata refresh.
|
|
51
|
+
*/
|
|
52
|
+
private validateAgainstLiveDatabaseRows;
|
|
53
|
+
private checkLiveDatabaseRowsForConflicts;
|
|
54
|
+
/**
|
|
55
|
+
* When `Status` is `'Active'` or `'Deprecated'` and a database provider is active, verifies
|
|
56
|
+
* that the physical SQL view exists in the database catalog.
|
|
57
|
+
*/
|
|
58
|
+
private validatePhysicalViewExistsIfUsable;
|
|
59
|
+
/**
|
|
60
|
+
* Queries the database catalog for the SQL definition of `EffectiveSchemaName.ViewName`
|
|
61
|
+
* when running against a database provider, then invokes `TryAutoPopulateParentIDFromAST`.
|
|
62
|
+
*/
|
|
63
|
+
private resolveAndPopulateParentIDFromDatabase;
|
|
64
|
+
/**
|
|
65
|
+
* Inspects `viewDefinitionSQL` with `SQLParser.ExtractTableRefs` and, if the SQL
|
|
66
|
+
* references exactly one sibling alternate base view on the same entity (without creating
|
|
67
|
+
* a cycle), automatically populates `this.ParentID`.
|
|
68
|
+
*/
|
|
69
|
+
TryAutoPopulateParentIDFromAST(viewDefinitionSQL: string): void;
|
|
70
|
+
private findMatchingSiblingsInTableRefs;
|
|
71
|
+
private wouldCreateCycle;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=MJEntityAlternateBaseViewEntityServer.server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MJEntityAlternateBaseViewEntityServer.server.d.ts","sourceRoot":"","sources":["../../src/custom/MJEntityAlternateBaseViewEntityServer.server.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,iBAAiB,EAQjB,gBAAgB,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,+BAA+B,EAAE,MAAM,+BAA+B,CAAC;AAchF;;;;;;;;;;;;;;GAcG;AACH,qBACa,qCAAsC,SAAQ,+BAA+B;IACtE,QAAQ,IAAI,gBAAgB;IAiCtB,aAAa,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAkB1C,IAAI,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBzE,OAAO,CAAC,4BAA4B;IAapC;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAmClC;;;;;OAKG;IACH,OAAO,CAAC,+BAA+B;IAoBvC,OAAO,CAAC,mCAAmC;IAoB3C,OAAO,CAAC,iCAAiC;IA+BzC,OAAO,CAAC,4CAA4C;IAwBpD;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA6B/B,OAAO,CAAC,2BAA2B;IAoBnC,OAAO,CAAC,wBAAwB;IA6BhC;;;;OAIG;YACW,+BAA+B;IA8C7C,OAAO,CAAC,iCAAiC;IAkDzC;;;OAGG;YACW,kCAAkC;IAsChD;;;OAGG;YACW,sCAAsC;IAuCpD;;;;OAIG;IACI,8BAA8B,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAkCtE,OAAO,CAAC,+BAA+B;IA0BvC,OAAO,CAAC,gBAAgB;CAoB3B"}
|