@itwin/ecschema-metadata 5.5.0-dev.2 → 5.5.0-dev.4
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 +6 -1
- package/lib/cjs/Constants.js.map +1 -1
- package/lib/cjs/DelayedPromise.js.map +1 -1
- package/lib/cjs/Deserialization/AbstractParser.js.map +1 -1
- package/lib/cjs/Deserialization/Helper.js.map +1 -1
- package/lib/cjs/Deserialization/JsonParser.js.map +1 -1
- package/lib/cjs/Deserialization/JsonProps.js.map +1 -1
- package/lib/cjs/Deserialization/SchemaGraphUtil.js.map +1 -1
- package/lib/cjs/Deserialization/XmlParser.js.map +1 -1
- package/lib/cjs/Deserialization/XmlSerializationUtils.js.map +1 -1
- package/lib/cjs/ECName.js.map +1 -1
- package/lib/cjs/ECObjects.js.map +1 -1
- package/lib/cjs/Exception.js.map +1 -1
- package/lib/cjs/Formatting/FormatSetFormatsProvider.js.map +1 -1
- package/lib/cjs/Formatting/SchemaFormatsProvider.js.map +1 -1
- package/lib/cjs/IncrementalLoading/ClassParsers.js.map +1 -1
- package/lib/cjs/IncrementalLoading/ECSqlSchemaLocater.js.map +1 -1
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.js +466 -466
- package/lib/cjs/IncrementalLoading/FullSchemaQueries.js.map +1 -1
- package/lib/cjs/IncrementalLoading/IncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IncrementalLoading/IncrementalSchemaReader.js.map +1 -1
- package/lib/cjs/IncrementalLoading/SchemaItemParsers.js.map +1 -1
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.js +235 -235
- package/lib/cjs/IncrementalLoading/SchemaItemQueries.js.map +1 -1
- package/lib/cjs/IncrementalLoading/SchemaParser.js.map +1 -1
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.js +309 -309
- package/lib/cjs/IncrementalLoading/SchemaStubQueries.js.map +1 -1
- package/lib/cjs/Interfaces.js.map +1 -1
- package/lib/cjs/Metadata/Class.js.map +1 -1
- package/lib/cjs/Metadata/Constant.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttribute.js.map +1 -1
- package/lib/cjs/Metadata/CustomAttributeClass.js.map +1 -1
- package/lib/cjs/Metadata/EntityClass.js.map +1 -1
- package/lib/cjs/Metadata/Enumeration.js.map +1 -1
- package/lib/cjs/Metadata/Format.js.map +1 -1
- package/lib/cjs/Metadata/InvertedUnit.js.map +1 -1
- package/lib/cjs/Metadata/KindOfQuantity.js.map +1 -1
- package/lib/cjs/Metadata/Mixin.js.map +1 -1
- package/lib/cjs/Metadata/OverrideFormat.js.map +1 -1
- package/lib/cjs/Metadata/Phenomenon.js.map +1 -1
- package/lib/cjs/Metadata/Property.js.map +1 -1
- package/lib/cjs/Metadata/PropertyCategory.js.map +1 -1
- package/lib/cjs/Metadata/RelationshipClass.js.map +1 -1
- package/lib/cjs/Metadata/Schema.js.map +1 -1
- package/lib/cjs/Metadata/SchemaItem.js.map +1 -1
- package/lib/cjs/Metadata/UnitSystem.js.map +1 -1
- package/lib/cjs/PropertyTypes.js.map +1 -1
- package/lib/cjs/SchemaJsonLocater.js.map +1 -1
- package/lib/cjs/SchemaKey.js.map +1 -1
- package/lib/cjs/SchemaLoader.js.map +1 -1
- package/lib/cjs/SchemaPartVisitorDelegate.js.map +1 -1
- package/lib/cjs/UnitConversion/Graph.js.map +1 -1
- package/lib/cjs/UnitConversion/Parser.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitConversion.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitConverter.js.map +1 -1
- package/lib/cjs/UnitConversion/UnitTree.js.map +1 -1
- package/lib/cjs/UnitProvider/SchemaUnitProvider.js.map +1 -1
- package/lib/cjs/Validation/SchemaWalker.js.map +1 -1
- package/lib/cjs/ecschema-metadata.js.map +1 -1
- package/lib/cjs/utils/SchemaGraph.js.map +1 -1
- package/lib/cjs/utils/SchemaLoadingController.js.map +1 -1
- package/lib/esm/Constants.js.map +1 -1
- package/lib/esm/DelayedPromise.js.map +1 -1
- package/lib/esm/Deserialization/AbstractParser.js.map +1 -1
- package/lib/esm/Deserialization/Helper.js.map +1 -1
- package/lib/esm/Deserialization/JsonParser.js.map +1 -1
- package/lib/esm/Deserialization/JsonProps.js.map +1 -1
- package/lib/esm/Deserialization/SchemaGraphUtil.js.map +1 -1
- package/lib/esm/Deserialization/XmlParser.js.map +1 -1
- package/lib/esm/Deserialization/XmlSerializationUtils.js.map +1 -1
- package/lib/esm/ECName.js.map +1 -1
- package/lib/esm/ECObjects.js.map +1 -1
- package/lib/esm/Exception.js.map +1 -1
- package/lib/esm/Formatting/FormatSetFormatsProvider.js.map +1 -1
- package/lib/esm/Formatting/SchemaFormatsProvider.js.map +1 -1
- package/lib/esm/IncrementalLoading/ClassParsers.js.map +1 -1
- package/lib/esm/IncrementalLoading/ECSqlSchemaLocater.js.map +1 -1
- package/lib/esm/IncrementalLoading/FullSchemaQueries.js +466 -466
- package/lib/esm/IncrementalLoading/FullSchemaQueries.js.map +1 -1
- package/lib/esm/IncrementalLoading/IncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IncrementalLoading/IncrementalSchemaReader.js.map +1 -1
- package/lib/esm/IncrementalLoading/SchemaItemParsers.js.map +1 -1
- package/lib/esm/IncrementalLoading/SchemaItemQueries.js +235 -235
- package/lib/esm/IncrementalLoading/SchemaItemQueries.js.map +1 -1
- package/lib/esm/IncrementalLoading/SchemaParser.js.map +1 -1
- package/lib/esm/IncrementalLoading/SchemaStubQueries.js +309 -309
- package/lib/esm/IncrementalLoading/SchemaStubQueries.js.map +1 -1
- package/lib/esm/Interfaces.js.map +1 -1
- package/lib/esm/Metadata/Class.js.map +1 -1
- package/lib/esm/Metadata/Constant.js.map +1 -1
- package/lib/esm/Metadata/CustomAttribute.js.map +1 -1
- package/lib/esm/Metadata/CustomAttributeClass.js.map +1 -1
- package/lib/esm/Metadata/EntityClass.js.map +1 -1
- package/lib/esm/Metadata/Enumeration.js.map +1 -1
- package/lib/esm/Metadata/Format.js.map +1 -1
- package/lib/esm/Metadata/InvertedUnit.js.map +1 -1
- package/lib/esm/Metadata/KindOfQuantity.js.map +1 -1
- package/lib/esm/Metadata/Mixin.js.map +1 -1
- package/lib/esm/Metadata/OverrideFormat.js.map +1 -1
- package/lib/esm/Metadata/Phenomenon.js.map +1 -1
- package/lib/esm/Metadata/Property.js.map +1 -1
- package/lib/esm/Metadata/PropertyCategory.js.map +1 -1
- package/lib/esm/Metadata/RelationshipClass.js.map +1 -1
- package/lib/esm/Metadata/Schema.js.map +1 -1
- package/lib/esm/Metadata/SchemaItem.js.map +1 -1
- package/lib/esm/Metadata/UnitSystem.js.map +1 -1
- package/lib/esm/PropertyTypes.js.map +1 -1
- package/lib/esm/SchemaJsonLocater.js.map +1 -1
- package/lib/esm/SchemaKey.js.map +1 -1
- package/lib/esm/SchemaLoader.js.map +1 -1
- package/lib/esm/SchemaPartVisitorDelegate.js.map +1 -1
- package/lib/esm/UnitConversion/Graph.js.map +1 -1
- package/lib/esm/UnitConversion/Parser.js.map +1 -1
- package/lib/esm/UnitConversion/UnitConversion.js.map +1 -1
- package/lib/esm/UnitConversion/UnitConverter.js.map +1 -1
- package/lib/esm/UnitConversion/UnitTree.js.map +1 -1
- package/lib/esm/UnitProvider/SchemaUnitProvider.js.map +1 -1
- package/lib/esm/Validation/SchemaWalker.js.map +1 -1
- package/lib/esm/ecschema-metadata.js.map +1 -1
- package/lib/esm/utils/SchemaGraph.js.map +1 -1
- package/lib/esm/utils/SchemaLoadingController.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +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 ORDER BY [baseClassMap].[Ordinal] ASC\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"]}
|
|
1
|
+
{"version":3,"file":"FullSchemaQueries.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/FullSchemaQueries.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { SchemaItemQueries } from \"./SchemaItemQueries\";\r\nimport { modifier, strength, strengthDirection } from \"./SchemaStubQueries\";\r\n\r\n/**\r\n * Queries that return full Schema JSON data are found here. Shared SELECTS and\r\n * WITH clauses are broken down into individual variables.\r\n */\r\n\r\nconst propertyType = (alias: string) => {\r\n return `\r\n CASE\r\n WHEN [${alias}].[Kind] = 0 THEN 'PrimitiveProperty'\r\n WHEN [${alias}].[Kind] = 1 THEN 'StructProperty'\r\n WHEN [${alias}].[Kind] = 2 THEN 'PrimitiveArrayProperty'\r\n WHEN [${alias}].[Kind] = 3 THEN 'StructArrayProperty'\r\n WHEN [${alias}].[Kind] = 4 THEN 'NavigationProperty'\r\n ELSE NULL\r\n END\r\n `;\r\n};\r\n\r\nconst navigationDirection = (alias: string) => {\r\n return `\r\n CASE\r\n WHEN [${alias}].[NavigationDirection] = 1 THEN 'Forward'\r\n WHEN [${alias}].[NavigationDirection] = 2 THEN 'Backward'\r\n ELSE NULL\r\n END\r\n `;\r\n};\r\n\r\nconst schemaCustomAttribute = (alias: string) => {\r\n return `\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 1\r\n ORDER BY [ca].[Ordinal]\r\n `;\r\n};\r\n\r\n/**\r\n * Selects customAttribute data for each class type.\r\n */\r\nconst classCustomAttribute = (alias: string) => {\r\n return `\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 30\r\n ORDER BY [ca].[Ordinal]\r\n `;\r\n};\r\n\r\nconst propertyCustomAttribute = (alias: string) => {\r\n return `\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [${alias}].[ECInstanceId] AND [ca].[ContainerType] = 992\r\n ORDER BY [ca].[Ordinal]\r\n `;\r\n};\r\n\r\n\r\n/**\r\n * Selects base class data for each class type.\r\n */\r\nconst selectBaseClasses = `\r\n SELECT\r\n ec_classname([baseClass].[ECInstanceId], 's.c')\r\n FROM\r\n [meta].[ECClassDef] [baseClass]\r\n INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]\r\n ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]\r\n WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]\r\n ORDER BY [baseClassMap].[Ordinal] ASC\r\n LIMIT 1\r\n`;\r\n\r\n/**\r\n * Selects class property data for each class type. ClassProperties\r\n * is a common table expression (CTE or WITH clause) defined below.\r\n */\r\nconst selectProperties = `\r\n SELECT\r\n json_group_array(json([classProperties].[property]))\r\n FROM\r\n [ClassProperties] [classProperties]\r\n WHERE\r\n [classProperties].[ClassId] = [class].[ECInstanceId]\r\n`;\r\n\r\n/**\r\n * A CTE used to select AppliesTo from IsMixin CustomAttributes for a given Mixin.\r\n */\r\nconst withAppliesTo = `\r\n AppliesToCTE AS (\r\n SELECT\r\n [mixinAppliesTo].[ECInstanceId] AS [AppliesToId],\r\n [appliesToSchema].[name] as [AppliesToSchema],\r\n json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.IsMixin.AppliesToEntityClass') AS [AppliesTo]\r\n FROM [meta].[CustomAttribute] [ca]\r\n JOIN [meta].[ECClassDef] [mixinAppliesTo]\r\n ON [mixinAppliesTo].[ECInstanceId] = [ca].[ContainerId]\r\n JOIN [meta].[ECSchemaDef] [appliesToSchema]\r\n ON [appliesToSchema].[ECInstanceId] = [mixinAppliesTo].[Schema].[Id]\r\n WHERE [ca].[ContainerType] = 30\r\n AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') = 'IsMixin'\r\n )\r\n`;\r\n\r\n/**\r\n * A CTE used to select Schema reference data for a given Schema.\r\n */\r\nconst withSchemaReferences = `\r\nSchemaReferences as (\r\n SELECT\r\n [ref].[SourceECInstanceId] as [SchemaId],\r\n json_object(\r\n 'name', [Name],\r\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor]))\r\n ) as [reference]\r\n FROM\r\n [meta].[ECSchemaDef] as [refSchema]\r\n INNER JOIN [meta].[SchemaHasSchemaReferences] [ref]\r\n ON [ref].[TargetECInstanceId] = [refSchema].[ECInstanceId]\r\n)\r\n`;\r\n\r\n/**\r\n * A CTE used to select Relationship constraints for a given RelationshipClass.\r\n */\r\nconst withRelationshipConstraints = `\r\nClassRelationshipConstraints as (\r\n SELECT\r\n [rhc].[SourceECInstanceId] as [ClassId],\r\n [constraintDef].[ECInstanceId] as [ConstraintId],\r\n [RelationshipEnd],\r\n CONCAT('(', [MultiplicityLowerLimit], '..', IIF([MultiplicityUpperLimit] IS NULL, '*', [MultiplicityUpperLimit]), ')') as [Multiplicity],\r\n [IsPolyMorphic],\r\n [RoleLabel],\r\n IIF([constraintDef].[AbstractConstraintClass] IS NOT NULL, ec_classname([constraintDef].[AbstractConstraintClass].[Id], 's.c'), null) as [AbstractConstraint],\r\n IIF ([rchc].[TargetECInstanceId] IS NOT NULL, JSON_GROUP_ARRAY(ec_classname([rchc].[TargetECInstanceId], 's.c')), null) as [ConstraintClasses]\r\n FROM\r\n [meta].[ECRelationshipConstraintDef] [constraintDef]\r\n JOIN [meta].[RelationshipHasConstraints] [rhc]\r\n ON [rhc].[TargetECInstanceId] = [constraintDef].[ECInstanceId]\r\n JOIN [meta].[RelationshipConstraintHasClasses] [rchc]\r\n ON [rchc].[SourceECInstanceId] = [constraintDef].[ECInstanceId]\r\n GROUP BY [constraintDef].[ECInstanceId]\r\n)\r\n`;\r\n\r\n/**\r\n * A CTE used to select Class property data for a given Class.\r\n */\r\nconst withClassProperties = `\r\nClassProperties as (\r\nSELECT\r\n [cop].[SourceECInstanceId] as [ClassId],\r\n json_object(\r\n 'name', [pd].[Name],\r\n 'label', [pd].[DisplayLabel],\r\n 'description', [pd].[Description],\r\n 'isReadOnly', IIF([pd].[IsReadOnly] = 1, json('true'), NULL),\r\n 'priority', [pd].[Priority],\r\n 'category', IIF([categoryDef].[Name] IS NULL, NULL, CONCAT([categorySchemaDef].[Name], '.', [categoryDef].[Name])),\r\n 'kindOfQuantity', IIF([koqDef].[Name] IS NULL, NULL, CONCAT([koqSchemaDef].[Name], '.', [koqDef].[Name])),\r\n 'typeName',\r\n CASE\r\n WHEN [pd].[Kind] = 0 OR [pd].[Kind] = 2 Then\r\n CASE\r\n WHEN [enumDef].[Name] IS NOT NULL Then CONCAT([enumSchemaDef].[Name], '.', [enumDef].[Name])\r\n WHEN [pd].[PrimitiveType] = 257 Then 'binary'\r\n WHEN [pd].[PrimitiveType] = 513 Then 'boolean'\r\n WHEN [pd].[PrimitiveType] = 769 Then 'dateTime'\r\n WHEN [pd].[PrimitiveType] = 1025 Then 'double'\r\n WHEN [pd].[PrimitiveType] = 1281 Then 'int'\r\n WHEN [pd].[PrimitiveType] = 1537 Then 'long'\r\n WHEN [pd].[PrimitiveType] = 1793 Then 'point2d'\r\n WHEN [pd].[PrimitiveType] = 2049 Then 'point3d'\r\n WHEN [pd].[PrimitiveType] = 2305 Then 'string'\r\n WHEN [pd].[PrimitiveType] = 2561 Then 'Bentley.Geometry.Common.IGeometry'\r\n ELSE null\r\n END\r\n WHEN [pd].[Kind] = 1 OR [pd].[Kind] = 3 Then\r\n CONCAT([structSchemaDef].[Name], '.', [structDef].[Name])\r\n ELSE null\r\n END,\r\n 'type', ${propertyType(\"pd\")},\r\n 'minLength', [pd].[PrimitiveTypeMinLength],\r\n 'maxLength', [pd].[PrimitiveTypeMaxLength],\r\n 'minValue', [pd].[PrimitiveTypeMinValue],\r\n 'maxValue', [pd].[PrimitiveTypeMaxValue],\r\n 'extendedTypeName', [pd].[ExtendedTypeName],\r\n 'minOccurs', [pd].[ArrayMinOccurs],\r\n 'maxOccurs', [pd].[ArrayMaxOccurs],\r\n 'direction', ${navigationDirection(\"pd\")},\r\n 'relationshipName', IIF([navRelDef].[Name] IS NULL, NULL, CONCAT([navSchemaDef].[Name], '.', [navRelDef].[Name])),\r\n 'customAttributes', (${propertyCustomAttribute(\"pd\")})\r\n ) as [property]\r\nFROM\r\n [meta].[ECPropertyDef] as [pd]\r\nJOIN [meta].[ClassOwnsLocalProperties] [cop]\r\n ON cop.[TargetECInstanceId] = [pd].[ECInstanceId]\r\nLEFT JOIN [meta].[ECEnumerationDef] [enumDef]\r\n ON [enumDef].[ECInstanceId] = [pd].[Enumeration].[Id]\r\nLEFT JOIN [meta].[ECSchemaDef] enumSchemaDef\r\n ON [enumSchemaDef].[ECInstanceId] = [enumDef].[Schema].[Id]\r\nLEFT JOIN [meta].[PropertyCategoryDef] [categoryDef]\r\n ON [categoryDef].[ECInstanceId] = [pd].[Category].[Id]\r\nLEFT JOIN [meta].[ECSchemaDef] [categorySchemaDef]\r\n ON [categorySchemaDef].[ECInstanceId] = [categoryDef].[Schema].[Id]\r\nLEFT JOIN [meta].[KindOfQuantityDef] [koqDef]\r\n ON [koqDef].[ECInstanceId] = [pd].[KindOfQuantity].[Id]\r\nLEFT JOIN [meta].[ECSchemaDef] [koqSchemaDef]\r\n ON [koqSchemaDef].[ECInstanceId] = [koqDef].[Schema].[Id]\r\nLEFT JOIN [meta].[ECClassDef] [structDef]\r\n ON structDef.[ECInstanceId] = [pd].[StructClass].[Id]\r\nLEFT JOIN [meta].[ECSchemaDef] [structSchemaDef]\r\n ON [structSchemaDef].[ECInstanceId] = [structDef].[Schema].[Id]\r\nLEFT JOIN [meta].[ECClassDef] [navRelDef]\r\n ON [navRelDef].[ECInstanceId] = [pd].[NavigationRelationshipClass].[Id]\r\nLEFT JOIN [meta].[ECSchemaDef] [navSchemaDef]\r\n ON [navSchemaDef].[ECInstanceId] = [navRelDef].[Schema].[Id]\r\n)\r\n`;\r\n\r\n/**\r\n * Query that provides EntityClass data and is shared by two cases:\r\n * 1. A single query to return a full schema.\r\n * 2. When querying a full schema with multiple schema item queries or\r\n * when just querying for Entity classes.\r\n */\r\nconst baseEntityQuery = `\r\n SELECT\r\n [sd].[Name] as [schema],\r\n json_object (\r\n 'schemaItemType', 'EntityClass',\r\n 'name', [class].[Name],\r\n 'label', [class].[DisplayLabel],\r\n 'description', [class].[Description],\r\n 'modifier', ${modifier(\"class\")},\r\n 'baseClass', (\r\n ${selectBaseClasses}\r\n ),\r\n 'mixins', (\r\n SELECT\r\n json_group_array(\r\n ec_classname([baseClass].[ECInstanceId], 's.c')\r\n )\r\n FROM\r\n [meta].[ECClassDef] [baseClass]\r\n INNER JOIN [meta].[ClassHasBaseClasses] [baseClassMap]\r\n ON [baseClassMap].[TargetECInstanceId] = [baseClass].[ECInstanceId]\r\n WHERE [baseClassMap].[SourceECInstanceId] = [class].[ECInstanceId]\r\n AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [baseClass].[ECInstanceId] = [ca].[Class].[Id]\r\n AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))\r\n ),\r\n 'customAttributes', (${classCustomAttribute(\"class\")}),\r\n 'properties', (\r\n ${selectProperties}\r\n )\r\n ) AS [item]\r\n FROM [meta].[ECClassDef] [class]\r\n JOIN\r\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\r\n WHERE [class].[Type] = 0 AND\r\n [sd].[Name] = :schemaName\r\n AND NOT EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]\r\n AND [ca].[CustomAttributeClass].Id Is ([CoreCA].[IsMixin]))\r\n `;\r\n\r\n/**\r\n * EntityClass query used to when querying for EntityClass data only. Not used\r\n * for full Schema load via single query.\r\n */\r\nconst entityQuery = `\r\n WITH\r\n ${withClassProperties}\r\n ${baseEntityQuery}\r\n `\r\n\r\n/**\r\n * Query that provides Mixin data and is shared by two cases:\r\n * 1. A single query to return a full schema.\r\n * 2. When querying a full schema with multiple schema item queries or\r\n * when just querying for Mixin classes.\r\n */\r\nconst baseMixinQuery = `\r\n SELECT\r\n [sd].[Name] as [schema],\r\n json_object (\r\n 'schemaItemType', 'Mixin',\r\n 'name', [class].[Name],\r\n 'label', [class].[DisplayLabel],\r\n 'description', [class].[Description],\r\n 'modifier', ${modifier(\"class\")},\r\n 'baseClass', (\r\n ${selectBaseClasses}\r\n ),\r\n 'appliesTo', (\r\n SELECT IIF(instr([atCTE].[AppliesTo], ':') > 1, ec_classname(ec_classId([atCTE].[AppliesTo]), 's.c'), CONCAT([atCTE].[AppliesToSchema], '.', [atCTE].[AppliesTo]))\r\n FROM [AppliesToCTE] [atCTE]\r\n WHERE [atCTE].[AppliesToId] = [class].[ECInstanceId]\r\n ),\r\n 'customAttributes', (\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [class].[ECInstanceId] AND [ca].[ContainerType] = 30\r\n AND json_extract(XmlCAToJson([ca].[Class].[Id], [ca].[Instance]), '$.ecClass') <> 'IsMixin'\r\n ),\r\n 'properties', (\r\n SELECT\r\n json_group_array(json([classProperties].[property]))\r\n FROM\r\n [ClassProperties] [classProperties]\r\n WHERE\r\n [classProperties].[ClassId] = [class].[ECInstanceId]\r\n )\r\n ) AS [item]\r\n FROM [meta].[ECClassDef] [class]\r\n JOIN\r\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\r\n WHERE [class].[Type] = 0 AND\r\n [sd].[Name] = :schemaName\r\n AND EXISTS(SELECT 1 FROM [meta].[ClassCustomAttribute] [ca] WHERE [class].[ECInstanceId] = [ca].[Class].[Id]\r\n AND [ca].[CustomAttributeClass].[Id] Is ([CoreCA].[IsMixin]))\r\n `;\r\n\r\n/**\r\n* Mixin query used to when querying for Mixin data only. Not used\r\n* for full Schema load via single query.\r\n*/\r\nconst mixinQuery = `\r\n WITH\r\n ${withAppliesTo},\r\n ${withClassProperties}\r\n${baseMixinQuery}\r\n`\r\n\r\n/**\r\n * Query that provides RelationshipClass data and is shared by two cases:\r\n * 1. A single query to return a full schema.\r\n * 2. When querying a full schema with multiple schema item queries or\r\n * when just querying for Relationship classes.\r\n */\r\nconst baseRelationshipClassQuery = `\r\n SELECT\r\n [sd].Name as schema,\r\n json_object (\r\n 'schemaItemType', 'RelationshipClass',\r\n 'name', [class].[Name],\r\n 'label', [class].[DisplayLabel],\r\n 'description', [class].[Description],\r\n 'strength', ${strength(\"class\")},\r\n 'strengthDirection', ${strengthDirection(\"class\")},\r\n 'modifier', ${modifier(\"class\")},\r\n 'baseClass', (\r\n ${selectBaseClasses}\r\n ),\r\n 'customAttributes', (${classCustomAttribute(\"class\")}),\r\n 'properties', (\r\n ${selectProperties}\r\n ),\r\n 'source', (\r\n SELECT\r\n json_object (\r\n 'multiplicity', [sourceConst].[Multiplicity],\r\n 'roleLabel', [sourceConst].[RoleLabel],\r\n 'polymorphic', IIF([sourceConst].[IsPolyMorphic] = 1, json('true'), json('false')),\r\n 'abstractConstraint', [sourceConst].[AbstractConstraint],\r\n 'constraintClasses', json([sourceConst].[ConstraintClasses]),\r\n 'customAttributes', (\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [sourceConst].[ConstraintId] AND [ca].[ContainerType] = 1024\r\n ORDER BY [ca].[Ordinal]\r\n )\r\n )\r\n FROM\r\n [ClassRelationshipConstraints] [sourceConst]\r\n WHERE [sourceConst].[relationshipEnd] = 0\r\n AND [sourceConst].[ClassId] = [class].[ECInstanceId]\r\n ),\r\n 'target', (\r\n SELECT\r\n json_object (\r\n 'multiplicity', [targetConst].[Multiplicity],\r\n 'roleLabel', [targetConst].[RoleLabel],\r\n 'polymorphic', IIF([targetConst].[IsPolyMorphic] = 1, json('true'), json('false')),\r\n 'abstractConstraint', [targetConst].[AbstractConstraint],\r\n 'constraintClasses', json([targetConst].[ConstraintClasses]),\r\n 'customAttributes', (\r\n SELECT\r\n json_group_array(json(XmlCAToJson([ca].[Class].[Id], [ca].[Instance])))\r\n FROM [meta].[CustomAttribute] [ca]\r\n WHERE [ca].[ContainerId] = [targetConst].[ConstraintId] AND [ca].[ContainerType] = 2048\r\n ORDER BY [ca].[Ordinal]\r\n )\r\n )\r\n FROM\r\n [ClassRelationshipConstraints] [targetConst]\r\n WHERE [targetConst].[relationshipEnd] = 1\r\n AND [targetConst].[ClassId] = [class].[ECInstanceId]\r\n )\r\n ) AS [item]\r\n FROM [meta].[ECClassDef] [class]\r\n JOIN\r\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\r\n WHERE [class].[Type] = 1 AND\r\n [sd].[Name] = :schemaName\r\n `;\r\n\r\n/**\r\n* RelationshipClass query used to when querying for RelationshipClass data only. Not used\r\n* for full Schema load via single query.\r\n*/\r\nconst relationshipClassQuery = `\r\n WITH\r\n ${withClassProperties},\r\n ${withRelationshipConstraints}\r\n${baseRelationshipClassQuery}\r\n`\r\n\r\n/**\r\n * Query that provides StructClass data and is shared by two cases:\r\n * 1. A single query to return a full schema.\r\n * 2. When querying a full schema with multiple schema item queries or\r\n * when just querying for Struct classes.\r\n */\r\nconst baseStructQuery = `\r\n SELECT\r\n [sd].Name as schema,\r\n json_object (\r\n 'schemaItemType', 'StructClass',\r\n 'name', [class].[Name],\r\n 'label', [class].[DisplayLabel],\r\n 'description', [class].[Description],\r\n 'modifier', ${modifier(\"class\")},\r\n 'baseClass', (\r\n ${selectBaseClasses}\r\n ),\r\n 'customAttributes', (${classCustomAttribute(\"class\")}),\r\n 'properties', (\r\n ${selectProperties}\r\n )\r\n ) AS item\r\n FROM [meta].[ECClassDef] [class]\r\n JOIN\r\n [meta].[ECSchemaDef] [sd] ON [sd].[ECInstanceId] = [class].[Schema].[Id]\r\n WHERE [class].[Type] = 2 AND\r\n [sd].[Name] = :schemaName\r\n `;\r\n\r\n/**\r\n * StructClass query used to when querying for StructClass data only. Not used\r\n * for full Schema load via single query.\r\n */\r\nconst structQuery = `\r\n WITH\r\n ${withClassProperties}\r\n${baseStructQuery}\r\n`\r\n\r\n/**\r\n * Query that provides CustomAttributeClass data and is shared by two cases:\r\n * 1. A single query to return a full schema.\r\n * 2. When querying a full schema with multiple schema item queries or\r\n * when just querying for CustomAttribute classes.\r\n */\r\nconst baseCustomAttributeQuery = `\r\n SELECT\r\n [sd].Name as schema,\r\n json_object (\r\n 'schemaItemType', 'CustomAttributeClass',\r\n 'name', [class].[Name],\r\n 'label', [class].[DisplayLabel],\r\n 'description', [class].[Description],\r\n 'appliesTo', [class].[CustomAttributeContainerType],\r\n 'modifier', ${modifier(\"class\")},\r\n 'baseClass', (\r\n ${selectBaseClasses}\r\n ),\r\n 'customAttributes', (${classCustomAttribute(\"class\")}),\r\n 'properties', (\r\n ${selectProperties}\r\n )\r\n ) AS [item]\r\n FROM [meta].[ECClassDef] [class]\r\n JOIN\r\n [meta].[ECSchemaDef] sd ON [sd].[ECInstanceId] = [class].[Schema].[Id]\r\n WHERE [class].[Type] = 3 AND\r\n [sd].[Name] = :schemaName\r\n `;\r\n\r\n/**\r\n * CustomAttributeClass query used to when querying for CustomAttributeClass data only. Not used\r\n * for full Schema load via single query.\r\n */\r\nconst customAttributeQuery = `\r\nWITH\r\n ${withClassProperties}\r\n${baseCustomAttributeQuery}\r\n`\r\n\r\n/**\r\n * Used by full schema load query via single query. Allows\r\n * all SchemaItemTypes to be queried at once.\r\n */\r\nconst withSchemaItems = `\r\nSchemaItems AS (\r\n ${baseEntityQuery}\r\n UNION ALL\r\n ${baseRelationshipClassQuery}\r\n UNION ALL\r\n ${baseStructQuery}\r\n UNION ALL\r\n ${baseMixinQuery}\r\n UNION ALL\r\n ${baseCustomAttributeQuery}\r\n UNION ALL\r\n ${SchemaItemQueries.kindOfQuantity(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.enumeration(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.propertyCategory(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.unit(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.invertedUnit(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.unitSystem(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.constant(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.phenomenon(true)}\r\n UNION ALL\r\n ${SchemaItemQueries.format(true)}\r\n)\r\n`;\r\n\r\n/**\r\n * Query for Schema data without SchemaItems\r\n */\r\nconst schemaNoItemsQuery = `\r\nWITH\r\n ${withSchemaReferences}\r\nSELECT\r\n json_object (\r\n 'name', [schemaDef].[Name],\r\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),\r\n 'alias', [schemaDef].[Alias],\r\n 'label', [schemaDef].[DisplayLabel],\r\n 'description', [schemaDef].[Description],\r\n 'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],\r\n 'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],\r\n 'customAttributes', (${schemaCustomAttribute(\"schemaDef\")}),\r\n 'references', (\r\n SELECT\r\n json_group_array(json([schemaReferences].[reference]))\r\n FROM\r\n [SchemaReferences] [schemaReferences]\r\n WHERE\r\n [schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]\r\n )\r\n ) as [schema]\r\nFROM\r\n [meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName\r\n`;\r\n\r\n/**\r\n * Query to load a full Schema via a single query.\r\n */\r\nconst schemaQuery = `\r\nWITH\r\n ${withAppliesTo},\r\n ${withSchemaReferences},\r\n ${withClassProperties},\r\n ${withRelationshipConstraints},\r\n ${withSchemaItems}\r\nSELECT\r\n json_object (\r\n 'name', [schemaDef].[Name],\r\n 'version', CONCAT(printf('%02d', [VersionMajor]), '.', printf('%02d', [VersionWrite]), '.', printf('%02d', [VersionMinor])),\r\n 'alias', [schemaDef].[Alias],\r\n 'label', [schemaDef].[DisplayLabel],\r\n 'description', [schemaDef].[Description],\r\n 'ecSpecMajorVersion', [schemaDef].[OriginalECXmlVersionMajor],\r\n 'ecSpecMinorVersion', [schemaDef].[OriginalECXmlVersionMinor],\r\n 'customAttributes', (${schemaCustomAttribute(\"schemaDef\")}),\r\n 'references', (\r\n SELECT\r\n json_group_array(json([schemaReferences].[reference]))\r\n FROM\r\n [SchemaReferences] [schemaReferences]\r\n WHERE\r\n [schemaReferences].[SchemaId] = [schemaDef].[ECInstanceId]\r\n ),\r\n 'items', (\r\n SELECT\r\n json_group_array(json(json_object(\r\n 'item', json([items].[item])\r\n )))\r\n FROM\r\n [SchemaItems] [items]\r\n )\r\n) as [schema]\r\nFROM\r\n [meta].[ECSchemaDef] [schemaDef] WHERE [Name] = :schemaName\r\n`;\r\n\r\n/**\r\n * Queries for loading full Schema JSON.\r\n * @internal\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport const FullSchemaQueries = {\r\n schemaQuery,\r\n schemaNoItemsQuery,\r\n entityQuery,\r\n relationshipClassQuery,\r\n mixinQuery,\r\n structQuery,\r\n customAttributeQuery\r\n};\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalSchemaLocater.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/IncrementalSchemaLocater.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 { ECSchemaNamespaceUris } from \"../Constants\";\nimport { ISchemaLocater, SchemaContext } from \"../Context\";\nimport { SchemaProps, SchemaReferenceProps } from \"../Deserialization/JsonProps\";\nimport { SchemaGraphUtil } from \"../Deserialization/SchemaGraphUtil\";\nimport { SchemaMatchType } from \"../ECObjects\";\nimport { ECSchemaError, ECSchemaStatus } from \"../Exception\";\nimport { SchemaInfo } from \"../Interfaces\";\nimport { Schema } from \"../Metadata/Schema\";\nimport { SchemaKey } from \"../SchemaKey\";\nimport { SchemaLoadingController } from \"../utils/SchemaLoadingController\";\nimport { IncrementalSchemaReader } from \"./IncrementalSchemaReader\";\n\ninterface IncrementalSchemaInfo extends SchemaInfo {\n readonly description?: string;\n readonly label?: string;\n}\n\ntype LoadSchemaInfoHandler = (context: SchemaContext) => Promise<Iterable<SchemaInfo>>;\n\n/**\n * Defines the SchemaLocater Options which determine how each schema is to be loaded.\n * All options are optional.\n * @beta\n */\nexport interface SchemaLocaterOptions {\n /** Only load partial schemas. Full schema information will not be retrieved. Defaults to false. */\n readonly loadPartialSchemaOnly?: boolean;\n}\n\n/**\n * A [[ISchemaLocater]] implementation for locating and retrieving EC [[Schema]]\n * objects incrementally instead of the full schema and it's references at once. This is useful for large schemas that\n * take a long time to load, but clients need a rough skeleton of the schema as fast as possible.\n *\n * The IncrementalSchemaLocater is a locater around the [[IncrementalSchemaLocater]] to be used in a\n * [[SchemaContext]].\n * @internal\n */\nexport abstract class IncrementalSchemaLocater implements ISchemaLocater {\n private readonly _options: SchemaLocaterOptions;\n protected readonly _schemaInfoCache: SchemaInfoCache;\n\n /**\n * Initializes a new instance of the IncrementalSchemaLocater class.\n * @param options The [[SchemaLocaterOptions]] that control the loading of the schema.\n */\n constructor(options?: SchemaLocaterOptions) {\n this._options = options || {};\n\n this._schemaInfoCache = new SchemaInfoCache(async (context) => {\n return this.loadSchemaInfos(context);\n });\n }\n\n /** Gets the options how the schema locater load the schemas. */\n protected get options(): SchemaLocaterOptions {\n return this._options;\n }\n\n /**\n * Gets the [[SchemaInfo]] which matches the provided SchemaKey. The SchemaInfo may be returned\n * before the schema is fully loaded. May return the entire Schema so long as it is completely loaded as it satisfies\n * the SchemaInfo interface.\n * @param schemaKey The [[SchemaKey]] to look up.\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\n * @param context The [[SchemaContext]] for loading schema references.\n */\n public async getSchemaInfo(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<SchemaInfo | undefined> {\n return this._schemaInfoCache.lookup(schemaKey, matchType, context);\n }\n\n /**\n * Attempts to get a [[Schema]] from the locater. Yields undefined if no matching schema is found.\n * For schemas that may have references, construct and call through a SchemaContext instead.\n * @param schemaKey The [[SchemaKey]] to look up.\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\n * @param context The [[SchemaContext]] for loading schema references.\n */\n public async getSchema(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<Schema | undefined> {\n const schemaInfo = await this.getSchemaInfo(schemaKey, matchType, context);\n return schemaInfo\n ? this.loadSchema(schemaInfo, context)\n : undefined;\n }\n\n /**\n * Attempts to get a [[Schema]] from the locater. Yields undefined if no matching schema is found.\n * For schemas that may have references, construct and call through a SchemaContext instead.\n * NOT IMPLEMENTED IN THIS LOCATER - ALWAYS RETURNS UNDEFINED.\n * @param schemaKey The [[SchemaKey]] to look up.\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\n * @param context The [[SchemaContext]] for loading schema references.\n * @returns Incremental schema loading does not work synchronously, this will always return undefined.\n */\n public getSchemaSync(_schemaKey: Readonly<SchemaKey>, _matchType: SchemaMatchType, _context: SchemaContext): Schema | undefined {\n return undefined;\n }\n\n /**\n * Gets the schema partials for the given schema key. The first item in the array is the\n * actual schema props of the schema to load, the following items are partial schema props\n * of referenced schemas.\n * @param schemaKey The schema key of the requested schema.\n * @param context The schema context.\n */\n protected abstract getSchemaPartials(schemaKey: SchemaKey, context: SchemaContext): Promise<ReadonlyArray<SchemaProps> | undefined>;\n\n /**\n * Gets the full schema json for the requested schema key.\n * @param schemaKey The schema key of the requested schema.\n * @param context The schema context.\n */\n protected abstract getSchemaJson(schemaKey: SchemaKey, context: SchemaContext): Promise<SchemaProps | undefined>;\n\n /**\n * Loads the schema info objects for the given context.\n * @param context The schema context to load the schema infos for.\n * @returns A promise that resolves to an iterable of schema infos.\n */\n protected abstract loadSchemaInfos(context: SchemaContext): Promise<Iterable<SchemaInfo>>;\n\n /**\n * Checks if the context contains the right schemas to support incremental schema loading.\n * @param context The schema context to check.\n * @returns true if incremental schema loading is supported, false otherwise.\n */\n protected abstract supportPartialSchemaLoading(context: SchemaContext): Promise<boolean>;\n\n /**\n * Start loading the schema for the given schema info incrementally. The schema is returned\n * as soon as the schema stub is loaded while the schema fully resolves in the background. It should\n * only be called by the IncrementalSchemaLocater if a schema has not been loaded or started to\n * load yet.\n * @param schemaInfo The schema info of the schema to load.\n * @param schemaContext The schema context to load the schema into.\n */\n protected async loadSchema(schemaInfo: SchemaInfo, schemaContext: SchemaContext): Promise<Schema> {\n // If the meta schema is an earlier version than 4.0.3, we can't use the ECSql query interface to get the schema\n // information required to load the schema entirely. In this case, we fallback to use the ECSchema RPC interface\n // to fetch the whole schema json.\n if (!await this.supportPartialSchemaLoading(schemaContext)) {\n const schemaJson = await this.getSchemaJson(schemaInfo.schemaKey, schemaContext);\n if(schemaJson === undefined)\n throw new ECSchemaError(ECSchemaStatus.UnableToLocateSchema, `Could not locate the schema, ${schemaInfo.schemaKey.name}.${schemaInfo.schemaKey.version.toString()}`);\n\n return Schema.fromJson(schemaJson, schemaContext);\n }\n\n // Fetches the schema partials for the given schema key. The first item in the array is the\n // actual schema props of the schema to load, the following items are schema props of referenced\n // schema items that are needed to resolve the schema properly.\n const schemaPartials = await this.getSchemaPartials(schemaInfo.schemaKey, schemaContext);\n if (schemaPartials === undefined)\n throw new ECSchemaError(ECSchemaStatus.UnableToLocateSchema, `Could not locate the schema, ${schemaInfo.schemaKey.name}.${schemaInfo.schemaKey.version.toString()}`);\n\n // Sort the partials in dependency order to ensure referenced schemas exist in the schema context\n // when they get requested. Otherwise the context would call this method again and for referenced\n // schemas, we would not want to request the whole schema props.\n const sortedPartials = await this.sortSchemaPartials(schemaPartials, schemaContext);\n for (const schemaProps of sortedPartials) {\n await this.startLoadingPartialSchema(schemaProps, schemaContext);\n }\n\n const schema = await schemaContext.getCachedSchema(schemaInfo.schemaKey);\n if (!schema)\n throw new Error(`Schema ${schemaInfo.schemaKey.name} could not be found.`);\n\n return schema;\n }\n\n /**\n * Creates a SchemaProps object by loading the Schema information from the given SchemaContext.\n * @param schemaKey The SchemaKey of the Schema whose props are to be retrieved.\n * @param schemaContext The SchemaContext holding the Schema.\n * @returns The SchemaProps object.\n */\n protected async createSchemaProps(schemaKey: SchemaKey, schemaContext: SchemaContext): Promise<SchemaProps> {\n const schemaInfo = await schemaContext.getSchemaInfo(schemaKey, SchemaMatchType.Latest) as IncrementalSchemaInfo | undefined;\n if (!schemaInfo)\n throw new Error(`Schema ${schemaKey.name} could not be found.`);\n\n const schemaReferences: Array<SchemaReferenceProps> = [];\n const schemaProps: SchemaProps = {\n $schema: ECSchemaNamespaceUris.SCHEMAURL3_2_JSON,\n name: schemaKey.name,\n alias: schemaInfo.alias,\n version: schemaInfo.schemaKey.version.toString(),\n description: schemaInfo.description,\n label: schemaInfo.label,\n references: schemaReferences,\n items: {}\n };\n\n schemaInfo.references.forEach((ref) => {\n schemaReferences.push({ name: ref.schemaKey.name, version: ref.schemaKey.version.toString() });\n });\n\n return schemaProps;\n }\n\n private async startLoadingPartialSchema(schemaProps: SchemaProps, schemaContext: SchemaContext): Promise<void> {\n if (schemaContext.schemaExists(SchemaKey.parseString(`${schemaProps.name}.${schemaProps.version}`))) {\n return;\n }\n\n const controller = new SchemaLoadingController();\n const schemaReader = new IncrementalSchemaReader(schemaContext, true);\n const schema = new Schema(schemaContext);\n schema.setLoadingController(controller);\n\n await schemaReader.readSchema(schema, schemaProps);\n\n if (!this._options.loadPartialSchemaOnly)\n controller.start(this.startLoadingFullSchema(schema));\n }\n\n private async loadFullSchema(schema: Schema): Promise<void> {\n const fullSchemaProps = await this.getSchemaJson(schema.schemaKey, schema.context)\n const reader = new IncrementalSchemaReader(schema.context, false);\n await reader.readSchema(schema, fullSchemaProps, false);\n }\n\n private async startLoadingFullSchema(schema: Schema): Promise<void> {\n if (!schema.loadingController)\n return;\n\n // If the schema is already resolved, return it directly.\n if (schema.loadingController.isComplete || schema.loadingController.inProgress) {\n return;\n }\n\n // Since the schema relies on it's references, they get triggered to be resolved\n // first by recursively calling this method. After all references has been resolved\n // the schema itself gets resolved.\n await Promise.all(schema.references.map(async (referenceSchema) => {\n if (referenceSchema.loadingController && referenceSchema.loadingController.inProgress)\n return referenceSchema.loadingController.wait();\n else\n return this.startLoadingFullSchema(referenceSchema);\n }));\n\n return this.loadFullSchema(schema);\n }\n\n private async sortSchemaPartials(schemaPartials: ReadonlyArray<SchemaProps>, schemaContext: SchemaContext): Promise<ReadonlyArray<SchemaProps>> {\n const schemaInfos: Array<SchemaInfo & { props: SchemaProps }> = [];\n for (const schemaProps of schemaPartials) {\n const schemaKey = SchemaKey.parseString(`${schemaProps.name}.${schemaProps.version}`);\n const schemaInfo = await schemaContext.getSchemaInfo(schemaKey, SchemaMatchType.Latest);\n if (!schemaInfo)\n throw new Error(`Schema ${schemaKey.name} could not be found.`);\n\n schemaInfos.push({ ...schemaInfo, props: schemaProps });\n }\n\n const orderedSchemaInfos = SchemaGraphUtil.buildDependencyOrderedSchemaInfoList(schemaInfos) as Array<SchemaInfo & { props: SchemaProps }>;\n return orderedSchemaInfos.map((schemaInfo) => schemaInfo.props);\n }\n}\n\n/**\n * Helper class to manage schema infos for a schema context.\n */\nclass SchemaInfoCache {\n private readonly _schemaInfoCache: WeakMap<SchemaContext, Array<IncrementalSchemaInfo>>;\n private readonly _schemaInfoLoader: LoadSchemaInfoHandler;\n\n constructor(schemaInfoLoader: LoadSchemaInfoHandler) {\n this._schemaInfoCache = new WeakMap<SchemaContext, Array<IncrementalSchemaInfo>>();\n this._schemaInfoLoader = schemaInfoLoader;\n }\n\n public async getSchemasByContext(context: SchemaContext): Promise<IncrementalSchemaInfo[] | undefined> {\n if (!this._schemaInfoCache.has(context)) {\n const schemaInfos = await this._schemaInfoLoader(context);\n this._schemaInfoCache.set(context, Array.from(schemaInfos));\n }\n return this._schemaInfoCache.get(context);\n }\n\n public async lookup(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<IncrementalSchemaInfo | undefined> {\n const contextSchemaInfos = await this.getSchemasByContext(context);\n return contextSchemaInfos\n ? contextSchemaInfos.find((schemaInfo) => schemaInfo.schemaKey.matches(schemaKey, matchType))\n : undefined;\n }\n\n public remove(schemaKey: SchemaKey, context: SchemaContext): void {\n const contextSchemaInfos = this._schemaInfoCache.get(context);\n if (!contextSchemaInfos)\n return;\n\n const index = contextSchemaInfos.findIndex((schemaInfo) => schemaInfo.schemaKey.name === schemaKey.name);\n if (index !== -1) {\n contextSchemaInfos.splice(index, 1);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"IncrementalSchemaLocater.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/IncrementalSchemaLocater.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { ECSchemaNamespaceUris } from \"../Constants\";\r\nimport { ISchemaLocater, SchemaContext } from \"../Context\";\r\nimport { SchemaProps, SchemaReferenceProps } from \"../Deserialization/JsonProps\";\r\nimport { SchemaGraphUtil } from \"../Deserialization/SchemaGraphUtil\";\r\nimport { SchemaMatchType } from \"../ECObjects\";\r\nimport { ECSchemaError, ECSchemaStatus } from \"../Exception\";\r\nimport { SchemaInfo } from \"../Interfaces\";\r\nimport { Schema } from \"../Metadata/Schema\";\r\nimport { SchemaKey } from \"../SchemaKey\";\r\nimport { SchemaLoadingController } from \"../utils/SchemaLoadingController\";\r\nimport { IncrementalSchemaReader } from \"./IncrementalSchemaReader\";\r\n\r\ninterface IncrementalSchemaInfo extends SchemaInfo {\r\n readonly description?: string;\r\n readonly label?: string;\r\n}\r\n\r\ntype LoadSchemaInfoHandler = (context: SchemaContext) => Promise<Iterable<SchemaInfo>>;\r\n\r\n/**\r\n * Defines the SchemaLocater Options which determine how each schema is to be loaded.\r\n * All options are optional.\r\n * @beta\r\n */\r\nexport interface SchemaLocaterOptions {\r\n /** Only load partial schemas. Full schema information will not be retrieved. Defaults to false. */\r\n readonly loadPartialSchemaOnly?: boolean;\r\n}\r\n\r\n/**\r\n * A [[ISchemaLocater]] implementation for locating and retrieving EC [[Schema]]\r\n * objects incrementally instead of the full schema and it's references at once. This is useful for large schemas that\r\n * take a long time to load, but clients need a rough skeleton of the schema as fast as possible.\r\n *\r\n * The IncrementalSchemaLocater is a locater around the [[IncrementalSchemaLocater]] to be used in a\r\n * [[SchemaContext]].\r\n * @internal\r\n */\r\nexport abstract class IncrementalSchemaLocater implements ISchemaLocater {\r\n private readonly _options: SchemaLocaterOptions;\r\n protected readonly _schemaInfoCache: SchemaInfoCache;\r\n\r\n /**\r\n * Initializes a new instance of the IncrementalSchemaLocater class.\r\n * @param options The [[SchemaLocaterOptions]] that control the loading of the schema.\r\n */\r\n constructor(options?: SchemaLocaterOptions) {\r\n this._options = options || {};\r\n\r\n this._schemaInfoCache = new SchemaInfoCache(async (context) => {\r\n return this.loadSchemaInfos(context);\r\n });\r\n }\r\n\r\n /** Gets the options how the schema locater load the schemas. */\r\n protected get options(): SchemaLocaterOptions {\r\n return this._options;\r\n }\r\n\r\n /**\r\n * Gets the [[SchemaInfo]] which matches the provided SchemaKey. The SchemaInfo may be returned\r\n * before the schema is fully loaded. May return the entire Schema so long as it is completely loaded as it satisfies\r\n * the SchemaInfo interface.\r\n * @param schemaKey The [[SchemaKey]] to look up.\r\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\r\n * @param context The [[SchemaContext]] for loading schema references.\r\n */\r\n public async getSchemaInfo(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<SchemaInfo | undefined> {\r\n return this._schemaInfoCache.lookup(schemaKey, matchType, context);\r\n }\r\n\r\n /**\r\n * Attempts to get a [[Schema]] from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * @param schemaKey The [[SchemaKey]] to look up.\r\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\r\n * @param context The [[SchemaContext]] for loading schema references.\r\n */\r\n public async getSchema(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<Schema | undefined> {\r\n const schemaInfo = await this.getSchemaInfo(schemaKey, matchType, context);\r\n return schemaInfo\r\n ? this.loadSchema(schemaInfo, context)\r\n : undefined;\r\n }\r\n\r\n /**\r\n * Attempts to get a [[Schema]] from the locater. Yields undefined if no matching schema is found.\r\n * For schemas that may have references, construct and call through a SchemaContext instead.\r\n * NOT IMPLEMENTED IN THIS LOCATER - ALWAYS RETURNS UNDEFINED.\r\n * @param schemaKey The [[SchemaKey]] to look up.\r\n * @param matchType The [[SchemaMatchType]] to use against candidate schemas.\r\n * @param context The [[SchemaContext]] for loading schema references.\r\n * @returns Incremental schema loading does not work synchronously, this will always return undefined.\r\n */\r\n public getSchemaSync(_schemaKey: Readonly<SchemaKey>, _matchType: SchemaMatchType, _context: SchemaContext): Schema | undefined {\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Gets the schema partials for the given schema key. The first item in the array is the\r\n * actual schema props of the schema to load, the following items are partial schema props\r\n * of referenced schemas.\r\n * @param schemaKey The schema key of the requested schema.\r\n * @param context The schema context.\r\n */\r\n protected abstract getSchemaPartials(schemaKey: SchemaKey, context: SchemaContext): Promise<ReadonlyArray<SchemaProps> | undefined>;\r\n\r\n /**\r\n * Gets the full schema json for the requested schema key.\r\n * @param schemaKey The schema key of the requested schema.\r\n * @param context The schema context.\r\n */\r\n protected abstract getSchemaJson(schemaKey: SchemaKey, context: SchemaContext): Promise<SchemaProps | undefined>;\r\n\r\n /**\r\n * Loads the schema info objects for the given context.\r\n * @param context The schema context to load the schema infos for.\r\n * @returns A promise that resolves to an iterable of schema infos.\r\n */\r\n protected abstract loadSchemaInfos(context: SchemaContext): Promise<Iterable<SchemaInfo>>;\r\n\r\n /**\r\n * Checks if the context contains the right schemas to support incremental schema loading.\r\n * @param context The schema context to check.\r\n * @returns true if incremental schema loading is supported, false otherwise.\r\n */\r\n protected abstract supportPartialSchemaLoading(context: SchemaContext): Promise<boolean>;\r\n\r\n /**\r\n * Start loading the schema for the given schema info incrementally. The schema is returned\r\n * as soon as the schema stub is loaded while the schema fully resolves in the background. It should\r\n * only be called by the IncrementalSchemaLocater if a schema has not been loaded or started to\r\n * load yet.\r\n * @param schemaInfo The schema info of the schema to load.\r\n * @param schemaContext The schema context to load the schema into.\r\n */\r\n protected async loadSchema(schemaInfo: SchemaInfo, schemaContext: SchemaContext): Promise<Schema> {\r\n // If the meta schema is an earlier version than 4.0.3, we can't use the ECSql query interface to get the schema\r\n // information required to load the schema entirely. In this case, we fallback to use the ECSchema RPC interface\r\n // to fetch the whole schema json.\r\n if (!await this.supportPartialSchemaLoading(schemaContext)) {\r\n const schemaJson = await this.getSchemaJson(schemaInfo.schemaKey, schemaContext);\r\n if(schemaJson === undefined)\r\n throw new ECSchemaError(ECSchemaStatus.UnableToLocateSchema, `Could not locate the schema, ${schemaInfo.schemaKey.name}.${schemaInfo.schemaKey.version.toString()}`);\r\n\r\n return Schema.fromJson(schemaJson, schemaContext);\r\n }\r\n\r\n // Fetches the schema partials for the given schema key. The first item in the array is the\r\n // actual schema props of the schema to load, the following items are schema props of referenced\r\n // schema items that are needed to resolve the schema properly.\r\n const schemaPartials = await this.getSchemaPartials(schemaInfo.schemaKey, schemaContext);\r\n if (schemaPartials === undefined)\r\n throw new ECSchemaError(ECSchemaStatus.UnableToLocateSchema, `Could not locate the schema, ${schemaInfo.schemaKey.name}.${schemaInfo.schemaKey.version.toString()}`);\r\n\r\n // Sort the partials in dependency order to ensure referenced schemas exist in the schema context\r\n // when they get requested. Otherwise the context would call this method again and for referenced\r\n // schemas, we would not want to request the whole schema props.\r\n const sortedPartials = await this.sortSchemaPartials(schemaPartials, schemaContext);\r\n for (const schemaProps of sortedPartials) {\r\n await this.startLoadingPartialSchema(schemaProps, schemaContext);\r\n }\r\n\r\n const schema = await schemaContext.getCachedSchema(schemaInfo.schemaKey);\r\n if (!schema)\r\n throw new Error(`Schema ${schemaInfo.schemaKey.name} could not be found.`);\r\n\r\n return schema;\r\n }\r\n\r\n /**\r\n * Creates a SchemaProps object by loading the Schema information from the given SchemaContext.\r\n * @param schemaKey The SchemaKey of the Schema whose props are to be retrieved.\r\n * @param schemaContext The SchemaContext holding the Schema.\r\n * @returns The SchemaProps object.\r\n */\r\n protected async createSchemaProps(schemaKey: SchemaKey, schemaContext: SchemaContext): Promise<SchemaProps> {\r\n const schemaInfo = await schemaContext.getSchemaInfo(schemaKey, SchemaMatchType.Latest) as IncrementalSchemaInfo | undefined;\r\n if (!schemaInfo)\r\n throw new Error(`Schema ${schemaKey.name} could not be found.`);\r\n\r\n const schemaReferences: Array<SchemaReferenceProps> = [];\r\n const schemaProps: SchemaProps = {\r\n $schema: ECSchemaNamespaceUris.SCHEMAURL3_2_JSON,\r\n name: schemaKey.name,\r\n alias: schemaInfo.alias,\r\n version: schemaInfo.schemaKey.version.toString(),\r\n description: schemaInfo.description,\r\n label: schemaInfo.label,\r\n references: schemaReferences,\r\n items: {}\r\n };\r\n\r\n schemaInfo.references.forEach((ref) => {\r\n schemaReferences.push({ name: ref.schemaKey.name, version: ref.schemaKey.version.toString() });\r\n });\r\n\r\n return schemaProps;\r\n }\r\n\r\n private async startLoadingPartialSchema(schemaProps: SchemaProps, schemaContext: SchemaContext): Promise<void> {\r\n if (schemaContext.schemaExists(SchemaKey.parseString(`${schemaProps.name}.${schemaProps.version}`))) {\r\n return;\r\n }\r\n\r\n const controller = new SchemaLoadingController();\r\n const schemaReader = new IncrementalSchemaReader(schemaContext, true);\r\n const schema = new Schema(schemaContext);\r\n schema.setLoadingController(controller);\r\n\r\n await schemaReader.readSchema(schema, schemaProps);\r\n\r\n if (!this._options.loadPartialSchemaOnly)\r\n controller.start(this.startLoadingFullSchema(schema));\r\n }\r\n\r\n private async loadFullSchema(schema: Schema): Promise<void> {\r\n const fullSchemaProps = await this.getSchemaJson(schema.schemaKey, schema.context)\r\n const reader = new IncrementalSchemaReader(schema.context, false);\r\n await reader.readSchema(schema, fullSchemaProps, false);\r\n }\r\n\r\n private async startLoadingFullSchema(schema: Schema): Promise<void> {\r\n if (!schema.loadingController)\r\n return;\r\n\r\n // If the schema is already resolved, return it directly.\r\n if (schema.loadingController.isComplete || schema.loadingController.inProgress) {\r\n return;\r\n }\r\n\r\n // Since the schema relies on it's references, they get triggered to be resolved\r\n // first by recursively calling this method. After all references has been resolved\r\n // the schema itself gets resolved.\r\n await Promise.all(schema.references.map(async (referenceSchema) => {\r\n if (referenceSchema.loadingController && referenceSchema.loadingController.inProgress)\r\n return referenceSchema.loadingController.wait();\r\n else\r\n return this.startLoadingFullSchema(referenceSchema);\r\n }));\r\n\r\n return this.loadFullSchema(schema);\r\n }\r\n\r\n private async sortSchemaPartials(schemaPartials: ReadonlyArray<SchemaProps>, schemaContext: SchemaContext): Promise<ReadonlyArray<SchemaProps>> {\r\n const schemaInfos: Array<SchemaInfo & { props: SchemaProps }> = [];\r\n for (const schemaProps of schemaPartials) {\r\n const schemaKey = SchemaKey.parseString(`${schemaProps.name}.${schemaProps.version}`);\r\n const schemaInfo = await schemaContext.getSchemaInfo(schemaKey, SchemaMatchType.Latest);\r\n if (!schemaInfo)\r\n throw new Error(`Schema ${schemaKey.name} could not be found.`);\r\n\r\n schemaInfos.push({ ...schemaInfo, props: schemaProps });\r\n }\r\n\r\n const orderedSchemaInfos = SchemaGraphUtil.buildDependencyOrderedSchemaInfoList(schemaInfos) as Array<SchemaInfo & { props: SchemaProps }>;\r\n return orderedSchemaInfos.map((schemaInfo) => schemaInfo.props);\r\n }\r\n}\r\n\r\n/**\r\n * Helper class to manage schema infos for a schema context.\r\n */\r\nclass SchemaInfoCache {\r\n private readonly _schemaInfoCache: WeakMap<SchemaContext, Array<IncrementalSchemaInfo>>;\r\n private readonly _schemaInfoLoader: LoadSchemaInfoHandler;\r\n\r\n constructor(schemaInfoLoader: LoadSchemaInfoHandler) {\r\n this._schemaInfoCache = new WeakMap<SchemaContext, Array<IncrementalSchemaInfo>>();\r\n this._schemaInfoLoader = schemaInfoLoader;\r\n }\r\n\r\n public async getSchemasByContext(context: SchemaContext): Promise<IncrementalSchemaInfo[] | undefined> {\r\n if (!this._schemaInfoCache.has(context)) {\r\n const schemaInfos = await this._schemaInfoLoader(context);\r\n this._schemaInfoCache.set(context, Array.from(schemaInfos));\r\n }\r\n return this._schemaInfoCache.get(context);\r\n }\r\n\r\n public async lookup(schemaKey: SchemaKey, matchType: SchemaMatchType, context: SchemaContext): Promise<IncrementalSchemaInfo | undefined> {\r\n const contextSchemaInfos = await this.getSchemasByContext(context);\r\n return contextSchemaInfos\r\n ? contextSchemaInfos.find((schemaInfo) => schemaInfo.schemaKey.matches(schemaKey, matchType))\r\n : undefined;\r\n }\r\n\r\n public remove(schemaKey: SchemaKey, context: SchemaContext): void {\r\n const contextSchemaInfos = this._schemaInfoCache.get(context);\r\n if (!contextSchemaInfos)\r\n return;\r\n\r\n const index = contextSchemaInfos.findIndex((schemaInfo) => schemaInfo.schemaKey.name === schemaKey.name);\r\n if (index !== -1) {\r\n contextSchemaInfos.splice(index, 1);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncrementalSchemaReader.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/IncrementalSchemaReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,gBAAgB;IAC1C,YAAY,CAAU;IAEvC;;;;;OAKG;IACH,YAAY,aAA4B,EAAE,WAAoB;QAC5D,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACgB,kBAAkB,CAAC,UAAkC;QACtE,OAAO,UAAU,KAAK,SAAS;eAC1B,UAAU,CAAC,iBAAiB,KAAK,SAAS;eAC1C,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACa,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,gBAAmC;QACtH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAExH,2GAA2G;QAC3G,2GAA2G;QAC3G,+EAA+E;QAC/E,IAAI,IAAI,CAAC,YAAY,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAAC;YACxD,MAAM,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,iBAAiB,CAAC,UAAkC;QAC1D,IAAI,UAAU,KAAK,SAAS;YAC1B,OAAO;QAET,IAAI,UAAU,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACjD,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAE5C,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;eAC5B,UAAU,CAAC,cAAc,KAAK,cAAc,CAAC,cAAc;eAC3D,UAAU,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM;YACtD,UAAU,CAAC,iBAAiB,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;;YAE7D,UAAU,CAAC,iBAAiB,CAAC,UAAU,GAAG,IAAI,CAAC;IACnD,CAAC;CACF","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 { SchemaContext } from \"../Context\";\nimport { SchemaReadHelper } from \"../Deserialization/Helper\";\nimport { JsonParser } from \"../Deserialization/JsonParser\";\nimport { SchemaItemType } from \"../ECObjects\";\nimport { ECClass } from \"../Metadata/Class\";\nimport { Schema } from \"../Metadata/Schema\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { SchemaLoadingController } from \"../utils/SchemaLoadingController\";\n\n/**\n * Internal helper class to read schema information incrementally. It's based on the [[SchemaReadHelper]]\n * but overrides a few methods to support the incremental schema loading case.\n * @internal\n */\nexport class IncrementalSchemaReader extends SchemaReadHelper {\n private readonly _incremental: boolean;\n\n /**\n * Initializes a new [[IncrementalSchemaReader]] instance.\n * @param schemaContext The [[SchemaContext]] used to load the schemas.\n * @param incremental Indicates that the Schema should be read incrementally.\n * Pass false to load the full schema without an incremental/partial load.\n */\n constructor(schemaContext: SchemaContext, incremental: boolean) {\n super(JsonParser, schemaContext);\n this._incremental = incremental;\n }\n\n /**\n * Indicates that a given [[SchemaItem]] has been fully loaded.\n * @param schemaItem The SchemaItem to check.\n * @returns True if the item has been loaded, false if still in progress.\n */\n protected override isSchemaItemLoaded(schemaItem: SchemaItem | undefined): boolean {\n return schemaItem !== undefined\n && schemaItem.loadingController !== undefined\n && schemaItem.loadingController.isComplete;\n }\n\n /**\n * Starts loading the [[SchemaItem]] identified by the given name and itemType.\n * @param schema The [[Schema]] that contains the SchemaItem.\n * @param name The name of the SchemaItem to load.\n * @param itemType The SchemaItem type name of the item to load.\n * @param schemaItemObject The object accepting the SchemaItem data.\n * @returns A promise that resolves to the loaded SchemaItem instance. Can be undefined.\n */\n public override async loadSchemaItem(schema: Schema, name: string, itemType: string, schemaItemObject: Readonly<unknown>): Promise<SchemaItem | undefined> {\n const schemaItem = await super.loadSchemaItem(schema, name, itemType, this._incremental ? undefined : schemaItemObject);\n\n // In incremental mode, we only load the stubs of the classes. These include the modifier and base classes.\n // The fromJSON method of the actual class instances may complain about missing properties in the props, so\n // calling the fromJSON on the ECClass ensures only the bare minimum is loaded.\n if (this._incremental && schemaItemObject && schemaItem) {\n await schemaItem.fromJSON(schemaItemObject);\n }\n\n this.schemaItemLoading(schemaItem);\n return schemaItem;\n }\n\n private schemaItemLoading(schemaItem: SchemaItem | undefined): void {\n if (schemaItem === undefined)\n return;\n\n if (schemaItem.loadingController === undefined) {\n const controller = new SchemaLoadingController();\n schemaItem.setLoadingController(controller);\n\n return this.schemaItemLoading(schemaItem);\n }\n\n if (ECClass.isECClass(schemaItem)\n || schemaItem.schemaItemType === SchemaItemType.KindOfQuantity\n || schemaItem.schemaItemType === SchemaItemType.Format)\n schemaItem.loadingController.isComplete = !this._incremental;\n else\n schemaItem.loadingController.isComplete = true;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"IncrementalSchemaReader.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/IncrementalSchemaReader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAE3E;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,gBAAgB;IAC1C,YAAY,CAAU;IAEvC;;;;;OAKG;IACH,YAAY,aAA4B,EAAE,WAAoB;QAC5D,KAAK,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACgB,kBAAkB,CAAC,UAAkC;QACtE,OAAO,UAAU,KAAK,SAAS;eAC1B,UAAU,CAAC,iBAAiB,KAAK,SAAS;eAC1C,UAAU,CAAC,iBAAiB,CAAC,UAAU,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACa,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,IAAY,EAAE,QAAgB,EAAE,gBAAmC;QACtH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAExH,2GAA2G;QAC3G,2GAA2G;QAC3G,+EAA+E;QAC/E,IAAI,IAAI,CAAC,YAAY,IAAI,gBAAgB,IAAI,UAAU,EAAE,CAAC;YACxD,MAAM,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnC,OAAO,UAAU,CAAC;IACpB,CAAC;IAEO,iBAAiB,CAAC,UAAkC;QAC1D,IAAI,UAAU,KAAK,SAAS;YAC1B,OAAO;QAET,IAAI,UAAU,CAAC,iBAAiB,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACjD,UAAU,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAE5C,OAAO,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC;eAC5B,UAAU,CAAC,cAAc,KAAK,cAAc,CAAC,cAAc;eAC3D,UAAU,CAAC,cAAc,KAAK,cAAc,CAAC,MAAM;YACtD,UAAU,CAAC,iBAAiB,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;;YAE7D,UAAU,CAAC,iBAAiB,CAAC,UAAU,GAAG,IAAI,CAAC;IACnD,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport { SchemaContext } from \"../Context\";\r\nimport { SchemaReadHelper } from \"../Deserialization/Helper\";\r\nimport { JsonParser } from \"../Deserialization/JsonParser\";\r\nimport { SchemaItemType } from \"../ECObjects\";\r\nimport { ECClass } from \"../Metadata/Class\";\r\nimport { Schema } from \"../Metadata/Schema\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { SchemaLoadingController } from \"../utils/SchemaLoadingController\";\r\n\r\n/**\r\n * Internal helper class to read schema information incrementally. It's based on the [[SchemaReadHelper]]\r\n * but overrides a few methods to support the incremental schema loading case.\r\n * @internal\r\n */\r\nexport class IncrementalSchemaReader extends SchemaReadHelper {\r\n private readonly _incremental: boolean;\r\n\r\n /**\r\n * Initializes a new [[IncrementalSchemaReader]] instance.\r\n * @param schemaContext The [[SchemaContext]] used to load the schemas.\r\n * @param incremental Indicates that the Schema should be read incrementally.\r\n * Pass false to load the full schema without an incremental/partial load.\r\n */\r\n constructor(schemaContext: SchemaContext, incremental: boolean) {\r\n super(JsonParser, schemaContext);\r\n this._incremental = incremental;\r\n }\r\n\r\n /**\r\n * Indicates that a given [[SchemaItem]] has been fully loaded.\r\n * @param schemaItem The SchemaItem to check.\r\n * @returns True if the item has been loaded, false if still in progress.\r\n */\r\n protected override isSchemaItemLoaded(schemaItem: SchemaItem | undefined): boolean {\r\n return schemaItem !== undefined\r\n && schemaItem.loadingController !== undefined\r\n && schemaItem.loadingController.isComplete;\r\n }\r\n\r\n /**\r\n * Starts loading the [[SchemaItem]] identified by the given name and itemType.\r\n * @param schema The [[Schema]] that contains the SchemaItem.\r\n * @param name The name of the SchemaItem to load.\r\n * @param itemType The SchemaItem type name of the item to load.\r\n * @param schemaItemObject The object accepting the SchemaItem data.\r\n * @returns A promise that resolves to the loaded SchemaItem instance. Can be undefined.\r\n */\r\n public override async loadSchemaItem(schema: Schema, name: string, itemType: string, schemaItemObject: Readonly<unknown>): Promise<SchemaItem | undefined> {\r\n const schemaItem = await super.loadSchemaItem(schema, name, itemType, this._incremental ? undefined : schemaItemObject);\r\n\r\n // In incremental mode, we only load the stubs of the classes. These include the modifier and base classes.\r\n // The fromJSON method of the actual class instances may complain about missing properties in the props, so\r\n // calling the fromJSON on the ECClass ensures only the bare minimum is loaded.\r\n if (this._incremental && schemaItemObject && schemaItem) {\r\n await schemaItem.fromJSON(schemaItemObject);\r\n }\r\n\r\n this.schemaItemLoading(schemaItem);\r\n return schemaItem;\r\n }\r\n\r\n private schemaItemLoading(schemaItem: SchemaItem | undefined): void {\r\n if (schemaItem === undefined)\r\n return;\r\n\r\n if (schemaItem.loadingController === undefined) {\r\n const controller = new SchemaLoadingController();\r\n schemaItem.setLoadingController(controller);\r\n\r\n return this.schemaItemLoading(schemaItem);\r\n }\r\n\r\n if (ECClass.isECClass(schemaItem)\r\n || schemaItem.schemaItemType === SchemaItemType.KindOfQuantity\r\n || schemaItem.schemaItemType === SchemaItemType.Format)\r\n schemaItem.loadingController.isComplete = !this._incremental;\r\n else\r\n schemaItem.loadingController.isComplete = true;\r\n }\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaItemParsers.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/SchemaItemParsers.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAGhG,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAuB,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAMtD;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACjB,OAAO,CAAS;IAChB,YAAY,CAAuB;IAE7C;;;;OAIG;IACH,YAAmB,UAAkB,EAAE,WAAiC;QACtE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,KAAK,CAAC,IAAwB;QACzC,MAAM,KAAK,GAAG,IAA8B,CAAC;QAC7C,KAAK,CAAC,cAAc,GAAG,mBAAmB,CAAE,IAAY,CAAC,cAAc,CAAC,CAAC;QACzE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChJ,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAChE,OAAO,KAAK,CAAC,gBAAgB,CAAC;QAEhC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,oBAAoB,CAAC,WAAmB;QAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,EAAE;gBAClC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY;YACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvE,OAAO,GAAG,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAEO,oBAAoB,CAAC,KAAa;QACxC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK;gBAC5B,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAMD;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IACxD;;;;OAIG;IACa,KAAK,CAAC,KAAK,CAAC,IAAyB;QACnD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAA+B,CAAC;QAE3E,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;YACjC,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACzF,CAAC;QACD,YAAY,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAE3E,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,sBAAsB,CAAC,KAA0B;QACvD,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,iBAAiB;YAC1B,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM,gBAAgB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,kBAAkB,GAAwB,cAAc,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACnG,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;YACzE,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAA,CAAC;QAEF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,0BAA0B,CAAC,mBAAwC;QAEzE,IAAI,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzE,IAAI,mBAAmB,CAAC,SAAS,KAAK,SAAS;YAC7C,cAAc,IAAI,IAAI,mBAAmB,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC;QAEpE,IAAI,SAAS,KAAK,mBAAmB,CAAC,aAAa;YACjD,OAAO,cAAc,CAAC;QAExB,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,mBAAmB,CAAC,aAAa,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAErD,IAAI,SAAS,KAAK,SAAS;gBACzB,cAAc,IAAI,IAAI,YAAY,GAAG,CAAC;;gBAEtC,cAAc,IAAI,IAAI,YAAY,IAAI,SAAS,GAAG,CAAC;QACvD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;CACF","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 *--------------------------------------------------------------------------------------------*/\n\nimport { AnySchemaItemProps, KindOfQuantityProps, SchemaItemProps } from \"../Deserialization/JsonProps\";\nimport { parseSchemaItemType } from \"../ECObjects\";\nimport { SchemaInfo } from \"../Interfaces\";\nimport { OverrideFormat, OverrideFormatProps } from \"../Metadata/OverrideFormat\";\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\nimport { parseCustomAttribute } from \"./SchemaParser\";\n\ntype MutableSchemaItemProps = {\n -readonly [K in keyof SchemaItemProps]: SchemaItemProps[K]\n};\n\n/**\n * Parses SchemaItemProps JSON returned from an ECSql query and returns the correct SchemaItemProps JSON.\n * This is necessary as a small amount information (ie. CustomAttribute data) returned from the iModelDb\n * is in a different format than is required for a SchemaItemProps JSON object.\n * @internal\n */\nexport class SchemaItemParser {\n protected _schema: string;\n protected _schemaInfos: Iterable<SchemaInfo>;\n\n /**\n * Initializes a new SchemaItemParser.\n * @param schemaName The name the Schema containing the SchemaItems.\n * @param context The SchemaContext containing the Schema.\n */\n public constructor(schemaName: string, schemaInfos: Iterable<SchemaInfo>) {\n this._schema = schemaName;\n this._schemaInfos = schemaInfos;\n }\n\n /**\n * Parses the given SchemaItemProps JSON returned from an ECSql query.\n * @param data The SchemaItemProps JSON as returned from an iModelDb.\n * @returns The corrected SchemaItemProps Json.\n */\n public async parse(data: AnySchemaItemProps): Promise<SchemaItemProps> {\n const props = data as MutableSchemaItemProps;\n props.schemaItemType = parseSchemaItemType((data as any).schemaItemType);\n props.customAttributes = props.customAttributes ? props.customAttributes.map((attr: any) => { return parseCustomAttribute(attr); }) : undefined;\n if (!props.customAttributes || props.customAttributes.length === 0)\n delete props.customAttributes;\n\n return props;\n }\n\n /**\n * Helper method to resolve the SchemaItem's full name from the given rawTypeName.\n * If the SchemaItem is defined in the same Schema from which it is referenced,\n * the rawTypeName will be SchemaItem name ('PhysicalElement'). Otherwise,\n * the rawTypeName will have the schema alias ('bis:PhysicalElement').\n * @param rawTypeName The name or aliased name of the SchemaItem.\n * @returns The full name of the SchemaItem, ie. 'BisCore.PhysicalElement'\n */\n public getQualifiedTypeName(rawTypeName: string): string {\n const nameParts = rawTypeName.split(\":\");\n if (nameParts.length !== 2) {\n const [schemaName, itemName] = SchemaItem.parseFullName(rawTypeName);\n if (!schemaName || schemaName === '')\n return `${this._schema}.${itemName}`;\n return rawTypeName;\n }\n\n const resolvedName = this.resolveNameFromAlias(nameParts[0].toLocaleLowerCase());\n if (!resolvedName)\n throw new Error(`No valid schema found for alias '${nameParts[0]}'`);\n\n return `${resolvedName}.${nameParts[1]}`;\n }\n\n private resolveNameFromAlias(alias: string): string | undefined {\n for (const schemaInfo of this._schemaInfos) {\n if (schemaInfo.alias === alias)\n return schemaInfo.schemaKey.name;\n }\n return undefined;\n }\n}\n\ntype MutableKindOfQuantityProps = {\n -readonly [K in keyof KindOfQuantityProps]: KindOfQuantityProps[K]\n};\n\n/**\n * Parses KindOfQuantityProps JSON returned from an ECSql query and returns the correct KindOfQuantityProps JSON.\n * This is necessary as a small amount information (ie. unqualified type names of presentationUnits) returned from\n * the iModelDb is in a different format than is required for a KindOfQuantityProps JSON object.\n * @internal\n */\nexport class KindOfQuantityParser extends SchemaItemParser {\n /**\n * Parses the given KindOfQuantityProps JSON returned from an ECSql query.\n * @param data The KindOfQuantityProps JSON as returned from an iModelDb.\n * @returns The corrected KindOfQuantityProps Json.\n */\n public override async parse(data: KindOfQuantityProps): Promise<KindOfQuantityProps> {\n const mutableProps = await super.parse(data) as MutableKindOfQuantityProps;\n\n if (mutableProps.persistenceUnit) {\n mutableProps.persistenceUnit = this.getQualifiedTypeName(mutableProps.persistenceUnit);\n }\n mutableProps.presentationUnits = this.parsePresentationUnits(mutableProps);\n\n return mutableProps;\n }\n\n private parsePresentationUnits(props: KindOfQuantityProps): string[] {\n const presentationUnits: string[] = [];\n if (!props.presentationUnits)\n return [];\n\n for (const presentationUnit of props.presentationUnits) {\n const presFormatOverride: OverrideFormatProps = OverrideFormat.parseFormatString(presentationUnit);\n const formatString = this.createOverrideFormatString(presFormatOverride);\n presentationUnits.push(formatString);\n };\n\n return presentationUnits;\n }\n\n private createOverrideFormatString(overrideFormatProps: OverrideFormatProps): string {\n\n let formatFullName = this.getQualifiedTypeName(overrideFormatProps.name);\n if (overrideFormatProps.precision !== undefined)\n formatFullName += `(${overrideFormatProps.precision.toString()})`;\n\n if (undefined === overrideFormatProps.unitAndLabels)\n return formatFullName;\n\n for (const [unit, unitLabel] of overrideFormatProps.unitAndLabels) {\n const unitFullName = this.getQualifiedTypeName(unit);\n\n if (undefined === unitLabel)\n formatFullName += `[${unitFullName}]`;\n else\n formatFullName += `[${unitFullName}|${unitLabel}]`;\n }\n return formatFullName;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"SchemaItemParsers.js","sourceRoot":"","sources":["../../../src/IncrementalLoading/SchemaItemParsers.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAGhG,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAuB,MAAM,4BAA4B,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAMtD;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IACjB,OAAO,CAAS;IAChB,YAAY,CAAuB;IAE7C;;;;OAIG;IACH,YAAmB,UAAkB,EAAE,WAAiC;QACtE,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,KAAK,CAAC,IAAwB;QACzC,MAAM,KAAK,GAAG,IAA8B,CAAC;QAC7C,KAAK,CAAC,cAAc,GAAG,mBAAmB,CAAE,IAAY,CAAC,cAAc,CAAC,CAAC;QACzE,KAAK,CAAC,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE,GAAG,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAChJ,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAChE,OAAO,KAAK,CAAC,gBAAgB,CAAC;QAEhC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,oBAAoB,CAAC,WAAmB;QAC7C,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,EAAE;gBAClC,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;YACvC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACjF,IAAI,CAAC,YAAY;YACf,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvE,OAAO,GAAG,YAAY,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAEO,oBAAoB,CAAC,KAAa;QACxC,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3C,IAAI,UAAU,CAAC,KAAK,KAAK,KAAK;gBAC5B,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;QACrC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAMD;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,gBAAgB;IACxD;;;;OAIG;IACa,KAAK,CAAC,KAAK,CAAC,IAAyB;QACnD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,IAAI,CAA+B,CAAC;QAE3E,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC;YACjC,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACzF,CAAC;QACD,YAAY,CAAC,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAC;QAE3E,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,sBAAsB,CAAC,KAA0B;QACvD,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,iBAAiB;YAC1B,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM,gBAAgB,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YACvD,MAAM,kBAAkB,GAAwB,cAAc,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;YACnG,MAAM,YAAY,GAAG,IAAI,CAAC,0BAA0B,CAAC,kBAAkB,CAAC,CAAC;YACzE,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC;QAAA,CAAC;QAEF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAEO,0BAA0B,CAAC,mBAAwC;QAEzE,IAAI,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QACzE,IAAI,mBAAmB,CAAC,SAAS,KAAK,SAAS;YAC7C,cAAc,IAAI,IAAI,mBAAmB,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC;QAEpE,IAAI,SAAS,KAAK,mBAAmB,CAAC,aAAa;YACjD,OAAO,cAAc,CAAC;QAExB,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,mBAAmB,CAAC,aAAa,EAAE,CAAC;YAClE,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAErD,IAAI,SAAS,KAAK,SAAS;gBACzB,cAAc,IAAI,IAAI,YAAY,GAAG,CAAC;;gBAEtC,cAAc,IAAI,IAAI,YAAY,IAAI,SAAS,GAAG,CAAC;QACvD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { AnySchemaItemProps, KindOfQuantityProps, SchemaItemProps } from \"../Deserialization/JsonProps\";\r\nimport { parseSchemaItemType } from \"../ECObjects\";\r\nimport { SchemaInfo } from \"../Interfaces\";\r\nimport { OverrideFormat, OverrideFormatProps } from \"../Metadata/OverrideFormat\";\r\nimport { SchemaItem } from \"../Metadata/SchemaItem\";\r\nimport { parseCustomAttribute } from \"./SchemaParser\";\r\n\r\ntype MutableSchemaItemProps = {\r\n -readonly [K in keyof SchemaItemProps]: SchemaItemProps[K]\r\n};\r\n\r\n/**\r\n * Parses SchemaItemProps JSON returned from an ECSql query and returns the correct SchemaItemProps JSON.\r\n * This is necessary as a small amount information (ie. CustomAttribute data) returned from the iModelDb\r\n * is in a different format than is required for a SchemaItemProps JSON object.\r\n * @internal\r\n */\r\nexport class SchemaItemParser {\r\n protected _schema: string;\r\n protected _schemaInfos: Iterable<SchemaInfo>;\r\n\r\n /**\r\n * Initializes a new SchemaItemParser.\r\n * @param schemaName The name the Schema containing the SchemaItems.\r\n * @param context The SchemaContext containing the Schema.\r\n */\r\n public constructor(schemaName: string, schemaInfos: Iterable<SchemaInfo>) {\r\n this._schema = schemaName;\r\n this._schemaInfos = schemaInfos;\r\n }\r\n\r\n /**\r\n * Parses the given SchemaItemProps JSON returned from an ECSql query.\r\n * @param data The SchemaItemProps JSON as returned from an iModelDb.\r\n * @returns The corrected SchemaItemProps Json.\r\n */\r\n public async parse(data: AnySchemaItemProps): Promise<SchemaItemProps> {\r\n const props = data as MutableSchemaItemProps;\r\n props.schemaItemType = parseSchemaItemType((data as any).schemaItemType);\r\n props.customAttributes = props.customAttributes ? props.customAttributes.map((attr: any) => { return parseCustomAttribute(attr); }) : undefined;\r\n if (!props.customAttributes || props.customAttributes.length === 0)\r\n delete props.customAttributes;\r\n\r\n return props;\r\n }\r\n\r\n /**\r\n * Helper method to resolve the SchemaItem's full name from the given rawTypeName.\r\n * If the SchemaItem is defined in the same Schema from which it is referenced,\r\n * the rawTypeName will be SchemaItem name ('PhysicalElement'). Otherwise,\r\n * the rawTypeName will have the schema alias ('bis:PhysicalElement').\r\n * @param rawTypeName The name or aliased name of the SchemaItem.\r\n * @returns The full name of the SchemaItem, ie. 'BisCore.PhysicalElement'\r\n */\r\n public getQualifiedTypeName(rawTypeName: string): string {\r\n const nameParts = rawTypeName.split(\":\");\r\n if (nameParts.length !== 2) {\r\n const [schemaName, itemName] = SchemaItem.parseFullName(rawTypeName);\r\n if (!schemaName || schemaName === '')\r\n return `${this._schema}.${itemName}`;\r\n return rawTypeName;\r\n }\r\n\r\n const resolvedName = this.resolveNameFromAlias(nameParts[0].toLocaleLowerCase());\r\n if (!resolvedName)\r\n throw new Error(`No valid schema found for alias '${nameParts[0]}'`);\r\n\r\n return `${resolvedName}.${nameParts[1]}`;\r\n }\r\n\r\n private resolveNameFromAlias(alias: string): string | undefined {\r\n for (const schemaInfo of this._schemaInfos) {\r\n if (schemaInfo.alias === alias)\r\n return schemaInfo.schemaKey.name;\r\n }\r\n return undefined;\r\n }\r\n}\r\n\r\ntype MutableKindOfQuantityProps = {\r\n -readonly [K in keyof KindOfQuantityProps]: KindOfQuantityProps[K]\r\n};\r\n\r\n/**\r\n * Parses KindOfQuantityProps JSON returned from an ECSql query and returns the correct KindOfQuantityProps JSON.\r\n * This is necessary as a small amount information (ie. unqualified type names of presentationUnits) returned from\r\n * the iModelDb is in a different format than is required for a KindOfQuantityProps JSON object.\r\n * @internal\r\n */\r\nexport class KindOfQuantityParser extends SchemaItemParser {\r\n /**\r\n * Parses the given KindOfQuantityProps JSON returned from an ECSql query.\r\n * @param data The KindOfQuantityProps JSON as returned from an iModelDb.\r\n * @returns The corrected KindOfQuantityProps Json.\r\n */\r\n public override async parse(data: KindOfQuantityProps): Promise<KindOfQuantityProps> {\r\n const mutableProps = await super.parse(data) as MutableKindOfQuantityProps;\r\n\r\n if (mutableProps.persistenceUnit) {\r\n mutableProps.persistenceUnit = this.getQualifiedTypeName(mutableProps.persistenceUnit);\r\n }\r\n mutableProps.presentationUnits = this.parsePresentationUnits(mutableProps);\r\n\r\n return mutableProps;\r\n }\r\n\r\n private parsePresentationUnits(props: KindOfQuantityProps): string[] {\r\n const presentationUnits: string[] = [];\r\n if (!props.presentationUnits)\r\n return [];\r\n\r\n for (const presentationUnit of props.presentationUnits) {\r\n const presFormatOverride: OverrideFormatProps = OverrideFormat.parseFormatString(presentationUnit);\r\n const formatString = this.createOverrideFormatString(presFormatOverride);\r\n presentationUnits.push(formatString);\r\n };\r\n\r\n return presentationUnits;\r\n }\r\n\r\n private createOverrideFormatString(overrideFormatProps: OverrideFormatProps): string {\r\n\r\n let formatFullName = this.getQualifiedTypeName(overrideFormatProps.name);\r\n if (overrideFormatProps.precision !== undefined)\r\n formatFullName += `(${overrideFormatProps.precision.toString()})`;\r\n\r\n if (undefined === overrideFormatProps.unitAndLabels)\r\n return formatFullName;\r\n\r\n for (const [unit, unitLabel] of overrideFormatProps.unitAndLabels) {\r\n const unitFullName = this.getQualifiedTypeName(unit);\r\n\r\n if (undefined === unitLabel)\r\n formatFullName += `[${unitFullName}]`;\r\n else\r\n formatFullName += `[${unitFullName}|${unitLabel}]`;\r\n }\r\n return formatFullName;\r\n }\r\n}"]}
|