@itwin/core-backend 5.15.1 → 5.16.0-dev.10
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 +1 -1
- package/lib/cjs/ConcurrentQuery.d.ts +4 -0
- package/lib/cjs/ConcurrentQuery.d.ts.map +1 -1
- package/lib/cjs/ConcurrentQuery.js +28 -1
- package/lib/cjs/ConcurrentQuery.js.map +1 -1
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +5 -10
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.d.ts +39 -55
- package/lib/cjs/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/cjs/ECSqlRowExecutor.js +118 -140
- package/lib/cjs/ECSqlRowExecutor.js.map +1 -1
- package/lib/cjs/ECSqlSyncReader.d.ts +21 -8
- package/lib/cjs/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/cjs/ECSqlSyncReader.js +67 -25
- package/lib/cjs/ECSqlSyncReader.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +5 -10
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +7 -0
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +1 -0
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +11 -6
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts +4 -0
- package/lib/cjs/internal/ChangesetConflictArgs.d.ts.map +1 -1
- package/lib/cjs/internal/ChangesetConflictArgs.js +1 -0
- package/lib/cjs/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/cjs/internal/QueryMetadataCache.d.ts +8 -0
- package/lib/cjs/internal/QueryMetadataCache.d.ts.map +1 -1
- package/lib/cjs/internal/QueryMetadataCache.js +23 -0
- package/lib/cjs/internal/QueryMetadataCache.js.map +1 -1
- package/lib/esm/ConcurrentQuery.d.ts +4 -0
- package/lib/esm/ConcurrentQuery.d.ts.map +1 -1
- package/lib/esm/ConcurrentQuery.js +29 -2
- package/lib/esm/ConcurrentQuery.js.map +1 -1
- package/lib/esm/ECDb.d.ts.map +1 -1
- package/lib/esm/ECDb.js +6 -11
- package/lib/esm/ECDb.js.map +1 -1
- package/lib/esm/ECSqlRowExecutor.d.ts +39 -55
- package/lib/esm/ECSqlRowExecutor.d.ts.map +1 -1
- package/lib/esm/ECSqlRowExecutor.js +119 -140
- package/lib/esm/ECSqlRowExecutor.js.map +1 -1
- package/lib/esm/ECSqlSyncReader.d.ts +21 -8
- package/lib/esm/ECSqlSyncReader.d.ts.map +1 -1
- package/lib/esm/ECSqlSyncReader.js +68 -26
- package/lib/esm/ECSqlSyncReader.js.map +1 -1
- package/lib/esm/IModelDb.d.ts.map +1 -1
- package/lib/esm/IModelDb.js +6 -11
- package/lib/esm/IModelDb.js.map +1 -1
- package/lib/esm/IModelHost.d.ts +7 -0
- package/lib/esm/IModelHost.d.ts.map +1 -1
- package/lib/esm/IModelHost.js +1 -0
- package/lib/esm/IModelHost.js.map +1 -1
- package/lib/esm/TxnManager.d.ts.map +1 -1
- package/lib/esm/TxnManager.js +12 -7
- package/lib/esm/TxnManager.js.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.d.ts +4 -0
- package/lib/esm/internal/ChangesetConflictArgs.d.ts.map +1 -1
- package/lib/esm/internal/ChangesetConflictArgs.js +1 -0
- package/lib/esm/internal/ChangesetConflictArgs.js.map +1 -1
- package/lib/esm/internal/QueryMetadataCache.d.ts +8 -0
- package/lib/esm/internal/QueryMetadataCache.d.ts.map +1 -1
- package/lib/esm/internal/QueryMetadataCache.js +23 -0
- package/lib/esm/internal/QueryMetadataCache.js.map +1 -1
- package/lib/esm/test/IModelHost.test.js +103 -2
- package/lib/esm/test/IModelHost.test.js.map +1 -1
- package/lib/esm/test/ecdb/CTE.test.js +21 -0
- package/lib/esm/test/ecdb/CTE.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js +72 -0
- package/lib/esm/test/ecdb/ConcurrentQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js +51 -9
- package/lib/esm/test/ecdb/ConcurrentQueryLoad.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js +2 -1
- package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js +338 -84
- package/lib/esm/test/ecdb/ECSqlSyncReader.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js +40 -4
- package/lib/esm/test/ecdb/QueryMetadataCache.test.js.map +1 -1
- package/lib/esm/test/ecdb/QueryReaders.test.js +14 -7
- package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js +71 -1
- package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
- package/lib/esm/test/standalone/IModelWrite.test.js +6 -2
- package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
- package/lib/esm/test/standalone/MergeConflict.test.js +15 -0
- package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
- package/package.json +16 -16
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
import { DbChangeStage, DbConflictCause, DbOpcode, DbValueType, Id64String } from "@itwin/core-bentley";
|
|
5
5
|
import { SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from "../SqliteChangesetReader";
|
|
6
6
|
import { IModelDb } from "../IModelDb";
|
|
7
|
+
/** The conflict passed by native code to a changeset conflict handler.
|
|
8
|
+
* Each conflict gets its own object. Its functions must be called on that object and only work during the handler call.
|
|
9
|
+
*/
|
|
7
10
|
export interface DbChangesetConflictArgs {
|
|
8
11
|
cause: DbConflictCause;
|
|
9
12
|
opcode: DbOpcode;
|
|
@@ -35,6 +38,7 @@ export interface DbRebaseChangesetConflictArgs extends DbChangesetConflictArgs {
|
|
|
35
38
|
txn: TxnArgs;
|
|
36
39
|
}
|
|
37
40
|
export type SqliteConflictCause = "Conflict" | "Data" | "Constraint" | "ForeignKey" | "NotFound";
|
|
41
|
+
/** A conflict found while rebasing local changes. Only valid during the conflict handler call. */
|
|
38
42
|
export declare class RebaseChangesetConflictArgs {
|
|
39
43
|
private _dbConflictArg;
|
|
40
44
|
private _iModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetConflictArgs.d.ts","sourceRoot":"","sources":["../../../src/internal/ChangesetConflictArgs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChangesetConflictArgs.d.ts","sourceRoot":"","sources":["../../../src/internal/ChangesetConflictArgs.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { DbChangeStage, DbConflictCause, DbOpcode, DbValueType } from "@itwin/core-bentley";
|
|
9
9
|
import { SqliteChangesetReader } from "../SqliteChangesetReader";
|
|
10
|
+
/** A conflict found while rebasing local changes. Only valid during the conflict handler call. */
|
|
10
11
|
export class RebaseChangesetConflictArgs {
|
|
11
12
|
_dbConflictArg;
|
|
12
13
|
_iModel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangesetConflictArgs.js","sourceRoot":"","sources":["../../../src/internal/ChangesetConflictArgs.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\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { DbChangeStage, DbConflictCause, DbOpcode, DbValueType, Id64String } from \"@itwin/core-bentley\";\r\nimport { SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"../SqliteChangesetReader\";\r\nimport { IModelDb } from \"../IModelDb\";\r\n\r\nexport interface DbChangesetConflictArgs {\r\n cause: DbConflictCause;\r\n opcode: DbOpcode;\r\n indirect: boolean;\r\n tableName: string;\r\n columnCount: number;\r\n getForeignKeyConflicts: () => number;\r\n dump: () => void;\r\n setLastError: (message: string) => void;\r\n getPrimaryKeyColumns: () => number[];\r\n getValueType: (columnIndex: number, stage: DbChangeStage) => DbValueType | null | undefined;\r\n getValueBinary: (columnIndex: number, stage: DbChangeStage) => Uint8Array | null | undefined;\r\n getValueId: (columnIndex: number, stage: DbChangeStage) => Id64String | null | undefined;\r\n getValueText: (columnIndex: number, stage: DbChangeStage) => string | null | undefined;\r\n getValueInteger: (columnIndex: number, stage: DbChangeStage) => number | null | undefined;\r\n getValueDouble: (columnIndex: number, stage: DbChangeStage) => number | null | undefined;\r\n isValueNull: (columnIndex: number, stage: DbChangeStage) => boolean | undefined;\r\n getColumnNames(): string[];\r\n}\r\n\r\nexport interface DbMergeChangesetConflictArgs extends DbChangesetConflictArgs {\r\n changesetFile?: string;\r\n}\r\n\r\nexport interface TxnArgs {\r\n id: Id64String;\r\n type: \"Data\" | \"Schema\";\r\n descr: string;\r\n}\r\n\r\nexport interface DbRebaseChangesetConflictArgs extends DbChangesetConflictArgs {\r\n txn: TxnArgs;\r\n}\r\n\r\nexport type SqliteConflictCause = \"Conflict\" | \"Data\" | \"Constraint\" | \"ForeignKey\" | \"NotFound\";\r\n\r\nexport class RebaseChangesetConflictArgs {\r\n constructor(private _dbConflictArg: DbRebaseChangesetConflictArgs, private _iModel: IModelDb){}\r\n public get cause() : SqliteConflictCause {\r\n switch (this._dbConflictArg.cause) {\r\n case DbConflictCause.Conflict: return \"Conflict\";\r\n case DbConflictCause.Data: return \"Data\";\r\n case DbConflictCause.Constraint: return \"Constraint\";\r\n case DbConflictCause.ForeignKey: return \"ForeignKey\";\r\n case DbConflictCause.NotFound: return \"NotFound\";\r\n }\r\n throw new Error(\"Invalid value for cause\");\r\n }\r\n public get opcode(): SqliteChangeOp | undefined {\r\n switch (this._dbConflictArg.opcode) {\r\n case DbOpcode.Insert: return \"Inserted\";\r\n case DbOpcode.Update: return \"Updated\";\r\n case DbOpcode.Delete: return \"Deleted\";\r\n }\r\n }\r\n public openTxn(): SqliteChangesetReader {\r\n return SqliteChangesetReader.openTxn({txnId: this._dbConflictArg.txn.id, db: this._iModel});\r\n }\r\n public get indirect(): boolean {\r\n return this._dbConflictArg.indirect;\r\n }\r\n public get tableName(): string {\r\n return this._dbConflictArg.tableName;\r\n }\r\n public get columnCount(): number {\r\n return this._dbConflictArg.columnCount;\r\n }\r\n public getForeignKeyConflicts(): number {\r\n return this._dbConflictArg.getForeignKeyConflicts();\r\n }\r\n public setLastError(message: string): void {\r\n this._dbConflictArg.setLastError(message);\r\n }\r\n public getPrimaryKeyColumns(): number[] {\r\n return this._dbConflictArg.getPrimaryKeyColumns();\r\n }\r\n public getValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | null | undefined {\r\n return this._dbConflictArg.getValueType(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\r\n return this._dbConflictArg.getValueBinary(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\r\n return this._dbConflictArg.getValueId(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\r\n return this._dbConflictArg.getValueText(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._dbConflictArg.getValueInteger(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._dbConflictArg.getValueDouble(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public isValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\r\n return this._dbConflictArg.isValueNull(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getColumnNames(): string[] {\r\n return this._dbConflictArg.getColumnNames();\r\n }\r\n public getPrimaryKeyValues() {\r\n const pkv: (Uint8Array | number | string | null | undefined)[] = [];\r\n if (this.opcode === undefined)\r\n return pkv;\r\n\r\n const stage = this._dbConflictArg.opcode === DbOpcode.Insert ? DbChangeStage.New : DbChangeStage.Old;\r\n for (const pk of this._dbConflictArg.getPrimaryKeyColumns()) {\r\n const type = this._dbConflictArg.getValueType(pk, stage);\r\n if (type === DbValueType.IntegerVal)\r\n pkv.push(this._dbConflictArg.getValueId(pk, stage));\r\n else if (type === DbValueType.TextVal)\r\n pkv.push(this._dbConflictArg.getValueText(pk, stage));\r\n else if (type === DbValueType.FloatVal)\r\n pkv.push(this._dbConflictArg.getValueDouble(pk, stage));\r\n else if (type === DbValueType.BlobVal)\r\n pkv.push(this._dbConflictArg.getValueBinary(pk, stage));\r\n else\r\n pkv.push(null);\r\n }\r\n return pkv;\r\n };\r\n public get txn() {\r\n return this._dbConflictArg.txn;\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"ChangesetConflictArgs.js","sourceRoot":"","sources":["../../../src/internal/ChangesetConflictArgs.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\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\nimport { DbChangeStage, DbConflictCause, DbOpcode, DbValueType, Id64String } from \"@itwin/core-bentley\";\r\nimport { SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from \"../SqliteChangesetReader\";\r\nimport { IModelDb } from \"../IModelDb\";\r\n\r\n/** The conflict passed by native code to a changeset conflict handler.\r\n * Each conflict gets its own object. Its functions must be called on that object and only work during the handler call.\r\n */\r\nexport interface DbChangesetConflictArgs {\r\n cause: DbConflictCause;\r\n opcode: DbOpcode;\r\n indirect: boolean;\r\n tableName: string;\r\n columnCount: number;\r\n getForeignKeyConflicts: () => number;\r\n dump: () => void;\r\n setLastError: (message: string) => void;\r\n getPrimaryKeyColumns: () => number[];\r\n getValueType: (columnIndex: number, stage: DbChangeStage) => DbValueType | null | undefined;\r\n getValueBinary: (columnIndex: number, stage: DbChangeStage) => Uint8Array | null | undefined;\r\n getValueId: (columnIndex: number, stage: DbChangeStage) => Id64String | null | undefined;\r\n getValueText: (columnIndex: number, stage: DbChangeStage) => string | null | undefined;\r\n getValueInteger: (columnIndex: number, stage: DbChangeStage) => number | null | undefined;\r\n getValueDouble: (columnIndex: number, stage: DbChangeStage) => number | null | undefined;\r\n isValueNull: (columnIndex: number, stage: DbChangeStage) => boolean | undefined;\r\n getColumnNames(): string[];\r\n}\r\n\r\nexport interface DbMergeChangesetConflictArgs extends DbChangesetConflictArgs {\r\n changesetFile?: string;\r\n}\r\n\r\nexport interface TxnArgs {\r\n id: Id64String;\r\n type: \"Data\" | \"Schema\";\r\n descr: string;\r\n}\r\n\r\nexport interface DbRebaseChangesetConflictArgs extends DbChangesetConflictArgs {\r\n txn: TxnArgs;\r\n}\r\n\r\nexport type SqliteConflictCause = \"Conflict\" | \"Data\" | \"Constraint\" | \"ForeignKey\" | \"NotFound\";\r\n\r\n/** A conflict found while rebasing local changes. Only valid during the conflict handler call. */\r\nexport class RebaseChangesetConflictArgs {\r\n constructor(private _dbConflictArg: DbRebaseChangesetConflictArgs, private _iModel: IModelDb){}\r\n public get cause() : SqliteConflictCause {\r\n switch (this._dbConflictArg.cause) {\r\n case DbConflictCause.Conflict: return \"Conflict\";\r\n case DbConflictCause.Data: return \"Data\";\r\n case DbConflictCause.Constraint: return \"Constraint\";\r\n case DbConflictCause.ForeignKey: return \"ForeignKey\";\r\n case DbConflictCause.NotFound: return \"NotFound\";\r\n }\r\n throw new Error(\"Invalid value for cause\");\r\n }\r\n public get opcode(): SqliteChangeOp | undefined {\r\n switch (this._dbConflictArg.opcode) {\r\n case DbOpcode.Insert: return \"Inserted\";\r\n case DbOpcode.Update: return \"Updated\";\r\n case DbOpcode.Delete: return \"Deleted\";\r\n }\r\n }\r\n public openTxn(): SqliteChangesetReader {\r\n return SqliteChangesetReader.openTxn({txnId: this._dbConflictArg.txn.id, db: this._iModel});\r\n }\r\n public get indirect(): boolean {\r\n return this._dbConflictArg.indirect;\r\n }\r\n public get tableName(): string {\r\n return this._dbConflictArg.tableName;\r\n }\r\n public get columnCount(): number {\r\n return this._dbConflictArg.columnCount;\r\n }\r\n public getForeignKeyConflicts(): number {\r\n return this._dbConflictArg.getForeignKeyConflicts();\r\n }\r\n public setLastError(message: string): void {\r\n this._dbConflictArg.setLastError(message);\r\n }\r\n public getPrimaryKeyColumns(): number[] {\r\n return this._dbConflictArg.getPrimaryKeyColumns();\r\n }\r\n public getValueType(columnIndex: number, stage: SqliteValueStage): DbValueType | null | undefined {\r\n return this._dbConflictArg.getValueType(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueBinary(columnIndex: number, stage: SqliteValueStage): Uint8Array | null | undefined {\r\n return this._dbConflictArg.getValueBinary(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueId(columnIndex: number, stage: SqliteValueStage): Id64String | null | undefined {\r\n return this._dbConflictArg.getValueId(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueText(columnIndex: number, stage: SqliteValueStage): string | null | undefined {\r\n return this._dbConflictArg.getValueText(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueInteger(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._dbConflictArg.getValueInteger(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getValueDouble(columnIndex: number, stage: SqliteValueStage): number | null | undefined {\r\n return this._dbConflictArg.getValueDouble(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public isValueNull(columnIndex: number, stage: SqliteValueStage): boolean | undefined {\r\n return this._dbConflictArg.isValueNull(columnIndex, stage=== \"New\" ? DbChangeStage.New : DbChangeStage.Old);\r\n }\r\n public getColumnNames(): string[] {\r\n return this._dbConflictArg.getColumnNames();\r\n }\r\n public getPrimaryKeyValues() {\r\n const pkv: (Uint8Array | number | string | null | undefined)[] = [];\r\n if (this.opcode === undefined)\r\n return pkv;\r\n\r\n const stage = this._dbConflictArg.opcode === DbOpcode.Insert ? DbChangeStage.New : DbChangeStage.Old;\r\n for (const pk of this._dbConflictArg.getPrimaryKeyColumns()) {\r\n const type = this._dbConflictArg.getValueType(pk, stage);\r\n if (type === DbValueType.IntegerVal)\r\n pkv.push(this._dbConflictArg.getValueId(pk, stage));\r\n else if (type === DbValueType.TextVal)\r\n pkv.push(this._dbConflictArg.getValueText(pk, stage));\r\n else if (type === DbValueType.FloatVal)\r\n pkv.push(this._dbConflictArg.getValueDouble(pk, stage));\r\n else if (type === DbValueType.BlobVal)\r\n pkv.push(this._dbConflictArg.getValueBinary(pk, stage));\r\n else\r\n pkv.push(null);\r\n }\r\n return pkv;\r\n };\r\n public get txn() {\r\n return this._dbConflictArg.txn;\r\n }\r\n}\r\n\r\n"]}
|
|
@@ -39,6 +39,14 @@ export declare class QueryMetadataCache {
|
|
|
39
39
|
* while a successful cache hit is in flight. The second call has no `restartToken`.
|
|
40
40
|
*/
|
|
41
41
|
executeCachedQueryRequest(request: DbQueryRequest, executeQueryRequest: (request: DbQueryRequest) => Promise<DbQueryResponse>): Promise<DbQueryResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* Synchronous counterpart of [[executeCachedQueryRequest]] for primary-connection requests, which native completes on
|
|
44
|
+
* the caller's thread. The cache cannot be cleared while the request runs, so a cache hit never needs to be re-requested.
|
|
45
|
+
* @param request The request to execute. It is not modified.
|
|
46
|
+
* @param executeQueryRequest Sends a request to native without consulting this cache, typically
|
|
47
|
+
* `ConcurrentQuery.executePrimaryQueryRequest` with the database already bound. Called exactly once.
|
|
48
|
+
*/
|
|
49
|
+
executeCachedPrimaryQueryRequest(request: DbQueryRequest, executeQueryRequest: (request: DbQueryRequest) => DbQueryResponse): DbQueryResponse;
|
|
42
50
|
private static hasResult;
|
|
43
51
|
}
|
|
44
52
|
//# sourceMappingURL=QueryMetadataCache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryMetadataCache.d.ts","sourceRoot":"","sources":["../../../src/internal/QueryMetadataCache.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAA2C,MAAM,oBAAoB,CAAC;AAE9G;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAKV,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ7C,gBAAuB,eAAe,OAAO;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,WAAW,CAAK;gBAEY,SAAS,SAAqC;IAElF,gCAAgC;IAChC,IAAW,IAAI,IAAI,MAAM,CAA+B;IAExD,wFAAwF;IACjF,KAAK,IAAI,IAAI;IAKpB,OAAO,CAAC,MAAM,CAAC,OAAO;IAKtB,OAAO,CAAC,MAAM,CAAC,IAAI;IAInB,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,GAAG;IASX;;;;;;;;OAQG;IACU,yBAAyB,CAAC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAkCrK,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
|
|
1
|
+
{"version":3,"file":"QueryMetadataCache.d.ts","sourceRoot":"","sources":["../../../src/internal/QueryMetadataCache.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,eAAe,EAA2C,MAAM,oBAAoB,CAAC;AAE9G;;;;;;;;;;;;GAYG;AACH,qBAAa,kBAAkB;IAKV,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ7C,gBAAuB,eAAe,OAAO;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8C;IACvE,OAAO,CAAC,WAAW,CAAK;gBAEY,SAAS,SAAqC;IAElF,gCAAgC;IAChC,IAAW,IAAI,IAAI,MAAM,CAA+B;IAExD,wFAAwF;IACjF,KAAK,IAAI,IAAI;IAKpB,OAAO,CAAC,MAAM,CAAC,OAAO;IAKtB,OAAO,CAAC,MAAM,CAAC,IAAI;IAInB,OAAO,CAAC,GAAG;IAUX,OAAO,CAAC,GAAG;IASX;;;;;;;;OAQG;IACU,yBAAyB,CAAC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAkCrK;;;;;;OAMG;IACI,gCAAgC,CAAC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,eAAe,GAAG,eAAe;IAmBpJ,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
|
|
@@ -96,6 +96,29 @@ export class QueryMetadataCache {
|
|
|
96
96
|
this.set(key, QueryMetadataCache.copy(response.meta));
|
|
97
97
|
return response;
|
|
98
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* Synchronous counterpart of [[executeCachedQueryRequest]] for primary-connection requests, which native completes on
|
|
101
|
+
* the caller's thread. The cache cannot be cleared while the request runs, so a cache hit never needs to be re-requested.
|
|
102
|
+
* @param request The request to execute. It is not modified.
|
|
103
|
+
* @param executeQueryRequest Sends a request to native without consulting this cache, typically
|
|
104
|
+
* `ConcurrentQuery.executePrimaryQueryRequest` with the database already bound. Called exactly once.
|
|
105
|
+
*/
|
|
106
|
+
executeCachedPrimaryQueryRequest(request, executeQueryRequest) {
|
|
107
|
+
if (!request.includeMetaData)
|
|
108
|
+
return executeQueryRequest(request);
|
|
109
|
+
const key = QueryMetadataCache.makeKey(request);
|
|
110
|
+
const cached = this.get(key);
|
|
111
|
+
if (cached) {
|
|
112
|
+
const hitResponse = executeQueryRequest({ ...request, includeMetaData: false });
|
|
113
|
+
if (QueryMetadataCache.hasResult(hitResponse) && (hitResponse.meta === undefined || hitResponse.meta.length === 0))
|
|
114
|
+
hitResponse.meta = QueryMetadataCache.copy(cached);
|
|
115
|
+
return hitResponse;
|
|
116
|
+
}
|
|
117
|
+
const response = executeQueryRequest(request);
|
|
118
|
+
if (QueryMetadataCache.hasResult(response) && response.meta !== undefined && response.meta.length > 0)
|
|
119
|
+
this.set(key, QueryMetadataCache.copy(response.meta));
|
|
120
|
+
return response;
|
|
121
|
+
}
|
|
99
122
|
static hasResult(response) {
|
|
100
123
|
return response.status === DbResponseStatus.Done || response.status === DbResponseStatus.Partial;
|
|
101
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryMetadataCache.js","sourceRoot":"","sources":["../../../src/internal/QueryMetadataCache.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 ECDb\r\n */\r\n\r\nimport { DbQueryRequest, DbQueryResponse, DbResponseStatus, QueryPropertyMetaData } from \"@itwin/core-common\";\r\n\r\n/**\r\n * Caches the column metadata returned by concurrent query requests so that new [ECSqlReader]($common) instances for an\r\n * already-seen ECSQL can skip asking native to build and marshal it again.\r\n *\r\n * Column metadata only depends on the prepared statement (i.e. the schema) and the options that influence property naming.\r\n * The owning database clears it only in a full `clearCaches()`, together with its statement cache, so it stays exactly as\r\n * fresh as the metadata [ECSqlStatement]($backend) caches for `withPreparedStatement` and `withQueryReader`. Every path that\r\n * changes the schema must therefore do a full `clearCaches()`. Undo and redo never need to, because saving a schema txn\r\n * starts a new undo session, so undo/redo cannot cross a schema change.\r\n * A schema change made by another process to a file opened without change watching is not detected; the statement\r\n * cache has the same limitation.\r\n * @internal\r\n */\r\nexport class QueryMetadataCache {\r\n public static readonly defaultCapacity = 200;\r\n private readonly _entries = new Map<string, QueryPropertyMetaData[]>();\r\n private _generation = 0;\r\n\r\n public constructor(private readonly _capacity = QueryMetadataCache.defaultCapacity) { }\r\n\r\n /** Number of cached entries. */\r\n public get size(): number { return this._entries.size; }\r\n\r\n /** Drop all cached metadata. Requests already in flight will not populate the cache. */\r\n public clear(): void {\r\n this._entries.clear();\r\n ++this._generation;\r\n }\r\n\r\n private static makeKey(request: DbQueryRequest): string {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return `${request.usePrimaryConn ? 1 : 0}|${request.valueFormat ?? 0}|${request.abbreviateBlobs ? 1 : 0}|${request.convertClassIdsToClassNames ? 1 : 0}|${request.query}`;\r\n }\r\n\r\n private static copy(properties: QueryPropertyMetaData[]): QueryPropertyMetaData[] {\r\n return properties.map((property) => ({ ...property }));\r\n }\r\n\r\n private get(key: string): QueryPropertyMetaData[] | undefined {\r\n const properties = this._entries.get(key);\r\n if (properties && this._entries.size > 1) {\r\n // Move to the most-recently-used position.\r\n this._entries.delete(key);\r\n this._entries.set(key, properties);\r\n }\r\n return properties;\r\n }\r\n\r\n private set(key: string, properties: QueryPropertyMetaData[]): void {\r\n this._entries.delete(key);\r\n this._entries.set(key, properties);\r\n while (this._entries.size > this._capacity) {\r\n const oldest = this._entries.keys().next().value as string;\r\n this._entries.delete(oldest);\r\n }\r\n }\r\n\r\n /**\r\n * The cached counterpart of `executeQueryRequest`, serving column metadata from the cache when possible.\r\n * On a cache hit, `executeQueryRequest` is called with `includeMetaData: false` and the cached metadata is attached to the response.\r\n * On a miss, `executeQueryRequest` is called with the request unchanged and the returned metadata is cached.\r\n * @param request The request to execute. It is not modified.\r\n * @param executeQueryRequest Sends a request to native without consulting this cache, typically\r\n * `ConcurrentQuery.executeQueryRequest` with the database already bound. Called once, or twice if the cache is cleared\r\n * while a successful cache hit is in flight. The second call has no `restartToken`.\r\n */\r\n public async executeCachedQueryRequest(request: DbQueryRequest, executeQueryRequest: (request: DbQueryRequest) => Promise<DbQueryResponse>): Promise<DbQueryResponse> {\r\n if (!request.includeMetaData)\r\n return executeQueryRequest(request);\r\n\r\n const key = QueryMetadataCache.makeKey(request);\r\n const cached = this.get(key);\r\n let missRequest = request;\r\n if (cached) {\r\n const hitGeneration = this._generation;\r\n const hitResponse = await executeQueryRequest({ ...request, includeMetaData: false });\r\n // Cancelled, failed or busy: there are no rows to describe, so hand the status back to the caller as is.\r\n if (!QueryMetadataCache.hasResult(hitResponse))\r\n return hitResponse;\r\n\r\n if (hitGeneration === this._generation) {\r\n if (hitResponse.meta === undefined || hitResponse.meta.length === 0)\r\n hitResponse.meta = QueryMetadataCache.copy(cached);\r\n return hitResponse;\r\n }\r\n\r\n // Invalidated while in flight: the cached metadata may not match the statement that produced the rows, so run\r\n // the request again with metadata. Drop the restart token: a newer request may already be using it, and\r\n // resubmitting with it would cancel that request.\r\n missRequest = { ...request };\r\n delete missRequest.restartToken;\r\n }\r\n\r\n const generation = this._generation;\r\n const response = await executeQueryRequest(missRequest);\r\n if (generation === this._generation && QueryMetadataCache.hasResult(response) && response.meta !== undefined && response.meta.length > 0)\r\n this.set(key, QueryMetadataCache.copy(response.meta));\r\n return response;\r\n }\r\n\r\n private static hasResult(response: DbQueryResponse): boolean {\r\n return response.status === DbResponseStatus.Done || response.status === DbResponseStatus.Partial;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"QueryMetadataCache.js","sourceRoot":"","sources":["../../../src/internal/QueryMetadataCache.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 ECDb\r\n */\r\n\r\nimport { DbQueryRequest, DbQueryResponse, DbResponseStatus, QueryPropertyMetaData } from \"@itwin/core-common\";\r\n\r\n/**\r\n * Caches the column metadata returned by concurrent query requests so that new [ECSqlReader]($common) instances for an\r\n * already-seen ECSQL can skip asking native to build and marshal it again.\r\n *\r\n * Column metadata only depends on the prepared statement (i.e. the schema) and the options that influence property naming.\r\n * The owning database clears it only in a full `clearCaches()`, together with its statement cache, so it stays exactly as\r\n * fresh as the metadata [ECSqlStatement]($backend) caches for `withPreparedStatement` and `withQueryReader`. Every path that\r\n * changes the schema must therefore do a full `clearCaches()`. Undo and redo never need to, because saving a schema txn\r\n * starts a new undo session, so undo/redo cannot cross a schema change.\r\n * A schema change made by another process to a file opened without change watching is not detected; the statement\r\n * cache has the same limitation.\r\n * @internal\r\n */\r\nexport class QueryMetadataCache {\r\n public static readonly defaultCapacity = 200;\r\n private readonly _entries = new Map<string, QueryPropertyMetaData[]>();\r\n private _generation = 0;\r\n\r\n public constructor(private readonly _capacity = QueryMetadataCache.defaultCapacity) { }\r\n\r\n /** Number of cached entries. */\r\n public get size(): number { return this._entries.size; }\r\n\r\n /** Drop all cached metadata. Requests already in flight will not populate the cache. */\r\n public clear(): void {\r\n this._entries.clear();\r\n ++this._generation;\r\n }\r\n\r\n private static makeKey(request: DbQueryRequest): string {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n return `${request.usePrimaryConn ? 1 : 0}|${request.valueFormat ?? 0}|${request.abbreviateBlobs ? 1 : 0}|${request.convertClassIdsToClassNames ? 1 : 0}|${request.query}`;\r\n }\r\n\r\n private static copy(properties: QueryPropertyMetaData[]): QueryPropertyMetaData[] {\r\n return properties.map((property) => ({ ...property }));\r\n }\r\n\r\n private get(key: string): QueryPropertyMetaData[] | undefined {\r\n const properties = this._entries.get(key);\r\n if (properties && this._entries.size > 1) {\r\n // Move to the most-recently-used position.\r\n this._entries.delete(key);\r\n this._entries.set(key, properties);\r\n }\r\n return properties;\r\n }\r\n\r\n private set(key: string, properties: QueryPropertyMetaData[]): void {\r\n this._entries.delete(key);\r\n this._entries.set(key, properties);\r\n while (this._entries.size > this._capacity) {\r\n const oldest = this._entries.keys().next().value as string;\r\n this._entries.delete(oldest);\r\n }\r\n }\r\n\r\n /**\r\n * The cached counterpart of `executeQueryRequest`, serving column metadata from the cache when possible.\r\n * On a cache hit, `executeQueryRequest` is called with `includeMetaData: false` and the cached metadata is attached to the response.\r\n * On a miss, `executeQueryRequest` is called with the request unchanged and the returned metadata is cached.\r\n * @param request The request to execute. It is not modified.\r\n * @param executeQueryRequest Sends a request to native without consulting this cache, typically\r\n * `ConcurrentQuery.executeQueryRequest` with the database already bound. Called once, or twice if the cache is cleared\r\n * while a successful cache hit is in flight. The second call has no `restartToken`.\r\n */\r\n public async executeCachedQueryRequest(request: DbQueryRequest, executeQueryRequest: (request: DbQueryRequest) => Promise<DbQueryResponse>): Promise<DbQueryResponse> {\r\n if (!request.includeMetaData)\r\n return executeQueryRequest(request);\r\n\r\n const key = QueryMetadataCache.makeKey(request);\r\n const cached = this.get(key);\r\n let missRequest = request;\r\n if (cached) {\r\n const hitGeneration = this._generation;\r\n const hitResponse = await executeQueryRequest({ ...request, includeMetaData: false });\r\n // Cancelled, failed or busy: there are no rows to describe, so hand the status back to the caller as is.\r\n if (!QueryMetadataCache.hasResult(hitResponse))\r\n return hitResponse;\r\n\r\n if (hitGeneration === this._generation) {\r\n if (hitResponse.meta === undefined || hitResponse.meta.length === 0)\r\n hitResponse.meta = QueryMetadataCache.copy(cached);\r\n return hitResponse;\r\n }\r\n\r\n // Invalidated while in flight: the cached metadata may not match the statement that produced the rows, so run\r\n // the request again with metadata. Drop the restart token: a newer request may already be using it, and\r\n // resubmitting with it would cancel that request.\r\n missRequest = { ...request };\r\n delete missRequest.restartToken;\r\n }\r\n\r\n const generation = this._generation;\r\n const response = await executeQueryRequest(missRequest);\r\n if (generation === this._generation && QueryMetadataCache.hasResult(response) && response.meta !== undefined && response.meta.length > 0)\r\n this.set(key, QueryMetadataCache.copy(response.meta));\r\n return response;\r\n }\r\n\r\n /**\r\n * Synchronous counterpart of [[executeCachedQueryRequest]] for primary-connection requests, which native completes on\r\n * the caller's thread. The cache cannot be cleared while the request runs, so a cache hit never needs to be re-requested.\r\n * @param request The request to execute. It is not modified.\r\n * @param executeQueryRequest Sends a request to native without consulting this cache, typically\r\n * `ConcurrentQuery.executePrimaryQueryRequest` with the database already bound. Called exactly once.\r\n */\r\n public executeCachedPrimaryQueryRequest(request: DbQueryRequest, executeQueryRequest: (request: DbQueryRequest) => DbQueryResponse): DbQueryResponse {\r\n if (!request.includeMetaData)\r\n return executeQueryRequest(request);\r\n\r\n const key = QueryMetadataCache.makeKey(request);\r\n const cached = this.get(key);\r\n if (cached) {\r\n const hitResponse = executeQueryRequest({ ...request, includeMetaData: false });\r\n if (QueryMetadataCache.hasResult(hitResponse) && (hitResponse.meta === undefined || hitResponse.meta.length === 0))\r\n hitResponse.meta = QueryMetadataCache.copy(cached);\r\n return hitResponse;\r\n }\r\n\r\n const response = executeQueryRequest(request);\r\n if (QueryMetadataCache.hasResult(response) && response.meta !== undefined && response.meta.length > 0)\r\n this.set(key, QueryMetadataCache.copy(response.meta));\r\n return response;\r\n }\r\n\r\n private static hasResult(response: DbQueryResponse): boolean {\r\n return response.status === DbResponseStatus.Done || response.status === DbResponseStatus.Partial;\r\n }\r\n}\r\n"]}
|
|
@@ -1,3 +1,55 @@
|
|
|
1
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
+
if (value !== null && value !== void 0) {
|
|
3
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
+
var dispose, inner;
|
|
5
|
+
if (async) {
|
|
6
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
+
dispose = value[Symbol.asyncDispose];
|
|
8
|
+
}
|
|
9
|
+
if (dispose === void 0) {
|
|
10
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
+
dispose = value[Symbol.dispose];
|
|
12
|
+
if (async) inner = dispose;
|
|
13
|
+
}
|
|
14
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
+
}
|
|
18
|
+
else if (async) {
|
|
19
|
+
env.stack.push({ async: true });
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
+
return function (env) {
|
|
25
|
+
function fail(e) {
|
|
26
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
+
env.hasError = true;
|
|
28
|
+
}
|
|
29
|
+
var r, s = 0;
|
|
30
|
+
function next() {
|
|
31
|
+
while (r = env.stack.pop()) {
|
|
32
|
+
try {
|
|
33
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
+
if (r.dispose) {
|
|
35
|
+
var result = r.dispose.call(r.value);
|
|
36
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
+
}
|
|
38
|
+
else s |= 1;
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
fail(e);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
+
if (env.hasError) throw env.error;
|
|
46
|
+
}
|
|
47
|
+
return next();
|
|
48
|
+
};
|
|
49
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
+
var e = new Error(message);
|
|
51
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
+
});
|
|
1
53
|
/*---------------------------------------------------------------------------------------------
|
|
2
54
|
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
3
55
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
@@ -5,7 +57,7 @@
|
|
|
5
57
|
import { assert, expect } from "chai";
|
|
6
58
|
import * as path from "path";
|
|
7
59
|
import * as sinon from "sinon";
|
|
8
|
-
import { EditTxnError, RpcRegistry } from "@itwin/core-common";
|
|
60
|
+
import { DbResponseKind, DbResponseStatus, EditTxnError, RpcRegistry } from "@itwin/core-common";
|
|
9
61
|
import { BriefcaseManager } from "../BriefcaseManager";
|
|
10
62
|
import { EditTxn } from "../EditTxn";
|
|
11
63
|
import { IModelJsFs } from "../IModelJsFs";
|
|
@@ -18,7 +70,8 @@ import { TestUtils } from "./TestUtils";
|
|
|
18
70
|
import { IModelTestUtils } from "./IModelTestUtils";
|
|
19
71
|
import { Logger, LogLevel } from "@itwin/core-bentley";
|
|
20
72
|
import { overrideSyncNativeLogLevels } from "../internal/NativePlatform";
|
|
21
|
-
import { _getHubAccess, _hubAccess } from "../internal/Symbols";
|
|
73
|
+
import { _getHubAccess, _hubAccess, _nativeDb } from "../internal/Symbols";
|
|
74
|
+
import { ECDbTestHelper } from "./ecdb/ECDbTestHelper";
|
|
22
75
|
describe("IModelHost", () => {
|
|
23
76
|
const opts = { cacheDir: TestUtils.getCacheDir() };
|
|
24
77
|
beforeEach(async () => {
|
|
@@ -48,6 +101,54 @@ describe("IModelHost", () => {
|
|
|
48
101
|
expect(EditTxn.implicitWriteEnforcement).to.equal("log");
|
|
49
102
|
expect(IModelHost.configuration?.implicitWriteEnforcement).to.equal("log");
|
|
50
103
|
});
|
|
104
|
+
for (const collectCloudSqliteStats of [undefined, false, true]) {
|
|
105
|
+
it(`controls Cloud SQLite collection for all readers from host configuration (${collectCloudSqliteStats})`, async () => {
|
|
106
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
107
|
+
try {
|
|
108
|
+
await IModelHost.startup({ ...opts, collectCloudSqliteStats });
|
|
109
|
+
const ecdb = __addDisposableResource(env_1, ECDbTestHelper.createECDb(KnownTestLocations.outputDir, "host-query-stats.ecdb"), false);
|
|
110
|
+
const imodel = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile("test.bim"));
|
|
111
|
+
try {
|
|
112
|
+
for (const db of [imodel, ecdb]) {
|
|
113
|
+
const execute = sinon.stub(db[_nativeDb], "concurrentQueryExecute").callsFake((request, callback) => {
|
|
114
|
+
expect(request).to.have.property("collectCloudSqliteStats", collectCloudSqliteStats === true);
|
|
115
|
+
const response = {
|
|
116
|
+
kind: DbResponseKind.ECSql, status: DbResponseStatus.Done, data: [[1]], rowCount: 1, meta: [],
|
|
117
|
+
stats: {
|
|
118
|
+
cpuTime: 1000, totalTime: 1, prepareTime: 0, timeLimit: 0, memLimit: 0, memUsed: 0,
|
|
119
|
+
...(collectCloudSqliteStats ? {
|
|
120
|
+
cloudSqliteTimingState: "measured", downloadTime: 0, executionTime: 1, downloadBlocks: 0, downloadBytes: 0,
|
|
121
|
+
} : {}),
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
callback(response);
|
|
125
|
+
});
|
|
126
|
+
// A legacy or untyped caller cannot override host policy.
|
|
127
|
+
const legacyOptions = { collectCloudSqliteStats: collectCloudSqliteStats !== true, limit: { count: 1 } };
|
|
128
|
+
for (const options of [undefined, legacyOptions]) {
|
|
129
|
+
const reader = db.createQueryReader("SELECT 1", undefined, options);
|
|
130
|
+
expect(await reader.toArray()).to.deep.equal([[1]]);
|
|
131
|
+
expect(reader.stats.backendDownloadTime).to.equal(collectCloudSqliteStats ? 0 : undefined);
|
|
132
|
+
expect(reader.stats.backendExecutionTime).to.equal(collectCloudSqliteStats ? 1 : undefined);
|
|
133
|
+
expect(reader.stats.backendDownloadBlocks).to.equal(collectCloudSqliteStats ? 0 : undefined);
|
|
134
|
+
expect(reader.stats.backendDownloadBytes).to.equal(collectCloudSqliteStats ? 0 : undefined);
|
|
135
|
+
}
|
|
136
|
+
expect(execute.callCount).to.equal(2);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
imodel.close();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
catch (e_1) {
|
|
144
|
+
env_1.error = e_1;
|
|
145
|
+
env_1.hasError = true;
|
|
146
|
+
}
|
|
147
|
+
finally {
|
|
148
|
+
__disposeResources(env_1);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
51
152
|
it("should properly cleanup beforeExit event listeners on shutdown", async () => {
|
|
52
153
|
const beforeCount = process.listenerCount("beforeExit");
|
|
53
154
|
for (let i = 0; i <= 15; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IModelHost.test.js","sourceRoot":"","sources":["../../../src/test/IModelHost.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\nimport { assert, expect } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as sinon from \"sinon\";\r\nimport { EditTxnError, RpcRegistry } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../BriefcaseManager\";\r\nimport { EditTxn } from \"../EditTxn\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\nimport { SnapshotDb, StandaloneDb } from \"../IModelDb\";\r\nimport { IModelHost, IModelHostOptions, KnownLocations } from \"../IModelHost\";\r\nimport { Schemas } from \"../Schema\";\r\nimport { KnownTestLocations } from \"./KnownTestLocations\";\r\nimport { AzureServerStorage } from \"@itwin/object-storage-azure\";\r\nimport type { ServerStorage } from \"@itwin/object-storage-core\";\r\nimport { TestUtils } from \"./TestUtils\";\r\nimport { IModelTestUtils } from \"./IModelTestUtils\";\r\nimport { Logger, LogLevel } from \"@itwin/core-bentley\";\r\nimport { overrideSyncNativeLogLevels } from \"../internal/NativePlatform\";\r\nimport { _getHubAccess, _hubAccess } from \"../internal/Symbols\";\r\n\r\ndescribe(\"IModelHost\", () => {\r\n const opts = { cacheDir: TestUtils.getCacheDir() };\r\n beforeEach(async () => {\r\n await TestUtils.shutdownBackend();\r\n });\r\n\r\n afterEach(async () => {\r\n sinon.restore();\r\n });\r\n\r\n after(async () => {\r\n await TestUtils.startBackend();\r\n });\r\n\r\n it(\"valid default configuration\", async () => {\r\n await IModelHost.startup(opts);\r\n\r\n // Valid registered implemented RPCs\r\n expect(RpcRegistry.instance.implementationClasses.size).to.equal(4);\r\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelReadRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelTileRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"SnapshotIModelRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"DevToolsRpcInterface\")).to.exist;\r\n\r\n expect(Schemas.getRegisteredSchema(\"BisCore\")).to.exist;\r\n expect(Schemas.getRegisteredSchema(\"Generic\")).to.exist;\r\n expect(Schemas.getRegisteredSchema(\"Functional\")).to.exist;\r\n expect(EditTxn.implicitWriteEnforcement).to.equal(\"allow\");\r\n });\r\n\r\n it(\"should allow configuring explicit transaction behavior\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"log\" });\r\n expect(EditTxn.implicitWriteEnforcement).to.equal(\"log\");\r\n expect(IModelHost.configuration?.implicitWriteEnforcement).to.equal(\"log\");\r\n });\r\n\r\n it(\"should properly cleanup beforeExit event listeners on shutdown\", async () => {\r\n const beforeCount = process.listenerCount(\"beforeExit\");\r\n for (let i = 0; i <= 15; i++) {\r\n await IModelHost.startup();\r\n await IModelHost.shutdown();\r\n\r\n }\r\n const afterCount = process.listenerCount(\"beforeExit\");\r\n expect(beforeCount).to.be.equal(afterCount);\r\n });\r\n\r\n it(\"should call logger sync function\", async () => {\r\n let nSyncCalls = 0;\r\n overrideSyncNativeLogLevels(() => ++nSyncCalls);\r\n await IModelHost.startup(opts);\r\n expect(nSyncCalls).to.equal(0);\r\n Logger.setLevel(\"test-cat\", LogLevel.Warning);\r\n expect(nSyncCalls).to.equal(1);\r\n overrideSyncNativeLogLevels(undefined);\r\n });\r\n\r\n it(\"should raise onAfterStartup events\", async () => {\r\n const eventHandler = sinon.spy();\r\n IModelHost.onAfterStartup.addOnce(eventHandler);\r\n await IModelHost.startup(opts);\r\n expect(eventHandler.calledOnce).to.be.true;\r\n });\r\n\r\n it(\"should raise onBeforeShutdown events\", async () => {\r\n await TestUtils.startBackend();\r\n const eventHandler = sinon.spy();\r\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\r\n const filename = IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\");\r\n\r\n const workspaceClose = sinon.spy((IModelHost.appWorkspace as any), \"close\");\r\n const saveSettings = IModelHost.appWorkspace.settings as any;\r\n const settingClose = sinon.spy(saveSettings, \"close\");\r\n expect(workspaceClose.callCount).eq(0);\r\n expect(settingClose.callCount).eq(0);\r\n expect(saveSettings._remove).to.not.be.undefined;\r\n\r\n // shutdown should close any opened iModels. Make sure that happens\r\n const imodel1 = SnapshotDb.openFile(filename, { key: \"imodel1\" });\r\n const imodel2 = SnapshotDb.openFile(filename, { key: \"imodel2\" });\r\n const imodel3 = SnapshotDb.openFile(filename, { key: \"imodel3\" });\r\n const imodel4 = SnapshotDb.openFile(filename, { key: \"imodel4\" });\r\n assert.notEqual(imodel1, imodel2);\r\n assert.notEqual(imodel2, imodel3);\r\n expect(imodel1.isOpen).to.be.true;\r\n expect(imodel2.isOpen).to.be.true;\r\n expect(imodel3.isOpen).to.be.true;\r\n imodel4.close(); // make sure it gets removed so we don't try to close it again on shutdown\r\n await TestUtils.shutdownBackend();\r\n expect(eventHandler.calledOnce).to.be.true;\r\n assert.isFalse(imodel1.isOpen, \"shutdown should close iModel1\");\r\n assert.isFalse(imodel2.isOpen, \"shutdown should close iModel2\");\r\n assert.isFalse(imodel3.isOpen, \"shutdown should close iModel3\");\r\n expect(workspaceClose.callCount).eq(1);\r\n expect(settingClose.callCount).eq(1);\r\n expect(saveSettings._remove).to.be.undefined;\r\n });\r\n\r\n it(\"should auto-shutdown on process beforeExit event\", async () => {\r\n await TestUtils.startBackend();\r\n expect(IModelHost.isValid).to.be.true;\r\n const eventHandler = sinon.spy();\r\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\r\n process.emit(\"beforeExit\", 0);\r\n await new Promise((resolve) => setImmediate(resolve));\r\n expect(eventHandler.calledOnce).to.be.true;\r\n expect(IModelHost.isValid).to.be.false;\r\n });\r\n\r\n it(\"should set the briefcase cache directory to expected locations\", async () => {\r\n const config: IModelHostOptions = {};\r\n const cacheSubDir = \"imodels\";\r\n\r\n // Test cache default location\r\n await IModelHost.shutdown();\r\n await IModelHost.startup(config);\r\n let expectedDir = path.join(IModelHost.cacheDir, cacheSubDir);\r\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\r\n\r\n // Test custom cache location\r\n await IModelHost.shutdown();\r\n config.cacheDir = KnownLocations.tmpdir;\r\n await IModelHost.startup(config);\r\n expectedDir = path.join(KnownLocations.tmpdir, cacheSubDir);\r\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\r\n });\r\n\r\n it(\"should set Azure cloud storage provider for tile cache given credentials\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n };\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.isDefined(IModelHost.tileStorage!.storage);\r\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\r\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, `https://${config.tileCacheAzureCredentials.account}.blob.core.windows.net`)\r\n });\r\n\r\n it(\"should set Azure cloud storage provider for tile cache with custom baseUrl\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n baseUrl: \"https://custom.blob.core.windows.net\",\r\n };\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.isDefined(IModelHost.tileStorage!.storage);\r\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\r\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, config.tileCacheAzureCredentials.baseUrl)\r\n });\r\n\r\n it(\"should set custom cloud storage provider for tile cache\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.equal(IModelHost.tileStorage!.storage, config.tileCacheStorage);\r\n });\r\n\r\n it(\"should throw if both tileCacheStorage and tileCacheAzureCredentials are set\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n };\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await expect(IModelHost.startup(config)).to.be.rejectedWith(\"Cannot use both Azure and custom cloud storage providers for tile cache.\");\r\n });\r\n\r\n it(\"should use local cache if cloud storage provider for tile cache is not set\", async () => {\r\n await IModelHost.startup(opts);\r\n\r\n assert.isUndefined(IModelHost.tileStorage);\r\n });\r\n\r\n it(\"should cleanup tileStorage on shutdown\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.equal(IModelHost.tileStorage?.storage, config.tileCacheStorage);\r\n\r\n await IModelHost.shutdown();\r\n\r\n assert.isUndefined(IModelHost.tileStorage);\r\n });\r\n\r\n it(\"should throw if hubAccess is undefined and getter is called\", async () => {\r\n await IModelHost.startup(opts);\r\n expect(IModelHost[_getHubAccess]()).undefined;\r\n expect(() => IModelHost[_hubAccess]).throws();\r\n });\r\n\r\n it(\"computeSchemaChecksum\", () => {\r\n const assetsDir = path.join(KnownTestLocations.assetsDir, \"ECSchemaOps\");\r\n const schemaXmlPath = path.join(assetsDir, \"SchemaA.ecschema.xml\");\r\n let referencePaths = [assetsDir];\r\n let sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths });\r\n expect(sha1).equal(\"3ac6578060902aa0b8426b61d62045fdf7fa0b2b\");\r\n\r\n expect(() => IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true })).throws(\"Failed to read schema SchemaA.ecschema\");\r\n\r\n referencePaths = [path.join(assetsDir, \"exact-match\")];\r\n sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true });\r\n expect(sha1).equal(\"2a618664fbba1df7c05f27d7c0e8f58de250003b\");\r\n });\r\n\r\n it(\"should log implicit transaction writes when configured to log\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"log\" });\r\n const logError = sinon.spy(Logger, \"logError\");\r\n const fileName = IModelTestUtils.prepareOutputFile(\"IModelHost\", \"implicitWriteLog.bim\");\r\n const db = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"implicitWriteLog\" },\r\n enableTransactions: true,\r\n });\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n db.saveFileProperty({ name: \"log-mode\", namespace: \"IModelHostTest\" }, \"value\");\r\n expect(db.queryFilePropertyString({ name: \"log-mode\", namespace: \"IModelHostTest\" })).to.equal(\"value\");\r\n expect(logError.calledOnce).to.be.true;\r\n expect(logError.firstCall.args[0]).to.equal(\"core-backend.IModelDb\");\r\n expect(EditTxnError.isError(logError.firstCall.args[1], \"implicit-txn-write-disallowed\")).to.be.true;\r\n } finally {\r\n if (db.isOpen)\r\n db.close();\r\n\r\n IModelJsFs.removeSync(fileName);\r\n }\r\n });\r\n\r\n it(\"should reject implicit transaction writes when configured to enforce\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"throw\" });\r\n const fileName = IModelTestUtils.prepareOutputFile(\"IModelHost\", \"implicitWriteEnforce.bim\");\r\n const db = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"implicitWriteEnforce\" },\r\n enableTransactions: true,\r\n });\r\n\r\n try {\r\n expect(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n db.saveFileProperty({ name: \"enforce-mode\", namespace: \"IModelHostTest\" }, \"value\");\r\n }).to.throw().that.satisfies((error: unknown) => EditTxnError.isError(error, \"implicit-txn-write-disallowed\"));\r\n\r\n const txn = new EditTxn(db, \"explicit test\");\r\n txn.start();\r\n txn.saveFileProperty({ name: \"explicit\", namespace: \"IModelHostTest\" }, \"value\");\r\n txn.end();\r\n\r\n expect(db.queryFilePropertyString({ name: \"explicit\", namespace: \"IModelHostTest\" })).to.equal(\"value\");\r\n } finally {\r\n if (db.isOpen)\r\n db.close();\r\n\r\n IModelJsFs.removeSync(fileName);\r\n }\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"IModelHost.test.js","sourceRoot":"","sources":["../../../src/test/IModelHost.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\nimport { assert, expect } from \"chai\";\r\nimport * as path from \"path\";\r\nimport * as sinon from \"sinon\";\r\nimport { DbQueryResponse, DbResponseKind, DbResponseStatus, EditTxnError, RpcRegistry } from \"@itwin/core-common\";\r\nimport { BriefcaseManager } from \"../BriefcaseManager\";\r\nimport { EditTxn } from \"../EditTxn\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\nimport { SnapshotDb, StandaloneDb } from \"../IModelDb\";\r\nimport { IModelHost, IModelHostOptions, KnownLocations } from \"../IModelHost\";\r\nimport { Schemas } from \"../Schema\";\r\nimport { KnownTestLocations } from \"./KnownTestLocations\";\r\nimport { AzureServerStorage } from \"@itwin/object-storage-azure\";\r\nimport type { ServerStorage } from \"@itwin/object-storage-core\";\r\nimport { TestUtils } from \"./TestUtils\";\r\nimport { IModelTestUtils } from \"./IModelTestUtils\";\r\nimport { Logger, LogLevel } from \"@itwin/core-bentley\";\r\nimport { overrideSyncNativeLogLevels } from \"../internal/NativePlatform\";\r\nimport { _getHubAccess, _hubAccess, _nativeDb } from \"../internal/Symbols\";\r\nimport { ECDbTestHelper } from \"./ecdb/ECDbTestHelper\";\r\n\r\ndescribe(\"IModelHost\", () => {\r\n const opts = { cacheDir: TestUtils.getCacheDir() };\r\n beforeEach(async () => {\r\n await TestUtils.shutdownBackend();\r\n });\r\n\r\n afterEach(async () => {\r\n sinon.restore();\r\n });\r\n\r\n after(async () => {\r\n await TestUtils.startBackend();\r\n });\r\n\r\n it(\"valid default configuration\", async () => {\r\n await IModelHost.startup(opts);\r\n\r\n // Valid registered implemented RPCs\r\n expect(RpcRegistry.instance.implementationClasses.size).to.equal(4);\r\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelReadRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"IModelTileRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"SnapshotIModelRpcInterface\")).to.exist;\r\n expect(RpcRegistry.instance.implementationClasses.get(\"DevToolsRpcInterface\")).to.exist;\r\n\r\n expect(Schemas.getRegisteredSchema(\"BisCore\")).to.exist;\r\n expect(Schemas.getRegisteredSchema(\"Generic\")).to.exist;\r\n expect(Schemas.getRegisteredSchema(\"Functional\")).to.exist;\r\n expect(EditTxn.implicitWriteEnforcement).to.equal(\"allow\");\r\n });\r\n\r\n it(\"should allow configuring explicit transaction behavior\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"log\" });\r\n expect(EditTxn.implicitWriteEnforcement).to.equal(\"log\");\r\n expect(IModelHost.configuration?.implicitWriteEnforcement).to.equal(\"log\");\r\n });\r\n\r\n for (const collectCloudSqliteStats of [undefined, false, true]) {\r\n it(`controls Cloud SQLite collection for all readers from host configuration (${collectCloudSqliteStats})`, async () => {\r\n await IModelHost.startup({ ...opts, collectCloudSqliteStats });\r\n using ecdb = ECDbTestHelper.createECDb(KnownTestLocations.outputDir, \"host-query-stats.ecdb\");\r\n const imodel = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n try {\r\n for (const db of [imodel, ecdb]) {\r\n const execute = sinon.stub(db[_nativeDb], \"concurrentQueryExecute\").callsFake((request, callback) => {\r\n expect(request).to.have.property(\"collectCloudSqliteStats\", collectCloudSqliteStats === true);\r\n const response: DbQueryResponse = {\r\n kind: DbResponseKind.ECSql, status: DbResponseStatus.Done, data: [[1]], rowCount: 1, meta: [],\r\n stats: {\r\n cpuTime: 1000, totalTime: 1, prepareTime: 0, timeLimit: 0, memLimit: 0, memUsed: 0,\r\n ...(collectCloudSqliteStats ? {\r\n cloudSqliteTimingState: \"measured\", downloadTime: 0, executionTime: 1, downloadBlocks: 0, downloadBytes: 0,\r\n } : {}),\r\n },\r\n };\r\n callback(response);\r\n });\r\n // A legacy or untyped caller cannot override host policy.\r\n const legacyOptions = { collectCloudSqliteStats: collectCloudSqliteStats !== true, limit: { count: 1 } };\r\n for (const options of [undefined, legacyOptions]) {\r\n const reader = db.createQueryReader(\"SELECT 1\", undefined, options);\r\n expect(await reader.toArray()).to.deep.equal([[1]]);\r\n expect(reader.stats.backendDownloadTime).to.equal(collectCloudSqliteStats ? 0 : undefined);\r\n expect(reader.stats.backendExecutionTime).to.equal(collectCloudSqliteStats ? 1 : undefined);\r\n expect(reader.stats.backendDownloadBlocks).to.equal(collectCloudSqliteStats ? 0 : undefined);\r\n expect(reader.stats.backendDownloadBytes).to.equal(collectCloudSqliteStats ? 0 : undefined);\r\n }\r\n expect(execute.callCount).to.equal(2);\r\n }\r\n } finally {\r\n imodel.close();\r\n }\r\n });\r\n }\r\n\r\n it(\"should properly cleanup beforeExit event listeners on shutdown\", async () => {\r\n const beforeCount = process.listenerCount(\"beforeExit\");\r\n for (let i = 0; i <= 15; i++) {\r\n await IModelHost.startup();\r\n await IModelHost.shutdown();\r\n\r\n }\r\n const afterCount = process.listenerCount(\"beforeExit\");\r\n expect(beforeCount).to.be.equal(afterCount);\r\n });\r\n\r\n it(\"should call logger sync function\", async () => {\r\n let nSyncCalls = 0;\r\n overrideSyncNativeLogLevels(() => ++nSyncCalls);\r\n await IModelHost.startup(opts);\r\n expect(nSyncCalls).to.equal(0);\r\n Logger.setLevel(\"test-cat\", LogLevel.Warning);\r\n expect(nSyncCalls).to.equal(1);\r\n overrideSyncNativeLogLevels(undefined);\r\n });\r\n\r\n it(\"should raise onAfterStartup events\", async () => {\r\n const eventHandler = sinon.spy();\r\n IModelHost.onAfterStartup.addOnce(eventHandler);\r\n await IModelHost.startup(opts);\r\n expect(eventHandler.calledOnce).to.be.true;\r\n });\r\n\r\n it(\"should raise onBeforeShutdown events\", async () => {\r\n await TestUtils.startBackend();\r\n const eventHandler = sinon.spy();\r\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\r\n const filename = IModelTestUtils.resolveAssetFile(\"GetSetAutoHandledStructProperties.bim\");\r\n\r\n const workspaceClose = sinon.spy((IModelHost.appWorkspace as any), \"close\");\r\n const saveSettings = IModelHost.appWorkspace.settings as any;\r\n const settingClose = sinon.spy(saveSettings, \"close\");\r\n expect(workspaceClose.callCount).eq(0);\r\n expect(settingClose.callCount).eq(0);\r\n expect(saveSettings._remove).to.not.be.undefined;\r\n\r\n // shutdown should close any opened iModels. Make sure that happens\r\n const imodel1 = SnapshotDb.openFile(filename, { key: \"imodel1\" });\r\n const imodel2 = SnapshotDb.openFile(filename, { key: \"imodel2\" });\r\n const imodel3 = SnapshotDb.openFile(filename, { key: \"imodel3\" });\r\n const imodel4 = SnapshotDb.openFile(filename, { key: \"imodel4\" });\r\n assert.notEqual(imodel1, imodel2);\r\n assert.notEqual(imodel2, imodel3);\r\n expect(imodel1.isOpen).to.be.true;\r\n expect(imodel2.isOpen).to.be.true;\r\n expect(imodel3.isOpen).to.be.true;\r\n imodel4.close(); // make sure it gets removed so we don't try to close it again on shutdown\r\n await TestUtils.shutdownBackend();\r\n expect(eventHandler.calledOnce).to.be.true;\r\n assert.isFalse(imodel1.isOpen, \"shutdown should close iModel1\");\r\n assert.isFalse(imodel2.isOpen, \"shutdown should close iModel2\");\r\n assert.isFalse(imodel3.isOpen, \"shutdown should close iModel3\");\r\n expect(workspaceClose.callCount).eq(1);\r\n expect(settingClose.callCount).eq(1);\r\n expect(saveSettings._remove).to.be.undefined;\r\n });\r\n\r\n it(\"should auto-shutdown on process beforeExit event\", async () => {\r\n await TestUtils.startBackend();\r\n expect(IModelHost.isValid).to.be.true;\r\n const eventHandler = sinon.spy();\r\n IModelHost.onBeforeShutdown.addOnce(eventHandler);\r\n process.emit(\"beforeExit\", 0);\r\n await new Promise((resolve) => setImmediate(resolve));\r\n expect(eventHandler.calledOnce).to.be.true;\r\n expect(IModelHost.isValid).to.be.false;\r\n });\r\n\r\n it(\"should set the briefcase cache directory to expected locations\", async () => {\r\n const config: IModelHostOptions = {};\r\n const cacheSubDir = \"imodels\";\r\n\r\n // Test cache default location\r\n await IModelHost.shutdown();\r\n await IModelHost.startup(config);\r\n let expectedDir = path.join(IModelHost.cacheDir, cacheSubDir);\r\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\r\n\r\n // Test custom cache location\r\n await IModelHost.shutdown();\r\n config.cacheDir = KnownLocations.tmpdir;\r\n await IModelHost.startup(config);\r\n expectedDir = path.join(KnownLocations.tmpdir, cacheSubDir);\r\n assert.strictEqual(expectedDir, BriefcaseManager.cacheDir);\r\n });\r\n\r\n it(\"should set Azure cloud storage provider for tile cache given credentials\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n };\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.isDefined(IModelHost.tileStorage!.storage);\r\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\r\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, `https://${config.tileCacheAzureCredentials.account}.blob.core.windows.net`)\r\n });\r\n\r\n it(\"should set Azure cloud storage provider for tile cache with custom baseUrl\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n baseUrl: \"https://custom.blob.core.windows.net\",\r\n };\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.isDefined(IModelHost.tileStorage!.storage);\r\n assert.instanceOf(IModelHost.tileStorage!.storage, AzureServerStorage);\r\n assert.equal((IModelHost.tileStorage?.storage as any)._config.baseUrl, config.tileCacheAzureCredentials.baseUrl)\r\n });\r\n\r\n it(\"should set custom cloud storage provider for tile cache\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.isDefined(IModelHost.tileStorage);\r\n assert.equal(IModelHost.tileStorage!.storage, config.tileCacheStorage);\r\n });\r\n\r\n it(\"should throw if both tileCacheStorage and tileCacheAzureCredentials are set\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheAzureCredentials = {\r\n account: \"testAccount\",\r\n accessKey: \"testAccessKey\",\r\n };\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await expect(IModelHost.startup(config)).to.be.rejectedWith(\"Cannot use both Azure and custom cloud storage providers for tile cache.\");\r\n });\r\n\r\n it(\"should use local cache if cloud storage provider for tile cache is not set\", async () => {\r\n await IModelHost.startup(opts);\r\n\r\n assert.isUndefined(IModelHost.tileStorage);\r\n });\r\n\r\n it(\"should cleanup tileStorage on shutdown\", async () => {\r\n const config: IModelHostOptions = {};\r\n config.tileCacheStorage = {} as ServerStorage;\r\n\r\n await IModelHost.startup(config);\r\n\r\n assert.equal(IModelHost.tileStorage?.storage, config.tileCacheStorage);\r\n\r\n await IModelHost.shutdown();\r\n\r\n assert.isUndefined(IModelHost.tileStorage);\r\n });\r\n\r\n it(\"should throw if hubAccess is undefined and getter is called\", async () => {\r\n await IModelHost.startup(opts);\r\n expect(IModelHost[_getHubAccess]()).undefined;\r\n expect(() => IModelHost[_hubAccess]).throws();\r\n });\r\n\r\n it(\"computeSchemaChecksum\", () => {\r\n const assetsDir = path.join(KnownTestLocations.assetsDir, \"ECSchemaOps\");\r\n const schemaXmlPath = path.join(assetsDir, \"SchemaA.ecschema.xml\");\r\n let referencePaths = [assetsDir];\r\n let sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths });\r\n expect(sha1).equal(\"3ac6578060902aa0b8426b61d62045fdf7fa0b2b\");\r\n\r\n expect(() => IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true })).throws(\"Failed to read schema SchemaA.ecschema\");\r\n\r\n referencePaths = [path.join(assetsDir, \"exact-match\")];\r\n sha1 = IModelHost.computeSchemaChecksum({ schemaXmlPath, referencePaths, exactMatch: true });\r\n expect(sha1).equal(\"2a618664fbba1df7c05f27d7c0e8f58de250003b\");\r\n });\r\n\r\n it(\"should log implicit transaction writes when configured to log\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"log\" });\r\n const logError = sinon.spy(Logger, \"logError\");\r\n const fileName = IModelTestUtils.prepareOutputFile(\"IModelHost\", \"implicitWriteLog.bim\");\r\n const db = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"implicitWriteLog\" },\r\n enableTransactions: true,\r\n });\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n db.saveFileProperty({ name: \"log-mode\", namespace: \"IModelHostTest\" }, \"value\");\r\n expect(db.queryFilePropertyString({ name: \"log-mode\", namespace: \"IModelHostTest\" })).to.equal(\"value\");\r\n expect(logError.calledOnce).to.be.true;\r\n expect(logError.firstCall.args[0]).to.equal(\"core-backend.IModelDb\");\r\n expect(EditTxnError.isError(logError.firstCall.args[1], \"implicit-txn-write-disallowed\")).to.be.true;\r\n } finally {\r\n if (db.isOpen)\r\n db.close();\r\n\r\n IModelJsFs.removeSync(fileName);\r\n }\r\n });\r\n\r\n it(\"should reject implicit transaction writes when configured to enforce\", async () => {\r\n await IModelHost.startup({ ...opts, implicitWriteEnforcement: \"throw\" });\r\n const fileName = IModelTestUtils.prepareOutputFile(\"IModelHost\", \"implicitWriteEnforce.bim\");\r\n const db = StandaloneDb.createEmpty(fileName, {\r\n rootSubject: { name: \"implicitWriteEnforce\" },\r\n enableTransactions: true,\r\n });\r\n\r\n try {\r\n expect(() => {\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n db.saveFileProperty({ name: \"enforce-mode\", namespace: \"IModelHostTest\" }, \"value\");\r\n }).to.throw().that.satisfies((error: unknown) => EditTxnError.isError(error, \"implicit-txn-write-disallowed\"));\r\n\r\n const txn = new EditTxn(db, \"explicit test\");\r\n txn.start();\r\n txn.saveFileProperty({ name: \"explicit\", namespace: \"IModelHostTest\" }, \"value\");\r\n txn.end();\r\n\r\n expect(db.queryFilePropertyString({ name: \"explicit\", namespace: \"IModelHostTest\" })).to.equal(\"value\");\r\n } finally {\r\n if (db.isOpen)\r\n db.close();\r\n\r\n IModelJsFs.removeSync(fileName);\r\n }\r\n });\r\n});\r\n"]}
|
|
@@ -24,6 +24,27 @@ describe("Common table expression support in ECSQL", () => {
|
|
|
24
24
|
after(async () => {
|
|
25
25
|
imodel1.close();
|
|
26
26
|
});
|
|
27
|
+
for (const api of ["createQueryReader", "withQueryReader"]) {
|
|
28
|
+
it(`${api} preserves a zero-valued authoringId in a recursive CTE with UNION`, async () => {
|
|
29
|
+
const query = `
|
|
30
|
+
WITH RECURSIVE tree(authoringId, label, level) AS (
|
|
31
|
+
SELECT e.ECInstanceId authoringId, 'root' label, 0 level
|
|
32
|
+
FROM bis.Element e WHERE e.ECInstanceId = 1
|
|
33
|
+
UNION
|
|
34
|
+
SELECT 0 authoringId, 'child' label, level + 1
|
|
35
|
+
FROM tree WHERE level < 1
|
|
36
|
+
)
|
|
37
|
+
SELECT authoringId, label, level FROM tree ORDER BY level`;
|
|
38
|
+
const options = { rowFormat: QueryRowFormat.UseECSqlPropertyNames };
|
|
39
|
+
const rows = api === "createQueryReader"
|
|
40
|
+
? await imodel1.createQueryReader(query, undefined, options).toArray()
|
|
41
|
+
: imodel1.withQueryReader(query, (reader) => reader.toArray(), undefined, options);
|
|
42
|
+
assert.deepEqual(rows, [
|
|
43
|
+
{ authoringId: "0x1", label: "root", level: 0 },
|
|
44
|
+
{ authoringId: 0, label: "child", level: 1 },
|
|
45
|
+
]);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
27
48
|
it("collect base properties recursively", async () => {
|
|
28
49
|
const query = `
|
|
29
50
|
WITH RECURSIVE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.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\nimport { assert } from \"chai\";\r\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
|
|
1
|
+
{"version":3,"file":"CTE.test.js","sourceRoot":"","sources":["../../../../src/test/ecdb/CTE.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\nimport { assert } from \"chai\";\r\nimport { QueryBinder, QueryRowFormat } from \"@itwin/core-common\";\r\nimport { IModelDb, SnapshotDb } from \"../../core-backend\";\r\nimport { IModelTestUtils } from \"../IModelTestUtils\";\r\nimport { SequentialLogMatcher } from \"../SequentialLogMatcher\";\r\n\r\n// cspell:ignore mirukuru ibim\r\n\r\nasync function executeQuery(iModel: IModelDb, ecsql: string, bindings?: any[] | object, abbreviateBlobs?: boolean): Promise<any[]> {\r\n const rows: any[] = [];\r\n // eslint-disable-next-line @typescript-eslint/no-deprecated\r\n for await (const queryRow of iModel.createQueryReader(ecsql, QueryBinder.from(bindings), { rowFormat: QueryRowFormat.UseJsPropertyNames, abbreviateBlobs })) {\r\n rows.push(queryRow.toRow());\r\n }\r\n return rows;\r\n}\r\n\r\ndescribe(\"Common table expression support in ECSQL\", () => {\r\n let imodel1: SnapshotDb;\r\n\r\n before(async () => {\r\n imodel1 = SnapshotDb.openFile(IModelTestUtils.resolveAssetFile(\"test.bim\"));\r\n });\r\n\r\n after(async () => {\r\n imodel1.close();\r\n });\r\n\r\n for (const api of [\"createQueryReader\", \"withQueryReader\"]) {\r\n it(`${api} preserves a zero-valued authoringId in a recursive CTE with UNION`, async () => {\r\n const query = `\r\n WITH RECURSIVE tree(authoringId, label, level) AS (\r\n SELECT e.ECInstanceId authoringId, 'root' label, 0 level\r\n FROM bis.Element e WHERE e.ECInstanceId = 1\r\n UNION\r\n SELECT 0 authoringId, 'child' label, level + 1\r\n FROM tree WHERE level < 1\r\n )\r\n SELECT authoringId, label, level FROM tree ORDER BY level`;\r\n\r\n const options = { rowFormat: QueryRowFormat.UseECSqlPropertyNames };\r\n const rows = api === \"createQueryReader\"\r\n ? await imodel1.createQueryReader(query, undefined, options).toArray()\r\n : imodel1.withQueryReader(query, (reader) => reader.toArray(), undefined, options);\r\n\r\n assert.deepEqual(rows, [\r\n { authoringId: \"0x1\", label: \"root\", level: 0 },\r\n { authoringId: 0, label: \"child\", level: 1 },\r\n ]);\r\n });\r\n }\r\n\r\n it(\"collect base properties recursively\", async () => {\r\n const query = `\r\n WITH RECURSIVE\r\n base_classes (aId, aParentId, aPath, aDepth) AS (\r\n SELECT c.ECInstanceId, null, c.Name, 0 FROM meta.ECClassDef c WHERE c.Name=?\r\n UNION ALL\r\n SELECT c.ECInstanceId, cbc.TargetECInstanceId, aPath || '/' || c.Name, aDepth + 1\r\n FROM meta.ECClassDef c\r\n JOIN meta.ClassHasBaseClasses cbc ON cbc.SourceECInstanceId = c.ECInstanceId\r\n JOIN base_classes ON aId = cbc.TargetECInstanceId\r\n ORDER BY 1\r\n )\r\n SELECT p.Name prop from base_classes join meta.ECPropertyDef p on p.Class.id = aId GROUP BY p.Name` ;\r\n const rows = await executeQuery(imodel1, query, [\"Element\"]);\r\n const expected = [\"Angle\", \"BaseModel\", \"BBoxHigh\", \"BBoxLow\", \"Border\", \"BorderTemplate\", \"Category\", \"CategorySelector\", \"CodeScope\", \"CodeSpec\", \"CodeValue\", \"Data\", \"Description\", \"DisplayStyle\", \"DrawingModel\", \"Enabled\", \"Extents\", \"EyePoint\", \"FederationGuid\", \"Flags\", \"FocusDistance\", \"Format\", \"GeometryStream\", \"Height\", \"InSpatialIndex\", \"IsCameraOn\", \"IsPrivate\", \"JsonProperties\", \"LastMod\", \"LensAngle\", \"Model\", \"ModelSelector\", \"Name\", \"Origin\", \"PaletteName\", \"Parent\", \"Pitch\", \"Properties\", \"Rank\", \"Recipe\", \"RepositoryGuid\", \"Roll\", \"Rotation\", \"RotationAngle\", \"Scale\", \"SheetTemplate\", \"Type\", \"TypeDefinition\", \"Url\", \"UserLabel\", \"View\", \"ViewAttachment\", \"Width\", \"Yaw\"];\r\n const actual = rows.map((r) => r.prop);\r\n assert.sameOrderedMembers(actual, expected);\r\n });\r\n\r\n it(\"generate mandelbrot set\", async () => {\r\n const rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n [xaxis]([x]) AS(\r\n VALUES (- 2.0)\r\n UNION ALL\r\n SELECT [x] + 0.05\r\n FROM [xaxis]\r\n WHERE [x] < 1.2\r\n ),\r\n [yaxis]([y]) AS(\r\n VALUES (- 1.0)\r\n UNION ALL\r\n SELECT [y] + 0.1\r\n FROM [yaxis]\r\n WHERE [y] < 1.0\r\n ),\r\n [m]([iter], [cx], [cy], [x], [y]) AS(\r\n SELECT\r\n 0,\r\n [x],\r\n [y],\r\n 0.0,\r\n 0.0\r\n FROM [xaxis],\r\n [yaxis]\r\n UNION ALL\r\n SELECT\r\n [iter] + 1,\r\n [cx],\r\n [cy],\r\n [x] * [x] - [y] * [y] + [cx],\r\n 2.0 * [x] * [y] + [cy]\r\n FROM [m]\r\n WHERE ([x] * [x] + [y] * [y]) < 4.0 AND [iter] < 28\r\n ),\r\n [m2]([iter], [cx], [cy]) AS(\r\n SELECT\r\n MAX ([iter]),\r\n [cx],\r\n [cy]\r\n FROM [m]\r\n GROUP BY\r\n [cx],\r\n [cy]\r\n ),\r\n [a]([t]) AS(\r\n SELECT GROUP_CONCAT (SUBSTR (' .+*#', 1 + (CASE WHEN [iter] / 7 > 4 THEN 4 ELSE [iter] / 7 END), 1), '')\r\n FROM [m2]\r\n GROUP BY [cy]\r\n )\r\n SELECT GROUP_CONCAT (RTRIM ([t]), CHAR (0xa)) mandelbrot_set\r\n FROM [a];\r\n `);\r\n\r\n const expected =\r\n \" ....#\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" #############################################...\\n\" +\r\n \" ....+*################################.\\n\" +\r\n \" ...+#######++#######################.\\n\" +\r\n \" ..++..#.....*#####################+.\\n\" +\r\n \" .............+###################+.+\\n\" +\r\n \" .+.##################+.\\n\" +\r\n \" ..##+*##########+.++++\\n\" +\r\n \" .......+####.... +\\n\" +\r\n \" ..+####+.\\n\" +\r\n \" ..#*..\\n\" +\r\n \" ....#\\n\" +\r\n \" +.\";\r\n assert(rows[0].mandelbrot_set === expected);\r\n });\r\n\r\n it(\"basic cte test\", async () => {\r\n let rows = [];\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n UNION ALL\r\n SELECT x+1, 200 FROM cnt WHERE x<210\r\n )\r\n SELECT * from cnt`);\r\n assert(rows.length === 111);\r\n\r\n rows = await executeQuery(imodel1, `\r\n WITH RECURSIVE\r\n cnt (x,y) AS (\r\n SELECT 100, 200\r\n )\r\n SELECT * from cnt`);\r\n\r\n let slm = new SequentialLogMatcher();\r\n // these two are generated by sqlite\r\n slm.append().error().category(\"ECDb\").message(/BE_SQLITE_ERROR duplicate WITH table name/gm);\r\n assert(rows.length === 1);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n ),\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400, 300\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // should fail as cte_1 is used for two ct expression.\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n slm = new SequentialLogMatcher();\r\n // these two are generated by ECSQL. Its not clear why this message is logged twice.\r\n slm.append().error().category(\"ECDb\").message(/Common table 'cte_1' has 3 values for columns 2/gm);\r\n try {\r\n rows = await executeQuery(imodel1, `\r\n WITH\r\n cte_1 (a,b,c) AS (\r\n SELECT 100, 400\r\n )\r\n SELECT * from cte_1`);\r\n assert(false);\r\n } catch {\r\n assert(true); // number are to ct expression does not match select\r\n }\r\n assert.isTrue(slm.finishAndDispose());\r\n });\r\n});\r\n"]}
|