@itwin/ecschema-metadata 5.1.0-dev.9 → 5.2.0-dev.2
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/CHANGELOG.md +74 -1
- package/lib/cjs/Context.d.ts +1 -1
- package/lib/cjs/Context.js +1 -1
- package/lib/cjs/Context.js.map +1 -1
- package/lib/cjs/Deserialization/Helper.d.ts +30 -11
- package/lib/cjs/Deserialization/Helper.d.ts.map +1 -1
- package/lib/cjs/Deserialization/Helper.js +124 -96
- package/lib/cjs/Deserialization/Helper.js.map +1 -1
- package/lib/cjs/Deserialization/SchemaGraphUtil.d.ts +12 -3
- package/lib/cjs/Deserialization/SchemaGraphUtil.d.ts.map +1 -1
- package/lib/cjs/Deserialization/SchemaGraphUtil.js +36 -23
- package/lib/cjs/Deserialization/SchemaGraphUtil.js.map +1 -1
- package/lib/cjs/Deserialization/XmlParser.d.ts.map +1 -1
- package/lib/cjs/Deserialization/XmlParser.js +14 -5
- package/lib/cjs/Deserialization/XmlParser.js.map +1 -1
- package/lib/cjs/Deserialization/XmlSerializationUtils.js +1 -1
- package/lib/cjs/Deserialization/XmlSerializationUtils.js.map +1 -1
- package/lib/cjs/ECName.js +1 -1
- package/lib/cjs/ECName.js.map +1 -1
- package/lib/cjs/ECObjects.d.ts +1 -1
- package/lib/cjs/ECObjects.js +2 -2
- package/lib/cjs/ECObjects.js.map +1 -1
- package/lib/cjs/IncrementalLoading/ClassParsers.d.ts +60 -0
- package/lib/cjs/IncrementalLoading/ClassParsers.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/ClassParsers.js +111 -0
- package/lib/cjs/IncrementalLoading/ClassParsers.js.map +1 -0
- package/lib/cjs/IncrementalLoading/ECSqlSchemaLocater.d.ts +211 -0
- package/lib/cjs/IncrementalLoading/ECSqlSchemaLocater.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/ECSqlSchemaLocater.js +387 -0
- package/lib/cjs/IncrementalLoading/ECSqlSchemaLocater.js.map +1 -0
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.d.ts +14 -0
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.js +609 -0
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.js.map +1 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaLocater.d.ts +109 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaLocater.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaLocater.js +219 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaLocater.js.map +1 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaReader.d.ts +36 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaReader.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaReader.js +77 -0
- package/lib/cjs/IncrementalLoading/IncrementalSchemaReader.js.map +1 -0
- package/lib/cjs/IncrementalLoading/PerformanceLogger.d.ts +60 -0
- package/lib/cjs/IncrementalLoading/PerformanceLogger.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/PerformanceLogger.js +82 -0
- package/lib/cjs/IncrementalLoading/PerformanceLogger.js.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaItemParsers.d.ts +51 -0
- package/lib/cjs/IncrementalLoading/SchemaItemParsers.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaItemParsers.js +122 -0
- package/lib/cjs/IncrementalLoading/SchemaItemParsers.js.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.d.ts +16 -0
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.js +308 -0
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.js.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaParser.d.ts +42 -0
- package/lib/cjs/IncrementalLoading/SchemaParser.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaParser.js +109 -0
- package/lib/cjs/IncrementalLoading/SchemaParser.js.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.d.ts +12 -0
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.d.ts.map +1 -0
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.js +365 -0
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.js.map +1 -0
- package/lib/cjs/Metadata/Class.d.ts +5 -16
- package/lib/cjs/Metadata/Class.d.ts.map +1 -1
- package/lib/cjs/Metadata/Class.js +68 -68
- package/lib/cjs/Metadata/Class.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttribute.d.ts +7 -1
- package/lib/cjs/Metadata/CustomAttribute.d.ts.map +1 -1
- package/lib/cjs/Metadata/CustomAttribute.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.d.ts +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.js +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.js.map +1 -1
- package/lib/cjs/Metadata/EntityClass.d.ts +6 -6
- package/lib/cjs/Metadata/EntityClass.d.ts.map +1 -1
- package/lib/cjs/Metadata/EntityClass.js +48 -26
- package/lib/cjs/Metadata/EntityClass.js.map +1 -1
- package/lib/cjs/Metadata/Format.d.ts +5 -0
- package/lib/cjs/Metadata/Format.d.ts.map +1 -1
- package/lib/cjs/Metadata/Format.js +7 -0
- package/lib/cjs/Metadata/Format.js.map +1 -1
- package/lib/cjs/Metadata/KindOfQuantity.js.map +1 -1
- package/lib/cjs/Metadata/Schema.d.ts +10 -0
- package/lib/cjs/Metadata/Schema.d.ts.map +1 -1
- package/lib/cjs/Metadata/Schema.js +13 -0
- package/lib/cjs/Metadata/Schema.js.map +1 -1
- package/lib/cjs/Metadata/SchemaItem.d.ts +10 -0
- package/lib/cjs/Metadata/SchemaItem.d.ts.map +1 -1
- package/lib/cjs/Metadata/SchemaItem.js +13 -0
- package/lib/cjs/Metadata/SchemaItem.js.map +1 -1
- package/lib/cjs/SchemaFormatsProvider.d.ts +4 -3
- package/lib/cjs/SchemaFormatsProvider.d.ts.map +1 -1
- package/lib/cjs/SchemaFormatsProvider.js +60 -17
- package/lib/cjs/SchemaFormatsProvider.js.map +1 -1
- package/lib/cjs/SchemaLoader.d.ts +4 -1
- package/lib/cjs/SchemaLoader.d.ts.map +1 -1
- package/lib/cjs/SchemaLoader.js +4 -1
- package/lib/cjs/SchemaLoader.js.map +1 -1
- package/lib/cjs/ecschema-metadata.d.ts +2 -0
- package/lib/cjs/ecschema-metadata.d.ts.map +1 -1
- package/lib/cjs/ecschema-metadata.js +2 -0
- package/lib/cjs/ecschema-metadata.js.map +1 -1
- package/lib/cjs/utils/SchemaLoadingController.d.ts +37 -0
- package/lib/cjs/utils/SchemaLoadingController.d.ts.map +1 -0
- package/lib/cjs/utils/SchemaLoadingController.js +65 -0
- package/lib/cjs/utils/SchemaLoadingController.js.map +1 -0
- package/lib/esm/Context.d.ts +1 -1
- package/lib/esm/Context.js +1 -1
- package/lib/esm/Context.js.map +1 -1
- package/lib/esm/Deserialization/Helper.d.ts +30 -11
- package/lib/esm/Deserialization/Helper.d.ts.map +1 -1
- package/lib/esm/Deserialization/Helper.js +124 -96
- package/lib/esm/Deserialization/Helper.js.map +1 -1
- package/lib/esm/Deserialization/SchemaGraphUtil.d.ts +12 -3
- package/lib/esm/Deserialization/SchemaGraphUtil.d.ts.map +1 -1
- package/lib/esm/Deserialization/SchemaGraphUtil.js +36 -23
- package/lib/esm/Deserialization/SchemaGraphUtil.js.map +1 -1
- package/lib/esm/Deserialization/XmlParser.d.ts.map +1 -1
- package/lib/esm/Deserialization/XmlParser.js +14 -5
- package/lib/esm/Deserialization/XmlParser.js.map +1 -1
- package/lib/esm/Deserialization/XmlSerializationUtils.js +1 -1
- package/lib/esm/Deserialization/XmlSerializationUtils.js.map +1 -1
- package/lib/esm/ECName.js +1 -1
- package/lib/esm/ECName.js.map +1 -1
- package/lib/esm/ECObjects.d.ts +1 -1
- package/lib/esm/ECObjects.js +2 -2
- package/lib/esm/ECObjects.js.map +1 -1
- package/lib/esm/IncrementalLoading/ClassParsers.d.ts +60 -0
- package/lib/esm/IncrementalLoading/ClassParsers.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/ClassParsers.js +104 -0
- package/lib/esm/IncrementalLoading/ClassParsers.js.map +1 -0
- package/lib/esm/IncrementalLoading/ECSqlSchemaLocater.d.ts +211 -0
- package/lib/esm/IncrementalLoading/ECSqlSchemaLocater.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/ECSqlSchemaLocater.js +383 -0
- package/lib/esm/IncrementalLoading/ECSqlSchemaLocater.js.map +1 -0
- package/lib/esm/IncrementalLoading/FullSchemaQueries.d.ts +14 -0
- package/lib/esm/IncrementalLoading/FullSchemaQueries.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/FullSchemaQueries.js +606 -0
- package/lib/esm/IncrementalLoading/FullSchemaQueries.js.map +1 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaLocater.d.ts +109 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaLocater.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaLocater.js +215 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaLocater.js.map +1 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaReader.d.ts +36 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaReader.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaReader.js +73 -0
- package/lib/esm/IncrementalLoading/IncrementalSchemaReader.js.map +1 -0
- package/lib/esm/IncrementalLoading/PerformanceLogger.d.ts +60 -0
- package/lib/esm/IncrementalLoading/PerformanceLogger.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/PerformanceLogger.js +78 -0
- package/lib/esm/IncrementalLoading/PerformanceLogger.js.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaItemParsers.d.ts +51 -0
- package/lib/esm/IncrementalLoading/SchemaItemParsers.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaItemParsers.js +117 -0
- package/lib/esm/IncrementalLoading/SchemaItemParsers.js.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaItemQueries.d.ts +16 -0
- package/lib/esm/IncrementalLoading/SchemaItemQueries.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaItemQueries.js +305 -0
- package/lib/esm/IncrementalLoading/SchemaItemQueries.js.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaParser.d.ts +42 -0
- package/lib/esm/IncrementalLoading/SchemaParser.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaParser.js +104 -0
- package/lib/esm/IncrementalLoading/SchemaParser.js.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaStubQueries.d.ts +12 -0
- package/lib/esm/IncrementalLoading/SchemaStubQueries.d.ts.map +1 -0
- package/lib/esm/IncrementalLoading/SchemaStubQueries.js +359 -0
- package/lib/esm/IncrementalLoading/SchemaStubQueries.js.map +1 -0
- package/lib/esm/Metadata/Class.d.ts +5 -16
- package/lib/esm/Metadata/Class.d.ts.map +1 -1
- package/lib/esm/Metadata/Class.js +68 -68
- package/lib/esm/Metadata/Class.js.map +1 -1
- package/lib/esm/Metadata/CustomAttribute.d.ts +7 -1
- package/lib/esm/Metadata/CustomAttribute.d.ts.map +1 -1
- package/lib/esm/Metadata/CustomAttribute.js.map +1 -1
- package/lib/esm/Metadata/CustomAttributeClass.d.ts +1 -1
- package/lib/esm/Metadata/CustomAttributeClass.js +1 -1
- package/lib/esm/Metadata/CustomAttributeClass.js.map +1 -1
- package/lib/esm/Metadata/EntityClass.d.ts +6 -6
- package/lib/esm/Metadata/EntityClass.d.ts.map +1 -1
- package/lib/esm/Metadata/EntityClass.js +48 -26
- package/lib/esm/Metadata/EntityClass.js.map +1 -1
- package/lib/esm/Metadata/Format.d.ts +5 -0
- package/lib/esm/Metadata/Format.d.ts.map +1 -1
- package/lib/esm/Metadata/Format.js +7 -0
- package/lib/esm/Metadata/Format.js.map +1 -1
- package/lib/esm/Metadata/KindOfQuantity.js.map +1 -1
- package/lib/esm/Metadata/Schema.d.ts +10 -0
- package/lib/esm/Metadata/Schema.d.ts.map +1 -1
- package/lib/esm/Metadata/Schema.js +13 -0
- package/lib/esm/Metadata/Schema.js.map +1 -1
- package/lib/esm/Metadata/SchemaItem.d.ts +10 -0
- package/lib/esm/Metadata/SchemaItem.d.ts.map +1 -1
- package/lib/esm/Metadata/SchemaItem.js +13 -0
- package/lib/esm/Metadata/SchemaItem.js.map +1 -1
- package/lib/esm/SchemaFormatsProvider.d.ts +4 -3
- package/lib/esm/SchemaFormatsProvider.d.ts.map +1 -1
- package/lib/esm/SchemaFormatsProvider.js +61 -18
- package/lib/esm/SchemaFormatsProvider.js.map +1 -1
- package/lib/esm/SchemaLoader.d.ts +4 -1
- package/lib/esm/SchemaLoader.d.ts.map +1 -1
- package/lib/esm/SchemaLoader.js +4 -1
- package/lib/esm/SchemaLoader.js.map +1 -1
- package/lib/esm/ecschema-metadata.d.ts +2 -0
- package/lib/esm/ecschema-metadata.d.ts.map +1 -1
- package/lib/esm/ecschema-metadata.js +2 -0
- package/lib/esm/ecschema-metadata.js.map +1 -1
- package/lib/esm/utils/SchemaLoadingController.d.ts +37 -0
- package/lib/esm/utils/SchemaLoadingController.d.ts.map +1 -0
- package/lib/esm/utils/SchemaLoadingController.js +61 -0
- package/lib/esm/utils/SchemaLoadingController.js.map +1 -0
- package/package.json +15 -10
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
/*---------------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
|
+
*--------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { SchemaItemQueries } from "./SchemaItemQueries";
|
|
6
|
+
import { modifier, strength, strengthDirection } from "./SchemaStubQueries";
|
|
7
|
+
/**
|
|
8
|
+
* Queries that return full Schema JSON data are found here. Shared SELECTS and
|
|
9
|
+
* WITH clauses are broken down into individual variables.
|
|
10
|
+
*/
|
|
11
|
+
const propertyType = (alias) => {
|
|
12
|
+
return `
|
|
13
|
+
CASE
|
|
14
|
+
WHEN [${alias}].[Kind] = 0 THEN 'PrimitiveProperty'
|
|
15
|
+
WHEN [${alias}].[Kind] = 1 THEN 'StructProperty'
|
|
16
|
+
WHEN [${alias}].[Kind] = 2 THEN 'PrimitiveArrayProperty'
|
|
17
|
+
WHEN [${alias}].[Kind] = 3 THEN 'StructArrayProperty'
|
|
18
|
+
WHEN [${alias}].[Kind] = 4 THEN 'NavigationProperty'
|
|
19
|
+
ELSE NULL
|
|
20
|
+
END
|
|
21
|
+
`;
|
|
22
|
+
};
|
|
23
|
+
const navigationDirection = (alias) => {
|
|
24
|
+
return `
|
|
25
|
+
CASE
|
|
26
|
+
WHEN [${alias}].[NavigationDirection] = 1 THEN 'Forward'
|
|
27
|
+
WHEN [${alias}].[NavigationDirection] = 2 THEN 'Backward'
|
|
28
|
+
ELSE NULL
|
|
29
|
+
END
|
|
30
|
+
`;
|
|
31
|
+
};
|
|
32
|
+
const schemaCustomAttribute = (alias) => {
|
|
33
|
+
return `
|
|
34
|
+
SELECT
|
|
35
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
36
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
37
|
+
WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 1
|
|
38
|
+
ORDER BY [ca].[Ordinal]
|
|
39
|
+
`;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Selects customAttribute data for each class type.
|
|
43
|
+
*/
|
|
44
|
+
const classCustomAttribute = (alias) => {
|
|
45
|
+
return `
|
|
46
|
+
SELECT
|
|
47
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
48
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
49
|
+
WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 30
|
|
50
|
+
ORDER BY [ca].[Ordinal]
|
|
51
|
+
`;
|
|
52
|
+
};
|
|
53
|
+
const propertyCustomAttribute = (alias) => {
|
|
54
|
+
return `
|
|
55
|
+
SELECT
|
|
56
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
57
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
58
|
+
WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 992
|
|
59
|
+
ORDER BY [ca].[Ordinal]
|
|
60
|
+
`;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Selects base class data for each class type.
|
|
64
|
+
*/
|
|
65
|
+
const selectBaseClasses = `
|
|
66
|
+
SELECT
|
|
67
|
+
ec_classname([baseClass].[ECInstanceId], 's.c')
|
|
68
|
+
FROM
|
|
69
|
+
[meta].[ECClassDef] [baseClass]
|
|
70
|
+
INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]
|
|
71
|
+
ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]
|
|
72
|
+
WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]
|
|
73
|
+
LIMIT 1
|
|
74
|
+
`;
|
|
75
|
+
/**
|
|
76
|
+
* Selects class property data for each class type. ClassProperties
|
|
77
|
+
* is a common table expression (CTE or WITH clause) defined below.
|
|
78
|
+
*/
|
|
79
|
+
const selectProperties = `
|
|
80
|
+
SELECT
|
|
81
|
+
json_group_array(json([classProperties].[property]))
|
|
82
|
+
FROM
|
|
83
|
+
[ClassProperties] [classProperties]
|
|
84
|
+
WHERE
|
|
85
|
+
[classProperties].[ClassId] = [class].[ECInstanceId]
|
|
86
|
+
`;
|
|
87
|
+
/**
|
|
88
|
+
* A CTE used to select AppliesTo from IsMixin CustomAttributes for a given Mixin.
|
|
89
|
+
*/
|
|
90
|
+
const withAppliesTo = `
|
|
91
|
+
AppliesToCTE AS (
|
|
92
|
+
SELECT
|
|
93
|
+
[mixinAppliesTo].[ECInstanceId] AS [AppliesToId],
|
|
94
|
+
[appliesToSchema].[name] as [AppliesToSchema],
|
|
95
|
+
json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.IsMixin.AppliesToEntityClass') AS [AppliesTo]
|
|
96
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
97
|
+
JOIN [meta].[ECClassDef] [mixinAppliesTo]
|
|
98
|
+
ON [mixinAppliesTo].[ECInstanceId] = [ca].[ContainerId]
|
|
99
|
+
JOIN [meta].[ECSchemaDef] [appliesToSchema]
|
|
100
|
+
ON [appliesToSchema].[ECInstanceId] = [mixinAppliesTo].[Schema].[Id]
|
|
101
|
+
WHERE [ca].[ContainerType] = 30
|
|
102
|
+
AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') = 'IsMixin'
|
|
103
|
+
)
|
|
104
|
+
`;
|
|
105
|
+
/**
|
|
106
|
+
* A CTE used to select Schema reference data for a given Schema.
|
|
107
|
+
*/
|
|
108
|
+
const withSchemaReferences = `
|
|
109
|
+
SchemaReferences as (
|
|
110
|
+
SELECT
|
|
111
|
+
[ref].[SourceECInstanceId] as [SchemaId],
|
|
112
|
+
json_object(
|
|
113
|
+
'name', [Name],
|
|
114
|
+
'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor]))
|
|
115
|
+
) as [reference]
|
|
116
|
+
FROM
|
|
117
|
+
[meta].[ECSchemaDef] as [refSchema]
|
|
118
|
+
INNER JOIN [meta].[SchemaHasSchemaReferences] [ref]
|
|
119
|
+
ON [ref].[TargetECInstanceId] = [refSchema].[ECInstanceId]
|
|
120
|
+
)
|
|
121
|
+
`;
|
|
122
|
+
/**
|
|
123
|
+
* A CTE used to select Relationship constraints for a given RelationshipClass.
|
|
124
|
+
*/
|
|
125
|
+
const withRelationshipConstraints = `
|
|
126
|
+
ClassRelationshipConstraints as (
|
|
127
|
+
SELECT
|
|
128
|
+
[rhc].[SourceECInstanceId] as [ClassId],
|
|
129
|
+
[constraintDef].[ECInstanceId] as [ConstraintId],
|
|
130
|
+
[RelationshipEnd],
|
|
131
|
+
CONCAT('(', [MultiplicityLowerLimit], '..', IIF([MultiplicityUpperLimit] IS NULL, '*', [MultiplicityUpperLimit]), ')') as [Multiplicity],
|
|
132
|
+
[IsPolyMorphic],
|
|
133
|
+
[RoleLabel],
|
|
134
|
+
IIF([constraintDef].[AbstractConstraintClass] IS NOT NULL, ec_classname([constraintDef].[AbstractConstraintClass].[Id], 's.c'), null) as [AbstractConstraint],
|
|
135
|
+
IIF ([rchc].[TargetECInstanceId] IS NOT NULL, JSON_GROUP_ARRAY(ec_classname([rchc].[TargetECInstanceId], 's.c')), null) as [ConstraintClasses]
|
|
136
|
+
FROM
|
|
137
|
+
[meta].[ECRelationshipConstraintDef] [constraintDef]
|
|
138
|
+
JOIN [meta].[RelationshipHasConstraints] [rhc]
|
|
139
|
+
ON [rhc].[TargetECInstanceId] = [constraintDef].[ECInstanceId]
|
|
140
|
+
JOIN [meta].[RelationshipConstraintHasClasses] [rchc]
|
|
141
|
+
ON [rchc].[SourceECInstanceId] = [constraintDef].[ECInstanceId]
|
|
142
|
+
GROUP BY [constraintDef].[ECInstanceId]
|
|
143
|
+
)
|
|
144
|
+
`;
|
|
145
|
+
/**
|
|
146
|
+
* A CTE used to select Class property data for a given Class.
|
|
147
|
+
*/
|
|
148
|
+
const withClassProperties = `
|
|
149
|
+
ClassProperties as (
|
|
150
|
+
SELECT
|
|
151
|
+
[cop].[SourceECInstanceId] as [ClassId],
|
|
152
|
+
json_object(
|
|
153
|
+
'name', [pd].[Name],
|
|
154
|
+
'label', [pd].[DisplayLabel],
|
|
155
|
+
'description', [pd].[Description],
|
|
156
|
+
'isReadOnly', IIF([pd].[IsReadOnly] = 1, json('true'), NULL),
|
|
157
|
+
'priority', [pd].[Priority],
|
|
158
|
+
'category', IIF([categoryDef].[Name] IS NULL, NULL, CONCAT([categorySchemaDef].[Name], '.', [categoryDef].[Name])),
|
|
159
|
+
'kindOfQuantity', IIF([koqDef].[Name] IS NULL, NULL, CONCAT([koqSchemaDef].[Name], '.', [koqDef].[Name])),
|
|
160
|
+
'typeName',
|
|
161
|
+
CASE
|
|
162
|
+
WHEN [pd].[Kind] = 0 OR [pd].[Kind] = 2 Then
|
|
163
|
+
CASE
|
|
164
|
+
WHEN [enumDef].[Name] IS NOT NULL Then CONCAT([enumSchemaDef].[Name], '.', [enumDef].[Name])
|
|
165
|
+
WHEN [pd].[PrimitiveType] = 257 Then 'binary'
|
|
166
|
+
WHEN [pd].[PrimitiveType] = 513 Then 'boolean'
|
|
167
|
+
WHEN [pd].[PrimitiveType] = 769 Then 'dateTime'
|
|
168
|
+
WHEN [pd].[PrimitiveType] = 1025 Then 'double'
|
|
169
|
+
WHEN [pd].[PrimitiveType] = 1281 Then 'int'
|
|
170
|
+
WHEN [pd].[PrimitiveType] = 1537 Then 'long'
|
|
171
|
+
WHEN [pd].[PrimitiveType] = 1793 Then 'point2d'
|
|
172
|
+
WHEN [pd].[PrimitiveType] = 2049 Then 'point3d'
|
|
173
|
+
WHEN [pd].[PrimitiveType] = 2305 Then 'string'
|
|
174
|
+
WHEN [pd].[PrimitiveType] = 2561 Then 'Bentley.Geometry.Common.IGeometry'
|
|
175
|
+
ELSE null
|
|
176
|
+
END
|
|
177
|
+
WHEN [pd].[Kind] = 1 OR [pd].[Kind] = 3 Then
|
|
178
|
+
CONCAT([structSchemaDef].[Name], '.', [structDef].[Name])
|
|
179
|
+
ELSE null
|
|
180
|
+
END,
|
|
181
|
+
'type', ${propertyType("pd")},
|
|
182
|
+
'minLength', [pd].[PrimitiveTypeMinLength],
|
|
183
|
+
'maxLength', [pd].[PrimitiveTypeMaxLength],
|
|
184
|
+
'minValue', [pd].[PrimitiveTypeMinValue],
|
|
185
|
+
'maxValue', [pd].[PrimitiveTypeMaxValue],
|
|
186
|
+
'extendedTypeName', [pd].[ExtendedTypeName],
|
|
187
|
+
'minOccurs', [pd].[ArrayMinOccurs],
|
|
188
|
+
'maxOccurs', [pd].[ArrayMaxOccurs],
|
|
189
|
+
'direction', ${navigationDirection("pd")},
|
|
190
|
+
'relationshipName', IIF([navRelDef].[Name] IS NULL, NULL, CONCAT([navSchemaDef].[Name], '.', [navRelDef].[Name])),
|
|
191
|
+
'customAttributes', (${propertyCustomAttribute("pd")})
|
|
192
|
+
) as [property]
|
|
193
|
+
FROM
|
|
194
|
+
[meta].[ECPropertyDef] as [pd]
|
|
195
|
+
JOIN [meta].[ClassOwnsLocalProperties] [cop]
|
|
196
|
+
ON cop.[TargetECInstanceId] = [pd].[ECInstanceId]
|
|
197
|
+
LEFT JOIN [meta].[ECEnumerationDef] [enumDef]
|
|
198
|
+
ON [enumDef].[ECInstanceId] = [pd].[Enumeration].[Id]
|
|
199
|
+
LEFT JOIN [meta].[ECSchemaDef] enumSchemaDef
|
|
200
|
+
ON [enumSchemaDef].[ECInstanceId] = [enumDef].[Schema].[Id]
|
|
201
|
+
LEFT JOIN [meta].[PropertyCategoryDef] [categoryDef]
|
|
202
|
+
ON [categoryDef].[ECInstanceId] = [pd].[Category].[Id]
|
|
203
|
+
LEFT JOIN [meta].[ECSchemaDef] [categorySchemaDef]
|
|
204
|
+
ON [categorySchemaDef].[ECInstanceId] = [categoryDef].[Schema].[Id]
|
|
205
|
+
LEFT JOIN [meta].[KindOfQuantityDef] [koqDef]
|
|
206
|
+
ON [koqDef].[ECInstanceId] = [pd].[KindOfQuantity].[Id]
|
|
207
|
+
LEFT JOIN [meta].[ECSchemaDef] [koqSchemaDef]
|
|
208
|
+
ON [koqSchemaDef].[ECInstanceId] = [koqDef].[Schema].[Id]
|
|
209
|
+
LEFT JOIN [meta].[ECClassDef] [structDef]
|
|
210
|
+
ON structDef.[ECInstanceId] = [pd].[StructClass].[Id]
|
|
211
|
+
LEFT JOIN [meta].[ECSchemaDef] [structSchemaDef]
|
|
212
|
+
ON [structSchemaDef].[ECInstanceId] = [structDef].[Schema].[Id]
|
|
213
|
+
LEFT JOIN [meta].[ECClassDef] [navRelDef]
|
|
214
|
+
ON [navRelDef].[ECInstanceId] = [pd].[NavigationRelationshipClass].[Id]
|
|
215
|
+
LEFT JOIN [meta].[ECSchemaDef] [navSchemaDef]
|
|
216
|
+
ON [navSchemaDef].[ECInstanceId] = [navRelDef].[Schema].[Id]
|
|
217
|
+
)
|
|
218
|
+
`;
|
|
219
|
+
/**
|
|
220
|
+
* Query that provides EntityClass data and is shared by two cases:
|
|
221
|
+
* 1. A single query to return a full schema.
|
|
222
|
+
* 2. When querying a full schema with multiple schema item queries or
|
|
223
|
+
* when just querying for Entity classes.
|
|
224
|
+
*/
|
|
225
|
+
const baseEntityQuery = `
|
|
226
|
+
SELECT
|
|
227
|
+
[sd].[Name] as [schema],
|
|
228
|
+
json_object (
|
|
229
|
+
'schemaItemType', 'EntityClass',
|
|
230
|
+
'name', [class].[Name],
|
|
231
|
+
'label', [class].[DisplayLabel],
|
|
232
|
+
'description', [class].[Description],
|
|
233
|
+
'modifier', ${modifier("class")},
|
|
234
|
+
'baseClass', (
|
|
235
|
+
${selectBaseClasses}
|
|
236
|
+
),
|
|
237
|
+
'mixins', (
|
|
238
|
+
SELECT
|
|
239
|
+
json_group_array(
|
|
240
|
+
ec_classname([baseClass].[ECInstanceId], 's.c')
|
|
241
|
+
)
|
|
242
|
+
FROM
|
|
243
|
+
[meta].[ECClassDef] [baseClass]
|
|
244
|
+
INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]
|
|
245
|
+
ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]
|
|
246
|
+
WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]
|
|
247
|
+
AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [baseClass].[ECInstanceId] = [ca].[Class].[Id]
|
|
248
|
+
AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))
|
|
249
|
+
),
|
|
250
|
+
'customAttributes', (${classCustomAttribute("class")}),
|
|
251
|
+
'properties', (
|
|
252
|
+
${selectProperties}
|
|
253
|
+
)
|
|
254
|
+
) AS [item]
|
|
255
|
+
FROM [meta].[ECClassDef] [class]
|
|
256
|
+
JOIN
|
|
257
|
+
[meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]
|
|
258
|
+
WHERE [class].[Type] = 0 AND
|
|
259
|
+
[sd].[Name] = :schemaName
|
|
260
|
+
AND NOT EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]
|
|
261
|
+
AND [ca].[CustomAttributeClass].Id Is ([CoreCA].[IsMixin]))
|
|
262
|
+
`;
|
|
263
|
+
/**
|
|
264
|
+
* EntityClass query used to when querying for EntityClass data only. Not used
|
|
265
|
+
* for full Schema load via single query.
|
|
266
|
+
*/
|
|
267
|
+
const entityQuery = `
|
|
268
|
+
WITH
|
|
269
|
+
${withClassProperties}
|
|
270
|
+
${baseEntityQuery}
|
|
271
|
+
`;
|
|
272
|
+
/**
|
|
273
|
+
* Query that provides Mixin data and is shared by two cases:
|
|
274
|
+
* 1. A single query to return a full schema.
|
|
275
|
+
* 2. When querying a full schema with multiple schema item queries or
|
|
276
|
+
* when just querying for Mixin classes.
|
|
277
|
+
*/
|
|
278
|
+
const baseMixinQuery = `
|
|
279
|
+
SELECT
|
|
280
|
+
[sd].[Name] as [schema],
|
|
281
|
+
json_object (
|
|
282
|
+
'schemaItemType', 'Mixin',
|
|
283
|
+
'name', [class].[Name],
|
|
284
|
+
'label', [class].[DisplayLabel],
|
|
285
|
+
'description', [class].[Description],
|
|
286
|
+
'modifier', ${modifier("class")},
|
|
287
|
+
'baseClass', (
|
|
288
|
+
${selectBaseClasses}
|
|
289
|
+
),
|
|
290
|
+
'appliesTo', (
|
|
291
|
+
SELECT IIF(instr([atCTE].[AppliesTo], ':') > 1, ec_classname(ec_classId([atCTE].[AppliesTo]), 's.c'), CONCAT([atCTE].[AppliesToSchema], '.', [atCTE].[AppliesTo]))
|
|
292
|
+
FROM [AppliesToCTE] [atCTE]
|
|
293
|
+
WHERE [atCTE].[AppliesToId] = [class].[ECInstanceId]
|
|
294
|
+
),
|
|
295
|
+
'customAttributes', (
|
|
296
|
+
SELECT
|
|
297
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
298
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
299
|
+
WHERE [ca].[ContainerId] = [class].[ECInstanceId] AND [ca].[ContainerType] = 30
|
|
300
|
+
AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') <> 'IsMixin'
|
|
301
|
+
),
|
|
302
|
+
'properties', (
|
|
303
|
+
SELECT
|
|
304
|
+
json_group_array(json([classProperties].[property]))
|
|
305
|
+
FROM
|
|
306
|
+
[ClassProperties] [classProperties]
|
|
307
|
+
WHERE
|
|
308
|
+
[classProperties].[ClassId] = [class].[ECInstanceId]
|
|
309
|
+
)
|
|
310
|
+
) AS [item]
|
|
311
|
+
FROM [meta].[ECClassDef] [class]
|
|
312
|
+
JOIN
|
|
313
|
+
[meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]
|
|
314
|
+
WHERE [class].[Type] = 0 AND
|
|
315
|
+
[sd].[Name] = :schemaName
|
|
316
|
+
AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]
|
|
317
|
+
AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))
|
|
318
|
+
`;
|
|
319
|
+
/**
|
|
320
|
+
* Mixin query used to when querying for Mixin data only. Not used
|
|
321
|
+
* for full Schema load via single query.
|
|
322
|
+
*/
|
|
323
|
+
const mixinQuery = `
|
|
324
|
+
WITH
|
|
325
|
+
${withAppliesTo},
|
|
326
|
+
${withClassProperties}
|
|
327
|
+
${baseMixinQuery}
|
|
328
|
+
`;
|
|
329
|
+
/**
|
|
330
|
+
* Query that provides RelationshipClass data and is shared by two cases:
|
|
331
|
+
* 1. A single query to return a full schema.
|
|
332
|
+
* 2. When querying a full schema with multiple schema item queries or
|
|
333
|
+
* when just querying for Relationship classes.
|
|
334
|
+
*/
|
|
335
|
+
const baseRelationshipClassQuery = `
|
|
336
|
+
SELECT
|
|
337
|
+
[sd].Name as schema,
|
|
338
|
+
json_object (
|
|
339
|
+
'schemaItemType', 'RelationshipClass',
|
|
340
|
+
'name', [class].[Name],
|
|
341
|
+
'label', [class].[DisplayLabel],
|
|
342
|
+
'description', [class].[Description],
|
|
343
|
+
'strength', ${strength("class")},
|
|
344
|
+
'strengthDirection', ${strengthDirection("class")},
|
|
345
|
+
'modifier', ${modifier("class")},
|
|
346
|
+
'baseClass', (
|
|
347
|
+
${selectBaseClasses}
|
|
348
|
+
),
|
|
349
|
+
'customAttributes', (${classCustomAttribute("class")}),
|
|
350
|
+
'properties', (
|
|
351
|
+
${selectProperties}
|
|
352
|
+
),
|
|
353
|
+
'source', (
|
|
354
|
+
SELECT
|
|
355
|
+
json_object (
|
|
356
|
+
'multiplicity', [sourceConst].[Multiplicity],
|
|
357
|
+
'roleLabel', [sourceConst].[RoleLabel],
|
|
358
|
+
'polymorphic', IIF([sourceConst].[IsPolyMorphic] = 1, json('true'), json('false')),
|
|
359
|
+
'abstractConstraint', [sourceConst].[AbstractConstraint],
|
|
360
|
+
'constraintClasses', json([sourceConst].[ConstraintClasses]),
|
|
361
|
+
'customAttributes', (
|
|
362
|
+
SELECT
|
|
363
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
364
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
365
|
+
WHERE [ca].[ContainerId] = [sourceConst].[ConstraintId] AND [ca].[ContainerType] = 1024
|
|
366
|
+
ORDER BY [ca].[Ordinal]
|
|
367
|
+
)
|
|
368
|
+
)
|
|
369
|
+
FROM
|
|
370
|
+
[ClassRelationshipConstraints] [sourceConst]
|
|
371
|
+
WHERE [sourceConst].[relationshipEnd] = 0
|
|
372
|
+
AND [sourceConst].[ClassId] = [class].[ECInstanceId]
|
|
373
|
+
),
|
|
374
|
+
'target', (
|
|
375
|
+
SELECT
|
|
376
|
+
json_object (
|
|
377
|
+
'multiplicity', [targetConst].[Multiplicity],
|
|
378
|
+
'roleLabel', [targetConst].[RoleLabel],
|
|
379
|
+
'polymorphic', IIF([targetConst].[IsPolyMorphic] = 1, json('true'), json('false')),
|
|
380
|
+
'abstractConstraint', [targetConst].[AbstractConstraint],
|
|
381
|
+
'constraintClasses', json([targetConst].[ConstraintClasses]),
|
|
382
|
+
'customAttributes', (
|
|
383
|
+
SELECT
|
|
384
|
+
json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))
|
|
385
|
+
FROM [meta].[CustomAttribute] [ca]
|
|
386
|
+
WHERE [ca].[ContainerId] = [targetConst].[ConstraintId] AND [ca].[ContainerType] = 2048
|
|
387
|
+
ORDER BY [ca].[Ordinal]
|
|
388
|
+
)
|
|
389
|
+
)
|
|
390
|
+
FROM
|
|
391
|
+
[ClassRelationshipConstraints] [targetConst]
|
|
392
|
+
WHERE [targetConst].[relationshipEnd] = 1
|
|
393
|
+
AND [targetConst].[ClassId] = [class].[ECInstanceId]
|
|
394
|
+
)
|
|
395
|
+
) AS [item]
|
|
396
|
+
FROM [meta].[ECClassDef] [class]
|
|
397
|
+
JOIN
|
|
398
|
+
[meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]
|
|
399
|
+
WHERE [class].[Type] = 1 AND
|
|
400
|
+
[sd].[Name] = :schemaName
|
|
401
|
+
`;
|
|
402
|
+
/**
|
|
403
|
+
* RelationshipClass query used to when querying for RelationshipClass data only. Not used
|
|
404
|
+
* for full Schema load via single query.
|
|
405
|
+
*/
|
|
406
|
+
const relationshipClassQuery = `
|
|
407
|
+
WITH
|
|
408
|
+
${withClassProperties},
|
|
409
|
+
${withRelationshipConstraints}
|
|
410
|
+
${baseRelationshipClassQuery}
|
|
411
|
+
`;
|
|
412
|
+
/**
|
|
413
|
+
* Query that provides StructClass data and is shared by two cases:
|
|
414
|
+
* 1. A single query to return a full schema.
|
|
415
|
+
* 2. When querying a full schema with multiple schema item queries or
|
|
416
|
+
* when just querying for Struct classes.
|
|
417
|
+
*/
|
|
418
|
+
const baseStructQuery = `
|
|
419
|
+
SELECT
|
|
420
|
+
[sd].Name as schema,
|
|
421
|
+
json_object (
|
|
422
|
+
'schemaItemType', 'StructClass',
|
|
423
|
+
'name', [class].[Name],
|
|
424
|
+
'label', [class].[DisplayLabel],
|
|
425
|
+
'description', [class].[Description],
|
|
426
|
+
'modifier', ${modifier("class")},
|
|
427
|
+
'baseClass', (
|
|
428
|
+
${selectBaseClasses}
|
|
429
|
+
),
|
|
430
|
+
'customAttributes', (${classCustomAttribute("class")}),
|
|
431
|
+
'properties', (
|
|
432
|
+
${selectProperties}
|
|
433
|
+
)
|
|
434
|
+
) AS item
|
|
435
|
+
FROM [meta].[ECClassDef] [class]
|
|
436
|
+
JOIN
|
|
437
|
+
[meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]
|
|
438
|
+
WHERE [class].[Type] = 2 AND
|
|
439
|
+
[sd].[Name] = :schemaName
|
|
440
|
+
`;
|
|
441
|
+
/**
|
|
442
|
+
* StructClass query used to when querying for StructClass data only. Not used
|
|
443
|
+
* for full Schema load via single query.
|
|
444
|
+
*/
|
|
445
|
+
const structQuery = `
|
|
446
|
+
WITH
|
|
447
|
+
${withClassProperties}
|
|
448
|
+
${baseStructQuery}
|
|
449
|
+
`;
|
|
450
|
+
/**
|
|
451
|
+
* Query that provides CustomAttributeClass data and is shared by two cases:
|
|
452
|
+
* 1. A single query to return a full schema.
|
|
453
|
+
* 2. When querying a full schema with multiple schema item queries or
|
|
454
|
+
* when just querying for CustomAttribute classes.
|
|
455
|
+
*/
|
|
456
|
+
const baseCustomAttributeQuery = `
|
|
457
|
+
SELECT
|
|
458
|
+
[sd].Name as schema,
|
|
459
|
+
json_object (
|
|
460
|
+
'schemaItemType', 'CustomAttributeClass',
|
|
461
|
+
'name', [class].[Name],
|
|
462
|
+
'label', [class].[DisplayLabel],
|
|
463
|
+
'description', [class].[Description],
|
|
464
|
+
'appliesTo', [class].[CustomAttributeContainerType],
|
|
465
|
+
'modifier', ${modifier("class")},
|
|
466
|
+
'baseClass', (
|
|
467
|
+
${selectBaseClasses}
|
|
468
|
+
),
|
|
469
|
+
'customAttributes', (${classCustomAttribute("class")}),
|
|
470
|
+
'properties', (
|
|
471
|
+
${selectProperties}
|
|
472
|
+
)
|
|
473
|
+
) AS [item]
|
|
474
|
+
FROM [meta].[ECClassDef] [class]
|
|
475
|
+
JOIN
|
|
476
|
+
[meta].[ECSchemaDef] sd ON [sd].[ECInstanceId] = [class].[Schema].[Id]
|
|
477
|
+
WHERE [class].[Type] = 3 AND
|
|
478
|
+
[sd].[Name] = :schemaName
|
|
479
|
+
`;
|
|
480
|
+
/**
|
|
481
|
+
* CustomAttributeClass query used to when querying for CustomAttributeClass data only. Not used
|
|
482
|
+
* for full Schema load via single query.
|
|
483
|
+
*/
|
|
484
|
+
const customAttributeQuery = `
|
|
485
|
+
WITH
|
|
486
|
+
${withClassProperties}
|
|
487
|
+
${baseCustomAttributeQuery}
|
|
488
|
+
`;
|
|
489
|
+
/**
|
|
490
|
+
* Used by full schema load query via single query. Allows
|
|
491
|
+
* all SchemaItemTypes to be queried at once.
|
|
492
|
+
*/
|
|
493
|
+
const withSchemaItems = `
|
|
494
|
+
SchemaItems AS (
|
|
495
|
+
${baseEntityQuery}
|
|
496
|
+
UNION ALL
|
|
497
|
+
${baseRelationshipClassQuery}
|
|
498
|
+
UNION ALL
|
|
499
|
+
${baseStructQuery}
|
|
500
|
+
UNION ALL
|
|
501
|
+
${baseMixinQuery}
|
|
502
|
+
UNION ALL
|
|
503
|
+
${baseCustomAttributeQuery}
|
|
504
|
+
UNION ALL
|
|
505
|
+
${SchemaItemQueries.kindOfQuantity(true)}
|
|
506
|
+
UNION ALL
|
|
507
|
+
${SchemaItemQueries.enumeration(true)}
|
|
508
|
+
UNION ALL
|
|
509
|
+
${SchemaItemQueries.propertyCategory(true)}
|
|
510
|
+
UNION ALL
|
|
511
|
+
${SchemaItemQueries.unit(true)}
|
|
512
|
+
UNION ALL
|
|
513
|
+
${SchemaItemQueries.invertedUnit(true)}
|
|
514
|
+
UNION ALL
|
|
515
|
+
${SchemaItemQueries.unitSystem(true)}
|
|
516
|
+
UNION ALL
|
|
517
|
+
${SchemaItemQueries.constant(true)}
|
|
518
|
+
UNION ALL
|
|
519
|
+
${SchemaItemQueries.phenomenon(true)}
|
|
520
|
+
UNION ALL
|
|
521
|
+
${SchemaItemQueries.format(true)}
|
|
522
|
+
)
|
|
523
|
+
`;
|
|
524
|
+
/**
|
|
525
|
+
* Query for Schema data without SchemaItems
|
|
526
|
+
*/
|
|
527
|
+
const schemaNoItemsQuery = `
|
|
528
|
+
WITH
|
|
529
|
+
${withSchemaReferences}
|
|
530
|
+
SELECT
|
|
531
|
+
json_object (
|
|
532
|
+
'name', [schemaDef].[Name],
|
|
533
|
+
'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),
|
|
534
|
+
'alias', [schemaDef].[Alias],
|
|
535
|
+
'label', [schemaDef].[DisplayLabel],
|
|
536
|
+
'description', [schemaDef].[Description],
|
|
537
|
+
'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],
|
|
538
|
+
'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],
|
|
539
|
+
'customAttributes', (${schemaCustomAttribute("schemaDef")}),
|
|
540
|
+
'references', (
|
|
541
|
+
SELECT
|
|
542
|
+
json_group_array(json([schemaReferences].[reference]))
|
|
543
|
+
FROM
|
|
544
|
+
[SchemaReferences] [schemaReferences]
|
|
545
|
+
WHERE
|
|
546
|
+
[schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]
|
|
547
|
+
)
|
|
548
|
+
) as [schema]
|
|
549
|
+
FROM
|
|
550
|
+
[meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName
|
|
551
|
+
`;
|
|
552
|
+
/**
|
|
553
|
+
* Query to load a full Schema via a single query.
|
|
554
|
+
*/
|
|
555
|
+
const schemaQuery = `
|
|
556
|
+
WITH
|
|
557
|
+
${withAppliesTo},
|
|
558
|
+
${withSchemaReferences},
|
|
559
|
+
${withClassProperties},
|
|
560
|
+
${withRelationshipConstraints},
|
|
561
|
+
${withSchemaItems}
|
|
562
|
+
SELECT
|
|
563
|
+
json_object (
|
|
564
|
+
'name', [schemaDef].[Name],
|
|
565
|
+
'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),
|
|
566
|
+
'alias', [schemaDef].[Alias],
|
|
567
|
+
'label', [schemaDef].[DisplayLabel],
|
|
568
|
+
'description', [schemaDef].[Description],
|
|
569
|
+
'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],
|
|
570
|
+
'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],
|
|
571
|
+
'customAttributes', (${schemaCustomAttribute("schemaDef")}),
|
|
572
|
+
'references', (
|
|
573
|
+
SELECT
|
|
574
|
+
json_group_array(json([schemaReferences].[reference]))
|
|
575
|
+
FROM
|
|
576
|
+
[SchemaReferences] [schemaReferences]
|
|
577
|
+
WHERE
|
|
578
|
+
[schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]
|
|
579
|
+
),
|
|
580
|
+
'items', (
|
|
581
|
+
SELECT
|
|
582
|
+
json_group_array(json(json_object(
|
|
583
|
+
'item', json([items].[item])
|
|
584
|
+
)))
|
|
585
|
+
FROM
|
|
586
|
+
[SchemaItems] [items]
|
|
587
|
+
)
|
|
588
|
+
) as [schema]
|
|
589
|
+
FROM
|
|
590
|
+
[meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName
|
|
591
|
+
`;
|
|
592
|
+
/**
|
|
593
|
+
* Queries for loading full Schema JSON.
|
|
594
|
+
* @internal
|
|
595
|
+
*/
|
|
596
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
597
|
+
export const FullSchemaQueries = {
|
|
598
|
+
schemaQuery,
|
|
599
|
+
schemaNoItemsQuery,
|
|
600
|
+
entityQuery,
|
|
601
|
+
relationshipClassQuery,
|
|
602
|
+
mixinQuery,
|
|
603
|
+
structQuery,
|
|
604
|
+
customAttributeQuery
|
|
605
|
+
};
|
|
606
|
+
//# sourceMappingURL=FullSchemaQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FullSchemaQueries.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/FullSchemaQueries.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\nimport { SchemaItemQueries } from \"./SchemaItemQueries\";\nimport { modifier, strength, strengthDirection } from \"./SchemaStubQueries\";\n\n/**\n * Queries that return full Schema JSON data are found here. Shared SELECTS and\n * WITH clauses are broken down into individual variables.\n */\n\nconst propertyType = (alias: string) => {\n return `\n CASE\n WHEN [${alias}].[Kind] = 0 THEN 'PrimitiveProperty'\n WHEN [${alias}].[Kind] = 1 THEN 'StructProperty'\n WHEN [${alias}].[Kind] = 2 THEN 'PrimitiveArrayProperty'\n WHEN [${alias}].[Kind] = 3 THEN 'StructArrayProperty'\n WHEN [${alias}].[Kind] = 4 THEN 'NavigationProperty'\n ELSE NULL\n END\n `;\n};\n\nconst navigationDirection = (alias: string) => {\n return `\n CASE\n WHEN [${alias}].[NavigationDirection] = 1 THEN 'Forward'\n WHEN [${alias}].[NavigationDirection] = 2 THEN 'Backward'\n ELSE NULL\n END\n `;\n};\n\nconst schemaCustomAttribute = (alias: string) => {\n return `\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 1\n ORDER BY [ca].[Ordinal]\n `;\n};\n\n/**\n * Selects customAttribute data for each class type.\n */\nconst classCustomAttribute = (alias: string) => {\n return `\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 30\n ORDER BY [ca].[Ordinal]\n `;\n};\n\nconst propertyCustomAttribute = (alias: string) => {\n return `\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 992\n ORDER BY [ca].[Ordinal]\n `;\n};\n\n\n/**\n * Selects base class data for each class type.\n */\nconst selectBaseClasses = `\n SELECT\n ec_classname([baseClass].[ECInstanceId], 's.c')\n FROM\n [meta].[ECClassDef] [baseClass]\n INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]\n ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]\n WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]\n LIMIT 1\n`;\n\n/**\n * Selects class property data for each class type. ClassProperties\n * is a common table expression (CTE or WITH clause) defined below.\n */\nconst selectProperties = `\n SELECT\n json_group_array(json([classProperties].[property]))\n FROM\n [ClassProperties] [classProperties]\n WHERE\n [classProperties].[ClassId] = [class].[ECInstanceId]\n`;\n\n/**\n * A CTE used to select AppliesTo from IsMixin CustomAttributes for a given Mixin.\n */\nconst withAppliesTo = `\n AppliesToCTE AS (\n SELECT\n [mixinAppliesTo].[ECInstanceId] AS [AppliesToId],\n [appliesToSchema].[name] as [AppliesToSchema],\n json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.IsMixin.AppliesToEntityClass') AS [AppliesTo]\n FROM [meta].[CustomAttribute] [ca]\n JOIN [meta].[ECClassDef] [mixinAppliesTo]\n ON [mixinAppliesTo].[ECInstanceId] = [ca].[ContainerId]\n JOIN [meta].[ECSchemaDef] [appliesToSchema]\n ON [appliesToSchema].[ECInstanceId] = [mixinAppliesTo].[Schema].[Id]\n WHERE [ca].[ContainerType] = 30\n AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') = 'IsMixin'\n )\n`;\n\n/**\n * A CTE used to select Schema reference data for a given Schema.\n */\nconst withSchemaReferences = `\nSchemaReferences as (\n SELECT\n [ref].[SourceECInstanceId] as [SchemaId],\n json_object(\n 'name', [Name],\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor]))\n ) as [reference]\n FROM\n [meta].[ECSchemaDef] as [refSchema]\n INNER JOIN [meta].[SchemaHasSchemaReferences] [ref]\n ON [ref].[TargetECInstanceId] = [refSchema].[ECInstanceId]\n)\n`;\n\n/**\n * A CTE used to select Relationship constraints for a given RelationshipClass.\n */\nconst withRelationshipConstraints = `\nClassRelationshipConstraints as (\n SELECT\n [rhc].[SourceECInstanceId] as [ClassId],\n [constraintDef].[ECInstanceId] as [ConstraintId],\n [RelationshipEnd],\n CONCAT('(', [MultiplicityLowerLimit], '..', IIF([MultiplicityUpperLimit] IS NULL, '*', [MultiplicityUpperLimit]), ')') as [Multiplicity],\n [IsPolyMorphic],\n [RoleLabel],\n IIF([constraintDef].[AbstractConstraintClass] IS NOT NULL, ec_classname([constraintDef].[AbstractConstraintClass].[Id], 's.c'), null) as [AbstractConstraint],\n IIF ([rchc].[TargetECInstanceId] IS NOT NULL, JSON_GROUP_ARRAY(ec_classname([rchc].[TargetECInstanceId], 's.c')), null) as [ConstraintClasses]\n FROM\n [meta].[ECRelationshipConstraintDef] [constraintDef]\n JOIN [meta].[RelationshipHasConstraints] [rhc]\n ON [rhc].[TargetECInstanceId] = [constraintDef].[ECInstanceId]\n JOIN [meta].[RelationshipConstraintHasClasses] [rchc]\n ON [rchc].[SourceECInstanceId] = [constraintDef].[ECInstanceId]\n GROUP BY [constraintDef].[ECInstanceId]\n)\n`;\n\n/**\n * A CTE used to select Class property data for a given Class.\n */\nconst withClassProperties = `\nClassProperties as (\nSELECT\n [cop].[SourceECInstanceId] as [ClassId],\n json_object(\n 'name', [pd].[Name],\n 'label', [pd].[DisplayLabel],\n 'description', [pd].[Description],\n 'isReadOnly', IIF([pd].[IsReadOnly] = 1, json('true'), NULL),\n 'priority', [pd].[Priority],\n 'category', IIF([categoryDef].[Name] IS NULL, NULL, CONCAT([categorySchemaDef].[Name], '.', [categoryDef].[Name])),\n 'kindOfQuantity', IIF([koqDef].[Name] IS NULL, NULL, CONCAT([koqSchemaDef].[Name], '.', [koqDef].[Name])),\n 'typeName',\n CASE\n WHEN [pd].[Kind] = 0 OR [pd].[Kind] = 2 Then\n CASE\n WHEN [enumDef].[Name] IS NOT NULL Then CONCAT([enumSchemaDef].[Name], '.', [enumDef].[Name])\n WHEN [pd].[PrimitiveType] = 257 Then 'binary'\n WHEN [pd].[PrimitiveType] = 513 Then 'boolean'\n WHEN [pd].[PrimitiveType] = 769 Then 'dateTime'\n WHEN [pd].[PrimitiveType] = 1025 Then 'double'\n WHEN [pd].[PrimitiveType] = 1281 Then 'int'\n WHEN [pd].[PrimitiveType] = 1537 Then 'long'\n WHEN [pd].[PrimitiveType] = 1793 Then 'point2d'\n WHEN [pd].[PrimitiveType] = 2049 Then 'point3d'\n WHEN [pd].[PrimitiveType] = 2305 Then 'string'\n WHEN [pd].[PrimitiveType] = 2561 Then 'Bentley.Geometry.Common.IGeometry'\n ELSE null\n END\n WHEN [pd].[Kind] = 1 OR [pd].[Kind] = 3 Then\n CONCAT([structSchemaDef].[Name], '.', [structDef].[Name])\n ELSE null\n END,\n 'type', ${propertyType(\"pd\")},\n 'minLength', [pd].[PrimitiveTypeMinLength],\n 'maxLength', [pd].[PrimitiveTypeMaxLength],\n 'minValue', [pd].[PrimitiveTypeMinValue],\n 'maxValue', [pd].[PrimitiveTypeMaxValue],\n 'extendedTypeName', [pd].[ExtendedTypeName],\n 'minOccurs', [pd].[ArrayMinOccurs],\n 'maxOccurs', [pd].[ArrayMaxOccurs],\n 'direction', ${navigationDirection(\"pd\")},\n 'relationshipName', IIF([navRelDef].[Name] IS NULL, NULL, CONCAT([navSchemaDef].[Name], '.', [navRelDef].[Name])),\n 'customAttributes', (${propertyCustomAttribute(\"pd\")})\n ) as [property]\nFROM\n [meta].[ECPropertyDef] as [pd]\nJOIN [meta].[ClassOwnsLocalProperties] [cop]\n ON cop.[TargetECInstanceId] = [pd].[ECInstanceId]\nLEFT JOIN [meta].[ECEnumerationDef] [enumDef]\n ON [enumDef].[ECInstanceId] = [pd].[Enumeration].[Id]\nLEFT JOIN [meta].[ECSchemaDef] enumSchemaDef\n ON [enumSchemaDef].[ECInstanceId] = [enumDef].[Schema].[Id]\nLEFT JOIN [meta].[PropertyCategoryDef] [categoryDef]\n ON [categoryDef].[ECInstanceId] = [pd].[Category].[Id]\nLEFT JOIN [meta].[ECSchemaDef] [categorySchemaDef]\n ON [categorySchemaDef].[ECInstanceId] = [categoryDef].[Schema].[Id]\nLEFT JOIN [meta].[KindOfQuantityDef] [koqDef]\n ON [koqDef].[ECInstanceId] = [pd].[KindOfQuantity].[Id]\nLEFT JOIN [meta].[ECSchemaDef] [koqSchemaDef]\n ON [koqSchemaDef].[ECInstanceId] = [koqDef].[Schema].[Id]\nLEFT JOIN [meta].[ECClassDef] [structDef]\n ON structDef.[ECInstanceId] = [pd].[StructClass].[Id]\nLEFT JOIN [meta].[ECSchemaDef] [structSchemaDef]\n ON [structSchemaDef].[ECInstanceId] = [structDef].[Schema].[Id]\nLEFT JOIN [meta].[ECClassDef] [navRelDef]\n ON [navRelDef].[ECInstanceId] = [pd].[NavigationRelationshipClass].[Id]\nLEFT JOIN [meta].[ECSchemaDef] [navSchemaDef]\n ON [navSchemaDef].[ECInstanceId] = [navRelDef].[Schema].[Id]\n)\n`;\n\n/**\n * Query that provides EntityClass data and is shared by two cases:\n * 1. A single query to return a full schema.\n * 2. When querying a full schema with multiple schema item queries or\n * when just querying for Entity classes.\n */\nconst baseEntityQuery = `\n SELECT\n [sd].[Name] as [schema],\n json_object (\n 'schemaItemType', 'EntityClass',\n 'name', [class].[Name],\n 'label', [class].[DisplayLabel],\n 'description', [class].[Description],\n 'modifier', ${modifier(\"class\")},\n 'baseClass', (\n ${selectBaseClasses}\n ),\n 'mixins', (\n SELECT\n json_group_array(\n ec_classname([baseClass].[ECInstanceId], 's.c')\n )\n FROM\n [meta].[ECClassDef] [baseClass]\n INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]\n ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]\n WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]\n AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [baseClass].[ECInstanceId] = [ca].[Class].[Id]\n AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))\n ),\n 'customAttributes', (${classCustomAttribute(\"class\")}),\n 'properties', (\n ${selectProperties}\n )\n ) AS [item]\n FROM [meta].[ECClassDef] [class]\n JOIN\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\n WHERE [class].[Type] = 0 AND\n [sd].[Name] = :schemaName\n AND NOT EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]\n AND [ca].[CustomAttributeClass].Id Is ([CoreCA].[IsMixin]))\n `;\n\n/**\n * EntityClass query used to when querying for EntityClass data only. Not used\n * for full Schema load via single query.\n */\nconst entityQuery = `\n WITH\n ${withClassProperties}\n ${baseEntityQuery}\n `\n\n/**\n * Query that provides Mixin data and is shared by two cases:\n * 1. A single query to return a full schema.\n * 2. When querying a full schema with multiple schema item queries or\n * when just querying for Mixin classes.\n */\nconst baseMixinQuery = `\n SELECT\n [sd].[Name] as [schema],\n json_object (\n 'schemaItemType', 'Mixin',\n 'name', [class].[Name],\n 'label', [class].[DisplayLabel],\n 'description', [class].[Description],\n 'modifier', ${modifier(\"class\")},\n 'baseClass', (\n ${selectBaseClasses}\n ),\n 'appliesTo', (\n SELECT IIF(instr([atCTE].[AppliesTo], ':') > 1, ec_classname(ec_classId([atCTE].[AppliesTo]), 's.c'), CONCAT([atCTE].[AppliesToSchema], '.', [atCTE].[AppliesTo]))\n FROM [AppliesToCTE] [atCTE]\n WHERE [atCTE].[AppliesToId] = [class].[ECInstanceId]\n ),\n 'customAttributes', (\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [class].[ECInstanceId] AND [ca].[ContainerType] = 30\n AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') <> 'IsMixin'\n ),\n 'properties', (\n SELECT\n json_group_array(json([classProperties].[property]))\n FROM\n [ClassProperties] [classProperties]\n WHERE\n [classProperties].[ClassId] = [class].[ECInstanceId]\n )\n ) AS [item]\n FROM [meta].[ECClassDef] [class]\n JOIN\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\n WHERE [class].[Type] = 0 AND\n [sd].[Name] = :schemaName\n AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]\n AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))\n `;\n\n/**\n* Mixin query used to when querying for Mixin data only. Not used\n* for full Schema load via single query.\n*/\nconst mixinQuery = `\n WITH\n ${withAppliesTo},\n ${withClassProperties}\n${baseMixinQuery}\n`\n\n/**\n * Query that provides RelationshipClass data and is shared by two cases:\n * 1. A single query to return a full schema.\n * 2. When querying a full schema with multiple schema item queries or\n * when just querying for Relationship classes.\n */\nconst baseRelationshipClassQuery = `\n SELECT\n [sd].Name as schema,\n json_object (\n 'schemaItemType', 'RelationshipClass',\n 'name', [class].[Name],\n 'label', [class].[DisplayLabel],\n 'description', [class].[Description],\n 'strength', ${strength(\"class\")},\n 'strengthDirection', ${strengthDirection(\"class\")},\n 'modifier', ${modifier(\"class\")},\n 'baseClass', (\n ${selectBaseClasses}\n ),\n 'customAttributes', (${classCustomAttribute(\"class\")}),\n 'properties', (\n ${selectProperties}\n ),\n 'source', (\n SELECT\n json_object (\n 'multiplicity', [sourceConst].[Multiplicity],\n 'roleLabel', [sourceConst].[RoleLabel],\n 'polymorphic', IIF([sourceConst].[IsPolyMorphic] = 1, json('true'), json('false')),\n 'abstractConstraint', [sourceConst].[AbstractConstraint],\n 'constraintClasses', json([sourceConst].[ConstraintClasses]),\n 'customAttributes', (\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [sourceConst].[ConstraintId] AND [ca].[ContainerType] = 1024\n ORDER BY [ca].[Ordinal]\n )\n )\n FROM\n [ClassRelationshipConstraints] [sourceConst]\n WHERE [sourceConst].[relationshipEnd] = 0\n AND [sourceConst].[ClassId] = [class].[ECInstanceId]\n ),\n 'target', (\n SELECT\n json_object (\n 'multiplicity', [targetConst].[Multiplicity],\n 'roleLabel', [targetConst].[RoleLabel],\n 'polymorphic', IIF([targetConst].[IsPolyMorphic] = 1, json('true'), json('false')),\n 'abstractConstraint', [targetConst].[AbstractConstraint],\n 'constraintClasses', json([targetConst].[ConstraintClasses]),\n 'customAttributes', (\n SELECT\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\n FROM [meta].[CustomAttribute] [ca]\n WHERE [ca].[ContainerId] = [targetConst].[ConstraintId] AND [ca].[ContainerType] = 2048\n ORDER BY [ca].[Ordinal]\n )\n )\n FROM\n [ClassRelationshipConstraints] [targetConst]\n WHERE [targetConst].[relationshipEnd] = 1\n AND [targetConst].[ClassId] = [class].[ECInstanceId]\n )\n ) AS [item]\n FROM [meta].[ECClassDef] [class]\n JOIN\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\n WHERE [class].[Type] = 1 AND\n [sd].[Name] = :schemaName\n `;\n\n/**\n* RelationshipClass query used to when querying for RelationshipClass data only. Not used\n* for full Schema load via single query.\n*/\nconst relationshipClassQuery = `\n WITH\n ${withClassProperties},\n ${withRelationshipConstraints}\n${baseRelationshipClassQuery}\n`\n\n/**\n * Query that provides StructClass data and is shared by two cases:\n * 1. A single query to return a full schema.\n * 2. When querying a full schema with multiple schema item queries or\n * when just querying for Struct classes.\n */\nconst baseStructQuery = `\n SELECT\n [sd].Name as schema,\n json_object (\n 'schemaItemType', 'StructClass',\n 'name', [class].[Name],\n 'label', [class].[DisplayLabel],\n 'description', [class].[Description],\n 'modifier', ${modifier(\"class\")},\n 'baseClass', (\n ${selectBaseClasses}\n ),\n 'customAttributes', (${classCustomAttribute(\"class\")}),\n 'properties', (\n ${selectProperties}\n )\n ) AS item\n FROM [meta].[ECClassDef] [class]\n JOIN\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\n WHERE [class].[Type] = 2 AND\n [sd].[Name] = :schemaName\n `;\n\n/**\n * StructClass query used to when querying for StructClass data only. Not used\n * for full Schema load via single query.\n */\nconst structQuery = `\n WITH\n ${withClassProperties}\n${baseStructQuery}\n`\n\n/**\n * Query that provides CustomAttributeClass data and is shared by two cases:\n * 1. A single query to return a full schema.\n * 2. When querying a full schema with multiple schema item queries or\n * when just querying for CustomAttribute classes.\n */\nconst baseCustomAttributeQuery = `\n SELECT\n [sd].Name as schema,\n json_object (\n 'schemaItemType', 'CustomAttributeClass',\n 'name', [class].[Name],\n 'label', [class].[DisplayLabel],\n 'description', [class].[Description],\n 'appliesTo', [class].[CustomAttributeContainerType],\n 'modifier', ${modifier(\"class\")},\n 'baseClass', (\n ${selectBaseClasses}\n ),\n 'customAttributes', (${classCustomAttribute(\"class\")}),\n 'properties', (\n ${selectProperties}\n )\n ) AS [item]\n FROM [meta].[ECClassDef] [class]\n JOIN\n [meta].[ECSchemaDef] sd ON [sd].[ECInstanceId] = [class].[Schema].[Id]\n WHERE [class].[Type] = 3 AND\n [sd].[Name] = :schemaName\n `;\n\n/**\n * CustomAttributeClass query used to when querying for CustomAttributeClass data only. Not used\n * for full Schema load via single query.\n */\nconst customAttributeQuery = `\nWITH\n ${withClassProperties}\n${baseCustomAttributeQuery}\n`\n\n/**\n * Used by full schema load query via single query. Allows\n * all SchemaItemTypes to be queried at once.\n */\nconst withSchemaItems = `\nSchemaItems AS (\n ${baseEntityQuery}\n UNION ALL\n ${baseRelationshipClassQuery}\n UNION ALL\n ${baseStructQuery}\n UNION ALL\n ${baseMixinQuery}\n UNION ALL\n ${baseCustomAttributeQuery}\n UNION ALL\n ${SchemaItemQueries.kindOfQuantity(true)}\n UNION ALL\n ${SchemaItemQueries.enumeration(true)}\n UNION ALL\n ${SchemaItemQueries.propertyCategory(true)}\n UNION ALL\n ${SchemaItemQueries.unit(true)}\n UNION ALL\n ${SchemaItemQueries.invertedUnit(true)}\n UNION ALL\n ${SchemaItemQueries.unitSystem(true)}\n UNION ALL\n ${SchemaItemQueries.constant(true)}\n UNION ALL\n ${SchemaItemQueries.phenomenon(true)}\n UNION ALL\n ${SchemaItemQueries.format(true)}\n)\n`;\n\n/**\n * Query for Schema data without SchemaItems\n */\nconst schemaNoItemsQuery = `\nWITH\n ${withSchemaReferences}\nSELECT\n json_object (\n 'name', [schemaDef].[Name],\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),\n 'alias', [schemaDef].[Alias],\n 'label', [schemaDef].[DisplayLabel],\n 'description', [schemaDef].[Description],\n 'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],\n 'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],\n 'customAttributes', (${schemaCustomAttribute(\"schemaDef\")}),\n 'references', (\n SELECT\n json_group_array(json([schemaReferences].[reference]))\n FROM\n [SchemaReferences] [schemaReferences]\n WHERE\n [schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]\n )\n ) as [schema]\nFROM\n [meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName\n`;\n\n/**\n * Query to load a full Schema via a single query.\n */\nconst schemaQuery = `\nWITH\n ${withAppliesTo},\n ${withSchemaReferences},\n ${withClassProperties},\n ${withRelationshipConstraints},\n ${withSchemaItems}\nSELECT\n json_object (\n 'name', [schemaDef].[Name],\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),\n 'alias', [schemaDef].[Alias],\n 'label', [schemaDef].[DisplayLabel],\n 'description', [schemaDef].[Description],\n 'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],\n 'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],\n 'customAttributes', (${schemaCustomAttribute(\"schemaDef\")}),\n 'references', (\n SELECT\n json_group_array(json([schemaReferences].[reference]))\n FROM\n [SchemaReferences] [schemaReferences]\n WHERE\n [schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]\n ),\n 'items', (\n SELECT\n json_group_array(json(json_object(\n 'item', json([items].[item])\n )))\n FROM\n [SchemaItems] [items]\n )\n) as [schema]\nFROM\n [meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName\n`;\n\n/**\n * Queries for loading full Schema JSON.\n * @internal\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const FullSchemaQueries = {\n schemaQuery,\n schemaNoItemsQuery,\n entityQuery,\n relationshipClassQuery,\n mixinQuery,\n structQuery,\n customAttributeQuery\n};\n"]}
|