@milaboratories/pl-model-common 1.24.3 → 1.24.5

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 (275) hide show
  1. package/dist/base32_encode.cjs +11 -11
  2. package/dist/base32_encode.cjs.map +1 -1
  3. package/dist/base32_encode.d.ts +1 -1
  4. package/dist/base32_encode.js +11 -11
  5. package/dist/base32_encode.js.map +1 -1
  6. package/dist/base64.cjs +2 -2
  7. package/dist/base64.cjs.map +1 -1
  8. package/dist/base64.d.ts +1 -1
  9. package/dist/base64.d.ts.map +1 -1
  10. package/dist/base64.js +2 -2
  11. package/dist/base64.js.map +1 -1
  12. package/dist/block_state.d.ts +3 -3
  13. package/dist/bmodel/block_config.cjs +1 -1
  14. package/dist/bmodel/block_config.cjs.map +1 -1
  15. package/dist/bmodel/block_config.d.ts +3 -3
  16. package/dist/bmodel/block_config.d.ts.map +1 -1
  17. package/dist/bmodel/block_config.js +1 -1
  18. package/dist/bmodel/block_config.js.map +1 -1
  19. package/dist/bmodel/code.cjs +1 -1
  20. package/dist/bmodel/code.cjs.map +1 -1
  21. package/dist/bmodel/code.d.ts +2 -2
  22. package/dist/bmodel/code.js +1 -1
  23. package/dist/bmodel/code.js.map +1 -1
  24. package/dist/bmodel/container.d.ts +5 -5
  25. package/dist/bmodel/index.d.ts +5 -5
  26. package/dist/bmodel/normalization.cjs +17 -17
  27. package/dist/bmodel/normalization.cjs.map +1 -1
  28. package/dist/bmodel/normalization.d.ts +2 -2
  29. package/dist/bmodel/normalization.d.ts.map +1 -1
  30. package/dist/bmodel/normalization.js +17 -17
  31. package/dist/bmodel/normalization.js.map +1 -1
  32. package/dist/bmodel/types.d.ts +1 -1
  33. package/dist/branding.d.ts +2 -2
  34. package/dist/common_types.d.ts +1 -1
  35. package/dist/driver_kit.d.ts +1 -1
  36. package/dist/drivers/ChunkedStreamReader.cjs +13 -12
  37. package/dist/drivers/ChunkedStreamReader.cjs.map +1 -1
  38. package/dist/drivers/ChunkedStreamReader.d.ts +2 -2
  39. package/dist/drivers/ChunkedStreamReader.d.ts.map +1 -1
  40. package/dist/drivers/ChunkedStreamReader.js +13 -12
  41. package/dist/drivers/ChunkedStreamReader.js.map +1 -1
  42. package/dist/drivers/blob.cjs +1 -1
  43. package/dist/drivers/blob.cjs.map +1 -1
  44. package/dist/drivers/blob.d.ts +4 -4
  45. package/dist/drivers/blob.d.ts.map +1 -1
  46. package/dist/drivers/blob.js +1 -1
  47. package/dist/drivers/blob.js.map +1 -1
  48. package/dist/drivers/index.d.ts +8 -8
  49. package/dist/drivers/log.cjs +1 -1
  50. package/dist/drivers/log.cjs.map +1 -1
  51. package/dist/drivers/log.js +1 -1
  52. package/dist/drivers/log.js.map +1 -1
  53. package/dist/drivers/ls.cjs +3 -3
  54. package/dist/drivers/ls.cjs.map +1 -1
  55. package/dist/drivers/ls.d.ts +6 -6
  56. package/dist/drivers/ls.d.ts.map +1 -1
  57. package/dist/drivers/ls.js +3 -3
  58. package/dist/drivers/ls.js.map +1 -1
  59. package/dist/drivers/pframe/column_filter.d.ts +1 -1
  60. package/dist/drivers/pframe/data_info.cjs +119 -110
  61. package/dist/drivers/pframe/data_info.cjs.map +1 -1
  62. package/dist/drivers/pframe/data_info.d.ts +10 -10
  63. package/dist/drivers/pframe/data_info.d.ts.map +1 -1
  64. package/dist/drivers/pframe/data_info.js +119 -110
  65. package/dist/drivers/pframe/data_info.js.map +1 -1
  66. package/dist/drivers/pframe/data_types.cjs +7 -4
  67. package/dist/drivers/pframe/data_types.cjs.map +1 -1
  68. package/dist/drivers/pframe/data_types.d.ts +2 -2
  69. package/dist/drivers/pframe/data_types.d.ts.map +1 -1
  70. package/dist/drivers/pframe/data_types.js +7 -4
  71. package/dist/drivers/pframe/data_types.js.map +1 -1
  72. package/dist/drivers/pframe/driver.d.ts +10 -10
  73. package/dist/drivers/pframe/driver.d.ts.map +1 -1
  74. package/dist/drivers/pframe/find_columns.d.ts +2 -2
  75. package/dist/drivers/pframe/index.d.ts +14 -14
  76. package/dist/drivers/pframe/linker_columns.cjs +13 -5
  77. package/dist/drivers/pframe/linker_columns.cjs.map +1 -1
  78. package/dist/drivers/pframe/linker_columns.d.ts +2 -2
  79. package/dist/drivers/pframe/linker_columns.d.ts.map +1 -1
  80. package/dist/drivers/pframe/linker_columns.js +13 -5
  81. package/dist/drivers/pframe/linker_columns.js.map +1 -1
  82. package/dist/drivers/pframe/pframe.d.ts +6 -6
  83. package/dist/drivers/pframe/pframe.d.ts.map +1 -1
  84. package/dist/drivers/pframe/query/index.d.ts +2 -2
  85. package/dist/drivers/pframe/query/query_common.d.ts +37 -37
  86. package/dist/drivers/pframe/query/query_data.d.ts +2 -2
  87. package/dist/drivers/pframe/query/query_data.d.ts.map +1 -1
  88. package/dist/drivers/pframe/query/query_spec.d.ts +3 -3
  89. package/dist/drivers/pframe/query/query_spec.d.ts.map +1 -1
  90. package/dist/drivers/pframe/spec/anchored.cjs +6 -6
  91. package/dist/drivers/pframe/spec/anchored.cjs.map +1 -1
  92. package/dist/drivers/pframe/spec/anchored.d.ts +4 -4
  93. package/dist/drivers/pframe/spec/anchored.d.ts.map +1 -1
  94. package/dist/drivers/pframe/spec/anchored.js +6 -6
  95. package/dist/drivers/pframe/spec/anchored.js.map +1 -1
  96. package/dist/drivers/pframe/spec/filtered_column.cjs +1 -1
  97. package/dist/drivers/pframe/spec/filtered_column.cjs.map +1 -1
  98. package/dist/drivers/pframe/spec/filtered_column.d.ts +1 -1
  99. package/dist/drivers/pframe/spec/filtered_column.js +1 -1
  100. package/dist/drivers/pframe/spec/filtered_column.js.map +1 -1
  101. package/dist/drivers/pframe/spec/ids.cjs.map +1 -1
  102. package/dist/drivers/pframe/spec/ids.d.ts +5 -5
  103. package/dist/drivers/pframe/spec/ids.js.map +1 -1
  104. package/dist/drivers/pframe/spec/index.d.ts +6 -6
  105. package/dist/drivers/pframe/spec/native_id.cjs.map +1 -1
  106. package/dist/drivers/pframe/spec/native_id.d.ts +3 -3
  107. package/dist/drivers/pframe/spec/native_id.d.ts.map +1 -1
  108. package/dist/drivers/pframe/spec/native_id.js.map +1 -1
  109. package/dist/drivers/pframe/spec/selectors.cjs +1 -1
  110. package/dist/drivers/pframe/spec/selectors.cjs.map +1 -1
  111. package/dist/drivers/pframe/spec/selectors.d.ts +4 -4
  112. package/dist/drivers/pframe/spec/selectors.d.ts.map +1 -1
  113. package/dist/drivers/pframe/spec/selectors.js +1 -1
  114. package/dist/drivers/pframe/spec/selectors.js.map +1 -1
  115. package/dist/drivers/pframe/spec/spec.cjs +64 -59
  116. package/dist/drivers/pframe/spec/spec.cjs.map +1 -1
  117. package/dist/drivers/pframe/spec/spec.d.ts +15 -15
  118. package/dist/drivers/pframe/spec/spec.d.ts.map +1 -1
  119. package/dist/drivers/pframe/spec/spec.js +64 -59
  120. package/dist/drivers/pframe/spec/spec.js.map +1 -1
  121. package/dist/drivers/pframe/table.d.ts +2 -2
  122. package/dist/drivers/pframe/table_calculate.cjs +11 -11
  123. package/dist/drivers/pframe/table_calculate.cjs.map +1 -1
  124. package/dist/drivers/pframe/table_calculate.d.ts +30 -30
  125. package/dist/drivers/pframe/table_calculate.d.ts.map +1 -1
  126. package/dist/drivers/pframe/table_calculate.js +11 -11
  127. package/dist/drivers/pframe/table_calculate.js.map +1 -1
  128. package/dist/drivers/pframe/table_common.cjs +4 -4
  129. package/dist/drivers/pframe/table_common.cjs.map +1 -1
  130. package/dist/drivers/pframe/table_common.d.ts +6 -6
  131. package/dist/drivers/pframe/table_common.js +4 -4
  132. package/dist/drivers/pframe/table_common.js.map +1 -1
  133. package/dist/drivers/pframe/type_util.d.ts.map +1 -1
  134. package/dist/drivers/pframe/unique_values.d.ts +4 -4
  135. package/dist/drivers/urls.cjs +2 -2
  136. package/dist/drivers/urls.cjs.map +1 -1
  137. package/dist/drivers/urls.d.ts +1 -1
  138. package/dist/drivers/urls.js +2 -2
  139. package/dist/drivers/urls.js.map +1 -1
  140. package/dist/errors.cjs +12 -12
  141. package/dist/errors.cjs.map +1 -1
  142. package/dist/errors.d.ts +1 -1
  143. package/dist/errors.d.ts.map +1 -1
  144. package/dist/errors.js +12 -12
  145. package/dist/errors.js.map +1 -1
  146. package/dist/flags/block_flags.cjs +2 -2
  147. package/dist/flags/block_flags.cjs.map +1 -1
  148. package/dist/flags/block_flags.d.ts.map +1 -1
  149. package/dist/flags/block_flags.js +2 -2
  150. package/dist/flags/block_flags.js.map +1 -1
  151. package/dist/flags/flag_utils.cjs +31 -29
  152. package/dist/flags/flag_utils.cjs.map +1 -1
  153. package/dist/flags/flag_utils.d.ts +33 -33
  154. package/dist/flags/flag_utils.d.ts.map +1 -1
  155. package/dist/flags/flag_utils.js +31 -29
  156. package/dist/flags/flag_utils.js.map +1 -1
  157. package/dist/flags/index.d.ts +3 -3
  158. package/dist/flags/type_utils.d.ts +1 -1
  159. package/dist/flags/type_utils.d.ts.map +1 -1
  160. package/dist/httpAuth.cjs +4 -5
  161. package/dist/httpAuth.cjs.map +1 -1
  162. package/dist/httpAuth.d.ts +1 -1
  163. package/dist/httpAuth.d.ts.map +1 -1
  164. package/dist/httpAuth.js +4 -5
  165. package/dist/httpAuth.js.map +1 -1
  166. package/dist/index.d.ts +19 -19
  167. package/dist/json.cjs +1 -1
  168. package/dist/json.cjs.map +1 -1
  169. package/dist/json.d.ts.map +1 -1
  170. package/dist/json.js +1 -1
  171. package/dist/json.js.map +1 -1
  172. package/dist/navigation.cjs +1 -1
  173. package/dist/navigation.cjs.map +1 -1
  174. package/dist/navigation.d.ts +3 -3
  175. package/dist/navigation.js +1 -1
  176. package/dist/navigation.js.map +1 -1
  177. package/dist/plid.cjs +4 -4
  178. package/dist/plid.cjs.map +1 -1
  179. package/dist/plid.d.ts +1 -1
  180. package/dist/plid.js +4 -4
  181. package/dist/plid.js.map +1 -1
  182. package/dist/pool/entry.d.ts +1 -1
  183. package/dist/pool/index.d.ts +3 -3
  184. package/dist/pool/query.cjs +23 -23
  185. package/dist/pool/query.cjs.map +1 -1
  186. package/dist/pool/query.d.ts +9 -9
  187. package/dist/pool/query.d.ts.map +1 -1
  188. package/dist/pool/query.js +23 -23
  189. package/dist/pool/query.js.map +1 -1
  190. package/dist/pool/spec.cjs +9 -9
  191. package/dist/pool/spec.cjs.map +1 -1
  192. package/dist/pool/spec.d.ts +4 -4
  193. package/dist/pool/spec.d.ts.map +1 -1
  194. package/dist/pool/spec.js +9 -9
  195. package/dist/pool/spec.js.map +1 -1
  196. package/dist/ref.cjs +20 -18
  197. package/dist/ref.cjs.map +1 -1
  198. package/dist/ref.d.ts +1 -1
  199. package/dist/ref.d.ts.map +1 -1
  200. package/dist/ref.js +20 -18
  201. package/dist/ref.js.map +1 -1
  202. package/dist/utag.d.ts +1 -1
  203. package/dist/util.cjs +1 -1
  204. package/dist/util.cjs.map +1 -1
  205. package/dist/util.js +1 -1
  206. package/dist/util.js.map +1 -1
  207. package/dist/value_or_error.cjs.map +1 -1
  208. package/dist/value_or_error.d.ts.map +1 -1
  209. package/dist/value_or_error.js.map +1 -1
  210. package/package.json +18 -17
  211. package/src/base32_encode.ts +12 -12
  212. package/src/base64.ts +12 -8
  213. package/src/block_state.ts +3 -3
  214. package/src/bmodel/block_config.ts +12 -6
  215. package/src/bmodel/code.ts +3 -3
  216. package/src/bmodel/container.ts +5 -5
  217. package/src/bmodel/index.ts +5 -5
  218. package/src/bmodel/normalization.ts +33 -25
  219. package/src/bmodel/types.ts +1 -1
  220. package/src/branding.ts +2 -2
  221. package/src/common_types.ts +1 -1
  222. package/src/driver_kit.ts +1 -1
  223. package/src/drivers/ChunkedStreamReader.ts +16 -14
  224. package/src/drivers/blob.ts +7 -11
  225. package/src/drivers/index.ts +8 -8
  226. package/src/drivers/log.ts +3 -3
  227. package/src/drivers/ls.ts +18 -18
  228. package/src/drivers/pframe/column_filter.ts +1 -1
  229. package/src/drivers/pframe/data_info.ts +146 -146
  230. package/src/drivers/pframe/data_types.ts +56 -36
  231. package/src/drivers/pframe/driver.ts +20 -36
  232. package/src/drivers/pframe/find_columns.ts +2 -2
  233. package/src/drivers/pframe/index.ts +14 -14
  234. package/src/drivers/pframe/linker_columns.test.ts +280 -273
  235. package/src/drivers/pframe/linker_columns.ts +65 -39
  236. package/src/drivers/pframe/pframe.ts +6 -9
  237. package/src/drivers/pframe/query/index.ts +2 -2
  238. package/src/drivers/pframe/query/query_common.ts +46 -46
  239. package/src/drivers/pframe/query/query_data.ts +17 -10
  240. package/src/drivers/pframe/query/query_spec.ts +18 -10
  241. package/src/drivers/pframe/spec/anchored.ts +44 -33
  242. package/src/drivers/pframe/spec/filtered_column.ts +2 -2
  243. package/src/drivers/pframe/spec/ids.ts +6 -6
  244. package/src/drivers/pframe/spec/index.ts +6 -6
  245. package/src/drivers/pframe/spec/native_id.ts +7 -9
  246. package/src/drivers/pframe/spec/selectors.test.ts +170 -146
  247. package/src/drivers/pframe/spec/selectors.ts +22 -31
  248. package/src/drivers/pframe/spec/spec.test.ts +163 -176
  249. package/src/drivers/pframe/spec/spec.ts +132 -117
  250. package/src/drivers/pframe/table.ts +2 -2
  251. package/src/drivers/pframe/table_calculate.ts +44 -50
  252. package/src/drivers/pframe/table_common.ts +10 -10
  253. package/src/drivers/pframe/type_util.ts +2 -7
  254. package/src/drivers/pframe/unique_values.ts +4 -4
  255. package/src/drivers/urls.ts +3 -3
  256. package/src/errors.test.ts +20 -20
  257. package/src/errors.ts +24 -20
  258. package/src/flags/block_flags.ts +8 -7
  259. package/src/flags/flag_utils.test.ts +94 -73
  260. package/src/flags/flag_utils.ts +73 -50
  261. package/src/flags/index.ts +3 -3
  262. package/src/flags/type_utils.ts +10 -7
  263. package/src/httpAuth.ts +5 -6
  264. package/src/index.ts +19 -19
  265. package/src/json.ts +28 -17
  266. package/src/navigation.ts +4 -4
  267. package/src/plid.ts +6 -6
  268. package/src/pool/entry.ts +1 -1
  269. package/src/pool/index.ts +3 -3
  270. package/src/pool/query.ts +52 -56
  271. package/src/pool/spec.ts +20 -17
  272. package/src/ref.ts +25 -19
  273. package/src/utag.ts +1 -1
  274. package/src/util.ts +1 -1
  275. package/src/value_or_error.ts +6 -6
