@itwin/presentation-shared 0.1.0

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.
Files changed (124) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE.md +9 -0
  3. package/README.md +434 -0
  4. package/lib/cjs/presentation-shared.d.ts +13 -0
  5. package/lib/cjs/presentation-shared.d.ts.map +1 -0
  6. package/lib/cjs/presentation-shared.js +58 -0
  7. package/lib/cjs/presentation-shared.js.map +1 -0
  8. package/lib/cjs/shared/ConcatenatedValue.d.ts +47 -0
  9. package/lib/cjs/shared/ConcatenatedValue.d.ts.map +1 -0
  10. package/lib/cjs/shared/ConcatenatedValue.js +45 -0
  11. package/lib/cjs/shared/ConcatenatedValue.js.map +1 -0
  12. package/lib/cjs/shared/ECSqlCore.d.ts +91 -0
  13. package/lib/cjs/shared/ECSqlCore.d.ts.map +1 -0
  14. package/lib/cjs/shared/ECSqlCore.js +7 -0
  15. package/lib/cjs/shared/ECSqlCore.js.map +1 -0
  16. package/lib/cjs/shared/Event.d.ts +9 -0
  17. package/lib/cjs/shared/Event.d.ts.map +1 -0
  18. package/lib/cjs/shared/Event.js +7 -0
  19. package/lib/cjs/shared/Event.js.map +1 -0
  20. package/lib/cjs/shared/Formatting.d.ts +39 -0
  21. package/lib/cjs/shared/Formatting.d.ts.map +1 -0
  22. package/lib/cjs/shared/Formatting.js +132 -0
  23. package/lib/cjs/shared/Formatting.js.map +1 -0
  24. package/lib/cjs/shared/InstanceLabelSelectClauseFactory.d.ts +129 -0
  25. package/lib/cjs/shared/InstanceLabelSelectClauseFactory.d.ts.map +1 -0
  26. package/lib/cjs/shared/InstanceLabelSelectClauseFactory.js +167 -0
  27. package/lib/cjs/shared/InstanceLabelSelectClauseFactory.js.map +1 -0
  28. package/lib/cjs/shared/InternalUtils.d.ts +3 -0
  29. package/lib/cjs/shared/InternalUtils.d.ts.map +1 -0
  30. package/lib/cjs/shared/InternalUtils.js +14 -0
  31. package/lib/cjs/shared/InternalUtils.js.map +1 -0
  32. package/lib/cjs/shared/Logging.d.ts +27 -0
  33. package/lib/cjs/shared/Logging.d.ts.map +1 -0
  34. package/lib/cjs/shared/Logging.js +20 -0
  35. package/lib/cjs/shared/Logging.js.map +1 -0
  36. package/lib/cjs/shared/MappedTypes.d.ts +11 -0
  37. package/lib/cjs/shared/MappedTypes.d.ts.map +1 -0
  38. package/lib/cjs/shared/MappedTypes.js +7 -0
  39. package/lib/cjs/shared/MappedTypes.js.map +1 -0
  40. package/lib/cjs/shared/Metadata.d.ts +268 -0
  41. package/lib/cjs/shared/Metadata.d.ts.map +1 -0
  42. package/lib/cjs/shared/Metadata.js +54 -0
  43. package/lib/cjs/shared/Metadata.js.map +1 -0
  44. package/lib/cjs/shared/Utils.d.ts +26 -0
  45. package/lib/cjs/shared/Utils.d.ts.map +1 -0
  46. package/lib/cjs/shared/Utils.js +50 -0
  47. package/lib/cjs/shared/Utils.js.map +1 -0
  48. package/lib/cjs/shared/Values.d.ts +119 -0
  49. package/lib/cjs/shared/Values.d.ts.map +1 -0
  50. package/lib/cjs/shared/Values.js +156 -0
  51. package/lib/cjs/shared/Values.js.map +1 -0
  52. package/lib/cjs/shared/ecsql-snippets/ECSqlJoinSnippets.d.ts +48 -0
  53. package/lib/cjs/shared/ecsql-snippets/ECSqlJoinSnippets.d.ts.map +1 -0
  54. package/lib/cjs/shared/ecsql-snippets/ECSqlJoinSnippets.js +139 -0
  55. package/lib/cjs/shared/ecsql-snippets/ECSqlJoinSnippets.js.map +1 -0
  56. package/lib/cjs/shared/ecsql-snippets/ECSqlValueSelectorSnippets.d.ts +116 -0
  57. package/lib/cjs/shared/ecsql-snippets/ECSqlValueSelectorSnippets.d.ts.map +1 -0
  58. package/lib/cjs/shared/ecsql-snippets/ECSqlValueSelectorSnippets.js +244 -0
  59. package/lib/cjs/shared/ecsql-snippets/ECSqlValueSelectorSnippets.js.map +1 -0
  60. package/lib/cjs/shared/ecsql-snippets/index.d.ts +3 -0
  61. package/lib/cjs/shared/ecsql-snippets/index.d.ts.map +1 -0
  62. package/lib/cjs/shared/ecsql-snippets/index.js +16 -0
  63. package/lib/cjs/shared/ecsql-snippets/index.js.map +1 -0
  64. package/lib/esm/presentation-shared.d.ts +13 -0
  65. package/lib/esm/presentation-shared.d.ts.map +1 -0
  66. package/lib/esm/presentation-shared.js +15 -0
  67. package/lib/esm/presentation-shared.js.map +1 -0
  68. package/lib/esm/shared/ConcatenatedValue.d.ts +47 -0
  69. package/lib/esm/shared/ConcatenatedValue.d.ts.map +1 -0
  70. package/lib/esm/shared/ConcatenatedValue.js +42 -0
  71. package/lib/esm/shared/ConcatenatedValue.js.map +1 -0
  72. package/lib/esm/shared/ECSqlCore.d.ts +91 -0
  73. package/lib/esm/shared/ECSqlCore.d.ts.map +1 -0
  74. package/lib/esm/shared/ECSqlCore.js +6 -0
  75. package/lib/esm/shared/ECSqlCore.js.map +1 -0
  76. package/lib/esm/shared/Event.d.ts +9 -0
  77. package/lib/esm/shared/Event.d.ts.map +1 -0
  78. package/lib/esm/shared/Event.js +6 -0
  79. package/lib/esm/shared/Event.js.map +1 -0
  80. package/lib/esm/shared/Formatting.d.ts +39 -0
  81. package/lib/esm/shared/Formatting.d.ts.map +1 -0
  82. package/lib/esm/shared/Formatting.js +127 -0
  83. package/lib/esm/shared/Formatting.js.map +1 -0
  84. package/lib/esm/shared/InstanceLabelSelectClauseFactory.d.ts +129 -0
  85. package/lib/esm/shared/InstanceLabelSelectClauseFactory.d.ts.map +1 -0
  86. package/lib/esm/shared/InstanceLabelSelectClauseFactory.js +160 -0
  87. package/lib/esm/shared/InstanceLabelSelectClauseFactory.js.map +1 -0
  88. package/lib/esm/shared/InternalUtils.d.ts +3 -0
  89. package/lib/esm/shared/InternalUtils.d.ts.map +1 -0
  90. package/lib/esm/shared/InternalUtils.js +10 -0
  91. package/lib/esm/shared/InternalUtils.js.map +1 -0
  92. package/lib/esm/shared/Logging.d.ts +27 -0
  93. package/lib/esm/shared/Logging.d.ts.map +1 -0
  94. package/lib/esm/shared/Logging.js +17 -0
  95. package/lib/esm/shared/Logging.js.map +1 -0
  96. package/lib/esm/shared/MappedTypes.d.ts +11 -0
  97. package/lib/esm/shared/MappedTypes.d.ts.map +1 -0
  98. package/lib/esm/shared/MappedTypes.js +6 -0
  99. package/lib/esm/shared/MappedTypes.js.map +1 -0
  100. package/lib/esm/shared/Metadata.d.ts +268 -0
  101. package/lib/esm/shared/Metadata.d.ts.map +1 -0
  102. package/lib/esm/shared/Metadata.js +49 -0
  103. package/lib/esm/shared/Metadata.js.map +1 -0
  104. package/lib/esm/shared/Utils.d.ts +26 -0
  105. package/lib/esm/shared/Utils.d.ts.map +1 -0
  106. package/lib/esm/shared/Utils.js +44 -0
  107. package/lib/esm/shared/Utils.js.map +1 -0
  108. package/lib/esm/shared/Values.d.ts +119 -0
  109. package/lib/esm/shared/Values.d.ts.map +1 -0
  110. package/lib/esm/shared/Values.js +153 -0
  111. package/lib/esm/shared/Values.js.map +1 -0
  112. package/lib/esm/shared/ecsql-snippets/ECSqlJoinSnippets.d.ts +48 -0
  113. package/lib/esm/shared/ecsql-snippets/ECSqlJoinSnippets.d.ts.map +1 -0
  114. package/lib/esm/shared/ecsql-snippets/ECSqlJoinSnippets.js +135 -0
  115. package/lib/esm/shared/ecsql-snippets/ECSqlJoinSnippets.js.map +1 -0
  116. package/lib/esm/shared/ecsql-snippets/ECSqlValueSelectorSnippets.d.ts +116 -0
  117. package/lib/esm/shared/ecsql-snippets/ECSqlValueSelectorSnippets.d.ts.map +1 -0
  118. package/lib/esm/shared/ecsql-snippets/ECSqlValueSelectorSnippets.js +236 -0
  119. package/lib/esm/shared/ecsql-snippets/ECSqlValueSelectorSnippets.js.map +1 -0
  120. package/lib/esm/shared/ecsql-snippets/index.d.ts +3 -0
  121. package/lib/esm/shared/ecsql-snippets/index.d.ts.map +1 -0
  122. package/lib/esm/shared/ecsql-snippets/index.js +7 -0
  123. package/lib/esm/shared/ecsql-snippets/index.js.map +1 -0
  124. package/package.json +59 -0
