@milaboratories/pl-middle-layer 1.27.1 → 1.27.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/pool/data.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAS,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAY3E,wBAAiB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAgB3E;AAWD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAC7B,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EACjC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GACxB,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAiB7B;AAED,eAAO,MAAM,0BAA0B,kDAAmD,CAAC;AAC3F,eAAO,MAAM,+BAA+B,kDAG3C,CAAC;AACF,eAAO,MAAM,4BAA4B,kDAAqD,CAAC;AAC/F,eAAO,MAAM,iCAAiC,kDAG7C,CAAC;AACF,eAAO,MAAM,eAAe,kDAAwC,CAAC;AAErE,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wCAAwC,GAAG;IACrD,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,GACvB,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CA4IvC;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,aAAa,GAClB,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAcvC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAEpF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAEzF"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../src/pool/data.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAS,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAYhF,wBAAiB,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAgB3E;AAYD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAC7B,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EACjC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,GACxB,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,CAiB7B;AAED,eAAO,MAAM,0BAA0B,kDAAmD,CAAC;AAC3F,eAAO,MAAM,+BAA+B,kDAG3C,CAAC;AACF,eAAO,MAAM,4BAA4B,kDAAqD,CAAC;AAC/F,eAAO,MAAM,iCAAiC,kDAG7C,CAAC;AACF,eAAO,MAAM,eAAe,kDAAwC,CAAC;AAErE,MAAM,MAAM,4BAA4B,GAAG;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,aAAa,CAAC,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IAChD,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,wCAAwC,GAAG;IACrD,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,GACvB,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAkJvC;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,WAAW,EACjB,IAAI,EAAE,aAAa,GAClB,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAcvC;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,CAK5F;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAEpF;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,CAEzF"}
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,4BAA4B,CAAC;AACzF,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,IAAI,eAAe,EAC/B,OAAO,EACP,SAAS,EAET,SAAS,EAIT,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AA6L3D,qBAAa,YAAa,YAAW,eAAe;IAQhD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyD;IACjF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwE;IAChG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;gBAG9C,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,QAAQ;IAoE5B,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,kBAAkB,GAAG,aAAa,CAAC,EAClD,GAAG,EAAE,aAAa,GACjB,YAAY;IAaR,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,kBAAkB,GAAG,aAAa,CAAC,CAAC,EAC3D,GAAG,EAAE,aAAa,GACjB,YAAY;IAmBF,WAAW,CACtB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IA6BlB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAM9E,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAM9D,kBAAkB,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC5C,OAAO,CAAC,0BAA0B,CAAC;IAiCzB,eAAe,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IAkBnB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAKpD,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK1D,OAAO,CAClB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;CAM3B"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../../src/pool/driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,yBAAyB,CAAC;AAEhF,OAAO,KAAK,EAAE,aAAa,EAA2B,MAAM,4BAA4B,CAAC;AACzF,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,kBAAkB,EAClB,mBAAmB,EAEnB,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,IAAI,eAAe,EAC/B,OAAO,EACP,SAAS,EAET,SAAS,EAIT,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAoM3D,qBAAa,YAAa,YAAW,eAAe;IAQhD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyD;IACjF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwE;IAChG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA+B;IAChE,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8B;gBAG9C,UAAU,EAAE,cAAc,EAC1B,MAAM,EAAE,QAAQ;IAoE5B,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,kBAAkB,GAAG,aAAa,CAAC,EAClD,GAAG,EAAE,aAAa,GACjB,YAAY;IAaR,YAAY,CACjB,GAAG,EAAE,SAAS,CAAC,OAAO,CAAC,kBAAkB,GAAG,aAAa,CAAC,CAAC,EAC3D,GAAG,EAAE,aAAa,GACjB,YAAY;IAmBF,WAAW,CACtB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IA6BlB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;IAM9E,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAM9D,kBAAkB,CAC7B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAC5C,OAAO,CAAC,0BAA0B,CAAC;IAiCzB,eAAe,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,oBAAoB,CAAC;IAkBnB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAKpD,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAK1D,OAAO,CAClB,MAAM,EAAE,YAAY,EACpB,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,CAAC,EAAE,UAAU,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC;CAM3B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milaboratories/pl-middle-layer",
3
- "version": "1.27.1",
3
+ "version": "1.27.2",
4
4
  "description": "Pl Middle Layer",