@@ -1,286 +1,293 @@
1
1
  import {
2
- Annotation,
3
- AxisSpec,
4
- AxisSpecNormalized,
5
- getArrayFromAxisTree,
6
- getAxesTree,
7
- getNormalizedAxesList,
8
- getSetFromAxisTree,
9
- PColumnIdAndSpec,
10
- ValueType,
11
- } from './spec/index';
12
- import { PObjectId } from '../../pool';
13
- import { stringifyJson } from '../../json'
14
- import {
15
- describe,
16
- expect,
17
- test,
18
- } from 'vitest';
19
- import { LinkerMap } from './linker_columns';
20
-
21
- function makeTestAxis(params: {
22
- name: string;
23
- parents?: AxisSpec[];
24
- }): AxisSpec {
25
- return {
26
- type: ValueType.Int,
27
- name: params.name,
28
- annotations: {
29
- [Annotation.Label]: `${params.name} axis`,
30
- ...(params.parents && params.parents.length > 0
31
- ? { [Annotation.Parents]: stringifyJson(params.parents.map(p => p.name)) }
32
- : {}
33
- ),
34
- } satisfies Annotation,
35
- };
2
+ Annotation,
3
+ AxisSpec,
4
+ AxisSpecNormalized,
5
+ getArrayFromAxisTree,
6
+ getAxesTree,
7
+ getNormalizedAxesList,
8
+ getSetFromAxisTree,
9
+ PColumnIdAndSpec,
10
+ ValueType,
11
+ } from "./spec/index";
12
+ import { PObjectId } from "../../pool";
13
+ import { stringifyJson } from "../../json";
14
+ import { describe, expect, test } from "vitest";
15
+ import { LinkerMap } from "./linker_columns";
16
+
17
+ function makeTestAxis(params: { name: string; parents?: AxisSpec[] }): AxisSpec {
18
+ return {
19
+ type: ValueType.Int,
20
+ name: params.name,
21
+ annotations: {
22
+ [Annotation.Label]: `${params.name} axis`,
23
+ ...(params.parents && params.parents.length > 0
24
+ ? { [Annotation.Parents]: stringifyJson(params.parents.map((p) => p.name)) }
25
+ : {}),
26
+ } satisfies Annotation,
27
+ };
36
28
  }