@@ -0,0 +1,91 @@
1
+ import { Id64String } from "@itwin/core-bentley";
2
+ /**
3
+ * Defines an ECSql binding consisting of a value and its type. Necessary to differentiate between numeric
4
+ * types and `Id64String` vs `string`.
5
+ *
6
+ * @beta
7
+ */
8
+ export type ECSqlBinding = {
9
+ type: "boolean";
10
+ value?: boolean;
11
+ } | {
12
+ type: "double" | "int" | "long";
13
+ value?: number;
14
+ } | {
15
+ type: "id";
16
+ value?: Id64String;
17
+ } | {
18
+ type: "idset";
19
+ value?: Id64String[];
20
+ } | {
21
+ type: "string";
22
+ value?: string;
23
+ } | {
24
+ type: "point2d";
25
+ value?: {
26
+ x: number;
27
+ y: number;
28
+ };
29
+ } | {
30
+ type: "point3d";
31
+ value?: {
32
+ x: number;
33
+ y: number;
34
+ z: number;
35
+ };
36
+ };
37
+ /**
38
+ * Defines an ECSQL query and its bindings.
39
+ * @beta
40
+ */
41
+ export interface ECSqlQueryDef {
42
+ /** A list of CTEs used in the query. */
43
+ ctes?: string[];
44
+ /**
45
+ * The ECSQL query to execute.
46
+ * @note In case the query uses CTEs, they should be specified in the `ctes` rather than included in the `ecsql`.
47
+ */
48
+ ecsql: string;
49
+ /**
50
+ * Values to bind to the query.
51
+ * @see https://www.itwinjs.org/learning/ecsql/#ecsql-parameters
52
+ */
53
+ bindings?: ECSqlBinding[];
54
+ }
55
+ /**
56
+ * Defines requested ECSQL result row format.
57
+ * @see [QueryRowFormat](https://www.itwinjs.org/reference/core-common/imodels/queryrowformat/)
58
+ */
59
+ type ECSqlQueryRowFormat = "ECSqlPropertyNames" | "Indexes";
60
+ /**
61
+ * Defines options for ECSQL query reader.
62
+ * @see [QueryOptions](https://www.itwinjs.org/reference/core-common/imodels/queryoptions/)
63
+ * @beta
64
+ */
65
+ export interface ECSqlQueryReaderOptions {
66
+ rowFormat?: ECSqlQueryRowFormat;
67
+ }
68
+ /**
69
+ * Represents a single row of an ECSQL query result.
70
+ * @see [QueryRowProxy](https://www.itwinjs.org/reference/core-common/imodels/queryrowproxy/)
71
+ * @beta
72
+ */
73
+ export interface ECSqlQueryRow {
74
+ [propertyName: string]: any;
75
+ [propertyIndex: number]: any;
76
+ }
77
+ /**
78
+ * Represents ECSQL query results reader.
79
+ * @see [ECSqlReader](https://www.itwinjs.org/reference/core-common/imodels/ecsqlreader/)
80
+ */
81
+ type ECSqlQueryReader = AsyncIterableIterator<ECSqlQueryRow>;
82
+ /**
83
+ * An interface for something that knows how to create an ECSQL query reader.
84
+ * @see `createECSqlQueryExecutor` in `@itwin/presentation-core-interop`.
85
+ * @beta
86
+ */
87
+ export interface ECSqlQueryExecutor {
88
+ createQueryReader(query: ECSqlQueryDef, config?: ECSqlQueryReaderOptions): ECSqlQueryReader;
89
+ }
90
+ export {};
91
+ //# sourceMappingURL=ECSqlCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSqlCore.d.ts","sourceRoot":"","sources":["../../../src/shared/ECSqlCore.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACD;IACE,IAAI,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACD;IACE,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,CAAC,EAAE,UAAU,CAAC;CACpB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C,CAAC;AAEN;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,wCAAwC;IACxC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED;;;GAGG;AACH,KAAK,mBAAmB,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAE5D;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,mBAAmB,CAAC;CACjC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,CAAC,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,CAAC,aAAa,EAAE,MAAM,GAAG,GAAG,CAAC;CAC9B;AAED;;;GAGG;AACH,KAAK,gBAAgB,GAAG,qBAAqB,CAAC,aAAa,CAAC,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,uBAAuB,GAAG,gBAAgB,CAAC;CAC7F"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=ECSqlCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ECSqlCore.js","sourceRoot":"","sources":["../../../src/shared/ECSqlCore.ts"],"names":[],"mappings":";AAAA;;;gGAGgG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * An interface that allows subscribing and unsubscribing listeners that are called upon an event.
3
+ * @beta
4
+ */
5
+ export interface Event<TListener extends (...args: any[]) => void = () => void> {
6
+ addListener(listener: TListener): () => void;
7
+ removeListener(listener: TListener): void;
8
+ }
9
+ //# sourceMappingURL=Event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Event.d.ts","sourceRoot":"","sources":["../../../src/shared/Event.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,MAAM,WAAW,KAAK,CAAC,SAAS,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI;IAC5E,WAAW,CAAC,QAAQ,EAAE,SAAS,GAAG,MAAM,IAAI,CAAC;IAC7C,cAAc,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3C"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=Event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Event.js","sourceRoot":"","sources":["../../../src/shared/Event.ts"],"names":[],"mappings":";AAAA;;;gGAGgG"}
@@ -0,0 +1,39 @@
1
+ import { ConcatenatedValue } from "./ConcatenatedValue";
2
+ import { ECSchemaProvider } from "./Metadata";
3
+ import { TypedPrimitiveValue } from "./Values";
4
+ /**
5
+ * A type definition for a function that knows how to create a display string for a typed primitive value.
6
+ * @see `createDefaultValueFormatter`
7
+ * @beta
8
+ */
9
+ export type IPrimitiveValueFormatter = (value: TypedPrimitiveValue) => Promise<string>;
10
+ /**
11
+ * Formats a concatenated value into a string, taking into account different types of `ConcatenatedValuePart` that
12
+ * the value consists of.
13
+ *
14
+ * @throws Error if a `ConcatenatedValuePart` in given `ConcatenatedValue` references a non-primitive, `IGeometry` or `Binary` property.
15
+ * @beta
16
+ */
17
+ export declare function formatConcatenatedValue(props: {
18
+ value: ConcatenatedValue | string;
19
+ schemaProvider: ECSchemaProvider;
20
+ valueFormatter: IPrimitiveValueFormatter;
21
+ }): Promise<string>;
22
+ /**
23
+ * A values' formatter that knows how to format the following types:
24
+ * - `Boolean` values are formatted to either "true" or "false".
25
+ * - `Integer` and `Long` values are rounded to the closest integer.
26
+ * - `Double` values are rounded to 2 decimal places.
27
+ * - `DateTime` values accept 2 formats in addition to `Date`:
28
+ * - if the value is numeric, assume it's a julian day format,
29
+ * - if the value is string, assume it's an ISO 8601 format.
30
+ * If extended type is set to `ShortDate`, the date is formatted as locale date string. Otherwise, it's
31
+ * formatted as locale date + time string.
32
+ * - `Point2d` values are formatted in `(x, y)` format.
33
+ * - `Point3d` values are formatted in `(x, y, z)` format.
34
+ * - `String` and `Id` values are turned as-is.
35
+ *
36
+ * @beta
37
+ */
38
+ export declare function createDefaultValueFormatter(): IPrimitiveValueFormatter;
39
+ //# sourceMappingURL=Formatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Formatting.d.ts","sourceRoot":"","sources":["../../../src/shared/Formatting.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,qBAAqB,CAAC;AAE/E,OAAO,EAAE,gBAAgB,EAAY,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAAG,CAAC,KAAK,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEvF;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAClC,cAAc,EAAE,gBAAgB,CAAC;IACjC,cAAc,EAAE,wBAAwB,CAAC;CAC1C,GAAG,OAAO,CAAC,MAAM,CAAC,CA0ClB;AAOD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,IAAI,wBAAwB,CAatE"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createDefaultValueFormatter = exports.formatConcatenatedValue = void 0;
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const ConcatenatedValue_1 = require("./ConcatenatedValue");
10
+ const InternalUtils_1 = require("./InternalUtils");
11
+ const Metadata_1 = require("./Metadata");
12
+ /**
13
+ * Formats a concatenated value into a string, taking into account different types of `ConcatenatedValuePart` that
14
+ * the value consists of.
15
+ *
16
+ * @throws Error if a `ConcatenatedValuePart` in given `ConcatenatedValue` references a non-primitive, `IGeometry` or `Binary` property.
17
+ * @beta
18
+ */
19
+ async function formatConcatenatedValue(props) {
20
+ const { value, schemaProvider, valueFormatter } = props;
21
+ if (typeof value === "string") {
22
+ return valueFormatter({ value, type: "String" });
23
+ }
24
+ return ConcatenatedValue_1.ConcatenatedValue.serialize({
25
+ parts: value,
26
+ partFormatter: async (part) => {
27
+ // strings are converted to typed strings
28
+ if (ConcatenatedValue_1.ConcatenatedValuePart.isString(part)) {
29
+ part = {
30
+ value: part,
31
+ type: "String",
32
+ };
33
+ }
34
+ // for property parts - find property metadata and create `TypedPrimitiveValue` for them.
35
+ if (ConcatenatedValue_1.ConcatenatedValuePart.isProperty(part)) {
36
+ const property = await getProperty(part, schemaProvider);
37
+ if (!property?.isPrimitive()) {
38
+ throw new Error(`Concatenated values formatter expects a primitive property, but it's not.`);
39
+ }
40
+ if (property.primitiveType === "IGeometry") {
41
+ throw new Error(`Concatenated values formatter does not support "IGeometry" values, but the provided ${part.className}.${part.propertyName} property is.`);
42
+ }
43
+ if (property.primitiveType === "Binary") {
44
+ throw new Error(`Concatenated values formatter does not support "Binary" values, but the provided ${part.className}.${part.propertyName} property is.`);
45
+ }
46
+ part = {
47
+ type: property.primitiveType,
48
+ extendedType: property.extendedTypeName,
49
+ koqName: (await property.kindOfQuantity)?.fullName,
50
+ value: part.value,
51
+ };
52
+ }
53
+ // finally, use provided value formatter to create a string from `TypedPrimitiveValue`
54
+ return valueFormatter(part);
55
+ },
56
+ });
57
+ }
58
+ exports.formatConcatenatedValue = formatConcatenatedValue;
59
+ async function getProperty({ className, propertyName }, schemaProvider) {
60
+ const propertyClass = await (0, Metadata_1.getClass)(schemaProvider, className);
61
+ return propertyClass.getProperty(propertyName);
62
+ }
63
+ /**
64
+ * A values' formatter that knows how to format the following types:
65
+ * - `Boolean` values are formatted to either "true" or "false".
66
+ * - `Integer` and `Long` values are rounded to the closest integer.
67
+ * - `Double` values are rounded to 2 decimal places.
68
+ * - `DateTime` values accept 2 formats in addition to `Date`:
69
+ * - if the value is numeric, assume it's a julian day format,
70
+ * - if the value is string, assume it's an ISO 8601 format.
71
+ * If extended type is set to `ShortDate`, the date is formatted as locale date string. Otherwise, it's
72
+ * formatted as locale date + time string.
73
+ * - `Point2d` values are formatted in `(x, y)` format.
74
+ * - `Point3d` values are formatted in `(x, y, z)` format.
75
+ * - `String` and `Id` values are turned as-is.
76
+ *
77
+ * @beta
78
+ */
79
+ function createDefaultValueFormatter() {
80
+ const formatters = [applyBooleanFormatting, applyNumericFormatting, applyDatesFormatting, applyPointsFormatting];
81
+ return async function (value) {
82
+ for (const formatter of formatters) {
83
+ const result = formatter(value);
84
+ if (!!result) {
85
+ return result;
86
+ }
87
+ }
88
+ (0, core_bentley_1.assert)(typeof value.value === "undefined" || typeof value.value === "boolean" || typeof value.value === "number" || typeof value.value === "string");
89
+ return value.value.toString();
90
+ };
91
+ }
92
+ exports.createDefaultValueFormatter = createDefaultValueFormatter;
93
+ function applyBooleanFormatting(value) {
94
+ if (value.type === "Boolean") {
95
+ return Boolean(value.value).toString();
96
+ }
97
+ return undefined;
98
+ }
99
+ function applyNumericFormatting(value) {
100
+ if (value.type === "Integer" || value.type === "Long") {
101
+ return Math.round(value.value).toLocaleString();
102
+ }
103
+ if (value.type === "Double") {
104
+ return value.value.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
105
+ }
106
+ return undefined;
107
+ }
108
+ function applyDatesFormatting(value) {
109
+ function getDate(julianOrDate) {
110
+ return typeof julianOrDate === "number" ? (0, InternalUtils_1.julianToDateTime)(julianOrDate) : typeof julianOrDate === "string" ? new Date(julianOrDate) : julianOrDate;
111
+ }
112
+ if (value.type !== "DateTime") {
113
+ return undefined;
114
+ }
115
+ if (value.extendedType === "ShortDate") {
116
+ return getDate(value.value).toLocaleDateString();
117
+ }
118
+ return getDate(value.value).toLocaleString();
119
+ }
120
+ function applyPointsFormatting(value) {
121
+ function formatComponent(n) {
122
+ return applyNumericFormatting({ type: "Double", value: n });
123
+ }
124
+ if (value.type === "Point3d") {
125
+ return `(${formatComponent(value.value.x)}, ${formatComponent(value.value.y)}, ${formatComponent(value.value.z)})`;
126
+ }
127
+ if (value.type === "Point2d") {
128
+ return `(${formatComponent(value.value.x)}, ${formatComponent(value.value.y)})`;
129
+ }
130
+ return undefined;
131
+ }
132
+ //# sourceMappingURL=Formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Formatting.js","sourceRoot":"","sources":["../../../src/shared/Formatting.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAEhG,sDAA6C;AAC7C,2DAA+E;AAC/E,mDAAmD;AACnD,yCAAwD;AAUxD;;;;;;GAMG;AACI,KAAK,UAAU,uBAAuB,CAAC,KAI7C;IACC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,cAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,qCAAiB,CAAC,SAAS,CAAC;QACjC,KAAK,EAAE,KAAK;QACZ,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC5B,yCAAyC;YACzC,IAAI,yCAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzC,IAAI,GAAG;oBACL,KAAK,EAAE,IAAI;oBACX,IAAI,EAAE,QAAQ;iBACf,CAAC;YACJ,CAAC;YACD,yFAAyF;YACzF,IAAI,yCAAqB,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;gBACzD,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;gBAC/F,CAAC;gBACD,IAAI,QAAQ,CAAC,aAAa,KAAK,WAAW,EAAE,CAAC;oBAC3C,MAAM,IAAI,KAAK,CACb,uFAAuF,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,eAAe,CAC1I,CAAC;gBACJ,CAAC;gBACD,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CACb,oFAAoF,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,eAAe,CACvI,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG;oBACL,IAAI,EAAE,QAAQ,CAAC,aAAa;oBAC5B,YAAY,EAAE,QAAQ,CAAC,gBAAgB;oBACvC,OAAO,EAAE,CAAC,MAAM,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ;oBAClD,KAAK,EAAE,IAAI,CAAC,KAAK;iBACK,CAAC;YAC3B,CAAC;YACD,sFAAsF;YACtF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AA9CD,0DA8CC;AAED,KAAK,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,YAAY,EAA+C,EAAE,cAAgC;IACnI,MAAM,aAAa,GAAG,MAAM,IAAA,mBAAQ,EAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAChE,OAAO,aAAa,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;AACjD,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,2BAA2B;IACzC,MAAM,UAAU,GAAG,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,qBAAqB,CAAC,CAAC;IACjH,OAAO,KAAK,WAAW,KAA0B;QAC/C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;gBACb,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,IAAA,qBAAM,EAAC,OAAO,KAAK,CAAC,KAAK,KAAK,WAAW,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC;QACrJ,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC;AAbD,kEAaC;AAED,SAAS,sBAAsB,CAAC,KAA0B;IACxD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA0B;IACxD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,qBAAqB,EAAE,CAAC,EAAE,qBAAqB,EAAE,CAAC,EAAE,CAAC,CAAC;IACvG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAA0B;IACtD,SAAS,OAAO,CAAC,YAAoC;QACnD,OAAO,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,gCAAgB,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACtJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;QACvC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACnD,CAAC;IACD,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,qBAAqB,CAAC,KAA0B;IACvD,SAAS,eAAe,CAAC,CAAS;QAChC,OAAO,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAE,CAAC;IAC/D,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IACrH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAClF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,129 @@
1
+ import { ConcatenatedValue } from "./ConcatenatedValue";
2
+ import { TypedValueSelectClauseProps } from "./ecsql-snippets/ECSqlValueSelectorSnippets";
3
+ import { ECClassHierarchyInspector } from "./Metadata";
4
+ /**
5
+ * Props for `IInstanceLabelSelectClauseFactory.createSelectClause`.
6
+ */
7
+ interface CreateInstanceLabelSelectClauseProps {
8
+ /**
9
+ * Alias of an ECSQL class referring to the target instance whose label should be selected.
10
+ *
11
+ * Example:
12
+ * ```ts
13
+ * const selectClause = `
14
+ * SELECT ${await factory.createSelectClause({ classAlias: "x" })}
15
+ * FROM bis.GeometricElement3d AS x
16
+ * `;
17
+ * ```
18
+ */
19
+ classAlias: string;
20
+ /**
21
+ * An optional full name of the class whose instance label is to be selected.
22
+ *
23
+ * The attribute's purpose is purely for optimization and `IInstanceLabelSelectClauseFactory` should not
24
+ * rely on this to be set to a leaf class or set at all. However, when this name is provided, some factory
25
+ * implementations may be able to create a more efficient select clause (e.g. drop some pieces of clause
26
+ * that don't apply for given class).
27
+ */
28
+ className?: string;
29
+ /**
30
+ * An optional function for concatenating multiple `TypedValueSelectClauseProps`. Selectors' concatenation
31
+ * is used when a label consists of multiple pieces, e.g.:
32
+ * - `[` - string,
33
+ * - `this.PropertyX` - property value selector,
34
+ * - `]` - string.
35
+ *
36
+ * It's concatenator's job to serialize those pieces into a single selector and, depending on the use case,
37
+ * it may do that in multiple ways. For example:
38
+ *
39
+ * - `createConcatenatedValueJsonSelector` serializes parts into a JSON array selector. This allows the array to
40
+ * be parsed after the query is run, where each part can be handled individually without losing its metadata.
41
+ * This is the default value.
42
+ *
43
+ * - `createConcatenatedValueStringSelector` concatenates parts into a string using SQLite's `||` operator. While
44
+ * this way of concatenation looses metadata (thus disabling formatting of the values), it tries to produce the
45
+ * value to be as close as possible to the formatted one. This concatenator may be used to create a label for using
46
+ * in the query `WHERE` clause.
47
+ *
48
+ * @see `createConcatenatedValueJsonSelector`
49
+ * @see `createConcatenatedValueStringSelector`
50
+ */
51
+ selectorsConcatenator?: (selectors: TypedValueSelectClauseProps[], checkSelector?: string) => string;
52
+ }
53
+ /**
54
+ * An interface for a factory that knows how create instance label select clauses.
55
+ * @see `createDefaultInstanceLabelSelectClauseFactory`
56
+ * @see `createClassBasedInstanceLabelSelectClauseFactory`
57
+ * @see `createBisInstanceLabelSelectClauseFactory`
58
+ * @beta
59
+ */
60
+ export interface IInstanceLabelSelectClauseFactory {
61
+ /** Creates a select clause for an instance label. */
62
+ createSelectClause(props: CreateInstanceLabelSelectClauseProps): Promise<string>;
63
+ }
64
+ /**
65
+ * Parses an instance label from query result into a string or a `ConcatenatedValue`. The latter type of result
66
+ * is expected when label selector is created using `IInstanceLabelSelectClauseFactory.createSelectClause` with
67
+ * `createConcatenatedValueJsonSelector`.
68
+ *
69
+ * @beta
70
+ */
71
+ export declare function parseInstanceLabel(value: string | undefined): ConcatenatedValue | string;
72
+ /**
73
+ * Creates a label select clause in a format `Class label [base36(briefcase id)-base36(local id)]`, where
74
+ * local and briefcase IDs are calculated based on ECInstance ID:
75
+ * - `{briefcase id} = ECInstanceId >> 40`
76
+ * - `{local id} = ECInstanceId & (1 << 40 - 1)`
77
+ *
78
+ * @see https://www.itwinjs.org/presentation/advanced/defaultbisrules/#label-overrides
79
+ * @beta
80
+ */
81
+ export declare function createDefaultInstanceLabelSelectClauseFactory(): IInstanceLabelSelectClauseFactory;
82
+ /**
83
+ * An association of a class and an instance label select clause factory method.
84
+ */
85
+ interface ClassBasedLabelSelectClause {
86
+ /** Full class name */
87
+ className: string;
88
+ /** A factory method to create an instance label select clause */
89
+ clause: (props: CreateInstanceLabelSelectClauseProps) => Promise<string>;
90
+ }
91
+ /**
92
+ * Props for `createClassBasedInstanceLabelSelectClauseFactory`.
93
+ */
94
+ interface ClassBasedInstanceLabelSelectClauseFactoryProps {
95
+ /** Access to ECClass hierarchy in the iModel. */
96
+ classHierarchyInspector: ECClassHierarchyInspector;
97
+ /**
98
+ * A prioritized list of instance label selectors associated to classes they should be applied to.
99
+ *
100
+ * Because the list may contain clauses for classes in the same class hierarchy, and the factory
101
+ * handles them in given order, the order of clauses should be from the most specific class to the
102
+ * most general one.
103
+ */
104
+ clauses: ClassBasedLabelSelectClause[];
105
+ /**
106
+ * A fallback label clause factory for when class-based factory doesn't produce a label.
107
+ * Defaults to the result of `createDefaultInstanceLabelSelectClauseFactory`.
108
+ */
109
+ defaultClauseFactory?: IInstanceLabelSelectClauseFactory;
110
+ }
111
+ /**
112
+ * Creates an instance label select clause based on its class.
113
+ * @beta
114
+ */
115
+ export declare function createClassBasedInstanceLabelSelectClauseFactory(props: ClassBasedInstanceLabelSelectClauseFactoryProps): IInstanceLabelSelectClauseFactory;
116
+ /**
117
+ * Props for `createBisInstanceLabelSelectClauseFactory`.
118
+ */
119
+ interface BisInstanceLabelSelectClauseFactoryProps {
120
+ classHierarchyInspector: ECClassHierarchyInspector;
121
+ }
122
+ /**
123
+ * Creates a label select clause according to BIS instance label rules.
124
+ * @see https://www.itwinjs.org/presentation/advanced/defaultbisrules/#label-overrides
125
+ * @beta
126
+ */
127
+ export declare function createBisInstanceLabelSelectClauseFactory(props: BisInstanceLabelSelectClauseFactoryProps): IInstanceLabelSelectClauseFactory;
128
+ export {};
129
+ //# sourceMappingURL=InstanceLabelSelectClauseFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstanceLabelSelectClauseFactory.d.ts","sourceRoot":"","sources":["../../../src/shared/InstanceLabelSelectClauseFactory.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAuE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC/J,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,UAAU,oCAAoC;IAC5C;;;;;;;;;;OAUG;IACH,UAAU,EAAE,MAAM,CAAC;IAEnB;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,qBAAqB,CAAC,EAAE,CAAC,SAAS,EAAE,2BAA2B,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;CACtG;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iCAAiC;IAChD,qDAAqD;IACrD,kBAAkB,CAAC,KAAK,EAAE,oCAAoC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAClF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,GAAG,MAAM,CAaxF;AAED;;;;;;;;GAQG;AACH,wBAAgB,6CAA6C,IAAI,iCAAiC,CAmBjG;AAED;;GAEG;AACH,UAAU,2BAA2B;IACnC,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,MAAM,EAAE,CAAC,KAAK,EAAE,oCAAoC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1E;AAED;;GAEG;AACH,UAAU,+CAA+C;IACvD,iDAAiD;IACjD,uBAAuB,EAAE,yBAAyB,CAAC;IAEnD;;;;;;OAMG;IACH,OAAO,EAAE,2BAA2B,EAAE,CAAC;IAEvC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,iCAAiC,CAAC;CAC1D;AAED;;;GAGG;AACH,wBAAgB,gDAAgD,CAAC,KAAK,EAAE,+CAA+C,GAAG,iCAAiC,CA0D1J;AAED;;GAEG;AACH,UAAU,wCAAwC;IAChD,uBAAuB,EAAE,yBAAyB,CAAC;CACpD;AAED;;;;GAIG;AACH,wBAAgB,yCAAyC,CAAC,KAAK,EAAE,wCAAwC,GAAG,iCAAiC,CAuC5I"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createBisInstanceLabelSelectClauseFactory = exports.createClassBasedInstanceLabelSelectClauseFactory = exports.createDefaultInstanceLabelSelectClauseFactory = exports.parseInstanceLabel = void 0;
8
+ const ECSqlValueSelectorSnippets_1 = require("./ecsql-snippets/ECSqlValueSelectorSnippets");
9
+ /**
10
+ * Parses an instance label from query result into a string or a `ConcatenatedValue`. The latter type of result
11
+ * is expected when label selector is created using `IInstanceLabelSelectClauseFactory.createSelectClause` with
12
+ * `createConcatenatedValueJsonSelector`.
13
+ *
14
+ * @beta
15
+ */
16
+ function parseInstanceLabel(value) {
17
+ if (!value) {
18
+ return "";
19
+ }
20
+ if ((value.startsWith("[") && value.endsWith("]")) || (value.startsWith("{") && value.endsWith("}"))) {
21
+ try {
22
+ return JSON.parse(value);
23
+ }
24
+ catch {
25
+ // fall through
26
+ }
27
+ }
28
+ // not a JSON object/array
29
+ return value;
30
+ }
31
+ exports.parseInstanceLabel = parseInstanceLabel;
32
+ /**
33
+ * Creates a label select clause in a format `Class label [base36(briefcase id)-base36(local id)]`, where
34
+ * local and briefcase IDs are calculated based on ECInstance ID:
35
+ * - `{briefcase id} = ECInstanceId >> 40`
36
+ * - `{local id} = ECInstanceId & (1 << 40 - 1)`
37
+ *
38
+ * @see https://www.itwinjs.org/presentation/advanced/defaultbisrules/#label-overrides
39
+ * @beta
40
+ */
41
+ function createDefaultInstanceLabelSelectClauseFactory() {
42
+ return {
43
+ async createSelectClause(props) {
44
+ return `(
45
+ SELECT
46
+ ${concatenate(props, [
47
+ {
48
+ selector: `COALESCE(
49
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)("c", "DisplayLabel")},
50
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)("c", "Name")}
51
+ )`,
52
+ },
53
+ ...createECInstanceIdSuffixSelectors(props.classAlias),
54
+ ])}
55
+ FROM [meta].[ECClassDef] AS [c]
56
+ WHERE [c].[ECInstanceId] = ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(props.classAlias, "ECClassId")}
57
+ )`;
58
+ },
59
+ };
60
+ }
61
+ exports.createDefaultInstanceLabelSelectClauseFactory = createDefaultInstanceLabelSelectClauseFactory;
62
+ /**
63
+ * Creates an instance label select clause based on its class.
64
+ * @beta
65
+ */
66
+ function createClassBasedInstanceLabelSelectClauseFactory(props) {
67
+ const { classHierarchyInspector, clauses: labelClausesByClass } = props;
68
+ const defaultClauseFactory = props.defaultClauseFactory ?? createDefaultInstanceLabelSelectClauseFactory();
69
+ async function getLabelClausesForClass(queryClassName) {
70
+ const matchingLabelClauses = await Promise.all(labelClausesByClass.map(async (entry) => {
71
+ if (await classHierarchyInspector.classDerivesFrom(entry.className, queryClassName)) {
72
+ // label selector is intended for a more specific class than we're selecting from - need to include it
73
+ // as query results (on polymorphic select) are going to include more specific class instances too
74
+ return entry;
75
+ }
76
+ if (await classHierarchyInspector.classDerivesFrom(queryClassName, entry.className)) {
77
+ // label selector is intended for a base class of what query is selecting - need to include it as
78
+ // we want base class label selectors to apply to subclass instances
79
+ return entry;
80
+ }
81
+ return undefined;
82
+ }));
83
+ function filterNotUndefined(x) {
84
+ return !!x;
85
+ }
86
+ return matchingLabelClauses.filter(filterNotUndefined);
87
+ }
88
+ return {
89
+ async createSelectClause(clauseProps) {
90
+ if (labelClausesByClass.length === 0) {
91
+ return defaultClauseFactory.createSelectClause(clauseProps);
92
+ }
93
+ const labelClausePromises = clauseProps.className ? await getLabelClausesForClass(clauseProps.className) : labelClausesByClass;
94
+ if (labelClausePromises.length === 0) {
95
+ return defaultClauseFactory.createSelectClause(clauseProps);
96
+ }
97
+ const labelClauses = await Promise.all(labelClausePromises.map(async ({ className, clause }) => ({
98
+ className,
99
+ clause: await clause(clauseProps),
100
+ })));
101
+ return `COALESCE(
102
+ ${labelClauses
103
+ .map(({ className, clause }) => `
104
+ IIF(
105
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(clauseProps.classAlias, "ECClassId")} IS (${className}),
106
+ ${clause.trim()},
107
+ NULL
108
+ )
109
+ `.trim())
110
+ .join(", ")},
111
+ ${await defaultClauseFactory.createSelectClause(clauseProps)}
112
+ )`;
113
+ },
114
+ };
115
+ }
116
+ exports.createClassBasedInstanceLabelSelectClauseFactory = createClassBasedInstanceLabelSelectClauseFactory;
117
+ /**
118
+ * Creates a label select clause according to BIS instance label rules.
119
+ * @see https://www.itwinjs.org/presentation/advanced/defaultbisrules/#label-overrides
120
+ * @beta
121
+ */
122
+ function createBisInstanceLabelSelectClauseFactory(props) {
123
+ const clauses = [];
124
+ const factory = createClassBasedInstanceLabelSelectClauseFactory({
125
+ classHierarchyInspector: props.classHierarchyInspector,
126
+ clauses,
127
+ });
128
+ clauses.push({
129
+ className: "BisCore.GeometricElement",
130
+ clause: async ({ classAlias, ...rest }) => `
131
+ COALESCE(
132
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "CodeValue")},
133
+ ${concatenate(rest, [{ selector: (0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "UserLabel") }, ...createECInstanceIdSuffixSelectors(classAlias)], `${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "UserLabel")} IS NOT NULL`)}
134
+ )
135
+ `,
136
+ }, {
137
+ className: "BisCore.Element",
138
+ clause: async ({ classAlias }) => `
139
+ COALESCE(
140
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "UserLabel")},
141
+ ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "CodeValue")}
142
+ )
143
+ `,
144
+ }, {
145
+ className: "BisCore.Model",
146
+ clause: async ({ classAlias, ...rest }) => `(
147
+ SELECT ${await factory.createSelectClause({ ...rest, classAlias: "e", className: "BisCore.Element" })}
148
+ FROM [bis].[Element] AS [e]
149
+ WHERE [e].[ECInstanceId] = ${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "ModeledElement", "Id")}
150
+ )`,
151
+ });
152
+ return factory;
153
+ }
154
+ exports.createBisInstanceLabelSelectClauseFactory = createBisInstanceLabelSelectClauseFactory;
155
+ function createECInstanceIdSuffixSelectors(classAlias) {
156
+ return [
157
+ { value: ` [`, type: "String" },
158
+ { selector: `CAST(base36(${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "ECInstanceId")} >> 40) AS TEXT)` },
159
+ { value: `-`, type: "String" },
160
+ { selector: `CAST(base36(${(0, ECSqlValueSelectorSnippets_1.createRawPropertyValueSelector)(classAlias, "ECInstanceId")} & ((1 << 40) - 1)) AS TEXT)` },
161
+ { value: `]`, type: "String" },
162
+ ];
163
+ }
164
+ function concatenate(props, selectors, checkSelector) {
165
+ return (props.selectorsConcatenator ?? ECSqlValueSelectorSnippets_1.createConcatenatedValueJsonSelector)(selectors, checkSelector);
166
+ }
167
+ //# sourceMappingURL=InstanceLabelSelectClauseFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstanceLabelSelectClauseFactory.js","sourceRoot":"","sources":["../../../src/shared/InstanceLabelSelectClauseFactory.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;;AAGhG,4FAA+J;AAmE/J;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,KAAyB;IAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACrG,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IACD,0BAA0B;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAbD,gDAaC;AAED;;;;;;;;GAQG;AACH,SAAgB,6CAA6C;IAC3D,OAAO;QACL,KAAK,CAAC,kBAAkB,CAAC,KAA2C;YAClE,OAAO;;YAED,WAAW,CAAC,KAAK,EAAE;gBACnB;oBACE,QAAQ,EAAE;kBACN,IAAA,2DAA8B,EAAC,GAAG,EAAE,cAAc,CAAC;kBACnD,IAAA,2DAA8B,EAAC,GAAG,EAAE,MAAM,CAAC;gBAC7C;iBACH;gBACD,GAAG,iCAAiC,CAAC,KAAK,CAAC,UAAU,CAAC;aACvD,CAAC;;qCAEyB,IAAA,2DAA8B,EAAC,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC;QAC1F,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAnBD,sGAmBC;AAmCD;;;GAGG;AACH,SAAgB,gDAAgD,CAAC,KAAsD;IACrH,MAAM,EAAE,uBAAuB,EAAE,OAAO,EAAE,mBAAmB,EAAE,GAAG,KAAK,CAAC;IACxE,MAAM,oBAAoB,GAAG,KAAK,CAAC,oBAAoB,IAAI,6CAA6C,EAAE,CAAC;IAC3G,KAAK,UAAU,uBAAuB,CAAC,cAAsB;QAC3D,MAAM,oBAAoB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5C,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACtC,IAAI,MAAM,uBAAuB,CAAC,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAAC;gBACpF,sGAAsG;gBACtG,kGAAkG;gBAClG,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,MAAM,uBAAuB,CAAC,gBAAgB,CAAC,cAAc,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACpF,iGAAiG;gBACjG,oEAAoE;gBACpE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CACH,CAAC;QACF,SAAS,kBAAkB,CAAI,CAAgB;YAC7C,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC;QACD,OAAO,oBAAoB,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACzD,CAAC;IACD,OAAO;QACL,KAAK,CAAC,kBAAkB,CAAC,WAAiD;YACxE,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,oBAAoB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,mBAAmB,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC;YAC/H,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,OAAO,oBAAoB,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBACxD,SAAS;gBACT,MAAM,EAAE,MAAM,MAAM,CAAC,WAAW,CAAC;aAClC,CAAC,CAAC,CACJ,CAAC;YAEF,OAAO;UACH,YAAY;iBACX,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CAC7B;;kBAEM,IAAA,2DAA8B,EAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,QAAQ,SAAS;kBACpF,MAAM,CAAC,IAAI,EAAE;;;aAGlB,CAAC,IAAI,EAAE,CACT;iBACA,IAAI,CAAC,IAAI,CAAC;UACX,MAAM,oBAAoB,CAAC,kBAAkB,CAAC,WAAW,CAAC;QAC5D,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AA1DD,4GA0DC;AASD;;;;GAIG;AACH,SAAgB,yCAAyC,CAAC,KAA+C;IACvG,MAAM,OAAO,GAAkC,EAAE,CAAC;IAClD,MAAM,OAAO,GAAG,gDAAgD,CAAC;QAC/D,uBAAuB,EAAE,KAAK,CAAC,uBAAuB;QACtD,OAAO;KACR,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CACV;QACE,SAAS,EAAE,0BAA0B;QACrC,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC;;YAErC,IAAA,2DAA8B,EAAC,UAAU,EAAE,WAAW,CAAC;YACvD,WAAW,CACX,IAAI,EACJ,CAAC,EAAE,QAAQ,EAAE,IAAA,2DAA8B,EAAC,UAAU,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,iCAAiC,CAAC,UAAU,CAAC,CAAC,EACzH,GAAG,IAAA,2DAA8B,EAAC,UAAU,EAAE,WAAW,CAAC,cAAc,CACzE;;OAEJ;KACF,EACD;QACE,SAAS,EAAE,iBAAiB;QAC5B,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;;YAE5B,IAAA,2DAA8B,EAAC,UAAU,EAAE,WAAW,CAAC;YACvD,IAAA,2DAA8B,EAAC,UAAU,EAAE,WAAW,CAAC;;OAE5D;KACF,EACD;QACE,SAAS,EAAE,eAAe;QAC1B,MAAM,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,CAAC;iBAChC,MAAM,OAAO,CAAC,kBAAkB,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;;qCAExE,IAAA,2DAA8B,EAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,CAAC;QAC/F;KACH,CACF,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAvCD,8FAuCC;AAED,SAAS,iCAAiC,CAAC,UAAkB;IAC3D,OAAO;QACL,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC/B,EAAE,QAAQ,EAAE,eAAe,IAAA,2DAA8B,EAAC,UAAU,EAAE,cAAc,CAAC,kBAAkB,EAAE;QACzG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,EAAE,QAAQ,EAAE,eAAe,IAAA,2DAA8B,EAAC,UAAU,EAAE,cAAc,CAAC,8BAA8B,EAAE;QACrH,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,KAA+G,EAC/G,SAAwC,EACxC,aAAsB;IAEtB,OAAO,CAAC,KAAK,CAAC,qBAAqB,IAAI,gEAAmC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AACxG,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** @internal */
2
+ export declare function julianToDateTime(julianDate: number): Date;
3
+ //# sourceMappingURL=InternalUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalUtils.d.ts","sourceRoot":"","sources":["../../../src/shared/InternalUtils.ts"],"names":[],"mappings":"AAKA,gBAAgB;AAChB,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAGzD"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.julianToDateTime = void 0;
8
+ /** @internal */
9
+ function julianToDateTime(julianDate) {
10
+ const millis = (julianDate - 2440587.5) * 86400000;
11
+ return new Date(millis);
12
+ }
13
+ exports.julianToDateTime = julianToDateTime;
14
+ //# sourceMappingURL=InternalUtils.js.map