@platforma-sdk/model 1.62.0 → 1.63.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/PlMultiSequenceAlignment.cjs +1 -1
- package/dist/components/PlMultiSequenceAlignment.cjs.map +1 -1
- package/dist/components/PlMultiSequenceAlignment.js +2 -2
- package/dist/components/PlMultiSequenceAlignment.js.map +1 -1
- package/dist/components/PlSelectionModel.cjs.map +1 -1
- package/dist/components/PlSelectionModel.d.ts +1 -1
- package/dist/components/PlSelectionModel.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.js +1 -1
- package/dist/pframe_utils/index.cjs +2 -5
- package/dist/pframe_utils/index.cjs.map +1 -1
- package/dist/pframe_utils/index.js +2 -5
- package/dist/pframe_utils/index.js.map +1 -1
- package/package.json +9 -9
- package/src/components/PlMultiSequenceAlignment.ts +1 -2
- package/src/components/PlSelectionModel.ts +1 -1
- package/src/pframe_utils/index.ts +2 -6
|
@@ -4,7 +4,7 @@ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common")
|
|
|
4
4
|
//#region src/components/PlMultiSequenceAlignment.ts
|
|
5
5
|
function createRowSelectionColumn({ selection, columnId = (0, _milaboratories_pl_model_common.uniquePlId)(), label = "Selection marker", domain }) {
|
|
6
6
|
if (!selection?.axesSpec.length) return;
|
|
7
|
-
const data = selection.selectedKeys.filter((r) => r.every((v) =>
|
|
7
|
+
const data = selection.selectedKeys.filter((r) => r.every((v) => v !== null)).map((r) => ({
|
|
8
8
|
key: r,
|
|
9
9
|
val: 1
|
|
10
10
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlMultiSequenceAlignment.cjs","names":["ValueType","PColumnName","Annotation"],"sources":["../../src/components/PlMultiSequenceAlignment.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PColumnKey,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n
|
|
1
|
+
{"version":3,"file":"PlMultiSequenceAlignment.cjs","names":["ValueType","PColumnName","Annotation"],"sources":["../../src/components/PlMultiSequenceAlignment.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PColumnKey,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n PColumnName,\n stringifyJson,\n uniquePlId,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport type { PlSelectionModel } from \"./PlSelectionModel\";\n\nexport type PColumnPredicate = (column: PColumnIdAndSpec) => boolean | { default: boolean };\n\nexport interface PlMultiSequenceAlignmentSettings {\n sequenceColumnIds?: PObjectId[];\n labelColumnIds?: PTableColumnId[];\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n widgets: PlMultiSequenceAlignmentWidget[];\n alignmentParams: {\n gpo: number;\n gpe: number;\n tgpe: number;\n };\n}\n\nexport type PlMultiSequenceAlignmentWidget = \"consensus\" | \"seqLogo\" | \"tree\" | \"legend\";\n\nexport interface PlMultiSequenceAlignmentModel extends Partial<PlMultiSequenceAlignmentSettings> {\n version?: number;\n}\n\nexport type PlMultiSequenceAlignmentColorSchemeOption =\n | { type: \"no-color\" }\n | { type: \"chemical-properties\" }\n | { type: \"markup\"; columnIds: PObjectId[] };\n\nexport function createRowSelectionColumn({\n selection,\n columnId = uniquePlId() as string as PObjectId,\n label = \"Selection marker\",\n domain,\n}: {\n selection: PlSelectionModel | undefined;\n columnId?: PObjectId;\n label?: string;\n domain?: Record<string, string>;\n}): PColumn<PColumnValues> | undefined {\n if (!selection?.axesSpec.length) {\n return;\n }\n const data: PColumnValues = selection.selectedKeys\n .filter((r): r is PColumnKey => r.every((v) => v !== null))\n .map((r) => ({ key: r, val: 1 }));\n if (!data.length) {\n return;\n }\n return {\n id: columnId,\n spec: {\n kind: \"PColumn\",\n valueType: ValueType.Int,\n name: PColumnName.Table.RowSelection,\n axesSpec: selection.axesSpec,\n ...(domain && Object.keys(domain).length && { domain }),\n annotations: {\n [Annotation.Label]: label,\n [Annotation.DiscreteValues]: stringifyJson([1]),\n } satisfies Annotation,\n },\n data,\n };\n}\n"],"mappings":";;;;AA0CA,SAAgB,yBAAyB,EACvC,WACA,4DAAuB,EACvB,QAAQ,oBACR,UAMqC;AACrC,KAAI,CAAC,WAAW,SAAS,OACvB;CAEF,MAAM,OAAsB,UAAU,aACnC,QAAQ,MAAuB,EAAE,OAAO,MAAM,MAAM,KAAK,CAAC,CAC1D,KAAK,OAAO;EAAE,KAAK;EAAG,KAAK;EAAG,EAAE;AACnC,KAAI,CAAC,KAAK,OACR;AAEF,QAAO;EACL,IAAI;EACJ,MAAM;GACJ,MAAM;GACN,WAAWA,0CAAU;GACrB,MAAMC,4CAAY,MAAM;GACxB,UAAU,UAAU;GACpB,GAAI,UAAU,OAAO,KAAK,OAAO,CAAC,UAAU,EAAE,QAAQ;GACtD,aAAa;KACVC,2CAAW,QAAQ;KACnBA,2CAAW,oEAA+B,CAAC,EAAE,CAAC;IAChD;GACF;EACD;EACD"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Annotation, PColumnName, ValueType,
|
|
1
|
+
import { Annotation, PColumnName, ValueType, stringifyJson, uniquePlId } from "@milaboratories/pl-model-common";
|
|
2
2
|
|
|
3
3
|
//#region src/components/PlMultiSequenceAlignment.ts
|
|
4
4
|
function createRowSelectionColumn({ selection, columnId = uniquePlId(), label = "Selection marker", domain }) {
|
|
5
5
|
if (!selection?.axesSpec.length) return;
|
|
6
|
-
const data = selection.selectedKeys.filter((r) => r.every((v) =>
|
|
6
|
+
const data = selection.selectedKeys.filter((r) => r.every((v) => v !== null)).map((r) => ({
|
|
7
7
|
key: r,
|
|
8
8
|
val: 1
|
|
9
9
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlMultiSequenceAlignment.js","names":[],"sources":["../../src/components/PlMultiSequenceAlignment.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PColumnKey,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n
|
|
1
|
+
{"version":3,"file":"PlMultiSequenceAlignment.js","names":[],"sources":["../../src/components/PlMultiSequenceAlignment.ts"],"sourcesContent":["import type {\n PColumn,\n PColumnIdAndSpec,\n PColumnKey,\n PColumnValues,\n PObjectId,\n PTableColumnId,\n} from \"@milaboratories/pl-model-common\";\nimport {\n Annotation,\n PColumnName,\n stringifyJson,\n uniquePlId,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport type { PlSelectionModel } from \"./PlSelectionModel\";\n\nexport type PColumnPredicate = (column: PColumnIdAndSpec) => boolean | { default: boolean };\n\nexport interface PlMultiSequenceAlignmentSettings {\n sequenceColumnIds?: PObjectId[];\n labelColumnIds?: PTableColumnId[];\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n widgets: PlMultiSequenceAlignmentWidget[];\n alignmentParams: {\n gpo: number;\n gpe: number;\n tgpe: number;\n };\n}\n\nexport type PlMultiSequenceAlignmentWidget = \"consensus\" | \"seqLogo\" | \"tree\" | \"legend\";\n\nexport interface PlMultiSequenceAlignmentModel extends Partial<PlMultiSequenceAlignmentSettings> {\n version?: number;\n}\n\nexport type PlMultiSequenceAlignmentColorSchemeOption =\n | { type: \"no-color\" }\n | { type: \"chemical-properties\" }\n | { type: \"markup\"; columnIds: PObjectId[] };\n\nexport function createRowSelectionColumn({\n selection,\n columnId = uniquePlId() as string as PObjectId,\n label = \"Selection marker\",\n domain,\n}: {\n selection: PlSelectionModel | undefined;\n columnId?: PObjectId;\n label?: string;\n domain?: Record<string, string>;\n}): PColumn<PColumnValues> | undefined {\n if (!selection?.axesSpec.length) {\n return;\n }\n const data: PColumnValues = selection.selectedKeys\n .filter((r): r is PColumnKey => r.every((v) => v !== null))\n .map((r) => ({ key: r, val: 1 }));\n if (!data.length) {\n return;\n }\n return {\n id: columnId,\n spec: {\n kind: \"PColumn\",\n valueType: ValueType.Int,\n name: PColumnName.Table.RowSelection,\n axesSpec: selection.axesSpec,\n ...(domain && Object.keys(domain).length && { domain }),\n annotations: {\n [Annotation.Label]: label,\n [Annotation.DiscreteValues]: stringifyJson([1]),\n } satisfies Annotation,\n },\n data,\n };\n}\n"],"mappings":";;;AA0CA,SAAgB,yBAAyB,EACvC,WACA,WAAW,YAAY,EACvB,QAAQ,oBACR,UAMqC;AACrC,KAAI,CAAC,WAAW,SAAS,OACvB;CAEF,MAAM,OAAsB,UAAU,aACnC,QAAQ,MAAuB,EAAE,OAAO,MAAM,MAAM,KAAK,CAAC,CAC1D,KAAK,OAAO;EAAE,KAAK;EAAG,KAAK;EAAG,EAAE;AACnC,KAAI,CAAC,KAAK,OACR;AAEF,QAAO;EACL,IAAI;EACJ,MAAM;GACJ,MAAM;GACN,WAAW,UAAU;GACrB,MAAM,YAAY,MAAM;GACxB,UAAU,UAAU;GACpB,GAAI,UAAU,OAAO,KAAK,OAAO,CAAC,UAAU,EAAE,QAAQ;GACtD,aAAa;KACV,WAAW,QAAQ;KACnB,WAAW,iBAAiB,cAAc,CAAC,EAAE,CAAC;IAChD;GACF;EACD;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlSelectionModel.cjs","names":[],"sources":["../../src/components/PlSelectionModel.ts"],"sourcesContent":["import type { AxesSpec, PTableValueAxis } from \"@milaboratories/pl-model-common\";\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = PTableValueAxis[];\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n"],"mappings":";;AAiBA,SAAgB,yBAA2C;AACzD,QAAO;EACL,UAAU,EAAE;EACZ,cAAc,EAAE;EACjB"}
|
|
1
|
+
{"version":3,"file":"PlSelectionModel.cjs","names":[],"sources":["../../src/components/PlSelectionModel.ts"],"sourcesContent":["import type { AxesSpec, PTableValueAxis } from \"@milaboratories/pl-model-common\";\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = (PTableValueAxis | null)[];\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n"],"mappings":";;AAiBA,SAAgB,yBAA2C;AACzD,QAAO;EACL,UAAU,EAAE;EACZ,cAAc,EAAE;EACjB"}
|
|
@@ -2,7 +2,7 @@ import { AxesSpec, PTableValueAxis } from "@milaboratories/pl-model-common";
|
|
|
2
2
|
|
|
3
3
|
//#region src/components/PlSelectionModel.d.ts
|
|
4
4
|
/** Key is a set of all axes values, which means it is unique across rows */
|
|
5
|
-
type PTableKey = PTableValueAxis[];
|
|
5
|
+
type PTableKey = (PTableValueAxis | null)[];
|
|
6
6
|
/**
|
|
7
7
|
* Information on selected rows.
|
|
8
8
|
* for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlSelectionModel.js","names":[],"sources":["../../src/components/PlSelectionModel.ts"],"sourcesContent":["import type { AxesSpec, PTableValueAxis } from \"@milaboratories/pl-model-common\";\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = PTableValueAxis[];\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n"],"mappings":";AAiBA,SAAgB,yBAA2C;AACzD,QAAO;EACL,UAAU,EAAE;EACZ,cAAc,EAAE;EACjB"}
|
|
1
|
+
{"version":3,"file":"PlSelectionModel.js","names":[],"sources":["../../src/components/PlSelectionModel.ts"],"sourcesContent":["import type { AxesSpec, PTableValueAxis } from \"@milaboratories/pl-model-common\";\n\n/** Key is a set of all axes values, which means it is unique across rows */\nexport type PTableKey = (PTableValueAxis | null)[];\n\n/**\n * Information on selected rows.\n * for selectedKeys = [[axis1Value, axis2Value, axis3Value], ...]\n * axesSpec would be [axis1Spec, axis2Spec, axis3Spec]\n */\nexport type PlSelectionModel = {\n /** Specs for {@link AxisValue}'s in {@link PTableKey} */\n axesSpec: AxesSpec;\n /** Row keys (arrays of axes values) of selected rows */\n selectedKeys: PTableKey[];\n};\n\nexport function createPlSelectionModel(): PlSelectionModel {\n return {\n axesSpec: [],\n selectedKeys: [],\n };\n}\n"],"mappings":";AAiBA,SAAgB,yBAA2C;AACzD,QAAO;EACL,UAAU,EAAE;EACZ,cAAc,EAAE;EACjB"}
|
package/dist/package.cjs
CHANGED
package/dist/package.js
CHANGED
|
@@ -6,13 +6,10 @@ let es_toolkit = require("es-toolkit");
|
|
|
6
6
|
//#region src/pframe_utils/index.ts
|
|
7
7
|
const UNIQUE_VALUES_LIMIT = 1e6;
|
|
8
8
|
const sortValuesPredicate = (a, b) => a.label.localeCompare(b.label, "en", { numeric: true });
|
|
9
|
-
function convertColumnData(type, response
|
|
9
|
+
function convertColumnData(type, response) {
|
|
10
10
|
if (type === "String") return response.data;
|
|
11
11
|
const res = new Array(response.data.length);
|
|
12
|
-
for (let i = 0; i < response.data.length; i++) res[i] = (0, _milaboratories_pl_model_common.pTableValue)(response, i
|
|
13
|
-
absent: absentValue,
|
|
14
|
-
na: null
|
|
15
|
-
});
|
|
12
|
+
for (let i = 0; i < response.data.length; i++) res[i] = (0, _milaboratories_pl_model_common.pTableValue)(response, i);
|
|
16
13
|
return res;
|
|
17
14
|
}
|
|
18
15
|
function createSearchFilter(columnId, substring) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["PColumnName","Annotation"],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(\n type: ValueType,\n response: PTableVector,\n absentValue: number | null = null,\n): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i, { absent: absentValue, na: null }) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["PColumnName","Annotation"],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
@@ -5,13 +5,10 @@ import { flatten, uniq } from "es-toolkit";
|
|
|
5
5
|
//#region src/pframe_utils/index.ts
|
|
6
6
|
const UNIQUE_VALUES_LIMIT = 1e6;
|
|
7
7
|
const sortValuesPredicate = (a, b) => a.label.localeCompare(b.label, "en", { numeric: true });
|
|
8
|
-
function convertColumnData(type, response
|
|
8
|
+
function convertColumnData(type, response) {
|
|
9
9
|
if (type === "String") return response.data;
|
|
10
10
|
const res = new Array(response.data.length);
|
|
11
|
-
for (let i = 0; i < response.data.length; i++) res[i] = pTableValue(response, i
|
|
12
|
-
absent: absentValue,
|
|
13
|
-
na: null
|
|
14
|
-
});
|
|
11
|
+
for (let i = 0; i < response.data.length; i++) res[i] = pTableValue(response, i);
|
|
15
12
|
return res;
|
|
16
13
|
}
|
|
17
14
|
function createSearchFilter(columnId, substring) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(\n type: ValueType,\n response: PTableVector,\n absentValue: number | null = null,\n): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i, { absent: absentValue, na: null }) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/pframe_utils/index.ts"],"sourcesContent":["import { flatten, uniq } from \"es-toolkit\";\n\nimport type {\n AxisSpec,\n CalculateTableDataRequest,\n PColumnSpec,\n PFrameHandle,\n PTableVector,\n UniqueValuesRequest,\n AxisId,\n CanonicalizedJson,\n FindColumnsRequest,\n FindColumnsResponse,\n FullPTableColumnData,\n PColumnIdAndSpec,\n PObjectId,\n PTableRecordSingleValueFilterV2,\n ValueType,\n} from \"@milaboratories/pl-model-common\";\nimport {\n pTableValue,\n Annotation,\n canonicalizeAxisId,\n getAxisId,\n readAnnotation,\n PColumnName,\n} from \"@milaboratories/pl-model-common\";\n\nexport * from \"./columns\";\n\n// Types\ntype PValue = string | number | null;\n\ntype SuggestionResponse = {\n values: {\n value: string;\n label: string;\n }[];\n overflow: boolean;\n};\n\ntype SingleColumnData = {\n axesData: Record<string, PValue[]>;\n data: PValue[];\n};\n\ntype UniqueValuesResponse = {\n values: string[];\n overflow: boolean;\n};\n\ntype GetUniqueSourceValuesParams = {\n columnId: PObjectId;\n axisIdx?: number;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n};\n\ntype GetAxisUniqueValuesParams = {\n axisId: AxisId;\n parentColumnIds: PObjectId[];\n limit?: number;\n filters?: PTableRecordSingleValueFilterV2[];\n};\n\ntype GetColumnsFullParams = {\n selectedSources: PObjectId[];\n strictlyCompatible: boolean;\n types?: ValueType[];\n names?: string[];\n annotations?: FindColumnsRequest[\"columnFilter\"][\"annotationValue\"];\n annotationsNotEmpty?: string[];\n};\n\n// Constants\nconst UNIQUE_VALUES_LIMIT = 1000000;\n\n// Helper functions\nconst sortValuesPredicate = (a: { label: string }, b: { label: string }) =>\n a.label.localeCompare(b.label, \"en\", { numeric: true });\n\nfunction convertColumnData(type: ValueType, response: PTableVector): PValue[] {\n if (type === \"String\") {\n return response.data as PValue[];\n }\n const res: PValue[] = new Array(response.data.length);\n for (let i = 0; i < response.data.length; i++) {\n res[i] = pTableValue(response, i) as PValue;\n }\n return res;\n}\n\nfunction createSearchFilter(\n columnId: PObjectId,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"column\",\n id: columnId,\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction createAxisSearchFilter(\n axisSpec: AxisSpec,\n substring: string,\n): PTableRecordSingleValueFilterV2 {\n return {\n type: \"bySingleColumnV2\",\n column: {\n type: \"axis\",\n id: {\n type: axisSpec.type,\n name: axisSpec.name,\n },\n },\n predicate: {\n operator: \"StringIContains\",\n substring,\n },\n };\n}\n\nfunction mapValuesToSuggestions(values: string[]): { value: string; label: string }[] {\n return values.map((v) => ({ value: String(v), label: String(v) })).sort(sortValuesPredicate);\n}\n\nfunction getPFrameDriver() {\n if (typeof platforma === \"undefined\") {\n throw new Error(\"Platforma instance is not available\");\n }\n if (typeof platforma.pFrameDriver === \"undefined\") {\n throw new Error(\"PFrame driver is not available in the current Platforma instance\");\n }\n return platforma.pFrameDriver;\n}\n\n// Core functions\nexport async function getColumnSpecById(\n handle: PFrameHandle,\n id: PObjectId,\n): Promise<PColumnSpec | null> {\n try {\n const response = await getPFrameDriver().getColumnSpec(handle, id);\n return response ?? null;\n } catch (err) {\n console.error(\"PFrame: get single column error\", err);\n return null;\n }\n}\n\nexport async function getSingleColumnData(\n handle: PFrameHandle,\n id: PObjectId,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<SingleColumnData> {\n try {\n const response: FullPTableColumnData[] = await getPFrameDriver().calculateTableData(handle, {\n src: {\n type: \"column\",\n column: id,\n },\n filters,\n sorting: [],\n } as CalculateTableDataRequest<PObjectId>);\n\n const axes = response.filter((item) => item.spec.type === \"axis\");\n const columns = response.filter((item) => item.spec.type === \"column\");\n\n return {\n axesData: axes.reduce((res: Record<string, PValue[]>, item) => {\n const id = getAxisId(item.spec.spec as AxisSpec);\n res[canonicalizeAxisId(id)] = convertColumnData(id.type, item.data);\n return res;\n }, {}),\n data: columns.length ? convertColumnData(columns[0].data.type, columns[0].data) : [],\n };\n } catch (err) {\n console.error(\"PFrame: calculateTableData error\");\n throw err;\n }\n}\n\nexport async function getColumnUniqueValues(\n handle: PFrameHandle,\n id: PObjectId,\n limit = UNIQUE_VALUES_LIMIT,\n filters: PTableRecordSingleValueFilterV2[] = [],\n): Promise<UniqueValuesResponse> {\n const request: UniqueValuesRequest = {\n columnId: id,\n filters,\n limit,\n };\n\n try {\n const response = await getPFrameDriver().getUniqueValues(handle, request);\n if (response.overflow) {\n console.warn(`More than ${limit} values for ${id} column`);\n }\n return {\n values: Array.from(response.values.data as ArrayLike<unknown>).map(String),\n overflow: response.overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for column error\");\n throw err;\n }\n}\n\nexport async function getAxisUniqueValues(\n handle: PFrameHandle,\n params: GetAxisUniqueValuesParams,\n): Promise<UniqueValuesResponse> {\n const { axisId, parentColumnIds, limit = UNIQUE_VALUES_LIMIT, filters = [] } = params;\n const strAxisId = canonicalizeAxisId(axisId);\n\n const parentsSpecs = (await Promise.all(parentColumnIds.map((p) => getColumnSpecById(handle, p))))\n .flatMap((spec, i): [PObjectId, PColumnSpec][] =>\n spec != null && spec.kind === \"PColumn\" ? [[parentColumnIds[i], spec]] : [],\n )\n .filter(([_, spec]) =>\n spec.axesSpec.some((axisSpec) => canonicalizeAxisId(getAxisId(axisSpec)) === strAxisId),\n );\n\n if (parentsSpecs.length === 0) {\n console.warn(\"Axis unique values requested without parent columns\");\n return { values: [], overflow: false };\n }\n\n try {\n const responses = await Promise.all(\n parentsSpecs.map(([id]) =>\n getPFrameDriver().getUniqueValues(handle, {\n columnId: id,\n axis: axisId,\n filters,\n limit,\n }),\n ),\n );\n\n const overflow = responses.some((r) => r.overflow);\n return {\n values: uniq(\n flatten(responses.map((r) => Array.from(r.values.data as ArrayLike<unknown>).map(String))),\n ),\n overflow,\n };\n } catch (err) {\n console.error(\"PFrame: getUniqueValues for axis error\", err);\n return { values: [], overflow: false };\n }\n}\n\nexport async function getRequestColumnsFromSelectedSources(\n handle: PFrameHandle,\n sources: PObjectId[],\n): Promise<AxisId[]> {\n const result: AxisId[] = [];\n for (const item of sources) {\n const spec = await getColumnSpecById(handle, item);\n if (spec?.kind === \"PColumn\") {\n result.push(...spec.axesSpec.map((spec) => getAxisId(spec)));\n }\n }\n return result;\n}\n\nexport async function getColumnsFull(\n handle: PFrameHandle,\n params: GetColumnsFullParams,\n): Promise<PColumnIdAndSpec[]> {\n const { selectedSources, strictlyCompatible, types, names, annotations, annotationsNotEmpty } =\n params;\n\n try {\n const request: FindColumnsRequest = {\n columnFilter: {\n type: types,\n name: names,\n annotationValue: annotations,\n annotationPattern: annotationsNotEmpty?.reduce(\n (res, v) => {\n res[v] = \".+\";\n return res;\n },\n {} as Record<string, string>,\n ),\n },\n compatibleWith: await getRequestColumnsFromSelectedSources(handle, selectedSources),\n strictlyCompatible,\n };\n\n const response: FindColumnsResponse = await getPFrameDriver().findColumns(handle, request);\n return response.hits;\n } catch (err) {\n console.error(\"PFrame: findColumns error\");\n throw err;\n }\n}\n\nexport async function getColumnOrAxisValueLabelsId(\n handle: PFrameHandle,\n strAxisId: CanonicalizedJson<AxisId>,\n): Promise<PObjectId | undefined> {\n const labelColumns = await getColumnsFull(handle, {\n selectedSources: [],\n strictlyCompatible: false,\n names: [PColumnName.Label],\n });\n\n const labelColumn = labelColumns.find(({ spec }) => {\n return spec && spec.axesSpec.length === 1 && canonicalizeAxisId(spec.axesSpec[0]) === strAxisId;\n });\n\n return labelColumn?.columnId;\n}\n\nfunction getDiscreteValuesFromAnnotation(columnSpec: PColumnSpec): undefined | SuggestionResponse {\n const discreteValuesStr = readAnnotation(columnSpec, Annotation.DiscreteValues);\n if (!discreteValuesStr) {\n return undefined;\n }\n\n try {\n const discreteValues: string[] = (JSON.parse(discreteValuesStr) as (string | number)[]).map(\n (v) => String(v),\n );\n const values = discreteValues.map((v) => ({ value: v, label: v })).sort(sortValuesPredicate);\n return { values, overflow: false };\n } catch {\n console.error(`Parsing error: discrete values annotation ${discreteValuesStr}`);\n return undefined;\n }\n}\n\nasync function getAxisValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n axisSpec: AxisSpec;\n labelsColumnId: PObjectId | undefined;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, axisSpec, labelsColumnId, limit, searchQuery, searchQueryValue } = params;\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n\n let filters: PTableRecordSingleValueFilterV2[] = [];\n\n if (labelsColumnId) {\n if (searchQuery) {\n filters = [createSearchFilter(labelsColumnId, searchQuery)];\n }\n if (searchQueryValue) {\n filters = [createAxisSearchFilter(axisSpec, searchQueryValue)];\n }\n\n const { data: dataValues, axesData } = await getSingleColumnData(\n handle,\n labelsColumnId,\n filters,\n );\n const axisKeys = axesData[strAxisId];\n const values: { value: string; label: string }[] = [];\n\n for (let i = 0; i < Math.min(axisKeys.length, limit ?? axisKeys.length); i++) {\n values.push({ value: String(axisKeys[i]), label: String(dataValues[i]) });\n }\n\n values.sort(sortValuesPredicate);\n return { values, overflow: !(limit === undefined || axisKeys.length < limit) };\n } else {\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n if (searchInLabelsOrValue) {\n filters = [createAxisSearchFilter(axisSpec, searchInLabelsOrValue)];\n }\n\n const response = await getAxisUniqueValues(handle, {\n axisId: getAxisId(axisSpec),\n parentColumnIds: [columnId],\n limit,\n filters,\n });\n\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n }\n}\n\nasync function getColumnValuesWithLabels(\n handle: PFrameHandle,\n params: {\n columnId: PObjectId;\n limit?: number;\n searchQuery?: string;\n searchQueryValue?: string;\n },\n): Promise<SuggestionResponse> {\n const { columnId, limit, searchQuery, searchQueryValue } = params;\n const searchInLabelsOrValue = searchQuery ?? searchQueryValue;\n\n const filters: PTableRecordSingleValueFilterV2[] = searchInLabelsOrValue\n ? [createSearchFilter(columnId, searchInLabelsOrValue)]\n : [];\n\n const response = await getColumnUniqueValues(handle, columnId, limit, filters);\n const values = mapValuesToSuggestions(response.values);\n return { values, overflow: response.overflow };\n}\n\nexport async function getUniqueSourceValuesWithLabels(\n handle: PFrameHandle,\n params: GetUniqueSourceValuesParams,\n): Promise<SuggestionResponse> {\n const { columnId, axisIdx, limit, searchQuery, searchQueryValue } = params;\n\n const selectedSourceSpec = await getColumnSpecById(handle, columnId);\n if (selectedSourceSpec == null || selectedSourceSpec.kind !== \"PColumn\") {\n return { values: [], overflow: false };\n }\n\n // Try to get discrete values from annotation\n const discreteValues = getDiscreteValuesFromAnnotation(selectedSourceSpec);\n if (discreteValues != null) {\n return discreteValues;\n }\n\n // Handle axis values\n if (axisIdx != null) {\n const axisSpec = selectedSourceSpec.axesSpec[axisIdx];\n const strAxisId = canonicalizeAxisId(getAxisId(axisSpec));\n const labelsColumnId = await getColumnOrAxisValueLabelsId(handle, strAxisId);\n\n return getAxisValuesWithLabels(handle, {\n columnId,\n axisSpec,\n labelsColumnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n }\n\n // Handle column values\n return getColumnValuesWithLabels(handle, {\n columnId,\n limit,\n searchQuery,\n searchQueryValue,\n });\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@platforma-sdk/model",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.63.1",
|
|
4
4
|
"description": "Platforma.bio SDK / Block Model",
|
|
5
5
|
"files": [
|
|
6
6
|
"./dist/**/*",
|
|
@@ -30,22 +30,22 @@
|
|
|
30
30
|
"fast-json-patch": "^3.1.1",
|
|
31
31
|
"utility-types": "^3.11.0",
|
|
32
32
|
"zod": "~3.23.8",
|
|
33
|
-
"@milaboratories/helpers": "1.14.
|
|
34
|
-
"@milaboratories/pl-model-common": "1.30.0",
|
|
35
|
-
"@milaboratories/pl-model-middle-layer": "1.16.1",
|
|
33
|
+
"@milaboratories/helpers": "1.14.1",
|
|
36
34
|
"@milaboratories/pl-error-like": "1.12.9",
|
|
37
|
-
"@milaboratories/
|
|
35
|
+
"@milaboratories/pl-model-common": "1.31.1",
|
|
36
|
+
"@milaboratories/pl-model-middle-layer": "1.16.3",
|
|
37
|
+
"@milaboratories/ptabler-expression-js": "1.2.5"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@vitest/coverage-istanbul": "^4.0.18",
|
|
41
41
|
"fast-json-patch": "^3.1.1",
|
|
42
42
|
"typescript": "~5.9.3",
|
|
43
43
|
"vitest": "^4.0.18",
|
|
44
|
-
"@milaboratories/
|
|
45
|
-
"@milaboratories/pf-spec-driver": "1.2.0",
|
|
44
|
+
"@milaboratories/pf-spec-driver": "1.2.3",
|
|
46
45
|
"@milaboratories/ts-builder": "1.3.0",
|
|
47
|
-
"@milaboratories/
|
|
48
|
-
"@milaboratories/ts-configs": "1.2.2"
|
|
46
|
+
"@milaboratories/build-configs": "1.5.2",
|
|
47
|
+
"@milaboratories/ts-configs": "1.2.2",
|
|
48
|
+
"@milaboratories/pf-driver": "1.3.3"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "ts-builder build --target node",
|
|
@@ -8,7 +8,6 @@ import type {
|
|
|
8
8
|
} from "@milaboratories/pl-model-common";
|
|
9
9
|
import {
|
|
10
10
|
Annotation,
|
|
11
|
-
isPTableAbsent,
|
|
12
11
|
PColumnName,
|
|
13
12
|
stringifyJson,
|
|
14
13
|
uniquePlId,
|
|
@@ -56,7 +55,7 @@ export function createRowSelectionColumn({
|
|
|
56
55
|
return;
|
|
57
56
|
}
|
|
58
57
|
const data: PColumnValues = selection.selectedKeys
|
|
59
|
-
.filter((r): r is PColumnKey => r.every((v) =>
|
|
58
|
+
.filter((r): r is PColumnKey => r.every((v) => v !== null))
|
|
60
59
|
.map((r) => ({ key: r, val: 1 }));
|
|
61
60
|
if (!data.length) {
|
|
62
61
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AxesSpec, PTableValueAxis } from "@milaboratories/pl-model-common";
|
|
2
2
|
|
|
3
3
|
/** Key is a set of all axes values, which means it is unique across rows */
|
|
4
|
-
export type PTableKey = PTableValueAxis[];
|
|
4
|
+
export type PTableKey = (PTableValueAxis | null)[];
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Information on selected rows.
|
|
@@ -80,17 +80,13 @@ const UNIQUE_VALUES_LIMIT = 1000000;
|
|
|
80
80
|
const sortValuesPredicate = (a: { label: string }, b: { label: string }) =>
|
|
81
81
|
a.label.localeCompare(b.label, "en", { numeric: true });
|
|
82
82
|
|
|
83
|
-
function convertColumnData(
|
|
84
|
-
type: ValueType,
|
|
85
|
-
response: PTableVector,
|
|
86
|
-
absentValue: number | null = null,
|
|
87
|
-
): PValue[] {
|
|
83
|
+
function convertColumnData(type: ValueType, response: PTableVector): PValue[] {
|
|
88
84
|
if (type === "String") {
|
|
89
85
|
return response.data as PValue[];
|
|
90
86
|
}
|
|
91
87
|
const res: PValue[] = new Array(response.data.length);
|
|
92
88
|
for (let i = 0; i < response.data.length; i++) {
|
|
93
|
-
res[i] = pTableValue(response, i
|
|
89
|
+
res[i] = pTableValue(response, i) as PValue;
|
|
94
90
|
}
|
|
95
91
|
return res;
|
|
96
92
|
}
|