@platforma-sdk/model 1.66.2 → 1.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/block_state_util.cjs +2 -1
  2. package/dist/block_state_util.cjs.map +1 -1
  3. package/dist/block_state_util.js +2 -1
  4. package/dist/block_state_util.js.map +1 -1
  5. package/dist/columns/column_collection_builder.cjs +1 -1
  6. package/dist/columns/column_collection_builder.d.ts +1 -1
  7. package/dist/columns/column_collection_builder.js +1 -1
  8. package/dist/columns/index.cjs +2 -2
  9. package/dist/columns/index.d.ts +1 -1
  10. package/dist/columns/index.js +2 -2
  11. package/dist/components/PlDataTable/createPlDataTable/createPlDataTableV3.d.ts +3 -3
  12. package/dist/components/PlDataTable/createPlDataTable/discoverColumns.d.ts +1 -1
  13. package/dist/components/PlDatasetSelector/build_dataset_options.cjs +41 -0
  14. package/dist/components/PlDatasetSelector/build_dataset_options.cjs.map +1 -0
  15. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts +19 -0
  16. package/dist/components/PlDatasetSelector/build_dataset_options.d.ts.map +1 -0
  17. package/dist/components/PlDatasetSelector/build_dataset_options.js +41 -0
  18. package/dist/components/PlDatasetSelector/build_dataset_options.js.map +1 -0
  19. package/dist/components/PlDatasetSelector/filter_discovery.cjs +60 -0
  20. package/dist/components/PlDatasetSelector/filter_discovery.cjs.map +1 -0
  21. package/dist/components/PlDatasetSelector/filter_discovery.d.ts +31 -0
  22. package/dist/components/PlDatasetSelector/filter_discovery.d.ts.map +1 -0
  23. package/dist/components/PlDatasetSelector/filter_discovery.js +56 -0
  24. package/dist/components/PlDatasetSelector/filter_discovery.js.map +1 -0
  25. package/dist/components/PlDatasetSelector/index.cjs +2 -0
  26. package/dist/components/PlDatasetSelector/index.d.ts +2 -0
  27. package/dist/components/PlDatasetSelector/index.js +2 -0
  28. package/dist/components/index.cjs +3 -0
  29. package/dist/components/index.d.ts +2 -0
  30. package/dist/components/index.js +3 -0
  31. package/dist/index.cjs +10 -4
  32. package/dist/index.d.ts +7 -5
  33. package/dist/index.js +7 -5
  34. package/dist/package.cjs +1 -1
  35. package/dist/package.js +1 -1
  36. package/package.json +7 -7
  37. package/src/block_state_util.ts +2 -1
  38. package/src/components/PlDatasetSelector/build_dataset_options.ts +56 -0
  39. package/src/components/PlDatasetSelector/filter_discovery.test.ts +156 -0
  40. package/src/components/PlDatasetSelector/filter_discovery.ts +77 -0
  41. package/src/components/PlDatasetSelector/index.ts +2 -0
  42. package/src/components/index.ts +1 -0
@@ -11,7 +11,8 @@ function readOutput(outputValue) {
11
11
  return outputValue.value;
12
12
  }