5
5
  "types": "./dist/index.d.ts",
6
6
  "main": "./dist/index.js",
@@ -30,18 +30,18 @@
30
30
  "yaml": "^2.6.1",
31
31
  "zod": "~3.23.8",
32
32
  "@milaboratories/pl-http": "^1.0.3",
33
- "@milaboratories/resolve-helper": "^1.0.2",
34
33
  "@platforma-sdk/block-tools": "^2.5.7",
35
- "@milaboratories/pl-client": "^2.7.3",
34
+ "@milaboratories/resolve-helper": "^1.0.2",
36
35
  "@milaboratories/computable": "^2.3.4",
36
+ "@milaboratories/pl-client": "^2.7.3",
37
+ "@milaboratories/pl-model-common": "^1.10.4",
37
38
  "@milaboratories/pl-drivers": "^1.5.12",
38
39
  "@milaboratories/pl-model-middle-layer": "^1.7.1",
39
- "@milaboratories/pl-model-common": "^1.10.4",
40
- "@milaboratories/pl-tree": "^1.4.22",
41
40
  "@milaboratories/pl-model-backend": "^1.0.1",
41
+ "@milaboratories/pl-tree": "^1.4.22",
42
+ "@milaboratories/pl-deployments": "^1.1.0",
42
43
  "@platforma-sdk/model": "^1.22.2",
43
44
  "@milaboratories/ts-helpers": "^1.1.3",
44
- "@milaboratories/pl-deployments": "^1.1.0",
45
45
  "@milaboratories/pl-config": "^1.4.0",
46
46
  "@platforma-sdk/workflow-tengo": "2.9.9"
47
47
  },
@@ -55,8 +55,8 @@
55
55
  "jest": "^29.7.0",
56
56
  "@jest/globals": "^29.7.0",
57
57
  "ts-jest": "^29.2.5",
58
- "@milaboratories/eslint-config": "^1.0.1",
59
- "@milaboratories/platforma-build-configs": "1.0.2"
58
+ "@milaboratories/platforma-build-configs": "1.0.2",
59
+ "@milaboratories/eslint-config": "^1.0.1"
60
60
  },
