@itwin/core-backend 5.8.0-dev.2 → 5.8.0-dev.20
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 +36 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/BackendLoggerCategory.js.map +1 -1
- package/lib/cjs/BisCoreSchema.js.map +1 -1
- package/lib/cjs/BlobContainerService.js.map +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/CatalogDb.js.map +1 -1
- package/lib/cjs/Category.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +2 -2
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/ChangedElementsDb.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.js +248 -248
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
- package/lib/cjs/ChannelControl.js.map +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +5 -5
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeService.js.map +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +26 -0
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +53 -2
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +66 -0
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/cjs/ECSqlRowExecutor.js +135 -0
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -0
- package/lib/cjs/ECSqlStatement.d.ts +13 -1
- package/lib/cjs/ECSqlStatement.d.ts.map +1 -1
- package/lib/cjs/ECSqlStatement.js +30 -0
- package/lib/cjs/ECSqlStatement.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts +104 -0
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/cjs/ECSqlSyncReader.js +191 -0
- package/lib/cjs/ECSqlSyncReader.js.map +1 -0
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/ElementGraphics.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/Entity.js.map +1 -1
- package/lib/cjs/EntityReferences.js.map +1 -1
- package/lib/cjs/ExportGraphics.js.map +1 -1
- package/lib/cjs/ExternalSource.js.map +1 -1
- package/lib/cjs/FontFile.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/GeographicCRSServices.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +47 -47
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +26 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +63 -11
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelDbFonts.js.map +1 -1
- package/lib/cjs/IModelElementCloneContext.js.map +1 -1
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/ImageSourceConversion.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +28 -4
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LineStyle.d.ts +6 -0
- package/lib/cjs/LineStyle.d.ts.map +1 -1
- package/lib/cjs/LineStyle.js +41 -32
- package/lib/cjs/LineStyle.js.map +1 -1
- package/lib/cjs/LocalHub.d.ts +17 -10
- package/lib/cjs/LocalHub.d.ts.map +1 -1
- package/lib/cjs/LocalHub.js +127 -29
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/LockControl.js.map +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/Model.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/PropertyStore.js.map +1 -1
- package/lib/cjs/Relationship.js.map +1 -1
- package/lib/cjs/RpcBackend.js.map +1 -1
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/SchemaSync.js.map +1 -1
- package/lib/cjs/SchemaUtils.js.map +1 -1
- package/lib/cjs/SheetIndex.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.js.map +1 -1
- package/lib/cjs/SqliteStatement.js.map +1 -1
- package/lib/cjs/StashManager.js.map +1 -1
- package/lib/cjs/Texture.js.map +1 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/ViewStateHydrator.js.map +1 -1
- package/lib/cjs/ViewStore.js.map +1 -1
- package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/cjs/annotations/FrameGeometry.js.map +1 -1
- package/lib/cjs/annotations/LeaderGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/cjs/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/cjs/annotations/TextBlockLayout.js.map +1 -1
- package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
- package/lib/cjs/assets/Settings/Schemas/Base.Schema.json +32 -32
- package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +27 -27
- package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +94 -94
- package/lib/cjs/assets/Settings/backend.setting.json5 +21 -21
- package/lib/cjs/core-backend.d.ts +3 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +3 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
- package/lib/cjs/domains/GenericElements.js.map +1 -1
- package/lib/cjs/domains/GenericSchema.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/ElementLRUCache.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/HubMock.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/IntegrityCheck.js.map +1 -1
- package/lib/cjs/internal/NativePlatform.js.map +1 -1
- package/lib/cjs/internal/NoLocks.js.map +1 -1
- package/lib/cjs/internal/OnlineStatus.js.map +1 -1
- package/lib/cjs/internal/ServerBasedLocks.js.map +1 -1
- package/lib/cjs/internal/Symbols.js.map +1 -1
- package/lib/cjs/internal/annotations/fields.js.map +1 -1
- package/lib/cjs/internal/cross-package.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js +108 -0
- package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
- package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +8 -4
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js +40 -0
- package/lib/cjs/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +67 -16
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/cjs/rpc/multipart.js.map +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.d.ts +8 -0
- package/lib/cjs/workspace/Settings.d.ts.map +1 -1
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsDb.d.ts +109 -0
- package/lib/cjs/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsDb.js +19 -0
- package/lib/cjs/workspace/SettingsDb.js.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts +250 -0
- package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/cjs/workspace/SettingsEditor.js +53 -0
- package/lib/cjs/workspace/SettingsEditor.js.map +1 -0
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.d.ts +42 -19
- package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/cjs/workspace/WorkspaceEditor.js +19 -0
- package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
- package/lib/esm/BackendHubAccess.js.map +1 -1
- package/lib/esm/BackendLoggerCategory.js.map +1 -1
- package/lib/esm/BisCoreSchema.js.map +1 -1
- package/lib/esm/BlobContainerService.js.map +1 -1
- package/lib/esm/BriefcaseManager.js.map +1 -1
- package/lib/esm/CatalogDb.js.map +1 -1
- package/lib/esm/Category.js.map +1 -1
- package/lib/esm/ChangeSummaryManager.js +2 -2
- package/lib/esm/ChangeSummaryManager.js.map +1 -1
- package/lib/esm/ChangedElementsDb.js.map +1 -1
- package/lib/esm/ChangesetECAdaptor.js +248 -248
- package/lib/esm/ChangesetECAdaptor.js.map +1 -1
- package/lib/esm/ChannelControl.js.map +1 -1
- package/lib/esm/CheckpointManager.js.map +1 -1
- package/lib/esm/ClassRegistry.js +5 -5
- package/lib/esm/ClassRegistry.js.map +1 -1
- package/lib/esm/CloudSqlite.js.map +1 -1
- package/lib/esm/CodeService.js.map +1 -1
- package/lib/esm/CodeSpecs.js.map +1 -1
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/CustomViewState3dCreator.js.map +1 -1
- package/lib/esm/DevTools.js.map +1 -1
- package/lib/esm/DisplayStyle.js.map +1 -1
- package/lib/esm/ECDb.d.ts +26 -0
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +54 -3
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSchemaXmlContext.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +66 -0
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -0
- package/lib/esm/ECSqlRowExecutor.js +131 -0
- package/lib/esm/ECSqlRowExecutor.js.map +1 -0
- package/lib/esm/ECSqlStatement.d.ts +13 -1
- package/lib/esm/ECSqlStatement.d.ts.map +1 -1
- package/lib/esm/ECSqlStatement.js +30 -0
- package/lib/esm/ECSqlStatement.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts +104 -0
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -0
- package/lib/esm/ECSqlSyncReader.js +187 -0
- package/lib/esm/ECSqlSyncReader.js.map +1 -0
- package/lib/esm/Element.js.map +1 -1
- package/lib/esm/ElementAspect.js.map +1 -1
- package/lib/esm/ElementGraphics.js.map +1 -1
- package/lib/esm/ElementTreeWalker.js.map +1 -1
- package/lib/esm/Entity.js.map +1 -1
- package/lib/esm/EntityReferences.js.map +1 -1
- package/lib/esm/ExportGraphics.js.map +1 -1
- package/lib/esm/ExternalSource.js.map +1 -1
- package/lib/esm/FontFile.js.map +1 -1
- package/lib/esm/GeoCoordConfig.js.map +1 -1
- package/lib/esm/GeographicCRSServices.js.map +1 -1
- package/lib/esm/GeometrySummary.js +47 -47
- package/lib/esm/GeometrySummary.js.map +1 -1
- package/lib/esm/IModelDb.d.ts +26 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +63 -11
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelDbFonts.js.map +1 -1
- package/lib/esm/IModelElementCloneContext.js.map +1 -1
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/IModelIncrementalSchemaLocater.js.map +1 -1
- package/lib/esm/IModelJsFs.js.map +1 -1
- package/lib/esm/ImageSourceConversion.js.map +1 -1
- package/lib/esm/IpcHost.d.ts.map +1 -1
- package/lib/esm/IpcHost.js +28 -4
- package/lib/esm/IpcHost.js.map +1 -1
- package/lib/esm/LineStyle.d.ts +6 -0
- package/lib/esm/LineStyle.d.ts.map +1 -1
- package/lib/esm/LineStyle.js +41 -32
- package/lib/esm/LineStyle.js.map +1 -1
- package/lib/esm/LocalHub.d.ts +17 -10
- package/lib/esm/LocalHub.d.ts.map +1 -1
- package/lib/esm/LocalHub.js +128 -30
- package/lib/esm/LocalHub.js.map +1 -1
- package/lib/esm/LocalhostIpcHost.js.map +1 -1
- package/lib/esm/LockControl.js.map +1 -1
- package/lib/esm/Material.js.map +1 -1
- package/lib/esm/Model.js.map +1 -1
- package/lib/esm/NativeAppStorage.js.map +1 -1
- package/lib/esm/NativeHost.js.map +1 -1
- package/lib/esm/NavigationRelationship.js.map +1 -1
- package/lib/esm/PromiseMemoizer.js.map +1 -1
- package/lib/esm/PropertyStore.js.map +1 -1
- package/lib/esm/Relationship.js.map +1 -1
- package/lib/esm/RpcBackend.js.map +1 -1
- package/lib/esm/SQLiteDb.js.map +1 -1
- package/lib/esm/Schema.js.map +1 -1
- package/lib/esm/SchemaSync.js.map +1 -1
- package/lib/esm/SchemaUtils.js.map +1 -1
- package/lib/esm/SheetIndex.js.map +1 -1
- package/lib/esm/SqliteChangesetReader.js.map +1 -1
- package/lib/esm/SqliteStatement.js.map +1 -1
- package/lib/esm/StashManager.js.map +1 -1
- package/lib/esm/Texture.js.map +1 -1
- package/lib/esm/TileStorage.js.map +1 -1
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/ViewDefinition.js.map +1 -1
- package/lib/esm/ViewStateHydrator.js.map +1 -1
- package/lib/esm/ViewStore.js.map +1 -1
- package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
- package/lib/esm/annotations/FrameGeometry.js.map +1 -1
- package/lib/esm/annotations/LeaderGeometry.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
- package/lib/esm/annotations/TextAnnotationGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockGeometry.js.map +1 -1
- package/lib/esm/annotations/TextBlockLayout.js.map +1 -1
- package/lib/esm/core-backend.d.ts +3 -0
- package/lib/esm/core-backend.d.ts.map +1 -1
- package/lib/esm/core-backend.js +3 -0
- package/lib/esm/core-backend.js.map +1 -1
- package/lib/esm/domains/FunctionalElements.js.map +1 -1
- package/lib/esm/domains/FunctionalSchema.js.map +1 -1
- package/lib/esm/domains/GenericElements.js.map +1 -1
- package/lib/esm/domains/GenericSchema.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/ChannelAdmin.js.map +1 -1
- package/lib/esm/internal/ElementLRUCache.js.map +1 -1
- package/lib/esm/internal/FontFileImpl.js.map +1 -1
- package/lib/esm/internal/HubMock.js.map +1 -1
- package/lib/esm/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/esm/internal/IntegrityCheck.js.map +1 -1
- package/lib/esm/internal/NativePlatform.js.map +1 -1
- package/lib/esm/internal/NoLocks.js.map +1 -1
- package/lib/esm/internal/OnlineStatus.js.map +1 -1
- package/lib/esm/internal/ServerBasedLocks.js.map +1 -1
- package/lib/esm/internal/Symbols.js.map +1 -1
- package/lib/esm/internal/annotations/fields.js.map +1 -1
- package/lib/esm/internal/cross-package.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts +38 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js +104 -0
- package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
- package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/SettingsImpl.js +5 -2
- package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts +14 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.d.ts.map +1 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js +36 -0
- package/lib/esm/internal/workspace/SettingsSqliteDb.js.map +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts +1 -0
- package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceImpl.js +67 -17
- package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/esm/internal/workspace/WorkspaceSqliteDb.js.map +1 -1
- package/lib/esm/rpc/multipart.js.map +1 -1
- package/lib/esm/rpc/tracing.js.map +1 -1
- package/lib/esm/rpc/web/logging.js.map +1 -1
- package/lib/esm/rpc/web/request.js.map +1 -1
- package/lib/esm/rpc/web/response.js.map +1 -1
- package/lib/esm/rpc-impl/DevToolsRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/esm/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/esm/test/AdvancedEqual.js.map +1 -1
- package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
- package/lib/esm/test/AttachDb.test.js +11 -11
- package/lib/esm/test/AttachDb.test.js.map +1 -1
- package/lib/esm/test/ElementDrivesElement.test.js +23 -23
- package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
- package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
- package/lib/esm/test/GeometryTestUtil.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/IModelTestUtils.js.map +1 -1
- package/lib/esm/test/ImageSourceConversion.test.js.map +1 -1
- package/lib/esm/test/IpcHost.test.js +64 -13
- package/lib/esm/test/IpcHost.test.js.map +1 -1
- package/lib/esm/test/KnownTestLocations.js.map +1 -1
- package/lib/esm/test/PrintElementTree.js.map +1 -1
- package/lib/esm/test/PropertyDb.test.js.map +1 -1
- package/lib/esm/test/RevisionUtility.js.map +1 -1
- package/lib/esm/test/SchemaUtils.test.js +25 -25
- package/lib/esm/test/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/SequentialLogMatcher.js.map +1 -1
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js +129 -129
- package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
- package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
- package/lib/esm/test/TestUtils.js.map +1 -1
- package/lib/esm/test/annotations/Fields.test.js +53 -53
- package/lib/esm/test/annotations/Fields.test.js.map +1 -1
- package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/LeaderGeometry.test.js.map +1 -1
- package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
- package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
- package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
- package/lib/esm/test/categories/Category.test.js.map +1 -1
- package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +88 -88
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +19 -19
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +15 -15
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDb.test.js +72 -72
- package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECDbTestHelper.js.map +1 -1
- package/lib/esm/test/ecdb/ECSchemaXmlContext.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlAst.test.js +65 -65
- package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +100 -12
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlStatement.test.js +332 -332
- package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts +2 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +122 -0
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts +2 -0
- package/lib/esm/test/ecdb/QueryReaders.test.d.ts.map +1 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js +1462 -0
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -0
- package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +4 -1
- package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js +21 -21
- package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.d.ts.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js +11 -5
- package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js +186 -100
- package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
- package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
- package/lib/esm/test/element/ElementAspect.test.js +22 -22
- package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
- package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
- package/lib/esm/test/element/ElementRoundTrip.test.js +139 -139
- package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
- package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
- package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
- package/lib/esm/test/element/NullStructArray.test.js +13 -13
- package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
- package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
- package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
- package/lib/esm/test/element/UrlLink.test.js.map +1 -1
- package/lib/esm/test/font/FontFile.test.js.map +1 -1
- package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js +32 -32
- package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
- package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/CheckpointManager.test.js.map +1 -1
- package/lib/esm/test/hubaccess/Rebase.test.js +56 -56
- package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
- package/lib/esm/test/hubaccess/SemanticRebase.test.js +145 -145
- package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
- package/lib/esm/test/imageData.js.map +1 -1
- package/lib/esm/test/imodel/Code.test.js.map +1 -1
- package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
- package/lib/esm/test/imodel/GetTextureImage.test.js.map +1 -1
- package/lib/esm/test/imodel/IModel.test.js +44 -44
- package/lib/esm/test/imodel/IModel.test.js.map +1 -1
- package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
- package/lib/esm/test/imodel/SchemaXmlImport.test.js +13 -13
- package/lib/esm/test/imodel/SchemaXmlImport.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/IncrementalLoading.test.js.map +1 -1
- package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
- package/lib/esm/test/index.js.map +1 -1
- package/lib/esm/test/misc/DevTools.test.js.map +1 -1
- package/lib/esm/test/misc/EntitySubClasses.test.js.map +1 -1
- package/lib/esm/test/misc/GeoServices.test.js.map +1 -1
- package/lib/esm/test/misc/PromiseMemoizer.test.js.map +1 -1
- package/lib/esm/test/native/DgnDbWorker.test.js.map +1 -1
- package/lib/esm/test/rpc/response.test.js.map +1 -1
- package/lib/esm/test/schema/ClassRegistry.test.js +99 -99
- package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
- package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
- package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
- package/lib/esm/test/schema/IModelSchemaContext.test.js +9 -9
- package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js +19 -19
- package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
- package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangesetReader.test.js +135 -135
- package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
- package/lib/esm/test/standalone/CustomViewState3dCreator.test.js.map +1 -1
- package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
- package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
- package/lib/esm/test/standalone/ExportGraphics.test.js +14 -14
- package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
- package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
- package/lib/esm/test/standalone/HubMock.test.js +177 -7
- package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +27 -27
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
- package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/lib/esm/test/standalone/NativeAppStorage.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
- package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
- package/lib/esm/test/standalone/SQLiteDb.test.js.map +1 -1
- package/lib/esm/test/standalone/SchemaUtils.test.js.map +1 -1
- package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
- package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
- package/lib/esm/test/standalone/Setting.test.js.map +1 -1
- package/lib/esm/test/standalone/Settings.test.js +18 -0
- package/lib/esm/test/standalone/Settings.test.js.map +1 -1
- package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
- package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js +51 -1
- package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Texture.test.js.map +1 -1
- package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
- package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
- package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
- package/lib/esm/test/standalone/ViewStoreDb.test.js.map +1 -1
- package/lib/esm/test/standalone/Workspace.test.js +213 -0
- package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
- package/lib/esm/test/standalone/iModelDb.test.d.ts +2 -0
- package/lib/esm/test/standalone/iModelDb.test.d.ts.map +1 -0
- package/lib/esm/test/standalone/iModelDb.test.js +35 -0
- package/lib/esm/test/standalone/iModelDb.test.js.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts +2 -0
- package/lib/esm/test/workspace/SettingsDb.test.d.ts.map +1 -0
- package/lib/esm/test/workspace/SettingsDb.test.js +465 -0
- package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -0
- package/lib/esm/workspace/Settings.d.ts +8 -0
- package/lib/esm/workspace/Settings.d.ts.map +1 -1
- package/lib/esm/workspace/Settings.js.map +1 -1
- package/lib/esm/workspace/SettingsDb.d.ts +109 -0
- package/lib/esm/workspace/SettingsDb.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsDb.js +16 -0
- package/lib/esm/workspace/SettingsDb.js.map +1 -0
- package/lib/esm/workspace/SettingsEditor.d.ts +250 -0
- package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -0
- package/lib/esm/workspace/SettingsEditor.js +50 -0
- package/lib/esm/workspace/SettingsEditor.js.map +1 -0
- package/lib/esm/workspace/SettingsSchemas.js.map +1 -1
- package/lib/esm/workspace/Workspace.d.ts +42 -19
- package/lib/esm/workspace/Workspace.d.ts.map +1 -1
- package/lib/esm/workspace/Workspace.js.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts +32 -1
- package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
- package/lib/esm/workspace/WorkspaceEditor.js +19 -0
- package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
- package/package.json +15 -15
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts +0 -2
- package/lib/esm/test/ecdb/ECSqlReader.test.d.ts.map +0 -1
- package/lib/esm/test/ecdb/ECSqlReader.test.js +0 -669
- package/lib/esm/test/ecdb/ECSqlReader.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ECSqlAst.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlAst.test.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\n/** @packageDocumentation\r\n * @module ECSqlExpr\r\n */\r\n\r\nimport { assert } from \"chai\";\r\nimport {\r\n AssignmentExpr,\r\n BetweenExpr,\r\n BinaryBooleanExpr, BinaryValueExpr,\r\n CastExpr,\r\n ClassNameExpr,\r\n CteBlockExpr,\r\n CteBlockRefExpr,\r\n CteExpr,\r\n DeleteStatementExpr,\r\n DerivedPropertyExpr,\r\n ECSqlOptionsClauseExpr,\r\n Expr,\r\n ExprType,\r\n FromClauseExpr,\r\n FuncCallExpr,\r\n GroupByClauseExpr,\r\n HavingClauseExpr,\r\n IIFExpr,\r\n InExpr,\r\n InsertStatementExpr,\r\n IsNullExpr,\r\n IsOfTypeExpr,\r\n LikeExpr,\r\n LimitClauseExpr,\r\n LiteralExpr,\r\n LiteralValueType,\r\n MemberFuncCallExpr,\r\n NotExpr,\r\n OrderByClauseExpr,\r\n OrderBySpecExpr,\r\n ParameterExpr,\r\n PropertyNameExpr,\r\n QualifiedJoinExpr,\r\n SearchCaseExpr,\r\n SelectExpr,\r\n SelectionClauseExpr,\r\n SelectStatementExpr,\r\n SetClauseExpr,\r\n StatementExpr,\r\n SubqueryExpr,\r\n SubqueryRefExpr,\r\n SubqueryTestExpr,\r\n TableValuedFuncExpr,\r\n UnaryValueExpr,\r\n UpdateStatementExpr,\r\n UsingRelationshipJoinExpr,\r\n WhereClauseExp,\r\n} from \"@itwin/ecsql-common\";\r\nimport { ECDb, ECDbOpenMode, IModelHost } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { DbResult } from \"@itwin/core-bentley\";\r\n\r\ndescribe(\"ECSql Abstract Syntax Tree\", () => {\r\n let ecdb: ECDb;\r\n\r\n async function toNormalizeECSql(ecsql: string) {\r\n return (await parseECSql(ecsql)).toECSql();\r\n }\r\n\r\n async function parseECSql(ecsql: string) {\r\n const parseTreeECSql = `PRAGMA PARSE_TREE(\"${ecsql}\") ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`;\r\n if (true) {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return ecdb.withPreparedStatement(parseTreeECSql, (stmt) => {\r\n if (DbResult.BE_SQLITE_ROW !== stmt.step()) {\r\n throw new Error(\"unable to get parse tree.\");\r\n }\r\n return StatementExpr.deserialize(JSON.parse(stmt.getValue(0).getString()));\r\n });\r\n } else {\r\n const reader = ecdb.createQueryReader(parseTreeECSql);\r\n if (await reader.step()) {\r\n return StatementExpr.deserialize(JSON.parse(reader.current[0]));\r\n }\r\n throw new Error(\"unable to get parse tree.\");\r\n }\r\n }\r\n\r\n function printTree(expr: Expr, indent: number = 0) {\r\n process.stdout.write(`${\"\".padEnd(indent, \".\")}${expr.expType}${\"\".padEnd(30 - (indent + expr.expType.length), \" \")}${expr.toECSql()}\\n`);\r\n indent += 3;\r\n for (const child of expr.children)\r\n printTree(child, indent);\r\n }\r\n\r\n before(async () => {\r\n await IModelHost.startup();\r\n ecdb = new ECDb();\r\n ecdb.openDb(IModelTestUtils.resolveAssetFile(\"test.bim\"), ECDbOpenMode.ReadWrite);\r\n });\r\n\r\n after(async () => {\r\n ecdb.closeDb();\r\n });\r\n it(\"parse (|, &, <<, >>, +, -, %, /, *) binary & unary\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT (1 & 2 ) | (3 << 4 ) >> (5/ 6) * (7 + 8) + (4 % 9) + (-10) + (+20) - (~45)\",\r\n expectedECSql: \"SELECT (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45))\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse DATE, TIME & TIMESTAMP\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT TIMESTAMP '2013-02-09T12:00:00'\",\r\n expectedECSql: \"SELECT TIMESTAMP '2013-02-09T12:00:00'\",\r\n },\r\n {\r\n orignalECSql: \"SELECT DATE '2012-01-18'\",\r\n expectedECSql: \"SELECT DATE '2012-01-18'\",\r\n },\r\n {\r\n orignalECSql: \"SELECT TIME '13:35:16'\",\r\n expectedECSql: \"SELECT TIME '13:35:16'\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse NULL, NUMBER, STRING, TRUE, FALSE & ||\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT TRUE, FALSE\",\r\n expectedECSql: \"SELECT TRUE, FALSE\",\r\n },\r\n {\r\n orignalECSql: \"SELECT NULL\",\r\n expectedECSql: \"SELECT NULL\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 3.14159265358\",\r\n expectedECSql: \"SELECT 3.14159265358\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 314159\",\r\n expectedECSql: \"SELECT 314159\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 'Hello, World'\",\r\n expectedECSql: \"SELECT 'Hello, World'\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 'Hello'|| ',' || 'World'\",\r\n expectedECSql: \"SELECT (('Hello' || ',') || 'World')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse (!=, =, >, <, >=, <=, OR, AND)\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse CASE-WHEN-THEN\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT CASE WHEN 4>5 THEN NULL WHEN 1 IS NOT NULL THEN 'Hello' ELSE 'Bye' END\",\r\n expectedECSql: \"SELECT CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse [NOT] LIKE\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"select IIF(('Hello, World' LIKE '\\\\%World' escape '\\\\') , 2, 3)\",\r\n expectedECSql: \"SELECT IIF('Hello, World' LIKE '\\\\%World' ESCAPE '\\\\', 2, 3)\",\r\n },\r\n {\r\n orignalECSql: \"select IIF(('Hello, World' LIKE '%World') , 2, 3)\",\r\n expectedECSql: \"SELECT IIF('Hello, World' LIKE '%World', 2, 3)\",\r\n }\r\n ,\r\n {\r\n orignalECSql: \"select IIF(('Hello, World' NOT LIKE '%World') , 2, 3)\",\r\n expectedECSql: \"SELECT IIF('Hello, World' NOT LIKE '%World', 2, 3)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse [NOT] IN(select|list)\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF( 3 IN (SELECT 1 AS N UNION SELECT 2), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF( 3 IN (1,2,3), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(3 IN (1, 2, 3), 'True', 'False')\",\r\n }\r\n ,\r\n {\r\n orignalECSql: \"SELECT IIF( 3 NOT IN (1,2,3), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(3 NOT IN (1, 2, 3), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse IS [NOT] NULL\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF( NULL IS NULL, 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NULL IS NULL), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF( NULL IS NOT NULL, 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NULL IS NOT NULL), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF( 1 IS NOT NULL, 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((1 IS NOT NULL), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse IS [NOT] (type[,...])\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF( 3 IS (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF( 3 IS NOT (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse (NOT expr)\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF(NOT 3, 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NOT 3), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF( (NOT (NOT (NOT (NOT 3)))), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse [NOT] EXISTS (<subquery>)\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT IIF(EXISTS(SELECT 1), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(EXISTS(SELECT 1), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF(EXISTS(WITH temp(x) AS (SELECT 1) SELECT * FROM temp), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF(EXISTS(WITH [temp]([x]) AS (SELECT 1) SELECT [temp].[x] FROM [temp]), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF(NOT EXISTS(SELECT 1), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NOT EXISTS(SELECT 1)), 'True', 'False')\",\r\n },\r\n {\r\n orignalECSql: \"SELECT IIF(NOT EXISTS(WITH temp(x) AS (SELECT 1) SELECT * FROM temp), 'True', 'False')\",\r\n expectedECSql: \"SELECT IIF((NOT EXISTS(WITH [temp]([x]) AS (SELECT 1) SELECT [temp].[x] FROM [temp])), 'True', 'False')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse CAST(<expr> AS [TEXT | INTEGER | REAL | BLOB | TIMESTAMP])\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT CAST(1 AS TEXT)\",\r\n expectedECSql: \"SELECT CAST(1 AS TEXT)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT CAST(1 AS INTEGER)\",\r\n expectedECSql: \"SELECT CAST(1 AS INTEGER)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT CAST(1 AS REAL)\",\r\n expectedECSql: \"SELECT CAST(1 AS REAL)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT CAST(1 AS BLOB)\",\r\n expectedECSql: \"SELECT CAST(1 AS BLOB)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT CAST(1 AS TIMESTAMP)\",\r\n expectedECSql: \"SELECT CAST(1 AS TIMESTAMP)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse SELECT DISTINCT|ALL/SUM(DISTINCT|ALL <expr>) \", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT ECInstanceId FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT DISTINCT ECInstanceId FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT ALL ECInstanceId FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT SUM(DISTINCT ECInstanceId) FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT SUM(ALL ECInstanceId) FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT SUM(ALL [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT SUM(ECInstanceId) FROM meta.ECClassDef\",\r\n expectedECSql: \"SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse func(args...)\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT INSTR('First', 'Second')\",\r\n expectedECSql: \"SELECT INSTR('First', 'Second')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse ECSQLOPTIONS\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X=3\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse Subquery\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT d.a FROM (SELECT b.Name a FROM meta.ECClassDef b) d\",\r\n expectedECSql: \"SELECT [d].[a] FROM (SELECT [b].[Name] [a] FROM [ECDbMeta].[ECClassDef] [b]) [d]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse LIMIT <expr> [OFFSET <expr>]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef LIMIT 10+33\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] LIMIT (10 + 33)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef LIMIT 10+33 OFFSET 44\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] LIMIT (10 + 33) OFFSET 44\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse GROUP BY [expr...] HAVING [expr...]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef GROUP BY Name\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] GROUP BY [Name]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef GROUP BY [Name] HAVING COUNT(*)>2\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] GROUP BY [Name] HAVING (COUNT(*) > 2)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse ORDER BY [expr...]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ORDER BY Name ASC, ECInstanceId DESC\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ORDER BY [Name] ASC, [ECInstanceId] DESC\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ORDER BY NAME, DISPLAYLABEL\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ORDER BY [NAME], [DISPLAYLABEL]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse CTE\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"WITH RECURSIVE c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1) SELECT i FROM c\",\r\n expectedECSql: \"WITH RECURSIVE [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1) SELECT [i] FROM [c]\",\r\n },\r\n {\r\n orignalECSql: \"WITH c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1) SELECT i FROM c\",\r\n expectedECSql: \"WITH [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1) SELECT [i] FROM [c]\",\r\n },\r\n {\r\n orignalECSql: \"WITH c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1), d(i) AS (SELECT 1 UNION SELECT i+1 FROM d WHERE i < 100 ORDER BY 1) SELECT * FROM c,d\",\r\n expectedECSql: \"WITH [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1), [d]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [d] WHERE ([i] < 100) ORDER BY 1) SELECT [c].[i], [d].[i] FROM [c], [d]\",\r\n },\r\n {\r\n orignalECSql: \"WITH c(a,b,c) AS (SELECT ECInstanceId, ECClassId, Name FROM meta.ECClassDef) SELECT * FROM c\",\r\n expectedECSql: \"WITH [c]([a], [b], [c]) AS (SELECT [ECInstanceId], [ECClassId], [Name] FROM [ECDbMeta].[ECClassDef]) SELECT [c].[a], [c].[b], [c].[c] FROM [c]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse $, $->prop\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT $ FROM Meta.ECClassDef\",\r\n expectedECSql: \"SELECT $ FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT $->[Name], $-> DisplayLabel, $ -> Nothing FROM Meta.ECClassDef\",\r\n expectedECSql: \"SELECT $->[Name], $->[DisplayLabel], $->[Nothing] FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n // {\r\n // orignalECSql: \"SELECT $->Name, $-> DisplayLabel, $ -> Nothing FROM Meta.ECClassDef WHERE $->Name LIKE '%Hellp' ORDER BY $->ECInstanceId DESC\",\r\n // expectedECSql: \"SELECT $->[Name], $->[DisplayLabel], $->[Nothing] FROM [ECDbMeta].[ECClassDef] WHERE $->[Name] LIKE '%Hellp' ORDER BY $->[ECInstanceId] DESC\",\r\n // },\r\n {\r\n orignalECSql: \"SELECT e.$->[Name], e.$-> DisplayLabel, e.$ -> Nothing FROM Meta.ECClassDef e\",\r\n expectedECSql: \"SELECT [e].$->[Name], [e].$->[DisplayLabel], [e].$->[Nothing] FROM [ECDbMeta].[ECClassDef] [e]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse ?, :<param-name>\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT ?\",\r\n expectedECSql: \"SELECT ?\",\r\n },\r\n {\r\n orignalECSql: \"SELECT :param1\",\r\n expectedECSql: \"SELECT :param1\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse <from> JOIN <to> USING rel [FORWARD|BACKWARD]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef JOIN meta.ECPropertyDef USING meta.ClassOwnsLocalProperties\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] JOIN [ECDbMeta].[ECPropertyDef] USING [ECDbMeta].[ClassOwnsLocalProperties]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM bis.Element a JOIN bis.Element b USING bis.ElementOwnsChildElements FORWARD\",\r\n expectedECSql: \"SELECT 1 FROM [BisCore].[Element] [a] JOIN [BisCore].[Element] [b] USING [BisCore].[ElementOwnsChildElements] FORWARD\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM bis.Element a JOIN bis.Element b USING bis.ElementOwnsChildElements BACKWARD\",\r\n expectedECSql: \"SELECT 1 FROM [BisCore].[Element] [a] JOIN [BisCore].[Element] [b] USING [BisCore].[ElementOwnsChildElements] BACKWARD\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse <from> [INNER] [OUTER] JOIN <to> [ON <exp>]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef INNER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse <from> RIGHT [OUTER] JOIN <to> [ON <exp>]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef RIGHT JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] RIGHT OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef RIGHT OUTER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] RIGHT OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse <from> FULL [OUTER] JOIN <to> [ON <exp>]\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef FULL JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] FULL OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef FULL OUTER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] FULL OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse UNION | UNION ALL | INTERSECT | EXCEPT\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a UNION SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\r\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] UNION SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a UNION ALL SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\r\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] UNION ALL SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a INTERSECT SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\r\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] INTERSECT SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a EXCEPT SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\r\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] EXCEPT SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\r\n },\r\n\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse cte without columns\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"WITH cte AS (SELECT * FROM meta.ECClassDef) SELECT * FROM cte\",\r\n expectedECSql: \"WITH [cte] AS (SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [ECDbMeta].[ECClassDef]) SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [cte]\",\r\n },\r\n {\r\n orignalECSql: \"WITH cte AS (SELECT * FROM meta.ECClassDef) SELECT cte.ECInstanceId FROM cte\",\r\n expectedECSql: \"WITH [cte] AS (SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [ECDbMeta].[ECClassDef]) SELECT [cte].[ECInstanceId] FROM [cte]\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse SELECT (<subquery>) FROM\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT (SELECT b.ECInstanceId FROM meta.ECPropertyDef b) AS S FROM [ECDbMeta].[ECClassDef] a\",\r\n expectedECSql: \"SELECT (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) [S] FROM [ECDbMeta].[ECClassDef] [a]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT (WITH C(iD) AS (SELECT b.ECInstanceId FROM meta.ECPropertyDef b) SELECT * FROM C) AS S FROM [ECDbMeta].[ECClassDef] a\",\r\n expectedECSql: \"SELECT (WITH [C]([iD]) AS (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) SELECT [C].[iD] FROM [C]) [S] FROM [ECDbMeta].[ECClassDef] [a]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT (SELECT 1 UNION SELECT 2) FROM meta.ECClassDef a\",\r\n expectedECSql: \"SELECT (SELECT 1 UNION SELECT 2) FROM [ECDbMeta].[ECClassDef] [a]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE (SELECT [b].[ECInstanceId] FROM meta.ECPropertyDef b) = 1\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE ((SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) = 1)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE (WITH temp(Id) AS (SELECT [b].[ECInstanceId] FROM meta.ECPropertyDef b) SELECT * FROM temp) = 1\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE ((WITH [temp]([Id]) AS (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) SELECT [temp].[Id] FROM [temp]) = 1)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse ALL | ONLY <classname>\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef]\",\r\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM ONLY [ECDbMeta].[ECClassDef]\",\r\n expectedECSql: \"SELECT 1 FROM ONLY [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM ALL [ECDbMeta].[ECClassDef]\",\r\n expectedECSql: \"SELECT 1 FROM ALL [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM +ALL [ECDbMeta].[ECClassDef]\",\r\n expectedECSql: \"SELECT 1 FROM +ALL [ECDbMeta].[ECClassDef]\",\r\n },\r\n {\r\n orignalECSql: \"SELECT 1 FROM +ONLY [ECDbMeta].[ECClassDef]\",\r\n expectedECSql: \"SELECT 1 FROM +ONLY [ECDbMeta].[ECClassDef]\",\r\n },\r\n\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse tablevalue function FROM json1.json_tree()\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"select * from json1.json_tree('{}') where key='gravity'\",\r\n expectedECSql: \"SELECT [key], [value], [type], [atom], [parent], [fullkey], [path] FROM [json1].[json_tree]('{}') WHERE ([key] = 'gravity')\",\r\n },\r\n {\r\n orignalECSql: \"select s.key, s.[value], s.type from json1.json_tree('{}') s where s.key='gravity'\",\r\n expectedECSql: \"SELECT [s].[key], [s].[value], [s].[type] FROM [json1].[json_tree]('{}') [s] WHERE ([s].[key] = 'gravity')\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse SELECT, WHERE, FROM, GROUP BY, HAVING, ORDER BY, LIMIT & ECSQLOPTIONS\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"select count(*) from bis.element where codevalue lIKE '%s' group by ecclassid having count(*)>0 order by UserLabel limit 1 offset 10 ECSQLOPTIONS x=3\",\r\n expectedECSql: \"SELECT COUNT(*) FROM [BisCore].[Element] WHERE [codevalue] LIKE '%s' GROUP BY [ecclassid] HAVING (COUNT(*) > 0) ORDER BY [UserLabel] LIMIT 1 OFFSET 10 ECSQLOPTIONS x = 3\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse INSERT\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"INSERT INTO Bis.Subject(ECInstanceId) VALUES(1)\",\r\n expectedECSql: \"INSERT INTO [BisCore].[Subject] ([ECInstanceId]) VALUES(1)\",\r\n },\r\n {\r\n orignalECSql: \"INSERT INTO ONLY Bis.Subject(ECInstanceId) VALUES(1)\",\r\n expectedECSql: \"INSERT INTO [BisCore].[Subject] ([ECInstanceId]) VALUES(1)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse DELETE\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"DELETE FROM Bis.Subject WHERE ECInstanceId = 1\",\r\n expectedECSql: \"DELETE FROM [BisCore].[Subject] WHERE ([ECInstanceId] = 1)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse UPDATE\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"UPDATE Bis.Subject SET CodeValue ='hello' WHERE ECInstanceId =1\",\r\n expectedECSql: \"UPDATE [BisCore].[Subject] SET [CodeValue] = 'hello' WHERE ([ECInstanceId] = 1)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse NAVIGATION_VALUE\", async () => {\r\n const tests = [\r\n {\r\n orignalECSql: \"SELECT NAVIGATION_VALUE(Bis.Element.Model, 1)\",\r\n expectedECSql: \"SELECT NAVIGATION_VALUE([BisCore].[Element].[Model], 1)\",\r\n },\r\n {\r\n orignalECSql: \"SELECT NAVIGATION_VALUE(Bis.Element.Model, 1, 2)\",\r\n expectedECSql: \"SELECT NAVIGATION_VALUE([BisCore].[Element].[Model], 1, 2)\",\r\n },\r\n ];\r\n for (const test of tests) {\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\r\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\r\n }\r\n });\r\n it(\"parse complex query\", async () => {\r\n const ecsql = `\r\n WITH RECURSIVE\r\n f0(i) AS (SELECT 1 UNION SELECT i+1 FROM f0 WHERE i < 10 ORDER BY 1),\r\n f1(i) AS (SELECT 3.14159265358),\r\n f2(i) AS (SELECT IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False') i),\r\n f3(i) AS (SELECT 1 FROM bis.Element t0 JOIN bis.Element t1 USING bis.ElementOwnsChildElements FORWARD),\r\n f4(i) AS (SELECT 1 FROM bis.Element t0 JOIN bis.Element t1 USING bis.ElementOwnsChildElements BACKWARD),\r\n f5(i) AS (\r\n SELECT 1 FROM meta.ECClassDef\r\n JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\r\n WHERE ECClassDef.ECInstanceId = :param1\r\n )\r\n SELECT\r\n (1 & 2 ) | (3 << 4 ) >> (5/ 6) * (7 + 8) + (4 % 9) + (-10) + (+20) - (~45) c0,\r\n TIMESTAMP '2013-02-09T12:00:00' c1,\r\n DATE '2012-01-18' c2,\r\n TIME '13:35:16' c3,\r\n TRUE c4,\r\n FALSE c5,\r\n 3.14159265358 c6,\r\n 314159 c7,\r\n 'Hello, World' c8,\r\n 'Hello'|| ',' || 'World' c9,\r\n IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False') c10,\r\n CASE WHEN 4>5 THEN NULL WHEN 1 IS NOT NULL THEN 'Hello' ELSE 'Bye' END c11,\r\n IIF(('Hello, World' LIKE '\\\\%World' escape '\\\\') , 2, 3) c12,\r\n IIF(('Hello, World' LIKE '%World') , 2, 3) c13,\r\n IIF(('Hello, World' NOT LIKE '%World') , 2, 3) c14,\r\n IIF( 3 IN (SELECT 1 AS N UNION SELECT 2), 'True', 'False') c15,\r\n IIF( 3 IN (1,2,3), 'True', 'False') c16,\r\n IIF( 3 NOT IN (1,2,3), 'True', 'False') c17,\r\n IIF( NULL IS NULL, 'True', 'False') c18,\r\n IIF( NULL IS NOT NULL, 'True', 'False') c19,\r\n IIF( 1 IS NOT NULL, 'True', 'False') c20,\r\n IIF( 3 IS (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False') c21,\r\n IIF( 3 IS NOT (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False') c22,\r\n IIF(NOT 3, 'True', 'False') c23,\r\n IIF( (NOT (NOT (NOT (NOT 3)))), 'True', 'False') c24,\r\n IIF(EXISTS(SELECT 1), 'True', 'False') c25,\r\n IIF(NOT EXISTS(SELECT 1), 'True', 'False') c26,\r\n CAST(1 AS TEXT) c27,\r\n CAST(1 AS INTEGER) c28,\r\n CAST(1 AS REAL) c29,\r\n CAST(1 AS BLOB) c30,\r\n CAST(1 AS TIMESTAMP) c31,\r\n INSTR('First', 'Second') c32,\r\n f0.i c33,\r\n f1.i c34,\r\n f2.i c35,\r\n k0.ECInstanceId c36\r\n FROM f0, f1, f2, f3, f4, f5, meta.ECClassDef k0, (\r\n SELECT ECInstanceId FROM meta.ECClassDef\r\n UNION\r\n SELECT DISTINCT ECInstanceId FROM meta.ECClassDef\r\n UNION ALL\r\n SELECT ALL ECInstanceId FROM meta.ECClassDef\r\n EXCEPT\r\n SELECT SUM(DISTINCT ECInstanceId) FROM meta.ECClassDef\r\n INTERSECT\r\n SELECT SUM(ECInstanceId) FROM meta.ECClassDef GROUP BY ECClassId HAVING COUNT(*)> 1\r\n ) k1\r\n WHERE f0.i = f1.i AND k0.ECInstanceId = ? + 2\r\n GROUP BY k0.ECClassId,k0.DisplayLabel HAVING COUNT(*)> 1\r\n ORDER BY k0.Name ASC, k0.ECInstanceId DESC\r\n LIMIT 33 OFFSET ? + :param2\r\n ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X=3`;\r\n /** expected result (indented for readablity)\r\n * WITH RECURSIVE\r\n [f0]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [f0] WHERE ([i] < 10) ORDER BY 1),\r\n [f1]([i]) AS (SELECT 3.14159265358),\r\n [f2]([i]) AS (SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [i]),\r\n [f3]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] FORWARD),\r\n [f4]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] BACKWARD),\r\n [f5]([i]) AS (\r\n SELECT 1 FROM [ECDbMeta].[ECClassDef]\r\n INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\r\n WHERE ([ECClassDef].[ECInstanceId] = :param1)\r\n )\r\n SELECT\r\n (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45)) [c0],\r\n TIMESTAMP '2013-02-09T12:00:00' [c1],\r\n DATE '2012-01-18' [c2],\r\n TIME '13:35:16' [c3],\r\n TRUE [c4],\r\n FALSE [c5],\r\n 3.14159265358 [c6],\r\n 314159 [c7],\r\n 'Hello, World' [c8],\r\n (('Hello' || ',') || 'World') [c9],\r\n IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [c10],\r\n CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END [c11],\r\n IIF('Hello, World' LIKE '\\%World' ESCAPE '\\', 2, 3) [c12],\r\n IIF('Hello, World' LIKE '%World', 2, 3) [c13],\r\n IIF('Hello, World' NOT LIKE '%World', 2, 3) [c14],\r\n IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False') [c15],\r\n IIF(3 IN (1, 2, 3), 'True', 'False') [c16], IIF(3 NOT IN (1, 2, 3), 'True', 'False') [c17],\r\n IIF((NULL IS NULL), 'True', 'False') [c18], IIF((NULL IS NOT NULL), 'True', 'False') [c19],\r\n IIF((1 IS NOT NULL), 'True', 'False') [c20],\r\n IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c21],\r\n IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c22],\r\n IIF((NOT 3), 'True', 'False') [c23], IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False') [c24],\r\n IIF(EXISTS(SELECT 1), 'True', 'False') [c25], IIF((NOT EXISTS(SELECT 1)), 'True', 'False') [c26],\r\n CAST(1 AS TEXT) [c27],\r\n CAST(1 AS INTEGER) [c28],\r\n CAST(1 AS REAL) [c29],\r\n CAST(1 AS BLOB) [c30],\r\n CAST(1 AS TIMESTAMP) [c31],\r\n INSTR('First', 'Second') [c32],\r\n [f0].[i] [c33],\r\n [f1].[i] [c34],\r\n [f2].[i] [c35],\r\n [k0].[ECInstanceId] [c36]\r\n FROM [f0], [f1], [f2], [f3], [f4], [f5], [ECDbMeta].[ECClassDef] [k0],\r\n (SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\r\n UNION SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\r\n UNION ALL SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\r\n EXCEPT SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\r\n INTERSECT SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\r\n GROUP BY [ECClassId] HAVING (COUNT(*) > 1)) [k1]\r\n WHERE (([f0].[i] = [f1].[i]) AND ([k0].[ECInstanceId] = (? + 2))\r\n )\r\n GROUP BY [k0].[ECClassId], [k0].[DisplayLabel]\r\n HAVING (COUNT(*) > 1)\r\n ORDER BY [k0].[Name] ASC, [k0].[ECInstanceId] DESC LIMIT 33 OFFSET (? + :param2)\r\n ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\r\n */\r\n const expected = \"WITH RECURSIVE [f0]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [f0] WHERE ([i] < 10) ORDER BY 1), [f1]([i]) AS (SELECT 3.14159265358), [f2]([i]) AS (SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [i]), [f3]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] FORWARD), [f4]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] BACKWARD), [f5]([i]) AS (SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId]) WHERE ([ECClassDef].[ECInstanceId] = :param1)) SELECT (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45)) [c0], TIMESTAMP '2013-02-09T12:00:00' [c1], DATE '2012-01-18' [c2], TIME '13:35:16' [c3], TRUE [c4], FALSE [c5], 3.14159265358 [c6], 314159 [c7], 'Hello, World' [c8], (('Hello' || ',') || 'World') [c9], IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [c10], CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END [c11], IIF('Hello, World' LIKE '\\\\%World' ESCAPE '\\\\', 2, 3) [c12], IIF('Hello, World' LIKE '%World', 2, 3) [c13], IIF('Hello, World' NOT LIKE '%World', 2, 3) [c14], IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False') [c15], IIF(3 IN (1, 2, 3), 'True', 'False') [c16], IIF(3 NOT IN (1, 2, 3), 'True', 'False') [c17], IIF((NULL IS NULL), 'True', 'False') [c18], IIF((NULL IS NOT NULL), 'True', 'False') [c19], IIF((1 IS NOT NULL), 'True', 'False') [c20], IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c21], IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c22], IIF((NOT 3), 'True', 'False') [c23], IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False') [c24], IIF(EXISTS(SELECT 1), 'True', 'False') [c25], IIF((NOT EXISTS(SELECT 1)), 'True', 'False') [c26], CAST(1 AS TEXT) [c27], CAST(1 AS INTEGER) [c28], CAST(1 AS REAL) [c29], CAST(1 AS BLOB) [c30], CAST(1 AS TIMESTAMP) [c31], INSTR('First', 'Second') [c32], [f0].[i] [c33], [f1].[i] [c34], [f2].[i] [c35], [k0].[ECInstanceId] [c36] FROM [f0], [f1], [f2], [f3], [f4], [f5], [ECDbMeta].[ECClassDef] [k0], (SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef] UNION SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef] UNION ALL SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef] EXCEPT SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef] INTERSECT SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef] GROUP BY [ECClassId] HAVING (COUNT(*) > 1)) [k1] WHERE (([f0].[i] = [f1].[i]) AND ([k0].[ECInstanceId] = (? + 2))) GROUP BY [k0].[ECClassId], [k0].[DisplayLabel] HAVING (COUNT(*) > 1) ORDER BY [k0].[Name] ASC, [k0].[ECInstanceId] DESC LIMIT 33 OFFSET (? + :param2) ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\";\r\n assert.equal(expected, await toNormalizeECSql(ecsql));\r\n });\r\n describe(\"test methods\", () => {\r\n it(\"test Expr.findInstancesOf<T>()\", async () => {\r\n const stmt = new SelectStatementExpr(\r\n new SelectExpr(\r\n new SelectionClauseExpr([\r\n new DerivedPropertyExpr(\r\n new PropertyNameExpr(\"ECInstanceId\")),\r\n new DerivedPropertyExpr(\r\n new PropertyNameExpr(\"CodeValue\"))]),\r\n \"ALL\",\r\n new FromClauseExpr([\r\n new ClassNameExpr(\"bis\", \"Element\"),\r\n ]),\r\n new WhereClauseExp(\r\n new BinaryBooleanExpr(\r\n \"=\",\r\n new PropertyNameExpr(\"ECInstanceId\"),\r\n new LiteralExpr(LiteralValueType.Raw, \"1\")))),\r\n );\r\n const expected = \"SELECT ALL [ECInstanceId], [CodeValue] FROM [bis].[Element] WHERE ([ECInstanceId] = 1)\";\r\n assert.equal(stmt.toECSql(), expected);\r\n assert.equal(stmt.findInstancesOf<SelectExpr>(SelectExpr).length, 1);\r\n assert.equal(stmt.findInstancesOf<SelectionClauseExpr>(SelectionClauseExpr).length, 1);\r\n assert.equal(stmt.findInstancesOf<DerivedPropertyExpr>(DerivedPropertyExpr).length, 2);\r\n assert.equal(stmt.findInstancesOf<PropertyNameExpr>(PropertyNameExpr).length, 3);\r\n assert.equal(stmt.findInstancesOf<WhereClauseExp>(WhereClauseExp).length, 1);\r\n assert.equal(stmt.findInstancesOf<BinaryBooleanExpr>(BinaryBooleanExpr).length, 1);\r\n assert.equal(stmt.findInstancesOf<LiteralExpr>(LiteralExpr).length, 1);\r\n assert.equal(stmt.findInstancesOf<ClassNameExpr>(ClassNameExpr).length, 1);\r\n assert.equal(stmt.findInstancesOf<FromClauseExpr>(FromClauseExpr).length, 1);\r\n });\r\n it(\"test Expr.traverse()\", async () => {\r\n const stmt = new SelectStatementExpr(\r\n new SelectExpr(\r\n new SelectionClauseExpr([\r\n new DerivedPropertyExpr(\r\n new PropertyNameExpr(\"ECInstanceId\")),\r\n new DerivedPropertyExpr(\r\n new PropertyNameExpr(\"CodeValue\"))]),\r\n undefined,\r\n new FromClauseExpr([\r\n new ClassNameExpr(\"bis\", \"Element\"),\r\n ]),\r\n new WhereClauseExp(\r\n new BinaryBooleanExpr(\r\n \"=\",\r\n new PropertyNameExpr(\"ECInstanceId\"),\r\n new ParameterExpr()))),\r\n );\r\n const expected = \"SELECT [ECInstanceId], [CodeValue] FROM [bis].[Element] WHERE ([ECInstanceId] = ?)\";\r\n assert.equal(stmt.toECSql(), expected);\r\n const exprs: Expr[] = [];\r\n stmt.traverse((expr) => {\r\n exprs.push(expr);\r\n });\r\n assert.equal(exprs[0].expType, ExprType.SelectStatement);\r\n assert.equal(exprs[1].expType, ExprType.Select);\r\n assert.equal(exprs[2].expType, ExprType.SelectionClause);\r\n assert.equal(exprs[3].expType, ExprType.DerivedProperty);\r\n assert.equal(exprs[4].expType, ExprType.PropertyName);\r\n assert.equal(exprs[5].expType, ExprType.DerivedProperty);\r\n assert.equal(exprs[6].expType, ExprType.PropertyName);\r\n assert.equal(exprs[7].expType, ExprType.FromClause);\r\n assert.equal(exprs[8].expType, ExprType.ClassName);\r\n assert.equal(exprs[9].expType, ExprType.WhereClause);\r\n assert.equal(exprs[10].expType, ExprType.BinaryBoolean);\r\n assert.equal(exprs[11].expType, ExprType.PropertyName);\r\n assert.equal(exprs[12].expType, ExprType.Parameter);\r\n assert.equal(exprs.length, 13);\r\n });\r\n it(\"test Expr.type\", async () => {\r\n assert.equal(ExprType.Assignment, AssignmentExpr.type);\r\n assert.equal(ExprType.Between, BetweenExpr.type);\r\n assert.equal(ExprType.BinaryBoolean, BinaryBooleanExpr.type);\r\n assert.equal(ExprType.BinaryValue, BinaryValueExpr.type);\r\n assert.equal(ExprType.Cast, CastExpr.type);\r\n assert.equal(ExprType.ClassName, ClassNameExpr.type);\r\n assert.equal(ExprType.Cte, CteExpr.type);\r\n assert.equal(ExprType.CteBlock, CteBlockExpr.type);\r\n assert.equal(ExprType.CteBlockRef, CteBlockRefExpr.type);\r\n assert.equal(ExprType.DeleteStatement, DeleteStatementExpr.type);\r\n assert.equal(ExprType.DerivedProperty, DerivedPropertyExpr.type);\r\n assert.equal(ExprType.ECSqlOptionsClause, ECSqlOptionsClauseExpr.type);\r\n assert.equal(ExprType.FromClause, FromClauseExpr.type);\r\n assert.equal(ExprType.FuncCall, FuncCallExpr.type);\r\n assert.equal(ExprType.GroupByClause, GroupByClauseExpr.type);\r\n assert.equal(ExprType.HavingClause, HavingClauseExpr.type);\r\n assert.equal(ExprType.IIF, IIFExpr.type);\r\n assert.equal(ExprType.In, InExpr.type);\r\n assert.equal(ExprType.InsertStatement, InsertStatementExpr.type);\r\n assert.equal(ExprType.IsNull, IsNullExpr.type);\r\n assert.equal(ExprType.IsOfType, IsOfTypeExpr.type);\r\n assert.equal(ExprType.Like, LikeExpr.type);\r\n assert.equal(ExprType.LimitClause, LimitClauseExpr.type);\r\n assert.equal(ExprType.Literal, LiteralExpr.type);\r\n assert.equal(ExprType.MemberFuncCall, MemberFuncCallExpr.type);\r\n assert.equal(ExprType.Not, NotExpr.type);\r\n assert.equal(ExprType.OrderByClause, OrderByClauseExpr.type);\r\n assert.equal(ExprType.OrderBySpec, OrderBySpecExpr.type);\r\n assert.equal(ExprType.Parameter, ParameterExpr.type);\r\n assert.equal(ExprType.PropertyName, PropertyNameExpr.type);\r\n assert.equal(ExprType.QualifiedJoin, QualifiedJoinExpr.type);\r\n assert.equal(ExprType.SearchCase, SearchCaseExpr.type);\r\n assert.equal(ExprType.Select, SelectExpr.type);\r\n assert.equal(ExprType.SelectionClause, SelectionClauseExpr.type);\r\n assert.equal(ExprType.SelectStatement, SelectStatementExpr.type);\r\n assert.equal(ExprType.SetClause, SetClauseExpr.type);\r\n assert.equal(ExprType.Subquery, SubqueryExpr.type);\r\n assert.equal(ExprType.SubqueryRef, SubqueryRefExpr.type);\r\n assert.equal(ExprType.SubqueryTest, SubqueryTestExpr.type);\r\n assert.equal(ExprType.TableValuedFunc, TableValuedFuncExpr.type);\r\n assert.equal(ExprType.Unary, UnaryValueExpr.type);\r\n assert.equal(ExprType.UpdateStatement, UpdateStatementExpr.type);\r\n assert.equal(ExprType.UsingRelationshipJoin, UsingRelationshipJoinExpr.type);\r\n assert.equal(ExprType.WhereClause, WhereClauseExp.type);\r\n });\r\n it.skip(\"test print tree\", async () => {\r\n const ecsql = \"select el.ECInstanceId as id, count(*) as instances from bis.element el where el.codevalue lIKE '%s' group by el.ecclassid having count(*)>0 order by el.UserLabel limit 1 offset 10 ECSQLOPTIONS x=3\";\r\n const selectStmt = await parseECSql(ecsql);\r\n printTree(selectStmt);\r\n\r\n });\r\n it(\"test ClassNameExpr.fromECSql()\", async () => {\r\n assert.equal(ClassNameExpr.fromECSql(\"+all Bis.Element\").toECSql(), \"+ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"+all Bis:Element\").toECSql(), \"+ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"+only Bis.Element\").toECSql(), \"+ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"+only Bis:Element\").toECSql(), \"+ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + all Bis.Element \").toECSql(), \"+ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + all Bis:Element \").toECSql(), \"+ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis.Element \").toECSql(), \"+ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis:Element \").toECSql(), \"+ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" all Bis.Element \").toECSql(), \"ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" all Bis:Element \").toECSql(), \"ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" only Bis.Element \").toECSql(), \"ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" only Bis:Element \").toECSql(), \"ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"all Bis.Element\").toECSql(), \"ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"all Bis:Element\").toECSql(), \"ALL [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"only Bis.Element\").toECSql(), \"ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"only Bis:Element\").toECSql(), \"ONLY [Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"Bis:Element\").toECSql(), \"[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"Bis.Element\").toECSql(), \"[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"[Bis]:[Element]\").toECSql(), \"[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"[Bis].[Element]\").toECSql(), \"[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"tbl.Bis:Element\").toECSql(), \"[tbl].[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"tbl.Bis.Element\").toECSql(), \"[tbl].[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"[tbl].[Bis]:[Element]\").toECSql(), \"[tbl].[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\"[tbl]:[Bis].[Element]\").toECSql(), \"[tbl].[Bis].[Element]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis.Element as el\").toECSql(), \"+ONLY [Bis].[Element] [el]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis:Element el \").toECSql(), \"+ONLY [Bis].[Element] [el]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only tbl:Bis.Element as el\").toECSql(), \"+ONLY [tbl].[Bis].[Element] [el]\");\r\n assert.equal(ClassNameExpr.fromECSql(\" + only tbl:Bis:Element el \").toECSql(), \"+ONLY [tbl].[Bis].[Element] [el]\");\r\n });\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"ECSqlAst.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/ECSqlAst.test.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*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module ECSqlExpr\n */\n\nimport { assert } from \"chai\";\nimport {\n AssignmentExpr,\n BetweenExpr,\n BinaryBooleanExpr, BinaryValueExpr,\n CastExpr,\n ClassNameExpr,\n CteBlockExpr,\n CteBlockRefExpr,\n CteExpr,\n DeleteStatementExpr,\n DerivedPropertyExpr,\n ECSqlOptionsClauseExpr,\n Expr,\n ExprType,\n FromClauseExpr,\n FuncCallExpr,\n GroupByClauseExpr,\n HavingClauseExpr,\n IIFExpr,\n InExpr,\n InsertStatementExpr,\n IsNullExpr,\n IsOfTypeExpr,\n LikeExpr,\n LimitClauseExpr,\n LiteralExpr,\n LiteralValueType,\n MemberFuncCallExpr,\n NotExpr,\n OrderByClauseExpr,\n OrderBySpecExpr,\n ParameterExpr,\n PropertyNameExpr,\n QualifiedJoinExpr,\n SearchCaseExpr,\n SelectExpr,\n SelectionClauseExpr,\n SelectStatementExpr,\n SetClauseExpr,\n StatementExpr,\n SubqueryExpr,\n SubqueryRefExpr,\n SubqueryTestExpr,\n TableValuedFuncExpr,\n UnaryValueExpr,\n UpdateStatementExpr,\n UsingRelationshipJoinExpr,\n WhereClauseExp,\n} from \"@itwin/ecsql-common\";\nimport { ECDb, ECDbOpenMode, IModelHost } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { DbResult } from \"@itwin/core-bentley\";\n\ndescribe(\"ECSql Abstract Syntax Tree\", () => {\n let ecdb: ECDb;\n\n async function toNormalizeECSql(ecsql: string) {\n return (await parseECSql(ecsql)).toECSql();\n }\n\n async function parseECSql(ecsql: string) {\n const parseTreeECSql = `PRAGMA PARSE_TREE(\"${ecsql}\") ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES`;\n if (true) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return ecdb.withPreparedStatement(parseTreeECSql, (stmt) => {\n if (DbResult.BE_SQLITE_ROW !== stmt.step()) {\n throw new Error(\"unable to get parse tree.\");\n }\n return StatementExpr.deserialize(JSON.parse(stmt.getValue(0).getString()));\n });\n } else {\n const reader = ecdb.createQueryReader(parseTreeECSql);\n if (await reader.step()) {\n return StatementExpr.deserialize(JSON.parse(reader.current[0]));\n }\n throw new Error(\"unable to get parse tree.\");\n }\n }\n\n function printTree(expr: Expr, indent: number = 0) {\n process.stdout.write(`${\"\".padEnd(indent, \".\")}${expr.expType}${\"\".padEnd(30 - (indent + expr.expType.length), \" \")}${expr.toECSql()}\\n`);\n indent += 3;\n for (const child of expr.children)\n printTree(child, indent);\n }\n\n before(async () => {\n await IModelHost.startup();\n ecdb = new ECDb();\n ecdb.openDb(IModelTestUtils.resolveAssetFile(\"test.bim\"), ECDbOpenMode.ReadWrite);\n });\n\n after(async () => {\n ecdb.closeDb();\n });\n it(\"parse (|, &, <<, >>, +, -, %, /, *) binary & unary\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT (1 & 2 ) | (3 << 4 ) >> (5/ 6) * (7 + 8) + (4 % 9) + (-10) + (+20) - (~45)\",\n expectedECSql: \"SELECT (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45))\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse DATE, TIME & TIMESTAMP\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT TIMESTAMP '2013-02-09T12:00:00'\",\n expectedECSql: \"SELECT TIMESTAMP '2013-02-09T12:00:00'\",\n },\n {\n orignalECSql: \"SELECT DATE '2012-01-18'\",\n expectedECSql: \"SELECT DATE '2012-01-18'\",\n },\n {\n orignalECSql: \"SELECT TIME '13:35:16'\",\n expectedECSql: \"SELECT TIME '13:35:16'\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse NULL, NUMBER, STRING, TRUE, FALSE & ||\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT TRUE, FALSE\",\n expectedECSql: \"SELECT TRUE, FALSE\",\n },\n {\n orignalECSql: \"SELECT NULL\",\n expectedECSql: \"SELECT NULL\",\n },\n {\n orignalECSql: \"SELECT 3.14159265358\",\n expectedECSql: \"SELECT 3.14159265358\",\n },\n {\n orignalECSql: \"SELECT 314159\",\n expectedECSql: \"SELECT 314159\",\n },\n {\n orignalECSql: \"SELECT 'Hello, World'\",\n expectedECSql: \"SELECT 'Hello, World'\",\n },\n {\n orignalECSql: \"SELECT 'Hello'|| ',' || 'World'\",\n expectedECSql: \"SELECT (('Hello' || ',') || 'World')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse (!=, =, >, <, >=, <=, OR, AND)\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse CASE-WHEN-THEN\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT CASE WHEN 4>5 THEN NULL WHEN 1 IS NOT NULL THEN 'Hello' ELSE 'Bye' END\",\n expectedECSql: \"SELECT CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse [NOT] LIKE\", async () => {\n const tests = [\n {\n orignalECSql: \"select IIF(('Hello, World' LIKE '\\\\%World' escape '\\\\') , 2, 3)\",\n expectedECSql: \"SELECT IIF('Hello, World' LIKE '\\\\%World' ESCAPE '\\\\', 2, 3)\",\n },\n {\n orignalECSql: \"select IIF(('Hello, World' LIKE '%World') , 2, 3)\",\n expectedECSql: \"SELECT IIF('Hello, World' LIKE '%World', 2, 3)\",\n }\n ,\n {\n orignalECSql: \"select IIF(('Hello, World' NOT LIKE '%World') , 2, 3)\",\n expectedECSql: \"SELECT IIF('Hello, World' NOT LIKE '%World', 2, 3)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse [NOT] IN(select|list)\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF( 3 IN (SELECT 1 AS N UNION SELECT 2), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF( 3 IN (1,2,3), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(3 IN (1, 2, 3), 'True', 'False')\",\n }\n ,\n {\n orignalECSql: \"SELECT IIF( 3 NOT IN (1,2,3), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(3 NOT IN (1, 2, 3), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse IS [NOT] NULL\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF( NULL IS NULL, 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NULL IS NULL), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF( NULL IS NOT NULL, 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NULL IS NOT NULL), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF( 1 IS NOT NULL, 'True', 'False')\",\n expectedECSql: \"SELECT IIF((1 IS NOT NULL), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse IS [NOT] (type[,...])\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF( 3 IS (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF( 3 IS NOT (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse (NOT expr)\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF(NOT 3, 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NOT 3), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF( (NOT (NOT (NOT (NOT 3)))), 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse [NOT] EXISTS (<subquery>)\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT IIF(EXISTS(SELECT 1), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(EXISTS(SELECT 1), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF(EXISTS(WITH temp(x) AS (SELECT 1) SELECT * FROM temp), 'True', 'False')\",\n expectedECSql: \"SELECT IIF(EXISTS(WITH [temp]([x]) AS (SELECT 1) SELECT [temp].[x] FROM [temp]), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF(NOT EXISTS(SELECT 1), 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NOT EXISTS(SELECT 1)), 'True', 'False')\",\n },\n {\n orignalECSql: \"SELECT IIF(NOT EXISTS(WITH temp(x) AS (SELECT 1) SELECT * FROM temp), 'True', 'False')\",\n expectedECSql: \"SELECT IIF((NOT EXISTS(WITH [temp]([x]) AS (SELECT 1) SELECT [temp].[x] FROM [temp])), 'True', 'False')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse CAST(<expr> AS [TEXT | INTEGER | REAL | BLOB | TIMESTAMP])\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT CAST(1 AS TEXT)\",\n expectedECSql: \"SELECT CAST(1 AS TEXT)\",\n },\n {\n orignalECSql: \"SELECT CAST(1 AS INTEGER)\",\n expectedECSql: \"SELECT CAST(1 AS INTEGER)\",\n },\n {\n orignalECSql: \"SELECT CAST(1 AS REAL)\",\n expectedECSql: \"SELECT CAST(1 AS REAL)\",\n },\n {\n orignalECSql: \"SELECT CAST(1 AS BLOB)\",\n expectedECSql: \"SELECT CAST(1 AS BLOB)\",\n },\n {\n orignalECSql: \"SELECT CAST(1 AS TIMESTAMP)\",\n expectedECSql: \"SELECT CAST(1 AS TIMESTAMP)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse SELECT DISTINCT|ALL/SUM(DISTINCT|ALL <expr>) \", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT ECInstanceId FROM meta.ECClassDef\",\n expectedECSql: \"SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT DISTINCT ECInstanceId FROM meta.ECClassDef\",\n expectedECSql: \"SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT ALL ECInstanceId FROM meta.ECClassDef\",\n expectedECSql: \"SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT SUM(DISTINCT ECInstanceId) FROM meta.ECClassDef\",\n expectedECSql: \"SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT SUM(ALL ECInstanceId) FROM meta.ECClassDef\",\n expectedECSql: \"SELECT SUM(ALL [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT SUM(ECInstanceId) FROM meta.ECClassDef\",\n expectedECSql: \"SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse func(args...)\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT INSTR('First', 'Second')\",\n expectedECSql: \"SELECT INSTR('First', 'Second')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse ECSQLOPTIONS\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X=3\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse Subquery\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT d.a FROM (SELECT b.Name a FROM meta.ECClassDef b) d\",\n expectedECSql: \"SELECT [d].[a] FROM (SELECT [b].[Name] [a] FROM [ECDbMeta].[ECClassDef] [b]) [d]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse LIMIT <expr> [OFFSET <expr>]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef LIMIT 10+33\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] LIMIT (10 + 33)\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef LIMIT 10+33 OFFSET 44\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] LIMIT (10 + 33) OFFSET 44\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse GROUP BY [expr...] HAVING [expr...]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef GROUP BY Name\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] GROUP BY [Name]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef GROUP BY [Name] HAVING COUNT(*)>2\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] GROUP BY [Name] HAVING (COUNT(*) > 2)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse ORDER BY [expr...]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ORDER BY Name ASC, ECInstanceId DESC\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ORDER BY [Name] ASC, [ECInstanceId] DESC\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef ORDER BY NAME, DISPLAYLABEL\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] ORDER BY [NAME], [DISPLAYLABEL]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse CTE\", async () => {\n const tests = [\n {\n orignalECSql: \"WITH RECURSIVE c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1) SELECT i FROM c\",\n expectedECSql: \"WITH RECURSIVE [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1) SELECT [i] FROM [c]\",\n },\n {\n orignalECSql: \"WITH c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1) SELECT i FROM c\",\n expectedECSql: \"WITH [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1) SELECT [i] FROM [c]\",\n },\n {\n orignalECSql: \"WITH c(i) AS (SELECT 1 UNION SELECT i+1 FROM c WHERE i < 10 ORDER BY 1), d(i) AS (SELECT 1 UNION SELECT i+1 FROM d WHERE i < 100 ORDER BY 1) SELECT * FROM c,d\",\n expectedECSql: \"WITH [c]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [c] WHERE ([i] < 10) ORDER BY 1), [d]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [d] WHERE ([i] < 100) ORDER BY 1) SELECT [c].[i], [d].[i] FROM [c], [d]\",\n },\n {\n orignalECSql: \"WITH c(a,b,c) AS (SELECT ECInstanceId, ECClassId, Name FROM meta.ECClassDef) SELECT * FROM c\",\n expectedECSql: \"WITH [c]([a], [b], [c]) AS (SELECT [ECInstanceId], [ECClassId], [Name] FROM [ECDbMeta].[ECClassDef]) SELECT [c].[a], [c].[b], [c].[c] FROM [c]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse $, $->prop\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT $ FROM Meta.ECClassDef\",\n expectedECSql: \"SELECT $ FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT $->[Name], $-> DisplayLabel, $ -> Nothing FROM Meta.ECClassDef\",\n expectedECSql: \"SELECT $->[Name], $->[DisplayLabel], $->[Nothing] FROM [ECDbMeta].[ECClassDef]\",\n },\n // {\n // orignalECSql: \"SELECT $->Name, $-> DisplayLabel, $ -> Nothing FROM Meta.ECClassDef WHERE $->Name LIKE '%Hellp' ORDER BY $->ECInstanceId DESC\",\n // expectedECSql: \"SELECT $->[Name], $->[DisplayLabel], $->[Nothing] FROM [ECDbMeta].[ECClassDef] WHERE $->[Name] LIKE '%Hellp' ORDER BY $->[ECInstanceId] DESC\",\n // },\n {\n orignalECSql: \"SELECT e.$->[Name], e.$-> DisplayLabel, e.$ -> Nothing FROM Meta.ECClassDef e\",\n expectedECSql: \"SELECT [e].$->[Name], [e].$->[DisplayLabel], [e].$->[Nothing] FROM [ECDbMeta].[ECClassDef] [e]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse ?, :<param-name>\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT ?\",\n expectedECSql: \"SELECT ?\",\n },\n {\n orignalECSql: \"SELECT :param1\",\n expectedECSql: \"SELECT :param1\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse <from> JOIN <to> USING rel [FORWARD|BACKWARD]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef JOIN meta.ECPropertyDef USING meta.ClassOwnsLocalProperties\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] JOIN [ECDbMeta].[ECPropertyDef] USING [ECDbMeta].[ClassOwnsLocalProperties]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM bis.Element a JOIN bis.Element b USING bis.ElementOwnsChildElements FORWARD\",\n expectedECSql: \"SELECT 1 FROM [BisCore].[Element] [a] JOIN [BisCore].[Element] [b] USING [BisCore].[ElementOwnsChildElements] FORWARD\",\n },\n {\n orignalECSql: \"SELECT 1 FROM bis.Element a JOIN bis.Element b USING bis.ElementOwnsChildElements BACKWARD\",\n expectedECSql: \"SELECT 1 FROM [BisCore].[Element] [a] JOIN [BisCore].[Element] [b] USING [BisCore].[ElementOwnsChildElements] BACKWARD\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse <from> [INNER] [OUTER] JOIN <to> [ON <exp>]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef INNER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse <from> RIGHT [OUTER] JOIN <to> [ON <exp>]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef RIGHT JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] RIGHT OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef RIGHT OUTER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] RIGHT OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse <from> FULL [OUTER] JOIN <to> [ON <exp>]\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef FULL JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] FULL OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n {\n orignalECSql: \"SELECT 1 FROM meta.ECClassDef FULL OUTER JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] FULL OUTER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse UNION | UNION ALL | INTERSECT | EXCEPT\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a UNION SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] UNION SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\n },\n {\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a UNION ALL SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] UNION ALL SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\n },\n {\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a INTERSECT SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] INTERSECT SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\n },\n {\n orignalECSql: \"SELECT a.ECInstanceId FROM meta.ECClassDef a EXCEPT SELECT b.ECInstanceId FROM meta.ECPropertyDef b\",\n expectedECSql: \"SELECT [a].[ECInstanceId] FROM [ECDbMeta].[ECClassDef] [a] EXCEPT SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]\",\n },\n\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse cte without columns\", async () => {\n const tests = [\n {\n orignalECSql: \"WITH cte AS (SELECT * FROM meta.ECClassDef) SELECT * FROM cte\",\n expectedECSql: \"WITH [cte] AS (SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [ECDbMeta].[ECClassDef]) SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [cte]\",\n },\n {\n orignalECSql: \"WITH cte AS (SELECT * FROM meta.ECClassDef) SELECT cte.ECInstanceId FROM cte\",\n expectedECSql: \"WITH [cte] AS (SELECT [ECInstanceId], [ECClassId], [Schema], [Name], [DisplayLabel], [Description], [Type], [Modifier], [CustomAttributeContainerType], [RelationshipStrength], [RelationshipStrengthDirection] FROM [ECDbMeta].[ECClassDef]) SELECT [cte].[ECInstanceId] FROM [cte]\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse SELECT (<subquery>) FROM\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT (SELECT b.ECInstanceId FROM meta.ECPropertyDef b) AS S FROM [ECDbMeta].[ECClassDef] a\",\n expectedECSql: \"SELECT (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) [S] FROM [ECDbMeta].[ECClassDef] [a]\",\n },\n {\n orignalECSql: \"SELECT (WITH C(iD) AS (SELECT b.ECInstanceId FROM meta.ECPropertyDef b) SELECT * FROM C) AS S FROM [ECDbMeta].[ECClassDef] a\",\n expectedECSql: \"SELECT (WITH [C]([iD]) AS (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) SELECT [C].[iD] FROM [C]) [S] FROM [ECDbMeta].[ECClassDef] [a]\",\n },\n {\n orignalECSql: \"SELECT (SELECT 1 UNION SELECT 2) FROM meta.ECClassDef a\",\n expectedECSql: \"SELECT (SELECT 1 UNION SELECT 2) FROM [ECDbMeta].[ECClassDef] [a]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE (SELECT [b].[ECInstanceId] FROM meta.ECPropertyDef b) = 1\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE ((SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) = 1)\",\n },\n {\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE (WITH temp(Id) AS (SELECT [b].[ECInstanceId] FROM meta.ECPropertyDef b) SELECT * FROM temp) = 1\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef] [a] WHERE ((WITH [temp]([Id]) AS (SELECT [b].[ECInstanceId] FROM [ECDbMeta].[ECPropertyDef] [b]) SELECT [temp].[Id] FROM [temp]) = 1)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse ALL | ONLY <classname>\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef]\",\n expectedECSql: \"SELECT 1 FROM [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM ONLY [ECDbMeta].[ECClassDef]\",\n expectedECSql: \"SELECT 1 FROM ONLY [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM ALL [ECDbMeta].[ECClassDef]\",\n expectedECSql: \"SELECT 1 FROM ALL [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM +ALL [ECDbMeta].[ECClassDef]\",\n expectedECSql: \"SELECT 1 FROM +ALL [ECDbMeta].[ECClassDef]\",\n },\n {\n orignalECSql: \"SELECT 1 FROM +ONLY [ECDbMeta].[ECClassDef]\",\n expectedECSql: \"SELECT 1 FROM +ONLY [ECDbMeta].[ECClassDef]\",\n },\n\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse tablevalue function FROM json1.json_tree()\", async () => {\n const tests = [\n {\n orignalECSql: \"select * from json1.json_tree('{}') where key='gravity'\",\n expectedECSql: \"SELECT [key], [value], [type], [atom], [parent], [fullkey], [path] FROM [json1].[json_tree]('{}') WHERE ([key] = 'gravity')\",\n },\n {\n orignalECSql: \"select s.key, s.[value], s.type from json1.json_tree('{}') s where s.key='gravity'\",\n expectedECSql: \"SELECT [s].[key], [s].[value], [s].[type] FROM [json1].[json_tree]('{}') [s] WHERE ([s].[key] = 'gravity')\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse SELECT, WHERE, FROM, GROUP BY, HAVING, ORDER BY, LIMIT & ECSQLOPTIONS\", async () => {\n const tests = [\n {\n orignalECSql: \"select count(*) from bis.element where codevalue lIKE '%s' group by ecclassid having count(*)>0 order by UserLabel limit 1 offset 10 ECSQLOPTIONS x=3\",\n expectedECSql: \"SELECT COUNT(*) FROM [BisCore].[Element] WHERE [codevalue] LIKE '%s' GROUP BY [ecclassid] HAVING (COUNT(*) > 0) ORDER BY [UserLabel] LIMIT 1 OFFSET 10 ECSQLOPTIONS x = 3\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse INSERT\", async () => {\n const tests = [\n {\n orignalECSql: \"INSERT INTO Bis.Subject(ECInstanceId) VALUES(1)\",\n expectedECSql: \"INSERT INTO [BisCore].[Subject] ([ECInstanceId]) VALUES(1)\",\n },\n {\n orignalECSql: \"INSERT INTO ONLY Bis.Subject(ECInstanceId) VALUES(1)\",\n expectedECSql: \"INSERT INTO [BisCore].[Subject] ([ECInstanceId]) VALUES(1)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse DELETE\", async () => {\n const tests = [\n {\n orignalECSql: \"DELETE FROM Bis.Subject WHERE ECInstanceId = 1\",\n expectedECSql: \"DELETE FROM [BisCore].[Subject] WHERE ([ECInstanceId] = 1)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse UPDATE\", async () => {\n const tests = [\n {\n orignalECSql: \"UPDATE Bis.Subject SET CodeValue ='hello' WHERE ECInstanceId =1\",\n expectedECSql: \"UPDATE [BisCore].[Subject] SET [CodeValue] = 'hello' WHERE ([ECInstanceId] = 1)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse NAVIGATION_VALUE\", async () => {\n const tests = [\n {\n orignalECSql: \"SELECT NAVIGATION_VALUE(Bis.Element.Model, 1)\",\n expectedECSql: \"SELECT NAVIGATION_VALUE([BisCore].[Element].[Model], 1)\",\n },\n {\n orignalECSql: \"SELECT NAVIGATION_VALUE(Bis.Element.Model, 1, 2)\",\n expectedECSql: \"SELECT NAVIGATION_VALUE([BisCore].[Element].[Model], 1, 2)\",\n },\n ];\n for (const test of tests) {\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.orignalECSql));\n assert.equal(test.expectedECSql, await toNormalizeECSql(test.expectedECSql));\n }\n });\n it(\"parse complex query\", async () => {\n const ecsql = `\n WITH RECURSIVE\n f0(i) AS (SELECT 1 UNION SELECT i+1 FROM f0 WHERE i < 10 ORDER BY 1),\n f1(i) AS (SELECT 3.14159265358),\n f2(i) AS (SELECT IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False') i),\n f3(i) AS (SELECT 1 FROM bis.Element t0 JOIN bis.Element t1 USING bis.ElementOwnsChildElements FORWARD),\n f4(i) AS (SELECT 1 FROM bis.Element t0 JOIN bis.Element t1 USING bis.ElementOwnsChildElements BACKWARD),\n f5(i) AS (\n SELECT 1 FROM meta.ECClassDef\n JOIN meta.ECPropertyDef ON ECPropertyDef.Class.Id = ECClassDef.ECInstanceId\n WHERE ECClassDef.ECInstanceId = :param1\n )\n SELECT\n (1 & 2 ) | (3 << 4 ) >> (5/ 6) * (7 + 8) + (4 % 9) + (-10) + (+20) - (~45) c0,\n TIMESTAMP '2013-02-09T12:00:00' c1,\n DATE '2012-01-18' c2,\n TIME '13:35:16' c3,\n TRUE c4,\n FALSE c5,\n 3.14159265358 c6,\n 314159 c7,\n 'Hello, World' c8,\n 'Hello'|| ',' || 'World' c9,\n IIF((1 != 2) OR (4 = 5) AND ( 4 > 8 ) OR (4 < 5) OR (4 <= 5) AND ( 4 >= 6 ), 'True', 'False') c10,\n CASE WHEN 4>5 THEN NULL WHEN 1 IS NOT NULL THEN 'Hello' ELSE 'Bye' END c11,\n IIF(('Hello, World' LIKE '\\\\%World' escape '\\\\') , 2, 3) c12,\n IIF(('Hello, World' LIKE '%World') , 2, 3) c13,\n IIF(('Hello, World' NOT LIKE '%World') , 2, 3) c14,\n IIF( 3 IN (SELECT 1 AS N UNION SELECT 2), 'True', 'False') c15,\n IIF( 3 IN (1,2,3), 'True', 'False') c16,\n IIF( 3 NOT IN (1,2,3), 'True', 'False') c17,\n IIF( NULL IS NULL, 'True', 'False') c18,\n IIF( NULL IS NOT NULL, 'True', 'False') c19,\n IIF( 1 IS NOT NULL, 'True', 'False') c20,\n IIF( 3 IS (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False') c21,\n IIF( 3 IS NOT (ALL meta.ECClassDef, ONLY meta.ECPropertyDef), 'True', 'False') c22,\n IIF(NOT 3, 'True', 'False') c23,\n IIF( (NOT (NOT (NOT (NOT 3)))), 'True', 'False') c24,\n IIF(EXISTS(SELECT 1), 'True', 'False') c25,\n IIF(NOT EXISTS(SELECT 1), 'True', 'False') c26,\n CAST(1 AS TEXT) c27,\n CAST(1 AS INTEGER) c28,\n CAST(1 AS REAL) c29,\n CAST(1 AS BLOB) c30,\n CAST(1 AS TIMESTAMP) c31,\n INSTR('First', 'Second') c32,\n f0.i c33,\n f1.i c34,\n f2.i c35,\n k0.ECInstanceId c36\n FROM f0, f1, f2, f3, f4, f5, meta.ECClassDef k0, (\n SELECT ECInstanceId FROM meta.ECClassDef\n UNION\n SELECT DISTINCT ECInstanceId FROM meta.ECClassDef\n UNION ALL\n SELECT ALL ECInstanceId FROM meta.ECClassDef\n EXCEPT\n SELECT SUM(DISTINCT ECInstanceId) FROM meta.ECClassDef\n INTERSECT\n SELECT SUM(ECInstanceId) FROM meta.ECClassDef GROUP BY ECClassId HAVING COUNT(*)> 1\n ) k1\n WHERE f0.i = f1.i AND k0.ECInstanceId = ? + 2\n GROUP BY k0.ECClassId,k0.DisplayLabel HAVING COUNT(*)> 1\n ORDER BY k0.Name ASC, k0.ECInstanceId DESC\n LIMIT 33 OFFSET ? + :param2\n ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X=3`;\n /** expected result (indented for readablity)\n * WITH RECURSIVE\n [f0]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [f0] WHERE ([i] < 10) ORDER BY 1),\n [f1]([i]) AS (SELECT 3.14159265358),\n [f2]([i]) AS (SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [i]),\n [f3]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] FORWARD),\n [f4]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] BACKWARD),\n [f5]([i]) AS (\n SELECT 1 FROM [ECDbMeta].[ECClassDef]\n INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId])\n WHERE ([ECClassDef].[ECInstanceId] = :param1)\n )\n SELECT\n (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45)) [c0],\n TIMESTAMP '2013-02-09T12:00:00' [c1],\n DATE '2012-01-18' [c2],\n TIME '13:35:16' [c3],\n TRUE [c4],\n FALSE [c5],\n 3.14159265358 [c6],\n 314159 [c7],\n 'Hello, World' [c8],\n (('Hello' || ',') || 'World') [c9],\n IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [c10],\n CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END [c11],\n IIF('Hello, World' LIKE '\\%World' ESCAPE '\\', 2, 3) [c12],\n IIF('Hello, World' LIKE '%World', 2, 3) [c13],\n IIF('Hello, World' NOT LIKE '%World', 2, 3) [c14],\n IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False') [c15],\n IIF(3 IN (1, 2, 3), 'True', 'False') [c16], IIF(3 NOT IN (1, 2, 3), 'True', 'False') [c17],\n IIF((NULL IS NULL), 'True', 'False') [c18], IIF((NULL IS NOT NULL), 'True', 'False') [c19],\n IIF((1 IS NOT NULL), 'True', 'False') [c20],\n IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c21],\n IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c22],\n IIF((NOT 3), 'True', 'False') [c23], IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False') [c24],\n IIF(EXISTS(SELECT 1), 'True', 'False') [c25], IIF((NOT EXISTS(SELECT 1)), 'True', 'False') [c26],\n CAST(1 AS TEXT) [c27],\n CAST(1 AS INTEGER) [c28],\n CAST(1 AS REAL) [c29],\n CAST(1 AS BLOB) [c30],\n CAST(1 AS TIMESTAMP) [c31],\n INSTR('First', 'Second') [c32],\n [f0].[i] [c33],\n [f1].[i] [c34],\n [f2].[i] [c35],\n [k0].[ECInstanceId] [c36]\n FROM [f0], [f1], [f2], [f3], [f4], [f5], [ECDbMeta].[ECClassDef] [k0],\n (SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\n UNION SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\n UNION ALL SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef]\n EXCEPT SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\n INTERSECT SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef]\n GROUP BY [ECClassId] HAVING (COUNT(*) > 1)) [k1]\n WHERE (([f0].[i] = [f1].[i]) AND ([k0].[ECInstanceId] = (? + 2))\n )\n GROUP BY [k0].[ECClassId], [k0].[DisplayLabel]\n HAVING (COUNT(*) > 1)\n ORDER BY [k0].[Name] ASC, [k0].[ECInstanceId] DESC LIMIT 33 OFFSET (? + :param2)\n ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\n */\n const expected = \"WITH RECURSIVE [f0]([i]) AS (SELECT 1 UNION SELECT ([i] + 1) FROM [f0] WHERE ([i] < 10) ORDER BY 1), [f1]([i]) AS (SELECT 3.14159265358), [f2]([i]) AS (SELECT IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [i]), [f3]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] FORWARD), [f4]([i]) AS (SELECT 1 FROM [BisCore].[Element] [t0] JOIN [BisCore].[Element] [t1] USING [BisCore].[ElementOwnsChildElements] BACKWARD), [f5]([i]) AS (SELECT 1 FROM [ECDbMeta].[ECClassDef] INNER JOIN [ECDbMeta].[ECPropertyDef] ON ([ECPropertyDef].[Class].[Id] = [ECClassDef].[ECInstanceId]) WHERE ([ECClassDef].[ECInstanceId] = :param1)) SELECT (((1 & 2) | (3 << 4)) >> ((((((5 / 6) * (7 + 8)) + (4 % 9)) + -10) + +20) - ~45)) [c0], TIMESTAMP '2013-02-09T12:00:00' [c1], DATE '2012-01-18' [c2], TIME '13:35:16' [c3], TRUE [c4], FALSE [c5], 3.14159265358 [c6], 314159 [c7], 'Hello, World' [c8], (('Hello' || ',') || 'World') [c9], IIF(((((1 <> 2) OR ((4 = 5) AND (4 > 8))) OR (4 < 5)) OR ((4 <= 5) AND (4 >= 6))), 'True', 'False') [c10], CASE WHEN (4 > 5) THEN NULL WHEN (1 IS NOT NULL) THEN 'Hello' ELSE 'Bye' END [c11], IIF('Hello, World' LIKE '\\\\%World' ESCAPE '\\\\', 2, 3) [c12], IIF('Hello, World' LIKE '%World', 2, 3) [c13], IIF('Hello, World' NOT LIKE '%World', 2, 3) [c14], IIF(3 IN (SELECT 1 [N] UNION SELECT 2), 'True', 'False') [c15], IIF(3 IN (1, 2, 3), 'True', 'False') [c16], IIF(3 NOT IN (1, 2, 3), 'True', 'False') [c17], IIF((NULL IS NULL), 'True', 'False') [c18], IIF((NULL IS NOT NULL), 'True', 'False') [c19], IIF((1 IS NOT NULL), 'True', 'False') [c20], IIF(3 IS (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c21], IIF(3 IS NOT (ALL [ECDbMeta].[ECClassDef], ONLY [ECDbMeta].[ECPropertyDef]), 'True', 'False') [c22], IIF((NOT 3), 'True', 'False') [c23], IIF((NOT (NOT (NOT (NOT 3)))), 'True', 'False') [c24], IIF(EXISTS(SELECT 1), 'True', 'False') [c25], IIF((NOT EXISTS(SELECT 1)), 'True', 'False') [c26], CAST(1 AS TEXT) [c27], CAST(1 AS INTEGER) [c28], CAST(1 AS REAL) [c29], CAST(1 AS BLOB) [c30], CAST(1 AS TIMESTAMP) [c31], INSTR('First', 'Second') [c32], [f0].[i] [c33], [f1].[i] [c34], [f2].[i] [c35], [k0].[ECInstanceId] [c36] FROM [f0], [f1], [f2], [f3], [f4], [f5], [ECDbMeta].[ECClassDef] [k0], (SELECT [ECInstanceId] FROM [ECDbMeta].[ECClassDef] UNION SELECT DISTINCT [ECInstanceId] FROM [ECDbMeta].[ECClassDef] UNION ALL SELECT ALL [ECInstanceId] FROM [ECDbMeta].[ECClassDef] EXCEPT SELECT SUM(DISTINCT [ECInstanceId]) FROM [ECDbMeta].[ECClassDef] INTERSECT SELECT SUM([ECInstanceId]) FROM [ECDbMeta].[ECClassDef] GROUP BY [ECClassId] HAVING (COUNT(*) > 1)) [k1] WHERE (([f0].[i] = [f1].[i]) AND ([k0].[ECInstanceId] = (? + 2))) GROUP BY [k0].[ECClassId], [k0].[DisplayLabel] HAVING (COUNT(*) > 1) ORDER BY [k0].[Name] ASC, [k0].[ECInstanceId] DESC LIMIT 33 OFFSET (? + :param2) ECSQLOPTIONS NoECClassIdFilter ReadonlyPropertiesAreUpdatable X = 3\";\n assert.equal(expected, await toNormalizeECSql(ecsql));\n });\n describe(\"test methods\", () => {\n it(\"test Expr.findInstancesOf<T>()\", async () => {\n const stmt = new SelectStatementExpr(\n new SelectExpr(\n new SelectionClauseExpr([\n new DerivedPropertyExpr(\n new PropertyNameExpr(\"ECInstanceId\")),\n new DerivedPropertyExpr(\n new PropertyNameExpr(\"CodeValue\"))]),\n \"ALL\",\n new FromClauseExpr([\n new ClassNameExpr(\"bis\", \"Element\"),\n ]),\n new WhereClauseExp(\n new BinaryBooleanExpr(\n \"=\",\n new PropertyNameExpr(\"ECInstanceId\"),\n new LiteralExpr(LiteralValueType.Raw, \"1\")))),\n );\n const expected = \"SELECT ALL [ECInstanceId], [CodeValue] FROM [bis].[Element] WHERE ([ECInstanceId] = 1)\";\n assert.equal(stmt.toECSql(), expected);\n assert.equal(stmt.findInstancesOf<SelectExpr>(SelectExpr).length, 1);\n assert.equal(stmt.findInstancesOf<SelectionClauseExpr>(SelectionClauseExpr).length, 1);\n assert.equal(stmt.findInstancesOf<DerivedPropertyExpr>(DerivedPropertyExpr).length, 2);\n assert.equal(stmt.findInstancesOf<PropertyNameExpr>(PropertyNameExpr).length, 3);\n assert.equal(stmt.findInstancesOf<WhereClauseExp>(WhereClauseExp).length, 1);\n assert.equal(stmt.findInstancesOf<BinaryBooleanExpr>(BinaryBooleanExpr).length, 1);\n assert.equal(stmt.findInstancesOf<LiteralExpr>(LiteralExpr).length, 1);\n assert.equal(stmt.findInstancesOf<ClassNameExpr>(ClassNameExpr).length, 1);\n assert.equal(stmt.findInstancesOf<FromClauseExpr>(FromClauseExpr).length, 1);\n });\n it(\"test Expr.traverse()\", async () => {\n const stmt = new SelectStatementExpr(\n new SelectExpr(\n new SelectionClauseExpr([\n new DerivedPropertyExpr(\n new PropertyNameExpr(\"ECInstanceId\")),\n new DerivedPropertyExpr(\n new PropertyNameExpr(\"CodeValue\"))]),\n undefined,\n new FromClauseExpr([\n new ClassNameExpr(\"bis\", \"Element\"),\n ]),\n new WhereClauseExp(\n new BinaryBooleanExpr(\n \"=\",\n new PropertyNameExpr(\"ECInstanceId\"),\n new ParameterExpr()))),\n );\n const expected = \"SELECT [ECInstanceId], [CodeValue] FROM [bis].[Element] WHERE ([ECInstanceId] = ?)\";\n assert.equal(stmt.toECSql(), expected);\n const exprs: Expr[] = [];\n stmt.traverse((expr) => {\n exprs.push(expr);\n });\n assert.equal(exprs[0].expType, ExprType.SelectStatement);\n assert.equal(exprs[1].expType, ExprType.Select);\n assert.equal(exprs[2].expType, ExprType.SelectionClause);\n assert.equal(exprs[3].expType, ExprType.DerivedProperty);\n assert.equal(exprs[4].expType, ExprType.PropertyName);\n assert.equal(exprs[5].expType, ExprType.DerivedProperty);\n assert.equal(exprs[6].expType, ExprType.PropertyName);\n assert.equal(exprs[7].expType, ExprType.FromClause);\n assert.equal(exprs[8].expType, ExprType.ClassName);\n assert.equal(exprs[9].expType, ExprType.WhereClause);\n assert.equal(exprs[10].expType, ExprType.BinaryBoolean);\n assert.equal(exprs[11].expType, ExprType.PropertyName);\n assert.equal(exprs[12].expType, ExprType.Parameter);\n assert.equal(exprs.length, 13);\n });\n it(\"test Expr.type\", async () => {\n assert.equal(ExprType.Assignment, AssignmentExpr.type);\n assert.equal(ExprType.Between, BetweenExpr.type);\n assert.equal(ExprType.BinaryBoolean, BinaryBooleanExpr.type);\n assert.equal(ExprType.BinaryValue, BinaryValueExpr.type);\n assert.equal(ExprType.Cast, CastExpr.type);\n assert.equal(ExprType.ClassName, ClassNameExpr.type);\n assert.equal(ExprType.Cte, CteExpr.type);\n assert.equal(ExprType.CteBlock, CteBlockExpr.type);\n assert.equal(ExprType.CteBlockRef, CteBlockRefExpr.type);\n assert.equal(ExprType.DeleteStatement, DeleteStatementExpr.type);\n assert.equal(ExprType.DerivedProperty, DerivedPropertyExpr.type);\n assert.equal(ExprType.ECSqlOptionsClause, ECSqlOptionsClauseExpr.type);\n assert.equal(ExprType.FromClause, FromClauseExpr.type);\n assert.equal(ExprType.FuncCall, FuncCallExpr.type);\n assert.equal(ExprType.GroupByClause, GroupByClauseExpr.type);\n assert.equal(ExprType.HavingClause, HavingClauseExpr.type);\n assert.equal(ExprType.IIF, IIFExpr.type);\n assert.equal(ExprType.In, InExpr.type);\n assert.equal(ExprType.InsertStatement, InsertStatementExpr.type);\n assert.equal(ExprType.IsNull, IsNullExpr.type);\n assert.equal(ExprType.IsOfType, IsOfTypeExpr.type);\n assert.equal(ExprType.Like, LikeExpr.type);\n assert.equal(ExprType.LimitClause, LimitClauseExpr.type);\n assert.equal(ExprType.Literal, LiteralExpr.type);\n assert.equal(ExprType.MemberFuncCall, MemberFuncCallExpr.type);\n assert.equal(ExprType.Not, NotExpr.type);\n assert.equal(ExprType.OrderByClause, OrderByClauseExpr.type);\n assert.equal(ExprType.OrderBySpec, OrderBySpecExpr.type);\n assert.equal(ExprType.Parameter, ParameterExpr.type);\n assert.equal(ExprType.PropertyName, PropertyNameExpr.type);\n assert.equal(ExprType.QualifiedJoin, QualifiedJoinExpr.type);\n assert.equal(ExprType.SearchCase, SearchCaseExpr.type);\n assert.equal(ExprType.Select, SelectExpr.type);\n assert.equal(ExprType.SelectionClause, SelectionClauseExpr.type);\n assert.equal(ExprType.SelectStatement, SelectStatementExpr.type);\n assert.equal(ExprType.SetClause, SetClauseExpr.type);\n assert.equal(ExprType.Subquery, SubqueryExpr.type);\n assert.equal(ExprType.SubqueryRef, SubqueryRefExpr.type);\n assert.equal(ExprType.SubqueryTest, SubqueryTestExpr.type);\n assert.equal(ExprType.TableValuedFunc, TableValuedFuncExpr.type);\n assert.equal(ExprType.Unary, UnaryValueExpr.type);\n assert.equal(ExprType.UpdateStatement, UpdateStatementExpr.type);\n assert.equal(ExprType.UsingRelationshipJoin, UsingRelationshipJoinExpr.type);\n assert.equal(ExprType.WhereClause, WhereClauseExp.type);\n });\n it.skip(\"test print tree\", async () => {\n const ecsql = \"select el.ECInstanceId as id, count(*) as instances from bis.element el where el.codevalue lIKE '%s' group by el.ecclassid having count(*)>0 order by el.UserLabel limit 1 offset 10 ECSQLOPTIONS x=3\";\n const selectStmt = await parseECSql(ecsql);\n printTree(selectStmt);\n\n });\n it(\"test ClassNameExpr.fromECSql()\", async () => {\n assert.equal(ClassNameExpr.fromECSql(\"+all Bis.Element\").toECSql(), \"+ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"+all Bis:Element\").toECSql(), \"+ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"+only Bis.Element\").toECSql(), \"+ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"+only Bis:Element\").toECSql(), \"+ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" + all Bis.Element \").toECSql(), \"+ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" + all Bis:Element \").toECSql(), \"+ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis.Element \").toECSql(), \"+ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis:Element \").toECSql(), \"+ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" all Bis.Element \").toECSql(), \"ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" all Bis:Element \").toECSql(), \"ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" only Bis.Element \").toECSql(), \"ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" only Bis:Element \").toECSql(), \"ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"all Bis.Element\").toECSql(), \"ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"all Bis:Element\").toECSql(), \"ALL [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"only Bis.Element\").toECSql(), \"ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"only Bis:Element\").toECSql(), \"ONLY [Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"Bis:Element\").toECSql(), \"[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"Bis.Element\").toECSql(), \"[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"[Bis]:[Element]\").toECSql(), \"[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"[Bis].[Element]\").toECSql(), \"[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"tbl.Bis:Element\").toECSql(), \"[tbl].[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"tbl.Bis.Element\").toECSql(), \"[tbl].[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"[tbl].[Bis]:[Element]\").toECSql(), \"[tbl].[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\"[tbl]:[Bis].[Element]\").toECSql(), \"[tbl].[Bis].[Element]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis.Element as el\").toECSql(), \"+ONLY [Bis].[Element] [el]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only Bis:Element el \").toECSql(), \"+ONLY [Bis].[Element] [el]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only tbl:Bis.Element as el\").toECSql(), \"+ONLY [tbl].[Bis].[Element] [el]\");\n assert.equal(ClassNameExpr.fromECSql(\" + only tbl:Bis:Element el \").toECSql(), \"+ONLY [tbl].[Bis].[Element] [el]\");\n });\n });\n});\n"]}
|
|
@@ -568,8 +568,26 @@ describe("ECSql Query", () => {
|
|
|
568
568
|
assert.equal(reader.stats.backendRowsReturned, 0);
|
|
569
569
|
assert.isTrue(reader.stats.backendCpuTime > 0);
|
|
570
570
|
});
|
|
571
|
-
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
|
|
571
|
+
it("concurrent query bind idset with invalid values in IdSet virtual table should fail", async () => {
|
|
572
572
|
const ids = ["0x1", "ABC", "YZ"];
|
|
573
|
+
try {
|
|
574
|
+
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
575
|
+
}
|
|
576
|
+
catch (err) {
|
|
577
|
+
assert.equal(err.message, "unsupported type");
|
|
578
|
+
}
|
|
579
|
+
});
|
|
580
|
+
it("concurrent query bind idset with invalid values in IdSet virtual table should fail", async () => {
|
|
581
|
+
const ids = ["ABC", "0x1", "YZ"]; // as first value is not an Id so QueryBinder.from will throw error of "unsupported type"
|
|
582
|
+
try {
|
|
583
|
+
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
584
|
+
}
|
|
585
|
+
catch (err) {
|
|
586
|
+
assert.equal(err.message, "unsupported type");
|
|
587
|
+
}
|
|
588
|
+
});
|
|
589
|
+
it("concurrent query bind multiple ids in idset virtual table", async () => {
|
|
590
|
+
const ids = ["0x1", "0xe", "0x10"];
|
|
573
591
|
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
574
592
|
let props = await reader.getMetaData();
|
|
575
593
|
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
|
|
@@ -577,21 +595,12 @@ describe("ECSql Query", () => {
|
|
|
577
595
|
while (await reader.step()) {
|
|
578
596
|
rows++;
|
|
579
597
|
}
|
|
580
|
-
assert.equal(rows,
|
|
598
|
+
assert.equal(rows, 3);
|
|
581
599
|
props = await reader.getMetaData();
|
|
582
600
|
assert.equal(props.length, 12); // 11 for BisCore.element and 1 for IdSet
|
|
583
|
-
assert.equal(reader.stats.backendRowsReturned,
|
|
601
|
+
assert.equal(reader.stats.backendRowsReturned, 3);
|
|
584
602
|
assert.isTrue(reader.stats.backendCpuTime > 0);
|
|
585
603
|
});
|
|
586
|
-
it("concurrent query bind idset with invalid values in IdSet virtual table", async () => {
|
|
587
|
-
const ids = ["ABC", "0x1", "YZ"]; // as first value is not an Id so QueryBinder.from will throw error of "unsupported type"
|
|
588
|
-
try {
|
|
589
|
-
imodel1.createQueryReader("SELECT * FROM BisCore.element, IdSet(?) WHERE id = ECInstanceId ECSQLOPTIONS ENABLE_EXPERIMENTAL_FEATURES", QueryBinder.from([ids]));
|
|
590
|
-
}
|
|
591
|
-
catch (err) {
|
|
592
|
-
assert.equal(err.message, "unsupported type");
|
|
593
|
-
}
|
|
594
|
-
});
|
|
595
604
|
it("concurrent query get meta data", async () => {
|
|
596
605
|
const reader = imodel1.createQueryReader("SELECT * FROM BisCore.element");
|
|
597
606
|
let props = await reader.getMetaData();
|
|
@@ -705,5 +714,84 @@ describe("ECSql Query", () => {
|
|
|
705
714
|
assert.equal(rowCounts[entry], resultSet.length);
|
|
706
715
|
}
|
|
707
716
|
});
|
|
717
|
+
describe("supports_instance_query", () => {
|
|
718
|
+
it("returns 1 for entity classes", async () => {
|
|
719
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
720
|
+
assert.equal(row[0], 1, "Entity class BisCore.Element should support instance queries");
|
|
721
|
+
}
|
|
722
|
+
});
|
|
723
|
+
it("returns 1 for link table relationship classes", async () => {
|
|
724
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.CategorySelectorRefersToCategories')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
725
|
+
assert.equal(row[0], 1, "Link table relationship should support instance queries");
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
it("returns 1 for link table relationship with external class ids", async () => {
|
|
729
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.ModelSelectorRefersToModels')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
730
|
+
assert.equal(row[0], 1, "ModelSelectorRefersToModels (link table with external class ids) should support instance queries");
|
|
731
|
+
}
|
|
732
|
+
});
|
|
733
|
+
it("returns 0 for non-existent classes", async () => {
|
|
734
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('BisCore.DoesNotExist')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
735
|
+
assert.equal(row[0], 0, "Non-existent class should not support instance queries");
|
|
736
|
+
}
|
|
737
|
+
});
|
|
738
|
+
it("returns 0 for NULL input", async () => {
|
|
739
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query(NULL)", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
740
|
+
assert.equal(row[0], 0, "NULL input should return 0");
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
it("works with schema alias:class format", async () => {
|
|
744
|
+
for await (const row of imodel1.createQueryReader("SELECT supports_instance_query('bis:Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
745
|
+
assert.equal(row[0], 1, "Should work with alias:class format");
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
it("works with integer class id", async () => {
|
|
749
|
+
// First get the class id for BisCore.Element
|
|
750
|
+
let classId;
|
|
751
|
+
for await (const row of imodel1.createQueryReader("SELECT ec_classid('BisCore', 'Element')", undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
752
|
+
classId = row[0];
|
|
753
|
+
}
|
|
754
|
+
assert.isDefined(classId, "Should be able to resolve BisCore.Element class id");
|
|
755
|
+
for await (const row of imodel1.createQueryReader(`SELECT supports_instance_query(${classId})`, undefined, { rowFormat: QueryRowFormat.UseECSqlPropertyIndexes })) {
|
|
756
|
+
assert.equal(row[0], 1, "Should work with integer class id");
|
|
757
|
+
}
|
|
758
|
+
});
|
|
759
|
+
it("can be used to filter classes that support instance queries", async () => {
|
|
760
|
+
// Example: find all classes in a schema that support SELECT $
|
|
761
|
+
const rows = [];
|
|
762
|
+
for await (const row of imodel1.createQueryReader(`SELECT c.Name, supports_instance_query(c.ECInstanceId) as supported
|
|
763
|
+
FROM meta.ECClassDef c
|
|
764
|
+
JOIN meta.ECSchemaDef s ON c.Schema.Id = s.ECInstanceId
|
|
765
|
+
WHERE s.Name = 'BisCore' AND supports_instance_query(c.ECInstanceId) = 1
|
|
766
|
+
LIMIT 5`, undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
767
|
+
rows.push(row.toRow());
|
|
768
|
+
}
|
|
769
|
+
assert.isAbove(rows.length, 0, "Should find at least one BisCore class that supports instance queries");
|
|
770
|
+
for (const row of rows) {
|
|
771
|
+
assert.equal(row.supported, 1);
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
describe("instance query on link table relationships", () => {
|
|
776
|
+
it("SELECT $ works for link table relationship with external class ids", async () => {
|
|
777
|
+
// ModelSelectorRefersToModels is a link table relationship where SourceECClassId
|
|
778
|
+
// and TargetECClassId may be stored in external tables. This was previously failing
|
|
779
|
+
// with a SQLite syntax error due to bugs in CreateLinkTableView.
|
|
780
|
+
let rowCount = 0;
|
|
781
|
+
for await (const row of imodel1.createQueryReader("SELECT $ FROM BisCore.ModelSelectorRefersToModels", undefined, { rowFormat: QueryRowFormat.UseJsPropertyNames })) {
|
|
782
|
+
const instance = row.toRow();
|
|
783
|
+
const json = instance.$;
|
|
784
|
+
assert.isDefined(json, "$ column should be defined");
|
|
785
|
+
const parsed = typeof json === "string" ? JSON.parse(json) : json;
|
|
786
|
+
assert.isDefined(parsed.ECInstanceId, "Instance must have ECInstanceId");
|
|
787
|
+
assert.isDefined(parsed.ECClassId, "Instance must have ECClassId");
|
|
788
|
+
assert.isDefined(parsed.SourceECInstanceId, "Instance must have SourceECInstanceId");
|
|
789
|
+
assert.isDefined(parsed.TargetECInstanceId, "Instance must have TargetECInstanceId");
|
|
790
|
+
rowCount++;
|
|
791
|
+
}
|
|
792
|
+
// The query should at least not crash — whether there are rows depends on the test file
|
|
793
|
+
assert.isAtLeast(rowCount, 0, "Query should execute without error");
|
|
794
|
+
});
|
|
795
|
+
});
|
|
708
796
|
});
|
|
709
797
|
//# sourceMappingURL=ECSqlQuery.test.js.map
|