13
13
  function wrapOutputs(outputs) {
14
- return new Proxy(outputs, { get(target, key) {
14
+ return new Proxy(outputs, { get(target, key, receiver) {
15
+ if (typeof key === "symbol" || !(key in target)) return Reflect.get(target, key, receiver);
15
16
  return readOutput(target[key]);
16
17
  } });
17
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"block_state_util.cjs","names":[],"sources":["../src/block_state_util.ts"],"sourcesContent":["import type { BlockOutputsBase, OutputWithStatus } from \"@milaboratories/pl-model-common\";\nimport type { ErrorLike } from \"@milaboratories/pl-error-like\";\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: ErrorLike[],\n public readonly moreErrors: boolean,\n ) {\n super(`${errors.length}${moreErrors ? \"+\" : \"\"} errors, first error: ` + errors[0].message);\n }\n}\n\nexport function readOutput<T>(outputValue: OutputWithStatus<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends OutputWithStatus<unknown>> = Extract<V, { ok: true }>[\"value\"];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs,\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key: string) {\n return readOutput(target[key]);\n },\n }) as SimpleOutputs<Outputs>;\n}\n"],"mappings":";AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,YACE,QACA,YACA;AACA,QAAM,GAAG,OAAO,SAAS,aAAa,MAAM,GAAG,0BAA0B,OAAO,GAAG,QAAQ;AAH3E,OAAA,SAAA;AACA,OAAA,aAAA;;;AAMpB,SAAgB,WAAc,aAAqC;AACjE,KAAI,CAAC,YAAY,GAAI,OAAM,IAAI,YAAY,YAAY,QAAQ,YAAY,WAAW;AACtF,QAAO,YAAY;;AAQrB,SAAgB,YACd,SACwB;AACxB,QAAO,IAAI,MAAM,SAAS,EACxB,IAAI,QAAQ,KAAa;AACvB,SAAO,WAAW,OAAO,KAAK;IAEjC,CAAC"}
1
+ {"version":3,"file":"block_state_util.cjs","names":[],"sources":["../src/block_state_util.ts"],"sourcesContent":["import type { BlockOutputsBase, OutputWithStatus } from \"@milaboratories/pl-model-common\";\nimport type { ErrorLike } from \"@milaboratories/pl-error-like\";\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: ErrorLike[],\n public readonly moreErrors: boolean,\n ) {\n super(`${errors.length}${moreErrors ? \"+\" : \"\"} errors, first error: ` + errors[0].message);\n }\n}\n\nexport function readOutput<T>(outputValue: OutputWithStatus<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends OutputWithStatus<unknown>> = Extract<V, { ok: true }>[\"value\"];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs,\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key, receiver) {\n if (typeof key === \"symbol\" || !(key in target)) return Reflect.get(target, key, receiver);\n return readOutput(target[key]);\n },\n }) as SimpleOutputs<Outputs>;\n}\n"],"mappings":";AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,YACE,QACA,YACA;AACA,QAAM,GAAG,OAAO,SAAS,aAAa,MAAM,GAAG,0BAA0B,OAAO,GAAG,QAAQ;AAH3E,OAAA,SAAA;AACA,OAAA,aAAA;;;AAMpB,SAAgB,WAAc,aAAqC;AACjE,KAAI,CAAC,YAAY,GAAI,OAAM,IAAI,YAAY,YAAY,QAAQ,YAAY,WAAW;AACtF,QAAO,YAAY;;AAQrB,SAAgB,YACd,SACwB;AACxB,QAAO,IAAI,MAAM,SAAS,EACxB,IAAI,QAAQ,KAAK,UAAU;AACzB,MAAI,OAAO,QAAQ,YAAY,EAAE,OAAO,QAAS,QAAO,QAAQ,IAAI,QAAQ,KAAK,SAAS;AAC1F,SAAO,WAAW,OAAO,KAAK;IAEjC,CAAC"}
@@ -11,7 +11,8 @@ function readOutput(outputValue) {
11
11
  return outputValue.value;
12
12
  }
13
13
  function wrapOutputs(outputs) {
14
- return new Proxy(outputs, { get(target, key) {
14
+ return new Proxy(outputs, { get(target, key, receiver) {
15
+ if (typeof key === "symbol" || !(key in target)) return Reflect.get(target, key, receiver);
15
16
  return readOutput(target[key]);
16
17
  } });
17
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"block_state_util.js","names":[],"sources":["../src/block_state_util.ts"],"sourcesContent":["import type { BlockOutputsBase, OutputWithStatus } from \"@milaboratories/pl-model-common\";\nimport type { ErrorLike } from \"@milaboratories/pl-error-like\";\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: ErrorLike[],\n public readonly moreErrors: boolean,\n ) {\n super(`${errors.length}${moreErrors ? \"+\" : \"\"} errors, first error: ` + errors[0].message);\n }\n}\n\nexport function readOutput<T>(outputValue: OutputWithStatus<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends OutputWithStatus<unknown>> = Extract<V, { ok: true }>[\"value\"];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs,\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key: string) {\n return readOutput(target[key]);\n },\n }) as SimpleOutputs<Outputs>;\n}\n"],"mappings":";AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,YACE,QACA,YACA;AACA,QAAM,GAAG,OAAO,SAAS,aAAa,MAAM,GAAG,0BAA0B,OAAO,GAAG,QAAQ;AAH3E,OAAA,SAAA;AACA,OAAA,aAAA;;;AAMpB,SAAgB,WAAc,aAAqC;AACjE,KAAI,CAAC,YAAY,GAAI,OAAM,IAAI,YAAY,YAAY,QAAQ,YAAY,WAAW;AACtF,QAAO,YAAY;;AAQrB,SAAgB,YACd,SACwB;AACxB,QAAO,IAAI,MAAM,SAAS,EACxB,IAAI,QAAQ,KAAa;AACvB,SAAO,WAAW,OAAO,KAAK;IAEjC,CAAC"}
1
+ {"version":3,"file":"block_state_util.js","names":[],"sources":["../src/block_state_util.ts"],"sourcesContent":["import type { BlockOutputsBase, OutputWithStatus } from \"@milaboratories/pl-model-common\";\nimport type { ErrorLike } from \"@milaboratories/pl-error-like\";\n\nexport class OutputError extends Error {\n constructor(\n public readonly errors: ErrorLike[],\n public readonly moreErrors: boolean,\n ) {\n super(`${errors.length}${moreErrors ? \"+\" : \"\"} errors, first error: ` + errors[0].message);\n }\n}\n\nexport function readOutput<T>(outputValue: OutputWithStatus<T>): T {\n if (!outputValue.ok) throw new OutputError(outputValue.errors, outputValue.moreErrors);\n return outputValue.value;\n}\n\ntype ExtractValueType<V extends OutputWithStatus<unknown>> = Extract<V, { ok: true }>[\"value\"];\ntype SimpleOutputs<Outputs extends BlockOutputsBase> = {\n [Key in keyof Outputs]: ExtractValueType<Outputs[Key]>;\n};\n\nexport function wrapOutputs<Outputs extends BlockOutputsBase>(\n outputs: Outputs,\n): SimpleOutputs<Outputs> {\n return new Proxy(outputs, {\n get(target, key, receiver) {\n if (typeof key === \"symbol\" || !(key in target)) return Reflect.get(target, key, receiver);\n return readOutput(target[key]);\n },\n }) as SimpleOutputs<Outputs>;\n}\n"],"mappings":";AAGA,IAAa,cAAb,cAAiC,MAAM;CACrC,YACE,QACA,YACA;AACA,QAAM,GAAG,OAAO,SAAS,aAAa,MAAM,GAAG,0BAA0B,OAAO,GAAG,QAAQ;AAH3E,OAAA,SAAA;AACA,OAAA,aAAA;;;AAMpB,SAAgB,WAAc,aAAqC;AACjE,KAAI,CAAC,YAAY,GAAI,OAAM,IAAI,YAAY,YAAY,QAAQ,YAAY,WAAW;AACtF,QAAO,YAAY;;AAQrB,SAAgB,YACd,SACwB;AACxB,QAAO,IAAI,MAAM,SAAS,EACxB,IAAI,QAAQ,KAAK,UAAU;AACzB,MAAI,OAAO,QAAQ,YAAY,EAAE,OAAO,QAAS,QAAO,QAAQ,IAAI,QAAQ,KAAK,SAAS;AAC1F,SAAO,WAAW,OAAO,KAAK;IAEjC,CAAC"}
@@ -2,8 +2,8 @@ require("../_virtual/_rolldown/runtime.cjs");
2
2
  const require_accessor = require("../render/accessor.cjs");
3
3
  const require_get_services = require("../services/get_services.cjs");
4
4
  require("../services/index.cjs");
5
- const require_column_snapshot_provider = require("./column_snapshot_provider.cjs");
6
5
  const require_column_selector = require("./column_selector.cjs");
6
+ const require_column_snapshot_provider = require("./column_snapshot_provider.cjs");
7
7
  let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
8
8
  let _milaboratories_helpers = require("@milaboratories/helpers");
9
9
  //#region src/columns/column_collection_builder.ts
@@ -1,7 +1,7 @@
1
1
  import { TreeNodeAccessor } from "../render/accessor.js";
2
+ import { ColumnSelector, RelaxedColumnSelector } from "./column_selector.js";
2
3
  import { ColumnSnapshot } from "./column_snapshot.js";
3
4
  import { ColumnSource } from "./column_snapshot_provider.js";
4
- import { ColumnSelector, RelaxedColumnSelector } from "./column_selector.js";
5
5
  import { AxisQualification, PColumnSpec, PFrameSpecDriver, PObjectId } from "@milaboratories/pl-model-common";
6
6
 
7
7
  //#region src/columns/column_collection_builder.d.ts
@@ -1,8 +1,8 @@
1
1
  import { TreeNodeAccessor } from "../render/accessor.js";
2
2
  import { getService } from "../services/get_services.js";
3
3
  import "../services/index.js";
4
- import { ArrayColumnProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
5
4
  import { convertColumnSelectorToMultiColumnSelector } from "./column_selector.js";
5
+ import { ArrayColumnProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
6
6
  import { deriveNativeId, isPColumnSpec } from "@milaboratories/pl-model-common";
7
7
  import { throwError } from "@milaboratories/helpers";
8
8
  //#region src/columns/column_collection_builder.ts
@@ -1,6 +1,6 @@
1
- require("./column_snapshot.cjs");
2
- require("./column_snapshot_provider.cjs");
3
1
  require("./column_selector.cjs");
2
+ require("./column_snapshot_provider.cjs");
4
3
  require("./column_collection_builder.cjs");
5
4
  require("./ctx_column_sources.cjs");
5
+ require("./column_snapshot.cjs");
6
6
  require("./expand_by_partition.cjs");
@@ -1,6 +1,6 @@
1
+ import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./column_selector.js";
1
2
  import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./column_snapshot.js";
2
3
  import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./column_snapshot_provider.js";
3
- import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./column_selector.js";
4
4
  import { AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, BuildOptions, ColumnCollection, ColumnCollectionBuilder, ColumnMatch, FindColumnsOptions, MatchQualifications, MatchVariant, MatchingMode } from "./column_collection_builder.js";
5
5
  import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./ctx_column_sources.js";
6
6
  import { ExpandByPartitionOpts, ExpandByPartitionResult, SplitAxis, expandByPartition } from "./expand_by_partition.js";
@@ -1,6 +1,6 @@
1
- import "./column_snapshot.js";
2
- import "./column_snapshot_provider.js";
3
1
  import "./column_selector.js";
2
+ import "./column_snapshot_provider.js";
4
3
  import "./column_collection_builder.js";
5
4
  import "./ctx_column_sources.js";
5
+ import "./column_snapshot.js";
6
6
  import "./expand_by_partition.js";
@@ -1,10 +1,10 @@
1
1
  import { DeriveLabelsOptions } from "../../../labels/derive_distinct_labels.js";
2
2
  import { RenderCtxBase } from "../../../render/api.js";
3
- import { PlDataTableFilters, PlDataTableModel } from "../typesV5.js";
4
- import { PlDataTableStateV2 } from "../state-migration.js";
5
- import { ColumnSnapshot } from "../../../columns/column_snapshot.js";
6
3
  import { ColumnSelector } from "../../../columns/column_selector.js";
4
+ import { ColumnSnapshot } from "../../../columns/column_snapshot.js";
7
5
  import { MatchQualifications, MatchVariant, MatchingMode } from "../../../columns/column_collection_builder.js";
6
+ import { PlDataTableFilters, PlDataTableModel } from "../typesV5.js";
7
+ import { PlDataTableStateV2 } from "../state-migration.js";
8
8
  import { DiscoverTableColumnOptions } from "./discoverColumns.js";
9
9
  import { DiscoveredPColumnId, MultiColumnSelector, PColumnSpec, PObjectId, PTableSorting } from "@milaboratories/pl-model-common";
10
10
  import { Nil } from "@milaboratories/helpers";
@@ -1,6 +1,6 @@
1
1
  import { RenderCtxBase } from "../../../render/api.js";
2
- import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
3
2
  import { RelaxedColumnSelector } from "../../../columns/column_selector.js";
3
+ import { ColumnSource } from "../../../columns/column_snapshot_provider.js";
4
4
  import { ColumnsSelectorConfig, TableColumnSnapshot } from "./createPlDataTableV3.js";
5
5
  import { PColumnSpec, PObjectId, PlRef } from "@milaboratories/pl-model-common";
6
6
 
@@ -0,0 +1,41 @@
1
+ const require_filter_discovery = require("./filter_discovery.cjs");
2
+ const require_column_collection_builder = require("../../columns/column_collection_builder.cjs");
3
+ const require_ctx_column_sources = require("../../columns/ctx_column_sources.cjs");
4
+ //#region src/components/PlDatasetSelector/build_dataset_options.ts
5
+ /**
6
+ * Usage:
7
+ * ```ts
8
+ * .output("datasetOptions", (ctx) => buildDatasetOptions(ctx))
9
+ * ```
10
+ */
11
+ function buildDatasetOptions(ctx, opts) {
12
+ const predicate = opts?.selector ?? (() => true);
13
+ const options = ctx.resultPool.getOptions(predicate, { refsWithEnrichments: true });
14
+ if (options.length === 0) return [];
15
+ const columnSources = require_ctx_column_sources.collectCtxColumnSnapshotProviders(ctx);
16
+ const refMap = require_filter_discovery.buildRefMap(ctx.resultPool.getSpecs().entries);
17
+ const pframeSpec = ctx.getService("pframeSpec");
18
+ return options.map((o) => {
19
+ const datasetSpec = ctx.resultPool.getPColumnSpecByRef(o.ref);
20
+ if (!datasetSpec) return o;
21
+ const builder = new require_column_collection_builder.ColumnCollectionBuilder(pframeSpec);
22
+ for (const src of columnSources) builder.addSource(src);
23
+ const collection = builder.build({ anchors: { main: datasetSpec } });
24
+ if (!collection) return o;
25
+ try {
26
+ const matches = require_filter_discovery.findFilterColumns(collection);
27
+ if (matches.length === 0) return o;
28
+ const filters = require_filter_discovery.filterMatchesToOptions(matches, refMap, opts?.labelOptions);
29
+ return {
30
+ ...o,
31
+ filters
32
+ };
33
+ } finally {
34
+ collection.dispose();
35
+ }
36
+ });
37
+ }
38
+ //#endregion
39
+ exports.buildDatasetOptions = buildDatasetOptions;
40
+
41
+ //# sourceMappingURL=build_dataset_options.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_dataset_options.cjs","names":["collectCtxColumnSnapshotProviders","buildRefMap","ColumnCollectionBuilder","findFilterColumns","filterMatchesToOptions"],"sources":["../../../src/components/PlDatasetSelector/build_dataset_options.ts"],"sourcesContent":["import type {\n DatasetOption,\n Option,\n PColumnSelector,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type { DeriveLabelsOptions } from \"../../labels/derive_distinct_labels\";\nimport type { RenderCtxBase } from \"../../render\";\nimport { ColumnCollectionBuilder } from \"../../columns/column_collection_builder\";\nimport { collectCtxColumnSnapshotProviders } from \"../../columns/ctx_column_sources\";\nimport { buildRefMap, filterMatchesToOptions, findFilterColumns } from \"./filter_discovery\";\n\nexport type BuildDatasetOptions = {\n /** Which result pool columns qualify as datasets. Defaults to all. */\n selector?: PColumnSelector | PColumnSelector[] | ((spec: PObjectSpec) => boolean);\n /** Formatting options for filter labels. */\n labelOptions?: DeriveLabelsOptions;\n};\n\n/**\n * Usage:\n * ```ts\n * .output(\"datasetOptions\", (ctx) => buildDatasetOptions(ctx))\n * ```\n */\nexport function buildDatasetOptions(\n ctx: RenderCtxBase,\n opts?: BuildDatasetOptions,\n): DatasetOption[] | undefined {\n const predicate = opts?.selector ?? (() => true);\n const options = ctx.resultPool.getOptions(predicate, { refsWithEnrichments: true });\n if (options.length === 0) return [];\n\n const columnSources = collectCtxColumnSnapshotProviders(ctx);\n const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);\n const pframeSpec = ctx.getService(\"pframeSpec\");\n\n return options.map((o: Option): DatasetOption => {\n const datasetSpec = ctx.resultPool.getPColumnSpecByRef(o.ref);\n if (!datasetSpec) return o;\n\n const builder = new ColumnCollectionBuilder(pframeSpec);\n for (const src of columnSources) builder.addSource(src);\n const collection = builder.build({ anchors: { main: datasetSpec } });\n if (!collection) return o;\n\n try {\n const matches = findFilterColumns(collection);\n if (matches.length === 0) return o;\n const filters = filterMatchesToOptions(matches, refMap, opts?.labelOptions);\n return { ...o, filters };\n } finally {\n collection.dispose();\n }\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,oBACd,KACA,MAC6B;CAC7B,MAAM,YAAY,MAAM,mBAAmB;CAC3C,MAAM,UAAU,IAAI,WAAW,WAAW,WAAW,EAAE,qBAAqB,MAAM,CAAC;AACnF,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CAEnC,MAAM,gBAAgBA,2BAAAA,kCAAkC,IAAI;CAC5D,MAAM,SAASC,yBAAAA,YAAY,IAAI,WAAW,UAAU,CAAC,QAAQ;CAC7D,MAAM,aAAa,IAAI,WAAW,aAAa;AAE/C,QAAO,QAAQ,KAAK,MAA6B;EAC/C,MAAM,cAAc,IAAI,WAAW,oBAAoB,EAAE,IAAI;AAC7D,MAAI,CAAC,YAAa,QAAO;EAEzB,MAAM,UAAU,IAAIC,kCAAAA,wBAAwB,WAAW;AACvD,OAAK,MAAM,OAAO,cAAe,SAAQ,UAAU,IAAI;EACvD,MAAM,aAAa,QAAQ,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,EAAE,CAAC;AACpE,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI;GACF,MAAM,UAAUC,yBAAAA,kBAAkB,WAAW;AAC7C,OAAI,QAAQ,WAAW,EAAG,QAAO;GACjC,MAAM,UAAUC,yBAAAA,uBAAuB,SAAS,QAAQ,MAAM,aAAa;AAC3E,UAAO;IAAE,GAAG;IAAG;IAAS;YAChB;AACR,cAAW,SAAS;;GAEtB"}
@@ -0,0 +1,19 @@
1
+ import { DeriveLabelsOptions } from "../../labels/derive_distinct_labels.js";
2
+ import { RenderCtxBase } from "../../render/api.js";
3
+ import { DatasetOption, PColumnSelector, PObjectSpec } from "@milaboratories/pl-model-common";
4
+
5
+ //#region src/components/PlDatasetSelector/build_dataset_options.d.ts
6
+ type BuildDatasetOptions = {
7
+ /** Which result pool columns qualify as datasets. Defaults to all. */selector?: PColumnSelector | PColumnSelector[] | ((spec: PObjectSpec) => boolean); /** Formatting options for filter labels. */
8
+ labelOptions?: DeriveLabelsOptions;
9
+ };
10
+ /**
11
+ * Usage:
12
+ * ```ts
13
+ * .output("datasetOptions", (ctx) => buildDatasetOptions(ctx))
14
+ * ```
15
+ */
16
+ declare function buildDatasetOptions(ctx: RenderCtxBase, opts?: BuildDatasetOptions): DatasetOption[] | undefined;
17
+ //#endregion
18
+ export { BuildDatasetOptions, buildDatasetOptions };
19
+ //# sourceMappingURL=build_dataset_options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_dataset_options.d.ts","names":[],"sources":["../../../src/components/PlDatasetSelector/build_dataset_options.ts"],"mappings":";;;;;KAYY,mBAAA;wEAEV,QAAA,GAAW,eAAA,GAAkB,eAAA,OAAsB,IAAA,EAAM,WAAA,eAF/C;EAIV,YAAA,GAAe,mBAAA;AAAA;;;;;;;iBASD,mBAAA,CACd,GAAA,EAAK,aAAA,EACL,IAAA,GAAO,mBAAA,GACN,aAAA"}
@@ -0,0 +1,41 @@
1
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
2
+ import { ColumnCollectionBuilder } from "../../columns/column_collection_builder.js";
3
+ import { collectCtxColumnSnapshotProviders } from "../../columns/ctx_column_sources.js";
4
+ //#region src/components/PlDatasetSelector/build_dataset_options.ts
5
+ /**
6
+ * Usage:
7
+ * ```ts
8
+ * .output("datasetOptions", (ctx) => buildDatasetOptions(ctx))
9
+ * ```
10
+ */
11
+ function buildDatasetOptions(ctx, opts) {
12
+ const predicate = opts?.selector ?? (() => true);
13
+ const options = ctx.resultPool.getOptions(predicate, { refsWithEnrichments: true });
14
+ if (options.length === 0) return [];
15
+ const columnSources = collectCtxColumnSnapshotProviders(ctx);
16
+ const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);
17
+ const pframeSpec = ctx.getService("pframeSpec");
18
+ return options.map((o) => {
19
+ const datasetSpec = ctx.resultPool.getPColumnSpecByRef(o.ref);
20
+ if (!datasetSpec) return o;
21
+ const builder = new ColumnCollectionBuilder(pframeSpec);
22
+ for (const src of columnSources) builder.addSource(src);
23
+ const collection = builder.build({ anchors: { main: datasetSpec } });
24
+ if (!collection) return o;
25
+ try {
26
+ const matches = findFilterColumns(collection);
27
+ if (matches.length === 0) return o;
28
+ const filters = filterMatchesToOptions(matches, refMap, opts?.labelOptions);
29
+ return {
30
+ ...o,
31
+ filters
32
+ };
33
+ } finally {
34
+ collection.dispose();
35
+ }
36
+ });
37
+ }
38
+ //#endregion
39
+ export { buildDatasetOptions };
40
+
41
+ //# sourceMappingURL=build_dataset_options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build_dataset_options.js","names":[],"sources":["../../../src/components/PlDatasetSelector/build_dataset_options.ts"],"sourcesContent":["import type {\n DatasetOption,\n Option,\n PColumnSelector,\n PObjectSpec,\n} from \"@milaboratories/pl-model-common\";\nimport type { DeriveLabelsOptions } from \"../../labels/derive_distinct_labels\";\nimport type { RenderCtxBase } from \"../../render\";\nimport { ColumnCollectionBuilder } from \"../../columns/column_collection_builder\";\nimport { collectCtxColumnSnapshotProviders } from \"../../columns/ctx_column_sources\";\nimport { buildRefMap, filterMatchesToOptions, findFilterColumns } from \"./filter_discovery\";\n\nexport type BuildDatasetOptions = {\n /** Which result pool columns qualify as datasets. Defaults to all. */\n selector?: PColumnSelector | PColumnSelector[] | ((spec: PObjectSpec) => boolean);\n /** Formatting options for filter labels. */\n labelOptions?: DeriveLabelsOptions;\n};\n\n/**\n * Usage:\n * ```ts\n * .output(\"datasetOptions\", (ctx) => buildDatasetOptions(ctx))\n * ```\n */\nexport function buildDatasetOptions(\n ctx: RenderCtxBase,\n opts?: BuildDatasetOptions,\n): DatasetOption[] | undefined {\n const predicate = opts?.selector ?? (() => true);\n const options = ctx.resultPool.getOptions(predicate, { refsWithEnrichments: true });\n if (options.length === 0) return [];\n\n const columnSources = collectCtxColumnSnapshotProviders(ctx);\n const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);\n const pframeSpec = ctx.getService(\"pframeSpec\");\n\n return options.map((o: Option): DatasetOption => {\n const datasetSpec = ctx.resultPool.getPColumnSpecByRef(o.ref);\n if (!datasetSpec) return o;\n\n const builder = new ColumnCollectionBuilder(pframeSpec);\n for (const src of columnSources) builder.addSource(src);\n const collection = builder.build({ anchors: { main: datasetSpec } });\n if (!collection) return o;\n\n try {\n const matches = findFilterColumns(collection);\n if (matches.length === 0) return o;\n const filters = filterMatchesToOptions(matches, refMap, opts?.labelOptions);\n return { ...o, filters };\n } finally {\n collection.dispose();\n }\n });\n}\n"],"mappings":";;;;;;;;;;AAyBA,SAAgB,oBACd,KACA,MAC6B;CAC7B,MAAM,YAAY,MAAM,mBAAmB;CAC3C,MAAM,UAAU,IAAI,WAAW,WAAW,WAAW,EAAE,qBAAqB,MAAM,CAAC;AACnF,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CAEnC,MAAM,gBAAgB,kCAAkC,IAAI;CAC5D,MAAM,SAAS,YAAY,IAAI,WAAW,UAAU,CAAC,QAAQ;CAC7D,MAAM,aAAa,IAAI,WAAW,aAAa;AAE/C,QAAO,QAAQ,KAAK,MAA6B;EAC/C,MAAM,cAAc,IAAI,WAAW,oBAAoB,EAAE,IAAI;AAC7D,MAAI,CAAC,YAAa,QAAO;EAEzB,MAAM,UAAU,IAAI,wBAAwB,WAAW;AACvD,OAAK,MAAM,OAAO,cAAe,SAAQ,UAAU,IAAI;EACvD,MAAM,aAAa,QAAQ,MAAM,EAAE,SAAS,EAAE,MAAM,aAAa,EAAE,CAAC;AACpE,MAAI,CAAC,WAAY,QAAO;AAExB,MAAI;GACF,MAAM,UAAU,kBAAkB,WAAW;AAC7C,OAAI,QAAQ,WAAW,EAAG,QAAO;GACjC,MAAM,UAAU,uBAAuB,SAAS,QAAQ,MAAM,aAAa;AAC3E,UAAO;IAAE,GAAG;IAAG;IAAS;YAChB;AACR,cAAW,SAAS;;GAEtB"}
@@ -0,0 +1,60 @@
1
+ const require_runtime = require("../../_virtual/_rolldown/runtime.cjs");
2
+ const require_derive_distinct_labels = require("../../labels/derive_distinct_labels.cjs");
3
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
+ let canonicalize = require("canonicalize");
5
+ canonicalize = require_runtime.__toESM(canonicalize);
6
+ //#region src/components/PlDatasetSelector/filter_discovery.ts
7
+ /**
8
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
9
+ *
10
+ * The axes-subset constraint is enforced by `mode: "enrichment"`, which sets
11
+ * `allowFloatingHitAxes: false` — every axis of the matched column must be
12
+ * present in the anchor's axes. See `matchingModeToConstraints()` in
13
+ * `column_collection_builder.ts`.
14
+ */
15
+ function findFilterColumns(collection) {
16
+ return collection.findColumns({
17
+ mode: "enrichment",
18
+ include: { annotations: { [_milaboratories_pl_model_common.Annotation.IsSubset]: "true" } }
19
+ });
20
+ }
21
+ /**
22
+ * Derive labeled options from filter column matches, for use in DatasetOption.filters.
23
+ *
24
+ * @param matches - from findFilterColumns()
25
+ * @param refsByObjectId - from {@link buildRefMap}
26
+ * @param labelOptions - forwarded to deriveDistinctLabels()
27
+ */
28
+ function filterMatchesToOptions(matches, refsByObjectId, labelOptions) {
29
+ if (matches.length === 0) return [];
30
+ const flattened = matches.flatMap((m) => m.variants.map((v) => ({
31
+ match: m,
32
+ variant: v
33
+ })));
34
+ const labels = require_derive_distinct_labels.deriveDistinctLabels(flattened.map(({ match, variant }) => ({
35
+ spec: match.column.spec,
36
+ linkerPath: variant.path.map((p) => ({ spec: p.linker.spec }))
37
+ })), labelOptions);
38
+ return flattened.map(({ match }, i) => {
39
+ const ref = refsByObjectId.get(match.column.id);
40
+ if (ref === void 0) throw new Error(`no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`);
41
+ return {
42
+ ref,
43
+ label: labels[i]
44
+ };
45
+ });
46
+ }
47
+ /**
48
+ * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`
49
+ */
50
+ function buildRefMap(entries) {
51
+ const map = /* @__PURE__ */ new Map();
52
+ for (const entry of entries) map.set((0, canonicalize.default)(entry.ref), entry.ref);
53
+ return map;
54
+ }
55
+ //#endregion
56
+ exports.buildRefMap = buildRefMap;
57
+ exports.filterMatchesToOptions = filterMatchesToOptions;
58
+ exports.findFilterColumns = findFilterColumns;
59
+
60
+ //# sourceMappingURL=filter_discovery.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_discovery.cjs","names":["Annotation","deriveDistinctLabels"],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"sourcesContent":["import { Annotation } from \"@milaboratories/pl-model-common\";\nimport type { Option, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type {\n AnchoredColumnCollection,\n ColumnMatch,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * Matches columns annotated `pl7.app/isSubset: \"true\"` whose axes ⊆ anchor axes.\n *\n * The axes-subset constraint is enforced by `mode: \"enrichment\"`, which sets\n * `allowFloatingHitAxes: false` — every axis of the matched column must be\n * present in the anchor's axes. See `matchingModeToConstraints()` in\n * `column_collection_builder.ts`.\n */\nexport function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[] {\n return collection.findColumns({\n mode: \"enrichment\",\n include: {\n annotations: { [Annotation.IsSubset]: \"true\" },\n },\n });\n}\n\n/**\n * Derive labeled options from filter column matches, for use in DatasetOption.filters.\n *\n * @param matches - from findFilterColumns()\n * @param refsByObjectId - from {@link buildRefMap}\n * @param labelOptions - forwarded to deriveDistinctLabels()\n */\nexport function filterMatchesToOptions(\n matches: ColumnMatch[],\n refsByObjectId: ReadonlyMap<PObjectId, PlRef>,\n labelOptions?: DeriveLabelsOptions,\n): Option[] {\n if (matches.length === 0) return [];\n\n // Each ColumnMatch can be reached via multiple variants (different linker\n // paths / qualifications). We emit one Option per variant so the user can\n // pick a specific path — `deriveDistinctLabels` disambiguates labels by\n // path.\n const flattened = matches.flatMap((m) => m.variants.map((v) => ({ match: m, variant: v })));\n\n const entries: Entry[] = flattened.map(({ match, variant }) => ({\n spec: match.column.spec,\n linkerPath: variant.path.map((p) => ({ spec: p.linker.spec })),\n }));\n\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return flattened.map(({ match }, i) => {\n const ref = refsByObjectId.get(match.column.id);\n if (ref === undefined)\n throw new Error(\n `no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`,\n );\n return { ref, label: labels[i] };\n });\n}\n\n/**\n * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`\n */\nexport function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {\n const map = new Map<PObjectId, PlRef>();\n for (const entry of entries) {\n map.set(canonicalize(entry.ref)! as PObjectId, entry.ref);\n }\n return map;\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,YAAqD;AACrF,QAAO,WAAW,YAAY;EAC5B,MAAM;EACN,SAAS,EACP,aAAa,GAAGA,gCAAAA,WAAW,WAAW,QAAQ,EAC/C;EACF,CAAC;;;;;;;;;AAUJ,SAAgB,uBACd,SACA,gBACA,cACU;AACV,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CAMnC,MAAM,YAAY,QAAQ,SAAS,MAAM,EAAE,SAAS,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS;EAAG,EAAE,CAAC;CAO3F,MAAM,SAASC,+BAAAA,qBALU,UAAU,KAAK,EAAE,OAAO,eAAe;EAC9D,MAAM,MAAM,OAAO;EACnB,YAAY,QAAQ,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,EAAE;EAC/D,EAAE,EAE0C,aAAa;AAE1D,QAAO,UAAU,KAAK,EAAE,SAAS,MAAM;EACrC,MAAM,MAAM,eAAe,IAAI,MAAM,OAAO,GAAG;AAC/C,MAAI,QAAQ,KAAA,EACV,OAAM,IAAI,MACR,oCAAoC,MAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,OAAO,GAAG,GACpF;AACH,SAAO;GAAE;GAAK,OAAO,OAAO;GAAI;GAChC;;;;;AAMJ,SAAgB,YAAY,SAAoE;CAC9F,MAAM,sBAAM,IAAI,KAAuB;AACvC,MAAK,MAAM,SAAS,QAClB,KAAI,KAAA,GAAA,aAAA,SAAiB,MAAM,IAAI,EAAgB,MAAM,IAAI;AAE3D,QAAO"}
@@ -0,0 +1,31 @@
1
+ import { DeriveLabelsOptions } from "../../labels/derive_distinct_labels.js";
2
+ import { AnchoredColumnCollection, ColumnMatch } from "../../columns/column_collection_builder.js";
3
+ import { Option, PObjectId, PlRef } from "@milaboratories/pl-model-common";
4
+
5
+ //#region src/components/PlDatasetSelector/filter_discovery.d.ts
6
+ /**
7
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
8
+ *
9
+ * The axes-subset constraint is enforced by `mode: "enrichment"`, which sets
10
+ * `allowFloatingHitAxes: false` — every axis of the matched column must be
11
+ * present in the anchor's axes. See `matchingModeToConstraints()` in
12
+ * `column_collection_builder.ts`.
13
+ */
14
+ declare function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[];
15
+ /**
16
+ * Derive labeled options from filter column matches, for use in DatasetOption.filters.
17
+ *
18
+ * @param matches - from findFilterColumns()
19
+ * @param refsByObjectId - from {@link buildRefMap}
20
+ * @param labelOptions - forwarded to deriveDistinctLabels()
21
+ */
22
+ declare function filterMatchesToOptions(matches: ColumnMatch[], refsByObjectId: ReadonlyMap<PObjectId, PlRef>, labelOptions?: DeriveLabelsOptions): Option[];
23
+ /**
24
+ * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`
25
+ */
26
+ declare function buildRefMap(entries: readonly {
27
+ readonly ref: PlRef;
28
+ }[]): Map<PObjectId, PlRef>;
29
+ //#endregion
30
+ export { buildRefMap, filterMatchesToOptions, findFilterColumns };
31
+ //# sourceMappingURL=filter_discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_discovery.d.ts","names":[],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"mappings":";;;;;;;AAqBA;;;;;;iBAAgB,iBAAA,CAAkB,UAAA,EAAY,wBAAA,GAA2B,WAAA;;;AAgBzE;;;;;iBAAgB,sBAAA,CACd,OAAA,EAAS,WAAA,IACT,cAAA,EAAgB,WAAA,CAAY,SAAA,EAAW,KAAA,GACvC,YAAA,GAAe,mBAAA,GACd,MAAA;;;;iBA6Ba,WAAA,CAAY,OAAA;EAAA,SAA6B,GAAA,EAAK,KAAA;AAAA,MAAY,GAAA,CAAI,SAAA,EAAW,KAAA"}
@@ -0,0 +1,56 @@
1
+ import { deriveDistinctLabels } from "../../labels/derive_distinct_labels.js";
2
+ import { Annotation } from "@milaboratories/pl-model-common";
3
+ import canonicalize from "canonicalize";
4
+ //#region src/components/PlDatasetSelector/filter_discovery.ts
5
+ /**
6
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
7
+ *
8
+ * The axes-subset constraint is enforced by `mode: "enrichment"`, which sets
9
+ * `allowFloatingHitAxes: false` — every axis of the matched column must be
10
+ * present in the anchor's axes. See `matchingModeToConstraints()` in
11
+ * `column_collection_builder.ts`.
12
+ */
13
+ function findFilterColumns(collection) {
14
+ return collection.findColumns({
15
+ mode: "enrichment",
16
+ include: { annotations: { [Annotation.IsSubset]: "true" } }
17
+ });
18
+ }
19
+ /**
20
+ * Derive labeled options from filter column matches, for use in DatasetOption.filters.
21
+ *
22
+ * @param matches - from findFilterColumns()
23
+ * @param refsByObjectId - from {@link buildRefMap}
24
+ * @param labelOptions - forwarded to deriveDistinctLabels()
25
+ */
26
+ function filterMatchesToOptions(matches, refsByObjectId, labelOptions) {
27
+ if (matches.length === 0) return [];
28
+ const flattened = matches.flatMap((m) => m.variants.map((v) => ({
29
+ match: m,
30
+ variant: v
31
+ })));
32
+ const labels = deriveDistinctLabels(flattened.map(({ match, variant }) => ({
33
+ spec: match.column.spec,
34
+ linkerPath: variant.path.map((p) => ({ spec: p.linker.spec }))
35
+ })), labelOptions);
36
+ return flattened.map(({ match }, i) => {
37
+ const ref = refsByObjectId.get(match.column.id);
38
+ if (ref === void 0) throw new Error(`no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`);
39
+ return {
40
+ ref,
41
+ label: labels[i]
42
+ };
43
+ });
44
+ }
45
+ /**
46
+ * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`
47
+ */
48
+ function buildRefMap(entries) {
49
+ const map = /* @__PURE__ */ new Map();
50
+ for (const entry of entries) map.set(canonicalize(entry.ref), entry.ref);
51
+ return map;
52
+ }
53
+ //#endregion
54
+ export { buildRefMap, filterMatchesToOptions, findFilterColumns };
55
+
56
+ //# sourceMappingURL=filter_discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter_discovery.js","names":[],"sources":["../../../src/components/PlDatasetSelector/filter_discovery.ts"],"sourcesContent":["import { Annotation } from \"@milaboratories/pl-model-common\";\nimport type { Option, PlRef, PObjectId } from \"@milaboratories/pl-model-common\";\nimport canonicalize from \"canonicalize\";\nimport type {\n AnchoredColumnCollection,\n ColumnMatch,\n} from \"../../columns/column_collection_builder\";\nimport {\n deriveDistinctLabels,\n type DeriveLabelsOptions,\n type Entry,\n} from \"../../labels/derive_distinct_labels\";\n\n/**\n * Matches columns annotated `pl7.app/isSubset: \"true\"` whose axes ⊆ anchor axes.\n *\n * The axes-subset constraint is enforced by `mode: \"enrichment\"`, which sets\n * `allowFloatingHitAxes: false` — every axis of the matched column must be\n * present in the anchor's axes. See `matchingModeToConstraints()` in\n * `column_collection_builder.ts`.\n */\nexport function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[] {\n return collection.findColumns({\n mode: \"enrichment\",\n include: {\n annotations: { [Annotation.IsSubset]: \"true\" },\n },\n });\n}\n\n/**\n * Derive labeled options from filter column matches, for use in DatasetOption.filters.\n *\n * @param matches - from findFilterColumns()\n * @param refsByObjectId - from {@link buildRefMap}\n * @param labelOptions - forwarded to deriveDistinctLabels()\n */\nexport function filterMatchesToOptions(\n matches: ColumnMatch[],\n refsByObjectId: ReadonlyMap<PObjectId, PlRef>,\n labelOptions?: DeriveLabelsOptions,\n): Option[] {\n if (matches.length === 0) return [];\n\n // Each ColumnMatch can be reached via multiple variants (different linker\n // paths / qualifications). We emit one Option per variant so the user can\n // pick a specific path — `deriveDistinctLabels` disambiguates labels by\n // path.\n const flattened = matches.flatMap((m) => m.variants.map((v) => ({ match: m, variant: v })));\n\n const entries: Entry[] = flattened.map(({ match, variant }) => ({\n spec: match.column.spec,\n linkerPath: variant.path.map((p) => ({ spec: p.linker.spec })),\n }));\n\n const labels = deriveDistinctLabels(entries, labelOptions);\n\n return flattened.map(({ match }, i) => {\n const ref = refsByObjectId.get(match.column.id);\n if (ref === undefined)\n throw new Error(\n `no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`,\n );\n return { ref, label: labels[i] };\n });\n}\n\n/**\n * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`\n */\nexport function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {\n const map = new Map<PObjectId, PlRef>();\n for (const entry of entries) {\n map.set(canonicalize(entry.ref)! as PObjectId, entry.ref);\n }\n return map;\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,YAAqD;AACrF,QAAO,WAAW,YAAY;EAC5B,MAAM;EACN,SAAS,EACP,aAAa,GAAG,WAAW,WAAW,QAAQ,EAC/C;EACF,CAAC;;;;;;;;;AAUJ,SAAgB,uBACd,SACA,gBACA,cACU;AACV,KAAI,QAAQ,WAAW,EAAG,QAAO,EAAE;CAMnC,MAAM,YAAY,QAAQ,SAAS,MAAM,EAAE,SAAS,KAAK,OAAO;EAAE,OAAO;EAAG,SAAS;EAAG,EAAE,CAAC;CAO3F,MAAM,SAAS,qBALU,UAAU,KAAK,EAAE,OAAO,eAAe;EAC9D,MAAM,MAAM,OAAO;EACnB,YAAY,QAAQ,KAAK,KAAK,OAAO,EAAE,MAAM,EAAE,OAAO,MAAM,EAAE;EAC/D,EAAE,EAE0C,aAAa;AAE1D,QAAO,UAAU,KAAK,EAAE,SAAS,MAAM;EACrC,MAAM,MAAM,eAAe,IAAI,MAAM,OAAO,GAAG;AAC/C,MAAI,QAAQ,KAAA,EACV,OAAM,IAAI,MACR,oCAAoC,MAAM,OAAO,KAAK,KAAK,QAAQ,MAAM,OAAO,GAAG,GACpF;AACH,SAAO;GAAE;GAAK,OAAO,OAAO;GAAI;GAChC;;;;;AAMJ,SAAgB,YAAY,SAAoE;CAC9F,MAAM,sBAAM,IAAI,KAAuB;AACvC,MAAK,MAAM,SAAS,QAClB,KAAI,IAAI,aAAa,MAAM,IAAI,EAAgB,MAAM,IAAI;AAE3D,QAAO"}
@@ -0,0 +1,2 @@
1
+ require("./filter_discovery.cjs");
2
+ require("./build_dataset_options.cjs");
@@ -0,0 +1,2 @@
1
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery.js";
2
+ import { BuildDatasetOptions, buildDatasetOptions } from "./build_dataset_options.js";
@@ -0,0 +1,2 @@
1
+ import "./filter_discovery.js";
2
+ import "./build_dataset_options.js";
@@ -1,6 +1,9 @@
1
1
  require("../pframe_utils/axes.cjs");
2
2
  require("./PFrameForGraphs.cjs");
3
3
  require("./PlAnnotations/filters_ui.cjs");
4
+ require("./PlDatasetSelector/filter_discovery.cjs");
5
+ require("./PlDatasetSelector/build_dataset_options.cjs");
6
+ require("./PlDatasetSelector/index.cjs");
4
7
  require("./PlDataTable/state-migration.cjs");
5
8
  require("./PlDataTable/createPlDataTableSheet.cjs");
6
9
  require("./PlDataTable/createPlDataTable/utils.cjs");
@@ -2,6 +2,8 @@ import { AxesVault, enrichCompatible, getAvailableWithLinkersAxes } from "../pfr
2
2
  import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./PFrameForGraphs.js";
3
3
  import { AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationStep, IsNA, Log10, NotFilter, NumericalComparisonFilter, OrFilter, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, SortedCumulativeSum, TransformedColumn, ValueRank } from "./PlAnnotations/filter.js";
4
4
  import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType, FilterUiType, FormField, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./PlAnnotations/filters_ui.js";
5
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./PlDatasetSelector/filter_discovery.js";
6
+ import { BuildDatasetOptions, buildDatasetOptions } from "./PlDatasetSelector/build_dataset_options.js";
5
7
  import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson } from "./PlDataTable/typesV5.js";
6
8
  import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./PlDataTable/state-migration.js";
7
9
  import { createPlDataTableSheet } from "./PlDataTable/createPlDataTableSheet.js";
@@ -1,6 +1,9 @@
1
1
  import "../pframe_utils/axes.js";
2
2
  import "./PFrameForGraphs.js";
3
3
  import "./PlAnnotations/filters_ui.js";
4
+ import "./PlDatasetSelector/filter_discovery.js";
5
+ import "./PlDatasetSelector/build_dataset_options.js";
6
+ import "./PlDatasetSelector/index.js";
4
7
  import "./PlDataTable/state-migration.js";
5
8
  import "./PlDataTable/createPlDataTableSheet.js";
6
9
  import "./PlDataTable/createPlDataTable/utils.js";
package/dist/index.cjs CHANGED
@@ -31,6 +31,12 @@ const require_axes = require("./pframe_utils/axes.cjs");
31
31
  const require_columns = require("./pframe_utils/columns.cjs");
32
32
  const require_PFrameForGraphs = require("./components/PFrameForGraphs.cjs");
33
33
  const require_filters_ui = require("./components/PlAnnotations/filters_ui.cjs");
34
+ const require_filter_discovery = require("./components/PlDatasetSelector/filter_discovery.cjs");
35
+ const require_column_selector = require("./columns/column_selector.cjs");
36
+ const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
37
+ const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
38
+ const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
39
+ const require_build_dataset_options = require("./components/PlDatasetSelector/build_dataset_options.cjs");
34
40
  const require_filterToQuery = require("./filters/converters/filterToQuery.cjs");
35
41
  const require_filterUiToExpressionImpl = require("./filters/converters/filterUiToExpressionImpl.cjs");
36
42
  const require_distill = require("./filters/distill.cjs");
@@ -38,10 +44,6 @@ require("./filters/index.cjs");
38
44
  const require_state_migration = require("./components/PlDataTable/state-migration.cjs");
39
45
  const require_createPlDataTableSheet = require("./components/PlDataTable/createPlDataTableSheet.cjs");
40
46
  const require_column_snapshot = require("./columns/column_snapshot.cjs");
41
- const require_column_snapshot_provider = require("./columns/column_snapshot_provider.cjs");
42
- const require_column_selector = require("./columns/column_selector.cjs");
43
- const require_column_collection_builder = require("./columns/column_collection_builder.cjs");
44
- const require_ctx_column_sources = require("./columns/ctx_column_sources.cjs");
45
47
  const require_expand_by_partition = require("./columns/expand_by_partition.cjs");
46
48
  require("./columns/index.cjs");
47
49
  const require_derive_distinct_tooltips = require("./labels/derive_distinct_tooltips.cjs");
@@ -112,6 +114,8 @@ exports.UiState = require_actions.UiState;
112
114
  exports.allPColumnsReady = require_pcolumn_data.allPColumnsReady;
113
115
  exports.and = require_actions.and;
114
116
  exports.blockServiceNames = require_block_services.blockServiceNames;
117
+ exports.buildDatasetOptions = require_build_dataset_options.buildDatasetOptions;
118
+ exports.buildRefMap = require_filter_discovery.buildRefMap;
115
119
  exports.buildServices = require_service_bridge.buildServices;
116
120
  exports.collectCtxColumnSnapshotProviders = require_ctx_column_sources.collectCtxColumnSnapshotProviders;
117
121
  exports.compileAnnotationScript = require_filters_ui.compileAnnotationScript;
@@ -149,7 +153,9 @@ exports.expandByPartition = require_expand_by_partition.expandByPartition;
149
153
  exports.extractArchiveAndGetURL = require_actions.extractArchiveAndGetURL;
150
154
  exports.extractConfig = require_normalization.extractConfig;
151
155
  exports.filterDataInfoEntries = require_axis_filtering.filterDataInfoEntries;
156
+ exports.filterMatchesToOptions = require_filter_discovery.filterMatchesToOptions;
152
157
  exports.filterSpecToSpecQueryExpr = require_filterToQuery.filterSpecToSpecQueryExpr;
158
+ exports.findFilterColumns = require_filter_discovery.findFilterColumns;
153
159
  exports.flatten = require_actions.flatten;
154
160
  exports.fromPlOption = require_ref_util.fromPlOption;
155
161
  exports.fromPlRef = require_ref_util.fromPlRef;
package/dist/index.d.ts CHANGED
@@ -44,14 +44,16 @@ import { distillFilterSpec } from "./filters/distill.js";
44
44
  import { AnnotationSpec, AnnotationSpecUi, ExpressionSpec, FilterSpecUi } from "./annotations/types.js";
45
45
  import { convertFilterSpecsToExpressionSpecs } from "./annotations/converter.js";
46
46
  import { AnnotationScriptUi, AnnotationStepUi, AnyForm, FilterUi, FilterUiOfType, FilterUiType, FormField, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./components/PlAnnotations/filters_ui.js";
47
+ import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
48
+ import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
49
+ import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
50
+ import { AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, BuildOptions, ColumnCollection, ColumnCollectionBuilder, ColumnMatch, FindColumnsOptions, MatchQualifications, MatchVariant, MatchingMode } from "./columns/column_collection_builder.js";
51
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./components/PlDatasetSelector/filter_discovery.js";
52
+ import { BuildDatasetOptions, buildDatasetOptions } from "./components/PlDatasetSelector/build_dataset_options.js";
47
53
  import { PTableParamsV2, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlTableColumnId, PlTableColumnIdJson } from "./components/PlDataTable/typesV5.js";
48
54
  import { PlDataTableStateV2, createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./components/PlDataTable/state-migration.js";
49
55
  import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTableSheet.js";
50
56
  import { createPlDataTableV2 } from "./components/PlDataTable/createPlDataTable/createPlDataTableV2.js";
51
- import { ColumnData, ColumnDataStatus, ColumnSnapshot, createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
52
- import { ArrayColumnProvider, ColumnSnapshotProvider, ColumnSource, OutputColumnProvider, OutputColumnProviderOpts, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
53
- import { ColumnSelector, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, StringMatcher, convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
54
- import { AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, BuildOptions, ColumnCollection, ColumnCollectionBuilder, ColumnMatch, FindColumnsOptions, MatchQualifications, MatchVariant, MatchingMode } from "./columns/column_collection_builder.js";
55
57
  import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./columns/ctx_column_sources.js";
56
58
  import { ExpandByPartitionOpts, ExpandByPartitionResult, SplitAxis, expandByPartition } from "./columns/expand_by_partition.js";
57
59
  import { discoverTableColumnSnaphots } from "./components/PlDataTable/createPlDataTable/discoverColumns.js";
@@ -71,4 +73,4 @@ import { getService } from "./services/get_services.js";
71
73
  import { getEnvironmentValue } from "./env_value.js";
72
74
  export * from "@milaboratories/pl-model-common";
73
75
  export * from "@milaboratories/pl-error-like";
74
- export { ActAnd, ActExtractArchiveAndGetURL, ActFlatten, ActGetBlobContent, ActGetBlobContentAsJson, ActGetBlobContentAsString, ActGetDownloadedBlobContent, ActGetField, ActGetFromCtx, ActGetImmediate, ActGetLastLogs, ActGetLogHandle, ActGetOnDemandBlobContent, ActGetProgressLog, ActGetProgressLogWithInfo, ActGetResourceField, ActGetResourceValueAsJson, ActImportProgress, ActIsEmpty, ActIsolate, ActMakeArray, ActMakeObject, ActMapArrayValues, ActMapRecordValues, ActMapResourceFields, ActNot, ActOr, ActionResult, AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationScriptUi, AnnotationSpec, AnnotationSpecUi, AnnotationStep, AnnotationStepUi, AnyForm, Args, ArrayColumnProvider, AxesVault, AxisLabelProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockApiV1, BlockApiV2, BlockConfig, BlockConfigV3, BlockConfigV4, BlockDefaultModelServices, BlockDefaultUiServices, BlockModel, BlockModelInfo, BlockModelV3, BlockRenderCtx, BlockServiceFlags, BlockStatePatch, type BlockStorage, BlockStorageFacade, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, type BlockStorageSchemaVersion, BuildOptions, CancelSubscription, Cfg, CfgAnd, CfgBlobContent, CfgBlobContentAsJson, CfgBlobContentAsString, CfgDownloadedBlobContent, CfgExtractArchiveAndGetURL, CfgFlatten, CfgGetFromCtx, CfgGetJsonField, CfgGetResourceField, CfgImmediate, CfgImportProgress, CfgIsEmpty, CfgIsolate, CfgLastLogs, CfgLogHandle, CfgMakeArray, CfgMakeObject, CfgMapArrayValues, CfgMapRecordValues, CfgMapResourceFields, CfgNot, CfgOnDemandBlobContent, CfgOr, CfgProgressLog, CfgProgressLogWithInfo, CfgRenderingMode, CfgResourceValueAsJson, Checked, ColumnCollection, ColumnCollectionBuilder, ColumnData, ColumnDataStatus, ColumnMatch, ColumnMatcher, ColumnOrderRule, ColumnProvider, ColumnSelector, ColumnSnapshot, ColumnSnapshotProvider, ColumnSource, ColumnVisibilityRule, ColumnsDisplayOptions, ColumnsSelectorConfig, CommonFieldTraverseOps, CommonTraversalOps, ConfAction, ConfigRenderLambda, ConfigRenderLambdaFlags, ConfigResult, CurrentSdkInfo, DataModel, DataModelBuilder, DeriveHref, DeriveLabelsOptions, Entry, ExpandByPartitionOpts, ExpandByPartitionResult, ExpressionSpec, ExtractAction, ExtractFunctionHandleReturn, ExtractFutureRefType, FieldTraversalStep, FieldType, FilterSpec, FilterSpecLeaf, FilterSpecNode, FilterSpecOfType, FilterSpecType, FilterSpecUi, FilterUi, FilterUiOfType, FilterUiType, FindColumnsOptions, FormField, FutureRef, GetFieldStep, InferArgsType, InferBlockState, InferBlockStatePatch, InferDataType, InferFactoryData, InferFactoryModelServices, InferFactoryOutputs, InferFactoryParams, InferFactoryUiServices, InferHrefType, InferOutputType, InferOutputsFromConfigs, InferOutputsFromLambdas, InferOutputsType, InferPluginData, InferPluginHandle, InferPluginHandles, InferPluginNames, InferRenderFunctionReturn, InferUiState, InferVarTypeSafe, IsNA, It, internal_d_exports as JsRenderInternal, DeriveLabelsOptions as LabelDerivationOps, Log10, MainOutputs, MatchQualifications, MatchVariant, MatchingMode, type MigrateBlockStorageConfig, type MigrationFailure, type MigrationResult, type MigrationSuccess, ModelServices, type MutateStoragePayload, NotFilter, NumericalComparisonFilter, OptionalPlResourceEntry, OrFilter, OutputColumnProvider, OutputColumnProviderOpts, OutputError, PColumnCollection, PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, PColumnKeyList, PColumnLazyUniversal, PColumnLazyWithLabel, PColumnPredicate, PColumnResourceMapData, PColumnResourceMapEntry, PFrameImpl, POCExtractAction, PTableKey, PTableParamsV2, type ParamsInput, Patch, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlMultiSequenceAlignmentColorSchemeOption, PlMultiSequenceAlignmentModel, PlMultiSequenceAlignmentSettings, PlMultiSequenceAlignmentWidget, PlResourceEntry, PlSelectionModel, PlTableColumnId, PlTableColumnIdJson, Platforma, PlatformaApiVersion, PlatformaExtended, PlatformaFactory, PlatformaSDKVersion, PlatformaV1, PlatformaV2, PlatformaV3, type PluginConfig, type PluginData, PluginDataModel, PluginDataModelBuilder, type PluginDataModelVersions, type PluginFactory, PluginFactoryLike, PluginHandle, PluginInstance, PluginModel, type PluginName, type PluginOutputs, type PluginParams, type PluginRecord, type PluginRegistry, PluginRenderCtx, PrimitiveOrConfig, PrimitiveToCfg, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, RenderCtx, RenderCtxBase, RenderCtxLegacy, RenderFunction, RenderFunctionLegacy, ResolveCfgType, ResolveModelServices, ResolveUiServices, ResourceTraversalOps, ResourceType, ResultPool, ResultPoolColumnSnapshotProvider, SdkInfo, ServiceProxy, SimplifiedPColumnSpec, SimplifiedUniversalPColumnEntry, SnapshotColumnProvider, SortedCumulativeSum, Entry as SpecExtractorResult, SplitAxis, StagingOutputs, StdCtx, StdCtxArgsOnly, StringMatcher, TooltipEntry, Trace, TraceEntry, TransformedColumn, TreeNodeAccessor, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, TypedConfig, TypedConfigOrConfigLambda, TypedConfigOrString, UiServices, UiState, Unionize, UniversalColumnOption, UnwrapFutureRef, ValueRank, type VersionedData, allPColumnsReady, and, blockServiceNames, buildServices, collectCtxColumnSnapshotProviders, compileAnnotationScript, compileFilter, compileFilters, convertColumnSelectorToMultiColumnSelector, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector, createBlockStorage, createColumnSnapshot, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, createPlDataTableOptionsV3, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createReadyColumnData, createRowSelectionColumn, createServiceProxy, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterSpecToSpecQueryExpr, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLogHandle, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, ifDef, isBlockStorage, isColumnHidden, isColumnOptional, isColumnSnapshotProvider, isConfigLambda, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, readOutput, registerFacadeCallbacks, toColumnSnapshotProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
76
+ export { ActAnd, ActExtractArchiveAndGetURL, ActFlatten, ActGetBlobContent, ActGetBlobContentAsJson, ActGetBlobContentAsString, ActGetDownloadedBlobContent, ActGetField, ActGetFromCtx, ActGetImmediate, ActGetLastLogs, ActGetLogHandle, ActGetOnDemandBlobContent, ActGetProgressLog, ActGetProgressLogWithInfo, ActGetResourceField, ActGetResourceValueAsJson, ActImportProgress, ActIsEmpty, ActIsolate, ActMakeArray, ActMakeObject, ActMapArrayValues, ActMapRecordValues, ActMapResourceFields, ActNot, ActOr, ActionResult, AnchorEntry, AnchoredBuildOptions, AnchoredColumnCollection, AnchoredFindColumnsOptions, AndFilter, AnnotationFilter, AnnotationMode, AnnotationScript, AnnotationScript2, AnnotationScriptUi, AnnotationSpec, AnnotationSpecUi, AnnotationStep, AnnotationStepUi, AnyForm, Args, ArrayColumnProvider, AxesVault, AxisLabelProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockApiV1, BlockApiV2, BlockConfig, BlockConfigV3, BlockConfigV4, BlockDefaultModelServices, BlockDefaultUiServices, BlockModel, BlockModelInfo, BlockModelV3, BlockRenderCtx, BlockServiceFlags, BlockStatePatch, type BlockStorage, BlockStorageFacade, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, type BlockStorageSchemaVersion, BuildDatasetOptions, BuildOptions, CancelSubscription, Cfg, CfgAnd, CfgBlobContent, CfgBlobContentAsJson, CfgBlobContentAsString, CfgDownloadedBlobContent, CfgExtractArchiveAndGetURL, CfgFlatten, CfgGetFromCtx, CfgGetJsonField, CfgGetResourceField, CfgImmediate, CfgImportProgress, CfgIsEmpty, CfgIsolate, CfgLastLogs, CfgLogHandle, CfgMakeArray, CfgMakeObject, CfgMapArrayValues, CfgMapRecordValues, CfgMapResourceFields, CfgNot, CfgOnDemandBlobContent, CfgOr, CfgProgressLog, CfgProgressLogWithInfo, CfgRenderingMode, CfgResourceValueAsJson, Checked, ColumnCollection, ColumnCollectionBuilder, ColumnData, ColumnDataStatus, ColumnMatch, ColumnMatcher, ColumnOrderRule, ColumnProvider, ColumnSelector, ColumnSnapshot, ColumnSnapshotProvider, ColumnSource, ColumnVisibilityRule, ColumnsDisplayOptions, ColumnsSelectorConfig, CommonFieldTraverseOps, CommonTraversalOps, ConfAction, ConfigRenderLambda, ConfigRenderLambdaFlags, ConfigResult, CurrentSdkInfo, DataModel, DataModelBuilder, DeriveHref, DeriveLabelsOptions, Entry, ExpandByPartitionOpts, ExpandByPartitionResult, ExpressionSpec, ExtractAction, ExtractFunctionHandleReturn, ExtractFutureRefType, FieldTraversalStep, FieldType, FilterSpec, FilterSpecLeaf, FilterSpecNode, FilterSpecOfType, FilterSpecType, FilterSpecUi, FilterUi, FilterUiOfType, FilterUiType, FindColumnsOptions, FormField, FutureRef, GetFieldStep, InferArgsType, InferBlockState, InferBlockStatePatch, InferDataType, InferFactoryData, InferFactoryModelServices, InferFactoryOutputs, InferFactoryParams, InferFactoryUiServices, InferHrefType, InferOutputType, InferOutputsFromConfigs, InferOutputsFromLambdas, InferOutputsType, InferPluginData, InferPluginHandle, InferPluginHandles, InferPluginNames, InferRenderFunctionReturn, InferUiState, InferVarTypeSafe, IsNA, It, internal_d_exports as JsRenderInternal, DeriveLabelsOptions as LabelDerivationOps, Log10, MainOutputs, MatchQualifications, MatchVariant, MatchingMode, type MigrateBlockStorageConfig, type MigrationFailure, type MigrationResult, type MigrationSuccess, ModelServices, type MutateStoragePayload, NotFilter, NumericalComparisonFilter, OptionalPlResourceEntry, OrFilter, OutputColumnProvider, OutputColumnProviderOpts, OutputError, PColumnCollection, PColumnDataUniversal, PColumnEntryUniversal, PColumnEntryWithLabel, PColumnKeyList, PColumnLazyUniversal, PColumnLazyWithLabel, PColumnPredicate, PColumnResourceMapData, PColumnResourceMapEntry, PFrameImpl, POCExtractAction, PTableKey, PTableParamsV2, type ParamsInput, Patch, PatternFilter, PatternPredicate, PatternPredicateContainSubsequence, PatternPredicateEquals, PlDataTableFilterMeta, PlDataTableFilterSpecLeaf, PlDataTableFilters, PlDataTableFiltersWithMeta, PlDataTableGridStateCore, PlDataTableModel, PlDataTableSheet, PlDataTableSheetState, PlDataTableStateV2, PlDataTableStateV2CacheEntry, PlDataTableStateV2Normalized, PlMultiSequenceAlignmentColorSchemeOption, PlMultiSequenceAlignmentModel, PlMultiSequenceAlignmentSettings, PlMultiSequenceAlignmentWidget, PlResourceEntry, PlSelectionModel, PlTableColumnId, PlTableColumnIdJson, Platforma, PlatformaApiVersion, PlatformaExtended, PlatformaFactory, PlatformaSDKVersion, PlatformaV1, PlatformaV2, PlatformaV3, type PluginConfig, type PluginData, PluginDataModel, PluginDataModelBuilder, type PluginDataModelVersions, type PluginFactory, PluginFactoryLike, PluginHandle, PluginInstance, PluginModel, type PluginName, type PluginOutputs, type PluginParams, type PluginRecord, type PluginRegistry, PluginRenderCtx, PrimitiveOrConfig, PrimitiveToCfg, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RelaxedAxisSelector, RelaxedColumnSelector, RelaxedRecord, RelaxedStringMatchers, RenderCtx, RenderCtxBase, RenderCtxLegacy, RenderFunction, RenderFunctionLegacy, ResolveCfgType, ResolveModelServices, ResolveUiServices, ResourceTraversalOps, ResourceType, ResultPool, ResultPoolColumnSnapshotProvider, SdkInfo, ServiceProxy, SimplifiedPColumnSpec, SimplifiedUniversalPColumnEntry, SnapshotColumnProvider, SortedCumulativeSum, Entry as SpecExtractorResult, SplitAxis, StagingOutputs, StdCtx, StdCtxArgsOnly, StringMatcher, TooltipEntry, Trace, TraceEntry, TransformedColumn, TreeNodeAccessor, TypeField, TypeFieldRecord, TypeForm, TypeToLiteral, TypedConfig, TypedConfigOrConfigLambda, TypedConfigOrString, UiServices, UiState, Unionize, UniversalColumnOption, UnwrapFutureRef, ValueRank, type VersionedData, allPColumnsReady, and, blockServiceNames, buildDatasetOptions, buildRefMap, buildServices, collectCtxColumnSnapshotProviders, compileAnnotationScript, compileFilter, compileFilters, convertColumnSelectorToMultiColumnSelector, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector, createBlockStorage, createColumnSnapshot, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, createPlDataTableOptionsV3, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createReadyColumnData, createRowSelectionColumn, createServiceProxy, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterMatchesToOptions, filterSpecToSpecQueryExpr, findFilterColumns, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLogHandle, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, ifDef, isBlockStorage, isColumnHidden, isColumnOptional, isColumnSnapshotProvider, isConfigLambda, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, readOutput, registerFacadeCallbacks, toColumnSnapshotProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
package/dist/index.js CHANGED
@@ -30,6 +30,12 @@ import { enrichCompatible, getAvailableWithLinkersAxes } from "./pframe_utils/ax
30
30
  import { getAllRelatedColumns, getRelatedColumns } from "./pframe_utils/columns.js";
31
31
  import { createPFrameForGraphs, isHiddenFromGraphColumn, isHiddenFromUIColumn } from "./components/PFrameForGraphs.js";
32
32
  import { compileAnnotationScript, compileFilter, compileFilters, unreachable } from "./components/PlAnnotations/filters_ui.js";
33
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./components/PlDatasetSelector/filter_discovery.js";
34
+ import { convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
35
+ import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
36
+ import { ColumnCollectionBuilder } from "./columns/column_collection_builder.js";
37
+ import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./columns/ctx_column_sources.js";
38
+ import { buildDatasetOptions } from "./components/PlDatasetSelector/build_dataset_options.js";
33
39
  import { filterSpecToSpecQueryExpr } from "./filters/converters/filterToQuery.js";
34
40
  import { convertFilterUiToExpressionImpl, convertFilterUiToExpressions } from "./filters/converters/filterUiToExpressionImpl.js";
35
41
  import { distillFilterSpec } from "./filters/distill.js";
@@ -37,10 +43,6 @@ import "./filters/index.js";
37
43
  import { createDefaultPTableParams, createPlDataTableStateV2, upgradePlDataTableStateV2 } from "./components/PlDataTable/state-migration.js";
38
44
  import { createPlDataTableSheet } from "./components/PlDataTable/createPlDataTableSheet.js";
39
45
  import { createColumnSnapshot, createReadyColumnData } from "./columns/column_snapshot.js";
40
- import { ArrayColumnProvider, OutputColumnProvider, SnapshotColumnProvider, isColumnSnapshotProvider, toColumnSnapshotProvider } from "./columns/column_snapshot_provider.js";
41
- import { convertColumnSelectorToMultiColumnSelector, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector } from "./columns/column_selector.js";
42
- import { ColumnCollectionBuilder } from "./columns/column_collection_builder.js";
43
- import { ResultPoolColumnSnapshotProvider, collectCtxColumnSnapshotProviders } from "./columns/ctx_column_sources.js";
44
46
  import { expandByPartition } from "./columns/expand_by_partition.js";
45
47
  import "./columns/index.js";
46
48
  import { deriveDistinctTooltips } from "./labels/derive_distinct_tooltips.js";
@@ -62,4 +64,4 @@ import { getAxisUniqueValues, getColumnOrAxisValueLabelsId, getColumnSpecById, g
62
64
  import { getEnvironmentValue } from "./env_value.js";
63
65
  export * from "@milaboratories/pl-model-common";
64
66
  export * from "@milaboratories/pl-error-like";
65
- export { Args, ArrayColumnProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockModel, BlockModelV3, BlockRenderCtx, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, ColumnCollectionBuilder, CurrentSdkInfo, DataModel, DataModelBuilder, FutureRef, It, internal_exports as JsRenderInternal, MainOutputs, OutputColumnProvider, OutputError, PColumnCollection, PFrameImpl, PlatformaSDKVersion, PluginDataModel, PluginDataModelBuilder, PluginInstance, PluginModel, PluginRenderCtx, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RenderCtxBase, RenderCtxLegacy, ResultPool, ResultPoolColumnSnapshotProvider, SnapshotColumnProvider, StagingOutputs, TreeNodeAccessor, UiState, allPColumnsReady, and, blockServiceNames, buildServices, collectCtxColumnSnapshotProviders, compileAnnotationScript, compileFilter, compileFilters, convertColumnSelectorToMultiColumnSelector, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector, createBlockStorage, createColumnSnapshot, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createReadyColumnData, createRowSelectionColumn, createServiceProxy, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterSpecToSpecQueryExpr, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLogHandle, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, ifDef, isBlockStorage, isColumnHidden, isColumnOptional, isColumnSnapshotProvider, isConfigLambda, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, readOutput, registerFacadeCallbacks, toColumnSnapshotProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
67
+ export { Args, ArrayColumnProvider, BLOCK_SERVICE_FLAGS, BLOCK_STORAGE_FACADE_VERSION, BlockModel, BlockModelV3, BlockRenderCtx, BlockStorageFacadeCallbacks, BlockStorageFacadeHandles, ColumnCollectionBuilder, CurrentSdkInfo, DataModel, DataModelBuilder, FutureRef, It, internal_exports as JsRenderInternal, MainOutputs, OutputColumnProvider, OutputError, PColumnCollection, PFrameImpl, PlatformaSDKVersion, PluginDataModel, PluginDataModelBuilder, PluginInstance, PluginModel, PluginRenderCtx, RT_BINARY_PARTITIONED, RT_BINARY_SUPER_PARTITIONED, RT_JSON_PARTITIONED, RT_JSON_SUPER_PARTITIONED, RT_PARQUET_PARTITIONED, RT_PARQUET_SUPER_PARTITIONED, RT_RESOURCE_MAP, RT_RESOURCE_MAP_PARTITIONED, RenderCtxBase, RenderCtxLegacy, ResultPool, ResultPoolColumnSnapshotProvider, SnapshotColumnProvider, StagingOutputs, TreeNodeAccessor, UiState, allPColumnsReady, and, blockServiceNames, buildDatasetOptions, buildRefMap, buildServices, collectCtxColumnSnapshotProviders, compileAnnotationScript, compileFilter, compileFilters, convertColumnSelectorToMultiColumnSelector, convertFilterSpecsToExpressionSpecs, convertFilterUiToExpressionImpl, convertFilterUiToExpressions, convertOrParsePColumnData, convertRelaxedAxisSelectorToMultiAxisSelector, convertRelaxedColumnSelectorToMultiColumnSelector, createBlockStorage, createColumnSnapshot, createDefaultPTableParams, createPFrameForGraphs, createPlDataTable, createPlDataTableSheet, createPlDataTableStateV2, createPlDataTableV2, createPlDataTableV3, createPlSelectionModel, createReadyColumnData, createRowSelectionColumn, createServiceProxy, deriveDataFromStorage, deriveDistinctLabels, deriveDistinctTooltips, deriveLabels, discoverTableColumnSnaphots, distillFilterSpec, downgradeCfgOrLambda, enrichCompatible, expandByPartition, extractArchiveAndGetURL, extractConfig, filterDataInfoEntries, filterMatchesToOptions, filterSpecToSpecQueryExpr, findFilterColumns, flatten, fromPlOption, fromPlRef, getAllRelatedColumns, getAvailableWithLinkersAxes, getAxisUniqueValues, getBlobContent, getBlobContentAsJson, getBlobContentAsString, getColumnOrAxisValueLabelsId, getColumnSpecById, getColumnUniqueValues, getColumnsFull, getDownloadedBlobContent, getEffectiveVisibility, getEnvironmentValue, getFromCfg, getImmediate, getImportProgress, getJsonField, getLastLogs, getLogHandle, getOnDemandBlobContent, getOrderPriority, getPartitionKeysList, getPlatformaApiVersion, getPluginData, getProgressLog, getProgressLogWithInfo, getRawPlatformaInstance, getRelatedColumns, getRequestColumnsFromSelectedSources, getResourceField, getResourceValueAsJson, getService, getSingleColumnData, getStorageData, getUniquePartitionKeys, getUniqueSourceValuesWithLabels, ifDef, isBlockStorage, isColumnHidden, isColumnOptional, isColumnSnapshotProvider, isConfigLambda, isEmpty, isHiddenFromGraphColumn, isHiddenFromUIColumn, isPColumnReady, isPluginOutputKey, isolate, makeArray, makeObject, mapArrayValues, mapRecordValues, mapResourceFields, migrateBlockStorage, normalizeBlockStorage, not, or, parsePColumnData, parseResourceMap, pluginOutputKey, pluginOutputPrefix, readOutput, registerFacadeCallbacks, toColumnSnapshotProvider, unreachable, updateStorageData, upgradePlDataTableStateV2, wrapOutputs };
package/dist/package.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.66.2";
2
+ var version = "1.67.0";
3
3
  //#endregion
4
4
  Object.defineProperty(exports, "version", {
5
5
  enumerable: true,
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "1.66.2";
2
+ var version = "1.67.0";
3
3
  //#endregion
4
4
  export { version };
5
5
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platforma-sdk/model",
3
- "version": "1.66.2",
3
+ "version": "1.67.0",
4
4
  "description": "Platforma.bio SDK / Block Model",
5
5
  "files": [
6
6
  "./dist/**/*",
@@ -30,20 +30,20 @@
30
30
  "fast-json-patch": "^3.1.1",
31
31
  "utility-types": "^3.11.0",
32
32
  "zod": "~3.25.76",
33
- "@milaboratories/pl-error-like": "1.12.9",
34
33
  "@milaboratories/helpers": "1.14.1",
35
- "@milaboratories/pl-model-common": "1.34.1",
36
- "@milaboratories/pl-model-middle-layer": "1.18.3",
37
- "@milaboratories/ptabler-expression-js": "1.2.13"
34
+ "@milaboratories/pl-model-common": "1.35.0",
35
+ "@milaboratories/pl-model-middle-layer": "1.18.4",
36
+ "@milaboratories/pl-error-like": "1.12.9",
37
+ "@milaboratories/ptabler-expression-js": "1.2.14"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@vitest/coverage-istanbul": "^4.1.3",
41
41
  "fast-json-patch": "^3.1.1",
42
42
  "typescript": "~5.9.3",
43
43
  "vitest": "^4.1.3",
44
- "@milaboratories/pf-driver": "1.3.10",
44
+ "@milaboratories/pf-driver": "1.3.11",
45
45
  "@milaboratories/build-configs": "2.0.0",
46
- "@milaboratories/pf-spec-driver": "1.3.2",
46
+ "@milaboratories/pf-spec-driver": "1.3.3",
47
47
  "@milaboratories/ts-builder": "1.3.2",
48
48
  "@milaboratories/ts-configs": "1.2.3"
49
49
  },
@@ -24,7 +24,8 @@ export function wrapOutputs<Outputs extends BlockOutputsBase>(
24
24
  outputs: Outputs,
25
25
  ): SimpleOutputs<Outputs> {
26
26
  return new Proxy(outputs, {
27
- get(target, key: string) {
27
+ get(target, key, receiver) {
28
+ if (typeof key === "symbol" || !(key in target)) return Reflect.get(target, key, receiver);
28
29
  return readOutput(target[key]);
29
30
  },
30
31
  }) as SimpleOutputs<Outputs>;
@@ -0,0 +1,56 @@
1
+ import type {
2
+ DatasetOption,
3
+ Option,
4
+ PColumnSelector,
5
+ PObjectSpec,
6
+ } from "@milaboratories/pl-model-common";
7
+ import type { DeriveLabelsOptions } from "../../labels/derive_distinct_labels";
8
+ import type { RenderCtxBase } from "../../render";
9
+ import { ColumnCollectionBuilder } from "../../columns/column_collection_builder";
10
+ import { collectCtxColumnSnapshotProviders } from "../../columns/ctx_column_sources";
11
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery";
12
+
13
+ export type BuildDatasetOptions = {
14
+ /** Which result pool columns qualify as datasets. Defaults to all. */
15
+ selector?: PColumnSelector | PColumnSelector[] | ((spec: PObjectSpec) => boolean);
16
+ /** Formatting options for filter labels. */
17
+ labelOptions?: DeriveLabelsOptions;
18
+ };
19
+
20
+ /**
21
+ * Usage:
22
+ * ```ts
23
+ * .output("datasetOptions", (ctx) => buildDatasetOptions(ctx))
24
+ * ```
25
+ */
26
+ export function buildDatasetOptions(
27
+ ctx: RenderCtxBase,
28
+ opts?: BuildDatasetOptions,
29
+ ): DatasetOption[] | undefined {
30
+ const predicate = opts?.selector ?? (() => true);
31
+ const options = ctx.resultPool.getOptions(predicate, { refsWithEnrichments: true });
32
+ if (options.length === 0) return [];
33
+
34
+ const columnSources = collectCtxColumnSnapshotProviders(ctx);
35
+ const refMap = buildRefMap(ctx.resultPool.getSpecs().entries);
36
+ const pframeSpec = ctx.getService("pframeSpec");
37
+
38
+ return options.map((o: Option): DatasetOption => {
39
+ const datasetSpec = ctx.resultPool.getPColumnSpecByRef(o.ref);
40
+ if (!datasetSpec) return o;
41
+
42
+ const builder = new ColumnCollectionBuilder(pframeSpec);
43
+ for (const src of columnSources) builder.addSource(src);
44
+ const collection = builder.build({ anchors: { main: datasetSpec } });
45
+ if (!collection) return o;
46
+
47
+ try {
48
+ const matches = findFilterColumns(collection);
49
+ if (matches.length === 0) return o;
50
+ const filters = filterMatchesToOptions(matches, refMap, opts?.labelOptions);
51
+ return { ...o, filters };
52
+ } finally {
53
+ collection.dispose();
54
+ }
55
+ });
56
+ }
@@ -0,0 +1,156 @@
1
+ import { Annotation, createPlRef } from "@milaboratories/pl-model-common";
2
+ import type { AxisSpec, PColumnSpec, PlRef, PObjectId } from "@milaboratories/pl-model-common";
3
+ import { SpecDriver } from "@milaboratories/pf-spec-driver";
4
+ import canonicalize from "canonicalize";
5
+ import { afterEach, describe, expect, test } from "vitest";
6
+ import type { ColumnSnapshot } from "../../columns/column_snapshot";
7
+ import { ColumnCollectionBuilder } from "../../columns/column_collection_builder";
8
+ import { buildRefMap, filterMatchesToOptions, findFilterColumns } from "./filter_discovery";
9
+
10
+ const drivers: SpecDriver[] = [];
11
+
12
+ function createSpecFrameCtx() {
13
+ const driver = new SpecDriver();
14
+ drivers.push(driver);
15
+ return driver;
16
+ }
17
+
18
+ afterEach(async () => {
19
+ for (const driver of drivers) await driver.dispose();
20
+ drivers.length = 0;
21
+ });
22
+
23
+ function axis(name: string): AxisSpec {
24
+ return { name, type: "String" } as AxisSpec;
25
+ }
26
+
27
+ function spec(
28
+ name: string,
29
+ axesSpec: AxisSpec[],
30
+ annotations: Record<string, string> = {},
31
+ ): PColumnSpec {
32
+ return { kind: "PColumn", name, valueType: "Int", axesSpec, annotations } as PColumnSpec;
33
+ }
34
+
35
+ function snap(id: string, s: PColumnSpec): ColumnSnapshot<PObjectId> {
36
+ return { id: id as PObjectId, spec: s, dataStatus: "ready", data: { get: () => ({}) as never } };
37
+ }
38
+
39
+ // anchor defines the key space: [sample, gene]
40
+ const anchorAxes = [axis("sample"), axis("gene")];
41
+ const anchorSpec = spec("anchor", anchorAxes);
42
+ const anchorSnap = snap("anchor-id", anchorSpec);
43
+
44
+ describe("findFilterColumns", () => {
45
+ test("returns columns with pl7.app/isSubset annotation", () => {
46
+ const filter = snap("f1", spec("filter1", [axis("sample")], { [Annotation.IsSubset]: "true" }));
47
+ const regular = snap("r1", spec("regular1", [axis("sample")]));
48
+
49
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
50
+ builder.addSource([filter, regular, anchorSnap]);
51
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
52
+
53
+ const results = findFilterColumns(collection);
54
+ expect(results.every((m) => m.column.spec.name !== "regular1")).toBe(true);
55
+ expect(results.some((m) => m.column.spec.name === "filter1")).toBe(true);
56
+ });
57
+
58
+ test("axes subset: excludes filter whose axes are not a subset of anchor axes", () => {
59
+ // filter with axis "other" — not a subset of anchor axes [sample, gene]
60
+ const badFilter = snap(
61
+ "f2",
62
+ spec("bad-filter", [axis("other")], { [Annotation.IsSubset]: "true" }),
63
+ );
64
+
65
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
66
+ builder.addSource([badFilter, anchorSnap]);
67
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
68
+
69
+ const results = findFilterColumns(collection);
70
+ expect(results.every((m) => m.column.spec.name !== "bad-filter")).toBe(true);
71
+ });
72
+
73
+ test("empty result when no filters exist", () => {
74
+ const regular = snap("r1", spec("regular1", [axis("sample")]));
75
+
76
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
77
+ builder.addSource([regular, anchorSnap]);
78
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
79
+
80
+ expect(findFilterColumns(collection)).toHaveLength(0);
81
+ });
82
+ });
83
+
84
+ describe("buildRefMap", () => {
85
+ test("maps canonicalized PlRef to original ref", () => {
86
+ const ref1 = createPlRef("b1", "out1");
87
+ const ref2 = createPlRef("b2", "out2", true);
88
+ const entries = [{ ref: ref1 }, { ref: ref2 }];
89
+
90
+ const map = buildRefMap(entries);
91
+
92
+ expect(map.get(canonicalize(ref1)! as PObjectId)).toBe(ref1);
93
+ expect(map.get(canonicalize(ref2)! as PObjectId)).toBe(ref2);
94
+ expect(map.size).toBe(2);
95
+ });
96
+
97
+ test("returns empty map for empty entries", () => {
98
+ expect(buildRefMap([]).size).toBe(0);
99
+ });
100
+ });
101
+
102
+ describe("filterMatchesToOptions", () => {
103
+ test("converts filter matches to Option[] with derived labels", () => {
104
+ const filterRef1 = createPlRef("b1", "filter-top1000");
105
+ const filterRef2 = createPlRef("b1", "filter-highconf");
106
+
107
+ // Build ref map from entries (simulating result pool)
108
+ const refMap = buildRefMap([
109
+ { ref: anchorSnap.id as unknown as PlRef }, // anchor — won't be looked up
110
+ { ref: filterRef1 },
111
+ { ref: filterRef2 },
112
+ ]);
113
+
114
+ // Build filter specs with isSubset annotation
115
+ const filterSpec1 = spec("filter1", [axis("sample")], { [Annotation.IsSubset]: "true" });
116
+ const filterSpec2 = spec("filter2", [axis("sample")], { [Annotation.IsSubset]: "true" });
117
+
118
+ // Use the canonical PlRef as the PObjectId (matches how result pool works)
119
+ const f1Snap = snap(canonicalize(filterRef1)! as string, filterSpec1);
120
+ const f2Snap = snap(canonicalize(filterRef2)! as string, filterSpec2);
121
+
122
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
123
+ builder.addSource([f1Snap, f2Snap, anchorSnap]);
124
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
125
+
126
+ const matches = findFilterColumns(collection);
127
+ expect(matches.length).toBe(2);
128
+
129
+ const options = filterMatchesToOptions(matches, refMap);
130
+ expect(options).toHaveLength(2);
131
+ // Each option has a ref and label
132
+ for (const opt of options) {
133
+ expect(opt.ref).toBeDefined();
134
+ expect(opt.label).toBeDefined();
135
+ expect(typeof opt.label).toBe("string");
136
+ }
137
+ });
138
+
139
+ test("returns empty array for empty matches", () => {
140
+ expect(filterMatchesToOptions([], new Map())).toEqual([]);
141
+ });
142
+
143
+ test("throws when ref not found in map", () => {
144
+ const filterSpec1 = spec("orphan", [axis("sample")], { [Annotation.IsSubset]: "true" });
145
+ const f1Snap = snap("orphan-id", filterSpec1);
146
+
147
+ const builder = new ColumnCollectionBuilder(createSpecFrameCtx());
148
+ builder.addSource([f1Snap, anchorSnap]);
149
+ const collection = builder.build({ anchors: { main: anchorSpec } })!;
150
+
151
+ const matches = findFilterColumns(collection);
152
+ expect(matches.length).toBe(1);
153
+
154
+ expect(() => filterMatchesToOptions(matches, new Map())).toThrow(/no PlRef found/);
155
+ });
156
+ });
@@ -0,0 +1,77 @@
1
+ import { Annotation } from "@milaboratories/pl-model-common";
2
+ import type { Option, PlRef, PObjectId } from "@milaboratories/pl-model-common";
3
+ import canonicalize from "canonicalize";
4
+ import type {
5
+ AnchoredColumnCollection,
6
+ ColumnMatch,
7
+ } from "../../columns/column_collection_builder";
8
+ import {
9
+ deriveDistinctLabels,
10
+ type DeriveLabelsOptions,
11
+ type Entry,
12
+ } from "../../labels/derive_distinct_labels";
13
+
14
+ /**
15
+ * Matches columns annotated `pl7.app/isSubset: "true"` whose axes ⊆ anchor axes.
16
+ *
17
+ * The axes-subset constraint is enforced by `mode: "enrichment"`, which sets
18
+ * `allowFloatingHitAxes: false` — every axis of the matched column must be
19
+ * present in the anchor's axes. See `matchingModeToConstraints()` in
20
+ * `column_collection_builder.ts`.
21
+ */
22
+ export function findFilterColumns(collection: AnchoredColumnCollection): ColumnMatch[] {
23
+ return collection.findColumns({
24
+ mode: "enrichment",
25
+ include: {
26
+ annotations: { [Annotation.IsSubset]: "true" },
27
+ },
28
+ });
29
+ }
30
+
31
+ /**
32
+ * Derive labeled options from filter column matches, for use in DatasetOption.filters.
33
+ *
34
+ * @param matches - from findFilterColumns()
35
+ * @param refsByObjectId - from {@link buildRefMap}
36
+ * @param labelOptions - forwarded to deriveDistinctLabels()
37
+ */
38
+ export function filterMatchesToOptions(
39
+ matches: ColumnMatch[],
40
+ refsByObjectId: ReadonlyMap<PObjectId, PlRef>,
41
+ labelOptions?: DeriveLabelsOptions,
42
+ ): Option[] {
43
+ if (matches.length === 0) return [];
44
+
45
+ // Each ColumnMatch can be reached via multiple variants (different linker
46
+ // paths / qualifications). We emit one Option per variant so the user can
47
+ // pick a specific path — `deriveDistinctLabels` disambiguates labels by
48
+ // path.
49
+ const flattened = matches.flatMap((m) => m.variants.map((v) => ({ match: m, variant: v })));
50
+
51
+ const entries: Entry[] = flattened.map(({ match, variant }) => ({
52
+ spec: match.column.spec,
53
+ linkerPath: variant.path.map((p) => ({ spec: p.linker.spec })),
54
+ }));
55
+
56
+ const labels = deriveDistinctLabels(entries, labelOptions);
57
+
58
+ return flattened.map(({ match }, i) => {
59
+ const ref = refsByObjectId.get(match.column.id);
60
+ if (ref === undefined)
61
+ throw new Error(
62
+ `no PlRef found for filter column ${match.column.spec.name} (id: ${match.column.id})`,
63
+ );
64
+ return { ref, label: labels[i] };
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Usage: `buildRefMap(ctx.resultPool.getSpecs().entries)`
70
+ */
71
+ export function buildRefMap(entries: readonly { readonly ref: PlRef }[]): Map<PObjectId, PlRef> {
72
+ const map = new Map<PObjectId, PlRef>();
73
+ for (const entry of entries) {
74
+ map.set(canonicalize(entry.ref)! as PObjectId, entry.ref);
75
+ }
76
+ return map;
77
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./filter_discovery";
2
+ export * from "./build_dataset_options";
@@ -1,5 +1,6 @@
1
1
  export * from "./PFrameForGraphs";
2
2
  export * from "./PlAnnotations";
3
+ export * from "./PlDatasetSelector";
3
4
  export * from "./PlDataTable";
4
5
  export * from "./PlMultiSequenceAlignment";
5
6
  export * from "./PlSelectionModel";