61
61
  "scripts": {
62
62
  "type-check": "tsc --noEmit --composite false",
package/src/pool/data.ts CHANGED
@@ -1,16 +1,16 @@
1
- import { PColumnSpec, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';
2
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
- import { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';
1
+ import type { PColumnSpec, PColumnValues, PlRef, PObjectId, PObjectSpec } from '@platforma-sdk/model';
2
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
+ import type { PlTreeNodeAccessor, ResourceInfo } from '@milaboratories/pl-tree';
4
4
  import { assertNever } from '@milaboratories/ts-helpers';
5
5
  import canonicalize from 'canonicalize';
6
6
  import {
7
7
  isNullResourceId,
8
8
  resourceType,
9
9
  resourceTypeToString,
10
- resourceTypesEqual
10
+ resourceTypesEqual,
11
11
  } from '@milaboratories/pl-client';
12
- import { Writable } from 'utility-types';
13
- import { createHash } from 'crypto';
12
+ import type { Writable } from 'utility-types';
13
+ import { createHash } from 'node:crypto';
14
14
 
15
15
  export function* allBlobs<B>(data: PFrameInternal.DataInfo<B>): Generator<B> {
16
16
  switch (data.type) {
@@ -32,16 +32,17 @@ export function* allBlobs<B>(data: PFrameInternal.DataInfo<B>): Generator<B> {
32
32
 
33
33
  function mapValues<T extends object, TResult>(
34
34
  obj: T,
35
- callback: (v: T[keyof T], key: keyof T) => TResult
36
- ): { [P in keyof T]: TResult } {
35
+ callback: (v: T[keyof T], key: keyof T) => TResult,
36
+ ): { [K in keyof T]: TResult } {
37
37
  return Object.fromEntries(
38
- Object.entries(obj).map(([key, value]) => [key, callback(value, key as any)])
39
- ) as any;
38
+ (Object.entries(obj) as { [K in keyof T]: [K, T[K]]; }[keyof T][])
39
+ .map(([key, value]) => [key, callback(value, key)]),
40
+ ) as { [K in keyof T]: TResult };
40
41
  }
41
42
 
42
43
  export function mapBlobs<B1, B2>(
43
44
  data: PFrameInternal.DataInfo<B1>,
44
- mapping: (blob: B1) => B2
45
+ mapping: (blob: B1) => B2,
45
46
  ): PFrameInternal.DataInfo<B2> {
46
47
  switch (data.type) {
47
48
  case 'Json':
@@ -53,8 +54,8 @@ export function mapBlobs<B1, B2>(
53
54
  ...data,
54
55
  parts: mapValues(data.parts, (v) => ({
55
56
  index: mapping(v.index),
56
- values: mapping(v.values)
57
- }))
57
+ values: mapping(v.values),
58
+ })),
58
59
  };
59
60
  default:
60
61
  assertNever(data);
@@ -64,12 +65,12 @@ export function mapBlobs<B1, B2>(
64
65
  export const PColumnDataJsonPartitioned = resourceType('PColumnData/JsonPartitioned', '1');
65
66
  export const PColumnDataJsonSuperPartitioned = resourceType(
66
67
  'PColumnData/Partitioned/JsonPartitioned',
67
- '1'
68
+ '1',
68
69
  );
69
70
  export const PColumnDataBinaryPartitioned = resourceType('PColumnData/BinaryPartitioned', '1');
70
71
  export const PColumnDataBinarySuperPartitioned = resourceType(
71
72
  'PColumnData/Partitioned/BinaryPartitioned',
72
- '1'
73
+ '1',
73
74
  );
74
75
  export const PColumnDataJson = resourceType('PColumnData/Json', '1');
75
76
 
@@ -88,7 +89,7 @@ export type PColumnDataSuperPartitionedResourceValue = {
88
89
  };
89
90
 
90
91
  export function parseDataInfoResource(
91
- data: PlTreeNodeAccessor
92
+ data: PlTreeNodeAccessor,
92
93
  ): PFrameInternal.DataInfo<ResourceInfo> {
93
94
  if (!data.getIsReadyOrError()) throw new Error('Data not ready.');
94
95
 
@@ -102,7 +103,7 @@ export function parseDataInfoResource(
102
103
  return {
103
104
  type: 'Json',
104
105
  keyLength: dataContent.keyLength,
105
- data: dataContent.data
106
+ data: dataContent.data,
106
107
  };
107
108
  } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonPartitioned)) {
108
109
  const meta = resourceData as PColumnDataPartitionedResourceValue;
@@ -110,13 +111,13 @@ export function parseDataInfoResource(
110
111
  const parts = Object.fromEntries(
111
112
  data
112
113
  .listInputFields()
113
- .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo])
114
+ .map((field) => [field, data.traverse({ field, errorIfFieldNotSet: true }).resourceInfo]),
114
115
  );
115
116
 
116
117
  return {
117
118
  type: 'JsonPartitioned',
118
119
  partitionKeyLength: meta.partitionKeyLength,
119
- parts
120
+ parts,
120
121
  };
121
122
  } else if (resourceTypesEqual(data.resourceType, PColumnDataJsonSuperPartitioned)) {
122
123
  const meta = resourceData as PColumnDataSuperPartitionedResourceValue;
@@ -128,7 +129,9 @@ export function parseDataInfoResource(
128
129
  if (keys === undefined) throw new Error(`no partition keys for super key ${superKey}`);
129
130
 
130
131
  for (const key of keys) {
131
- const partKey = JSON.stringify([...JSON.parse(superKey), ...JSON.parse(key)]);
132
+ const partKey = JSON.stringify([
133
+ ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],
134
+ ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);
132
135
  parts[partKey] = superPart.traverse({ field: key, errorIfFieldNotSet: true }).resourceInfo;
133
136
  }
134
137
  }
@@ -136,7 +139,7 @@ export function parseDataInfoResource(
136
139
  return {
137
140
  type: 'JsonPartitioned',
138
141
  partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,
139
- parts
142
+ parts,
140
143
  };
141
144
  } else if (resourceTypesEqual(data.resourceType, PColumnDataBinaryPartitioned)) {
142
145
  const meta = resourceData as PColumnDataPartitionedResourceValue;
@@ -176,7 +179,7 @@ export function parseDataInfoResource(
176
179
  return {
177
180
  type: 'BinaryPartitioned',
178
181
  partitionKeyLength: meta.partitionKeyLength,
179
- parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>
182
+ parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,
180
183
  };
181
184
  } else if (resourceTypesEqual(data.resourceType, PColumnDataBinarySuperPartitioned)) {
182
185
  const meta = resourceData as PColumnDataSuperPartitionedResourceValue;
@@ -194,7 +197,9 @@ export function parseDataInfoResource(
194
197
  if (field.endsWith('.index')) {
195
198
  const key = field.slice(0, field.length - 6);
196
199
 
197
- const partKey = JSON.stringify([...JSON.parse(superKey), ...JSON.parse(key)]);
200
+ const partKey = JSON.stringify([
201
+ ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],
202
+ ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);
198
203
  let part = parts[partKey];
199
204
  if (part === undefined) {
200
205
  part = {};
@@ -202,12 +207,14 @@ export function parseDataInfoResource(
202
207
  }
203
208
  parts[partKey].index = superData.traverse({
204
209
  field,
205
- errorIfFieldNotSet: true
210
+ errorIfFieldNotSet: true,
206
211
  }).resourceInfo;
207
212
  } else if (field.endsWith('.values')) {
208
213
  const key = field.slice(0, field.length - 7);
209
214
 
210
- const partKey = JSON.stringify([...JSON.parse(superKey), ...JSON.parse(key)]);
215
+ const partKey = JSON.stringify([
216
+ ...JSON.parse(superKey) as PFrameInternal.JsonDataValue[],
217
+ ...JSON.parse(key) as PFrameInternal.JsonDataValue[]]);
211
218
  let part = parts[partKey];
212
219
  if (part === undefined) {
213
220
  part = {};
@@ -215,7 +222,7 @@ export function parseDataInfoResource(
215
222
  }
216
223
  parts[partKey].values = superData.traverse({
217
224
  field,
218
- errorIfFieldNotSet: true
225
+ errorIfFieldNotSet: true,
219
226
  }).resourceInfo;
220
227
  } else throw new Error(`unrecognized part field name: ${field}`);
221
228
  }
@@ -224,7 +231,7 @@ export function parseDataInfoResource(
224
231
  return {
225
232
  type: 'BinaryPartitioned',
226
233
  partitionKeyLength: meta.superPartitionKeyLength + meta.partitionKeyLength,
227
- parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>
234
+ parts: parts as Record<string, PFrameInternal.BinaryChunkInfo<ResourceInfo>>,
228
235
  };
229
236
  }
230
237
 
@@ -233,7 +240,7 @@ export function parseDataInfoResource(
233
240
 
234
241
  export function makeDataInfoResource(
235
242
  spec: PColumnSpec,
236
- data: PColumnValues
243
+ data: PColumnValues,
237
244
  ): PFrameInternal.DataInfo<ResourceInfo> {
238
245
  const keyLength = spec.axesSpec.length;
239
246
  const jsonData: Record<string, PFrameInternal.JsonDataValue> = {};
@@ -242,11 +249,11 @@ export function makeDataInfoResource(
242
249
  throw new Error(`inline column key length ${key.length} differs from axes count ${keyLength}`);
243
250
  jsonData[JSON.stringify(key)] = val;
244
251
  }
245
-
252
+
246
253
  return {
247
254
  type: 'Json',
248
255
  keyLength,
249
- data: jsonData
256
+ data: jsonData,
250
257
  };
251
258
  }
252
259
 
@@ -262,5 +269,5 @@ export function deriveGlobalPObjectId(blockId: string, exportName: string): PObj
262
269
  }
263
270
 
264
271
  export function deriveLocalPObjectId(resolvePath: string[], outputName: string): PObjectId {
265
- return canonicalize({ resolvePath, name: outputName })! as PObjectId
272
+ return canonicalize({ resolvePath, name: outputName })! as PObjectId;
266
273
  }
@@ -103,7 +103,7 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
103
103
  private readonly blobDriver: DownloadDriver,
104
104
  private readonly logger: MiLogger,
105
105
  private readonly blobContentCache: LRUCache<string, Uint8Array>,
106
- private readonly columns: InternalPFrameData,
106
+ columns: InternalPFrameData,
107
107
  ) {
108
108
  const logFunc: PFrameInternal.Logger = (level: 'info' | 'warn' | 'error', message: string) => {
109
109
  switch (level) {
@@ -122,18 +122,26 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
122
122
  this.blobIdToResource.set(blobKey(blob), blob);
123
123
  }
124
124
  }
125
+ const distinct_columns = [
126
+ ...new Map(columns.map((column) => ({
127
+ ...column,
128
+ data: mapBlobs(column.data, blobKey),
129
+ })).map(
130
+ (item) => [canonicalize(item)!, item] as const,
131
+ )).values(),
132
+ ];
125
133
 
126
134
  const createSpecPFrame = (): PFrameInternal.PFrameV2 => {
127
135
  try {
128
136
  if (getDebugFlags().usePFrameRs) {
129
137
  const pFrame = new PFrameRs(getDebugFlags().logPFrameRequests ? logFunc : undefined);
130
- for (const column of columns) {
138
+ for (const column of distinct_columns) {
131
139
  pFrame.addColumnSpec(column.id, column.spec);
132
140
  }
133
141
  return pFrame;
134
142
  } else {
135
143
  const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();
136
- for (const column of columns) {
144
+ for (const column of distinct_columns) {
137
145
  try {
138
146
  pFrame.addColumnSpec(column.id, column.spec);
139
147
  } catch (err: unknown) {
@@ -146,7 +154,7 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
146
154
  }
147
155
  } catch (err: unknown) {
148
156
  throw new Error(
149
- `Spec PFrame creation failed, columns: ${JSON.stringify(columns)}, error: ${err as Error}`,
157
+ `Spec PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,
150
158
  );
151
159
  }
152
160
  };
@@ -155,21 +163,20 @@ class PFrameHolder implements PFrameInternal.PFrameDataSource, Disposable {
155
163
  try {
156
164
  const pFrame = getDebugFlags().logPFrameRequests ? new PFrame(logFunc) : new PFrame();
157
165
  pFrame.setDataSource(this);
158
- for (const column of columns) {
159
- const dataInfo = mapBlobs(column.data, blobKey);
166
+ for (const column of distinct_columns) {
160
167
  try {
161
168
  pFrame.addColumnSpec(column.id, column.spec);
162
- pFrame.setColumnData(column.id, dataInfo);
169
+ pFrame.setColumnData(column.id, column.data);
163
170
  } catch (err: unknown) {
164
171
  throw new Error(
165
- `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}, DataInfo: ${JSON.stringify(dataInfo)}.`,
172
+ `Adding column ${column.id} to PFrame failed: ${err as Error}; Spec: ${JSON.stringify(column.spec)}, DataInfo: ${JSON.stringify(column.data)}.`,
166
173
  );
167
174
  }
168
175
  }
169
176
  return pFrame;
170
177
  } catch (err: unknown) {
171
178
  throw new Error(
172
- `Data PFrame creation failed, columns: ${JSON.stringify(columns)}, error: ${err as Error}`,
179
+ `Data PFrame creation failed, columns: ${JSON.stringify(distinct_columns)}, error: ${err as Error}`,
173
180
  );
174
181
  }
175
182
  };
@@ -524,7 +531,7 @@ function stableKeyFromPFrameData(data: PColumn<PFrameInternal.DataInfo<ResourceI
524
531
  keyLength: r.partitionKeyLength,
525
532
  payload: Object.entries(r.parts).map(([part, info]) => ({
526
533
  key: part,
527
- value: info.id.toString(),
534
+ value: blobKey(info),
528
535
  })),
529
536
  };
530
537
  break;
@@ -534,13 +541,12 @@ function stableKeyFromPFrameData(data: PColumn<PFrameInternal.DataInfo<ResourceI
534
541
  keyLength: r.partitionKeyLength,
535
542
  payload: Object.entries(r.parts).map(([part, info]) => ({
536
543
  key: part,
537
- value: [info.index.id.toString(), info.values.id.toString()] as const,
544
+ value: [blobKey(info.index), blobKey(info.values)] as const,
538
545
  })),
539
546
  };
540
547
  break;
541
548
  default:
542
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
543
- throw Error(`unsupported resource type: ${type satisfies never}`);
549
+ throw Error(`unsupported resource type: ${JSON.stringify(type satisfies never)}`);
544
550
  }
545
551
  result.payload.sort((lhs, rhs) => lhs.key.localeCompare(rhs.key));
546
552
  return result;