37
29
 
38
30
  function makeLinkerColumn(params: {
39
- name: string;
40
- from: AxisSpec[];
41
- to: AxisSpec[];
31
+ name: string;
32
+ from: AxisSpec[];
33
+ to: AxisSpec[];
42
34
  }): PColumnIdAndSpec {
43
- return {
44
- columnId: params.name as PObjectId,
45
- spec: {
46
- kind: 'PColumn',
47
- valueType: ValueType.String,
48
- name: params.name,
49
- axesSpec: [...params.from, ...params.to],
50
- annotations: {
51
- [Annotation.Label]: `${params.name} column`,
52
- [Annotation.IsLinkerColumn]: stringifyJson(true),
53
- } satisfies Annotation,
54
- },
55
- };
35
+ return {
36
+ columnId: params.name as PObjectId,
37
+ spec: {
38
+ kind: "PColumn",
39
+ valueType: ValueType.String,
40
+ name: params.name,
41
+ axesSpec: [...params.from, ...params.to],
42
+ annotations: {
43
+ [Annotation.Label]: `${params.name} column`,
44
+ [Annotation.IsLinkerColumn]: stringifyJson(true),
45
+ } satisfies Annotation,
46
+ },
47
+ };
56
48
  }
57
49
 
58
50
  /** Returns all permutations of initial array */
59
51
  function allPermutations<T>(arr: T[]): T[][] {
60
- switch (arr.length) {
61
- case 0: return [];
62
- case 1: return [arr];
63
- case 2: return [arr, [arr[1], arr[0]]];
64
- default: return arr.reduce(
65
- (acc, item, i) => acc.concat(
66
- allPermutations<T>([...arr.slice(0, i), ...arr.slice(i + 1)])
67
- .map(val => [item, ...val])
68
- ),
69
- [] as T[][],
70
- );
71
- }
72
- };
73
-
74
- describe('Linker columns', () => {
75
- test('Search in linker columns map', () => {
76
- const [axis1, axis2, axis3, axis4, axis5] = getNormalizedAxesList([
77
- makeTestAxis({ name: 'id1' }),
78
- makeTestAxis({ name: 'id2' }),
79
- makeTestAxis({ name: 'id3' }),
80
- makeTestAxis({ name: 'id4' }),
81
- makeTestAxis({ name: 'id5' })
82
- ]);
83
- const linkerMap = LinkerMap.fromColumns([
84
- makeLinkerColumn({ name: 'c12', from: [axis1], to: [axis2] }),
85
- makeLinkerColumn({ name: 'c13', from: [axis1], to: [axis3] }),
86
- makeLinkerColumn({ name: 'c45', from: [axis4], to: [axis5] }),
87
- ]);
88
-
89
- let testCase = (params: {
90
- from: AxisSpecNormalized[];
91
- to: AxisSpecNormalized[];
92
- expected: string[];
93
- }) => {
94
- const linkers = linkerMap.getLinkerColumnsForAxes({
95
- from: params.from,
96
- to: params.to,
97
- throwWhenNoLinkExists: false,
98
- });
99
- expect(linkers.map(item => item.spec.name).sort()).toEqual(params.expected);
100
- }
101
-
102
- testCase({ from: [axis2], to: [axis3], expected: ['c12', 'c13'] });
103
- testCase({ from: [axis1], to: [axis2], expected: ['c12'] });
104
- testCase({ from: [axis1], to: [axis4], expected: []});
105
- });
52
+ switch (arr.length) {
53
+ case 0:
54
+ return [];
55
+ case 1:
56
+ return [arr];
57
+ case 2:
58
+ return [arr, [arr[1], arr[0]]];
59
+ default:
60
+ return arr.reduce(
61
+ (acc, item, i) =>
62
+ acc.concat(
63
+ allPermutations<T>([...arr.slice(0, i), ...arr.slice(i + 1)]).map((val) => [
64
+ item,
65
+ ...val,
66
+ ]),
67
+ ),
68
+ [] as T[][],
69
+ );
70
+ }
71
+ }
72
+
73
+ describe("Linker columns", () => {
74
+ test("Search in linker columns map", () => {
75
+ const [axis1, axis2, axis3, axis4, axis5] = getNormalizedAxesList([
76
+ makeTestAxis({ name: "id1" }),
77
+ makeTestAxis({ name: "id2" }),
78
+ makeTestAxis({ name: "id3" }),
79
+ makeTestAxis({ name: "id4" }),
80
+ makeTestAxis({ name: "id5" }),
81
+ ]);
82
+ const linkerMap = LinkerMap.fromColumns([
83
+ makeLinkerColumn({ name: "c12", from: [axis1], to: [axis2] }),
84
+ makeLinkerColumn({ name: "c13", from: [axis1], to: [axis3] }),
85
+ makeLinkerColumn({ name: "c45", from: [axis4], to: [axis5] }),
86
+ ]);
87
+
88
+ let testCase = (params: {
89
+ from: AxisSpecNormalized[];
90
+ to: AxisSpecNormalized[];
91
+ expected: string[];
92
+ }) => {
93
+ const linkers = linkerMap.getLinkerColumnsForAxes({
94
+ from: params.from,
95
+ to: params.to,
96
+ throwWhenNoLinkExists: false,
97
+ });
98
+ expect(linkers.map((item) => item.spec.name).sort()).toEqual(params.expected);
99
+ };
100
+
101
+ testCase({ from: [axis2], to: [axis3], expected: ["c12", "c13"] });
102
+ testCase({ from: [axis1], to: [axis2], expected: ["c12"] });
103
+ testCase({ from: [axis1], to: [axis4], expected: [] });
104
+ });
105
+
106
+ test("Search in linker columns map with parents", () => {
107
+ const axisC = makeTestAxis({ name: "c" });
108
+ const axisB = makeTestAxis({ name: "b" });
109
+ const axisA = makeTestAxis({ name: "a", parents: [axisB] });
110
+
111
+ const linkerMap = LinkerMap.fromColumns([
112
+ makeLinkerColumn({ name: "abc", from: [axisA, axisB], to: [axisC] }),
113
+ ]);
114
+
115
+ let testCase = (params: {
116
+ from: AxisSpecNormalized[];
117
+ to: AxisSpecNormalized[];
118
+ expected: string[];
119
+ }) => {
120
+ const linkers = linkerMap.getLinkerColumnsForAxes({
121
+ from: params.from,
122
+ to: params.to,
123
+ throwWhenNoLinkExists: false,
124
+ });
125
+ expect(linkers.map((item) => item.spec.name).sort()).toEqual(params.expected);
126
+ };
106
127
 
107
- test('Search in linker columns map with parents', () => {
108
- const axisC = makeTestAxis({ name: 'c' });
109
- const axisB = makeTestAxis({ name: 'b' });
110
- const axisA = makeTestAxis({ name: 'a', parents: [axisB]});
111
-
112
- const linkerMap = LinkerMap.fromColumns([
113
- makeLinkerColumn({ name: 'abc', from: [axisA, axisB], to: [axisC] })
114
- ]);
115
-
116
- let testCase = (params: {
117
- from: AxisSpecNormalized[];
118
- to: AxisSpecNormalized[];
119
- expected: string[];
120
- }) => {
121
- const linkers = linkerMap.getLinkerColumnsForAxes({
122
- from: params.from,
123
- to: params.to,
124
- throwWhenNoLinkExists: false,
125
- });
126
- expect(linkers.map(item => item.spec.name).sort()).toEqual(params.expected);
127
- }
128
-
129
- testCase({ from: getNormalizedAxesList([axisA, axisB]), to: getNormalizedAxesList([axisC]), expected: ['abc'] });
130
- })
131
-
132
- test('Axis tree - without parents', () => {
133
- const [axisA, axisB] = getNormalizedAxesList([
134
- makeTestAxis({ name: 'a' }),
135
- makeTestAxis({ name: 'b' })
136
- ]);
137
- const tree = getAxesTree(axisA);
138
- expect(getSetFromAxisTree(tree).size).toBe(1);
139
- expect(getArrayFromAxisTree(tree).length).toBe(1);
140
-
141
- expect(LinkerMap.getAxesGroups([axisA, axisB]).length).toBe(2);
142
- })
143
-
144
- test('Axis tree - with parents', () => {
145
- const axisD = makeTestAxis({ name: 'd' });
146
- const axisC = makeTestAxis({ name: 'c', parents: [axisD] });
147
- const axisB = makeTestAxis({ name: 'b', parents: [axisC] });
148
- const axisA = makeTestAxis({ name: 'a', parents: [axisB] });
149
- const [axisDn, axisCn, axisBn, axisAn] = getNormalizedAxesList([axisD, axisC, axisB, axisA])
150
-
151
- const tree = getAxesTree(axisAn);
152
- expect(getSetFromAxisTree(tree).size).toBe(4);
153
- expect(getArrayFromAxisTree(tree).length).toBe(4);
154
-
155
- for (const group of allPermutations([axisAn, axisBn, axisCn, axisDn])) {
156
- expect(LinkerMap.getAxesGroups(group).length).toBe(1);
157
- }
158
-
159
- const axisD2 = makeTestAxis({ name: 'd' });
160
- const axisC2 = makeTestAxis({ name: 'c', parents: [axisD2] });
161
- const axisB2 = makeTestAxis({ name: 'b' });
162
- const axisA2 = makeTestAxis({ name: 'a', parents: [axisB2] });
163
- const normalized2 = getNormalizedAxesList([axisD2, axisC2, axisB2, axisA2])
164
-
165
- for (const group of allPermutations(normalized2)) {
166
- expect(LinkerMap.getAxesGroups(group).length).toBe(2);
167
- }
168
-
169
- const axisD3 = makeTestAxis({ name: 'd' });
170
- const axisC3 = makeTestAxis({ name: 'c' });
171
- const axisB3 = makeTestAxis({ name: 'b' });
172
- const axisA3 = makeTestAxis({ name: 'a', parents: [axisB3] });
173
- const normalized3 = getNormalizedAxesList([axisD3, axisC3, axisB3, axisA3])
174
-
175
- for (const group of allPermutations(normalized3)) {
176
- expect(LinkerMap.getAxesGroups(group).length).toBe(3);
177
- }
178
-
179
- const axisD4 = makeTestAxis({ name: 'd' });
180
- const axisC4 = makeTestAxis({ name: 'c' });
181
- const axisB4 = makeTestAxis({ name: 'b' });
182
- const axisA4 = makeTestAxis({ name: 'a' });
183
- const normalized4 = getNormalizedAxesList([axisD4, axisC4, axisB4, axisA4])
184
-
185
- for (const group of allPermutations(normalized4)) {
186
- expect(LinkerMap.getAxesGroups(group).length).toBe(4);
187
- }
188
- })
189
-
190
- test('Generate partial trees', () => {
191
- // Axes graph of parents (A, E - roots, C, B, D - parents) in some column:
192
- // A - C
193
- // \_ B _ D
194
- // E/
195
- //
196
- // If the column is not a linker: trees to search linkers should be:
197
- // 1 C
198
- // 2 D
199
- // 3 B - D
200
- // 4 A - C
201
- // \_ B - D
202
- // 5 E - B - D
203
-
204
- // If the axes are in a linker: trees must be in the linkers map:
205
-
206
- // 1 A - C
207
- // \_ B _ D
208
- // 2 E - B - D
209
-
210
- const axisD = makeTestAxis({ name: 'd' });
211
- const axisC = makeTestAxis({ name: 'c' });
212
- const axisB = makeTestAxis({ name: 'b', parents: [axisD] });
213
- const axisA = makeTestAxis({ name: 'a', parents: [axisB, axisC] });
214
- const axisE = makeTestAxis({ name: 'e', parents: [axisB, axisC] });
215
- const axisF = makeTestAxis({ name: 'f' });
216
- const axisH = makeTestAxis({ name: 'h' });
217
-
218
- const group1 = [axisA, axisB, axisC, axisD, axisE];
219
- const group2 = [axisF];
220
- const group3 = [axisH];
221
- const group1Normalized = getNormalizedAxesList(group1);
222
- const group2Normalized = getNormalizedAxesList(group2);
223
- const [axisAn, axisBn, axisCn, axisDn, axisEn] = group1Normalized;
224
-
225
- const linker1 = makeLinkerColumn({ name: 'linker1', from: group1, to: group2 });
226
- const linker2 = makeLinkerColumn({ name: 'linker2', from: group2, to: group3 });
227
-
228
- const roots = LinkerMap.getAxesRoots(group1Normalized);
229
-
230
- expect(roots).toEqual([axisAn, axisEn]);
231
-
232
- const groups = LinkerMap.getAxesGroups([...group1Normalized, ...group2Normalized]);
233
- expect(groups.length).toBe(2);
234
- expect(groups[0]).toEqual(group1Normalized);
235
- expect(groups[1]).toEqual(group2Normalized);
236
-
237
- const linkersMap = LinkerMap.fromColumns([linker1, linker2]);
238
-
239
- expect(
240
- new Set(linkersMap.getReachableByLinkersAxesFromAxesNormalized(group2Normalized).map(a => a.name))
241
- ).toEqual(
242
- new Set(([...group1, ...group3]).map(a => a.name))
243
- );
244
- expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisDn])).toEqual([]);
245
- expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisBn])).toEqual([]);
128
+ testCase({
129
+ from: getNormalizedAxesList([axisA, axisB]),
130
+ to: getNormalizedAxesList([axisC]),
131
+ expected: ["abc"],
246
132
  });
133
+ });
134
+
135
+ test("Axis tree - without parents", () => {
136
+ const [axisA, axisB] = getNormalizedAxesList([
137
+ makeTestAxis({ name: "a" }),
138
+ makeTestAxis({ name: "b" }),
139
+ ]);
140
+ const tree = getAxesTree(axisA);
141
+ expect(getSetFromAxisTree(tree).size).toBe(1);
142
+ expect(getArrayFromAxisTree(tree).length).toBe(1);
143
+
144
+ expect(LinkerMap.getAxesGroups([axisA, axisB]).length).toBe(2);
145
+ });
146
+
147
+ test("Axis tree - with parents", () => {
148
+ const axisD = makeTestAxis({ name: "d" });
149
+ const axisC = makeTestAxis({ name: "c", parents: [axisD] });
150
+ const axisB = makeTestAxis({ name: "b", parents: [axisC] });
151
+ const axisA = makeTestAxis({ name: "a", parents: [axisB] });
152
+ const [axisDn, axisCn, axisBn, axisAn] = getNormalizedAxesList([axisD, axisC, axisB, axisA]);
153
+
154
+ const tree = getAxesTree(axisAn);
155
+ expect(getSetFromAxisTree(tree).size).toBe(4);
156
+ expect(getArrayFromAxisTree(tree).length).toBe(4);
157
+
158
+ for (const group of allPermutations([axisAn, axisBn, axisCn, axisDn])) {
159
+ expect(LinkerMap.getAxesGroups(group).length).toBe(1);
160
+ }
161
+
162
+ const axisD2 = makeTestAxis({ name: "d" });
163
+ const axisC2 = makeTestAxis({ name: "c", parents: [axisD2] });
164
+ const axisB2 = makeTestAxis({ name: "b" });
165
+ const axisA2 = makeTestAxis({ name: "a", parents: [axisB2] });
166
+ const normalized2 = getNormalizedAxesList([axisD2, axisC2, axisB2, axisA2]);
167
+
168
+ for (const group of allPermutations(normalized2)) {
169
+ expect(LinkerMap.getAxesGroups(group).length).toBe(2);
170
+ }
171
+
172
+ const axisD3 = makeTestAxis({ name: "d" });
173
+ const axisC3 = makeTestAxis({ name: "c" });
174
+ const axisB3 = makeTestAxis({ name: "b" });
175
+ const axisA3 = makeTestAxis({ name: "a", parents: [axisB3] });
176
+ const normalized3 = getNormalizedAxesList([axisD3, axisC3, axisB3, axisA3]);
247
177
 
248
- test('Order of parents should not matter', () => {
249
- const axisA = makeTestAxis({ name: 'a' });
250
- const axisB = makeTestAxis({ name: 'b' });
251
- const axisC1 = makeTestAxis({ name: 'c', parents: [axisA, axisB] });
252
- const axisC2 = makeTestAxis({ name: 'c', parents: [axisB, axisA] });
253
- const axisD = makeTestAxis({ name: 'd' });
254
-
255
- const [a, b, c1, c2, d] = getNormalizedAxesList([axisA, axisB, axisC1, axisC2, axisD]);
256
- const linkerMap = LinkerMap.fromColumns([
257
- makeLinkerColumn({ name: 'linker1', from: [axisA, axisB, axisC1], to: [axisD] })
258
- ]);
259
-
260
- expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c2])).not.toHaveLength(0);
261
- expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c1])).not.toHaveLength(0);
262
- })
263
-
264
- test('Non-linkable axes', () => {
265
- const axisA = makeTestAxis({ name: 'a' });
266
- const axisB = makeTestAxis({ name: 'b' });
267
- const axisC = makeTestAxis({ name: 'c', parents: [axisA, axisB] });
268
- const axisD = makeTestAxis({ name: 'd' });
269
- const axisE = makeTestAxis({ name: 'e' });
270
-
271
- const axesList = getNormalizedAxesList([axisA, axisB, axisC, axisD, axisE]);
272
- const linkerMap = LinkerMap.fromColumns([
273
- makeLinkerColumn({ name: 'linker1', from: [axisA, axisB, axisC], to: [axisD] })
274
- ]);
275
-
276
- expect(linkerMap.getNonLinkableAxes(
277
- getNormalizedAxesList([axisA, axisB, axisC, axisD]),
278
- getNormalizedAxesList([axisA, axisB, axisC, axisE])
279
- ).map(v => v.name)).toEqual(['a', 'b', 'e']);
280
-
281
- expect(linkerMap.getNonLinkableAxes(
282
- [],
283
- getNormalizedAxesList([axisA, axisB, axisC, axisE])
284
- ).map(v => v.name)).toEqual(['a', 'b', 'c', 'e']);
285
- })
178
+ for (const group of allPermutations(normalized3)) {
179
+ expect(LinkerMap.getAxesGroups(group).length).toBe(3);
180
+ }
181
+
182
+ const axisD4 = makeTestAxis({ name: "d" });
183
+ const axisC4 = makeTestAxis({ name: "c" });
184
+ const axisB4 = makeTestAxis({ name: "b" });
185
+ const axisA4 = makeTestAxis({ name: "a" });
186
+ const normalized4 = getNormalizedAxesList([axisD4, axisC4, axisB4, axisA4]);
187
+
188
+ for (const group of allPermutations(normalized4)) {
189
+ expect(LinkerMap.getAxesGroups(group).length).toBe(4);
190
+ }
191
+ });
192
+
193
+ test("Generate partial trees", () => {
194
+ // Axes graph of parents (A, E - roots, C, B, D - parents) in some column:
195
+ // A - C
196
+ // \_ B _ D
197
+ // E/
198
+ //
199
+ // If the column is not a linker: trees to search linkers should be:
200
+ // 1 C
201
+ // 2 D
202
+ // 3 B - D
203
+ // 4 A - C
204
+ // \_ B - D
205
+ // 5 E - B - D
206
+
207
+ // If the axes are in a linker: trees must be in the linkers map:
208
+
209
+ // 1 A - C
210
+ // \_ B _ D
211
+ // 2 E - B - D
212
+
213
+ const axisD = makeTestAxis({ name: "d" });
214
+ const axisC = makeTestAxis({ name: "c" });
215
+ const axisB = makeTestAxis({ name: "b", parents: [axisD] });
216
+ const axisA = makeTestAxis({ name: "a", parents: [axisB, axisC] });
217
+ const axisE = makeTestAxis({ name: "e", parents: [axisB, axisC] });
218
+ const axisF = makeTestAxis({ name: "f" });
219
+ const axisH = makeTestAxis({ name: "h" });
220
+
221
+ const group1 = [axisA, axisB, axisC, axisD, axisE];
222
+ const group2 = [axisF];
223
+ const group3 = [axisH];
224
+ const group1Normalized = getNormalizedAxesList(group1);
225
+ const group2Normalized = getNormalizedAxesList(group2);
226
+ const [axisAn, axisBn, , axisDn, axisEn] = group1Normalized;
227
+
228
+ const linker1 = makeLinkerColumn({ name: "linker1", from: group1, to: group2 });
229
+ const linker2 = makeLinkerColumn({ name: "linker2", from: group2, to: group3 });
230
+
231
+ const roots = LinkerMap.getAxesRoots(group1Normalized);
232
+
233
+ expect(roots).toEqual([axisAn, axisEn]);
234
+
235
+ const groups = LinkerMap.getAxesGroups([...group1Normalized, ...group2Normalized]);
236
+ expect(groups.length).toBe(2);
237
+ expect(groups[0]).toEqual(group1Normalized);
238
+ expect(groups[1]).toEqual(group2Normalized);
239
+
240
+ const linkersMap = LinkerMap.fromColumns([linker1, linker2]);
241
+
242
+ expect(
243
+ new Set(
244
+ linkersMap.getReachableByLinkersAxesFromAxesNormalized(group2Normalized).map((a) => a.name),
245
+ ),
246
+ ).toEqual(new Set([...group1, ...group3].map((a) => a.name)));
247
+ expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisDn])).toEqual([]);
248
+ expect(linkersMap.getReachableByLinkersAxesFromAxesNormalized([axisBn])).toEqual([]);
249
+ });
250
+
251
+ test("Order of parents should not matter", () => {
252
+ const axisA = makeTestAxis({ name: "a" });
253
+ const axisB = makeTestAxis({ name: "b" });
254
+ const axisC1 = makeTestAxis({ name: "c", parents: [axisA, axisB] });
255
+ const axisC2 = makeTestAxis({ name: "c", parents: [axisB, axisA] });
256
+ const axisD = makeTestAxis({ name: "d" });
257
+
258
+ const [, , c1, c2] = getNormalizedAxesList([axisA, axisB, axisC1, axisC2, axisD]);
259
+ const linkerMap = LinkerMap.fromColumns([
260
+ makeLinkerColumn({ name: "linker1", from: [axisA, axisB, axisC1], to: [axisD] }),
261
+ ]);
262
+
263
+ expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c2])).not.toHaveLength(0);
264
+ expect(linkerMap.getReachableByLinkersAxesFromAxesNormalized([c1])).not.toHaveLength(0);
265
+ });
266
+
267
+ test("Non-linkable axes", () => {
268
+ const axisA = makeTestAxis({ name: "a" });
269
+ const axisB = makeTestAxis({ name: "b" });
270
+ const axisC = makeTestAxis({ name: "c", parents: [axisA, axisB] });
271
+ const axisD = makeTestAxis({ name: "d" });
272
+ const axisE = makeTestAxis({ name: "e" });
273
+
274
+ const linkerMap = LinkerMap.fromColumns([
275
+ makeLinkerColumn({ name: "linker1", from: [axisA, axisB, axisC], to: [axisD] }),
276
+ ]);
277
+
278
+ expect(
279
+ linkerMap
280
+ .getNonLinkableAxes(
281
+ getNormalizedAxesList([axisA, axisB, axisC, axisD]),
282
+ getNormalizedAxesList([axisA, axisB, axisC, axisE]),
283
+ )
284
+ .map((v) => v.name),
285
+ ).toEqual(["a", "b", "e"]);
286
+
287
+ expect(
288
+ linkerMap
289
+ .getNonLinkableAxes([], getNormalizedAxesList([axisA, axisB, axisC, axisE]))
290
+ .map((v) => v.name),
291
+ ).toEqual(["a", "b", "c", "e"]);
292
+ });
286
293
  });