@sqlrooms/mosaic 0.29.0-rc.0 → 0.29.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -2
- package/dist/MosaicChart.d.ts +20 -0
- package/dist/MosaicChart.d.ts.map +1 -0
- package/dist/MosaicChart.js +25 -0
- package/dist/MosaicChart.js.map +1 -0
- package/dist/MosaicChartBuilder.d.ts +32 -0
- package/dist/MosaicChartBuilder.d.ts.map +1 -0
- package/dist/MosaicChartBuilder.js +35 -0
- package/dist/MosaicChartBuilder.js.map +1 -0
- package/dist/MosaicColorLegend.d.ts +18 -0
- package/dist/MosaicColorLegend.d.ts.map +1 -0
- package/dist/MosaicColorLegend.js +117 -0
- package/dist/MosaicColorLegend.js.map +1 -0
- package/dist/MosaicSlice.d.ts +16 -13
- package/dist/MosaicSlice.d.ts.map +1 -1
- package/dist/MosaicSlice.js +67 -32
- package/dist/MosaicSlice.js.map +1 -1
- package/dist/VgPlotChart.d.ts +8 -0
- package/dist/VgPlotChart.d.ts.map +1 -1
- package/dist/VgPlotChart.js +26 -6
- package/dist/VgPlotChart.js.map +1 -1
- package/dist/chart-builders/ChartBuilderContent.d.ts +26 -0
- package/dist/chart-builders/ChartBuilderContent.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderContent.js +59 -0
- package/dist/chart-builders/ChartBuilderContent.js.map +1 -0
- package/dist/chart-builders/ChartBuilderContext.d.ts +11 -0
- package/dist/chart-builders/ChartBuilderContext.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderContext.js +10 -0
- package/dist/chart-builders/ChartBuilderContext.js.map +1 -0
- package/dist/chart-builders/ChartBuilderDialog.d.ts +23 -0
- package/dist/chart-builders/ChartBuilderDialog.d.ts.map +1 -0
- package/dist/chart-builders/ChartBuilderDialog.js +15 -0
- package/dist/chart-builders/ChartBuilderDialog.js.map +1 -0
- package/dist/chart-builders/FieldSelectorInput.d.ts +13 -0
- package/dist/chart-builders/FieldSelectorInput.d.ts.map +1 -0
- package/dist/chart-builders/FieldSelectorInput.js +19 -0
- package/dist/chart-builders/FieldSelectorInput.js.map +1 -0
- package/dist/chart-builders/builders.d.ts +7 -0
- package/dist/chart-builders/builders.d.ts.map +1 -0
- package/dist/chart-builders/builders.js +280 -0
- package/dist/chart-builders/builders.js.map +1 -0
- package/dist/chart-builders/chartSpecTitle.d.ts +7 -0
- package/dist/chart-builders/chartSpecTitle.d.ts.map +1 -0
- package/dist/chart-builders/chartSpecTitle.js +10 -0
- package/dist/chart-builders/chartSpecTitle.js.map +1 -0
- package/dist/chart-builders/createMosaicChartTool.d.ts +45 -0
- package/dist/chart-builders/createMosaicChartTool.d.ts.map +1 -0
- package/dist/chart-builders/createMosaicChartTool.js +109 -0
- package/dist/chart-builders/createMosaicChartTool.js.map +1 -0
- package/dist/chart-builders/describeChartSpecs.d.ts +7 -0
- package/dist/chart-builders/describeChartSpecs.d.ts.map +1 -0
- package/dist/chart-builders/describeChartSpecs.js +38 -0
- package/dist/chart-builders/describeChartSpecs.js.map +1 -0
- package/dist/chart-builders/types.d.ts +40 -0
- package/dist/chart-builders/types.d.ts.map +1 -0
- package/dist/chart-builders/types.js +2 -0
- package/dist/chart-builders/types.js.map +1 -0
- package/dist/dashboard/MosaicDashboard.d.ts +20 -0
- package/dist/dashboard/MosaicDashboard.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboard.js +68 -0
- package/dist/dashboard/MosaicDashboard.js.map +1 -0
- package/dist/dashboard/MosaicDashboardChartPanel.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardChartPanel.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardChartPanel.js +49 -0
- package/dist/dashboard/MosaicDashboardChartPanel.js.map +1 -0
- package/dist/dashboard/MosaicDashboardCharts.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardCharts.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardCharts.js +45 -0
- package/dist/dashboard/MosaicDashboardCharts.js.map +1 -0
- package/dist/dashboard/MosaicDashboardContext.d.ts +11 -0
- package/dist/dashboard/MosaicDashboardContext.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardContext.js +10 -0
- package/dist/dashboard/MosaicDashboardContext.js.map +1 -0
- package/dist/dashboard/MosaicDashboardProfiler.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardProfiler.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardProfiler.js +21 -0
- package/dist/dashboard/MosaicDashboardProfiler.js.map +1 -0
- package/dist/dashboard/MosaicDashboardSlice.d.ts +68 -0
- package/dist/dashboard/MosaicDashboardSlice.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardSlice.js +230 -0
- package/dist/dashboard/MosaicDashboardSlice.js.map +1 -0
- package/dist/dashboard/MosaicDashboardToolbar.d.ts +3 -0
- package/dist/dashboard/MosaicDashboardToolbar.d.ts.map +1 -0
- package/dist/dashboard/MosaicDashboardToolbar.js +19 -0
- package/dist/dashboard/MosaicDashboardToolbar.js.map +1 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts +8 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.d.ts.map +1 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.js +40 -0
- package/dist/dashboard/VgPlotSpecPopoverEditor.js.map +1 -0
- package/dist/editor/MosaicChartContainer.d.ts +51 -0
- package/dist/editor/MosaicChartContainer.d.ts.map +1 -0
- package/dist/editor/MosaicChartContainer.js +39 -0
- package/dist/editor/MosaicChartContainer.js.map +1 -0
- package/dist/editor/MosaicChartDisplay.d.ts +18 -0
- package/dist/editor/MosaicChartDisplay.d.ts.map +1 -0
- package/dist/editor/MosaicChartDisplay.js +21 -0
- package/dist/editor/MosaicChartDisplay.js.map +1 -0
- package/dist/editor/MosaicChartEditorActions.d.ts +20 -0
- package/dist/editor/MosaicChartEditorActions.d.ts.map +1 -0
- package/dist/editor/MosaicChartEditorActions.js +18 -0
- package/dist/editor/MosaicChartEditorActions.js.map +1 -0
- package/dist/editor/MosaicCodeMirrorEditor.d.ts +15 -0
- package/dist/editor/MosaicCodeMirrorEditor.d.ts.map +1 -0
- package/dist/editor/MosaicCodeMirrorEditor.js +26 -0
- package/dist/editor/MosaicCodeMirrorEditor.js.map +1 -0
- package/dist/editor/MosaicEditorContext.d.ts +8 -0
- package/dist/editor/MosaicEditorContext.d.ts.map +1 -0
- package/dist/editor/MosaicEditorContext.js +14 -0
- package/dist/editor/MosaicEditorContext.js.map +1 -0
- package/dist/editor/MosaicSpecEditorPanel.d.ts +20 -0
- package/dist/editor/MosaicSpecEditorPanel.d.ts.map +1 -0
- package/dist/editor/MosaicSpecEditorPanel.js +25 -0
- package/dist/editor/MosaicSpecEditorPanel.js.map +1 -0
- package/dist/editor/mosaicSchema.d.ts +20 -0
- package/dist/editor/mosaicSchema.d.ts.map +1 -0
- package/dist/editor/mosaicSchema.js +57 -0
- package/dist/editor/mosaicSchema.js.map +1 -0
- package/dist/editor/types.d.ts +72 -0
- package/dist/editor/types.d.ts.map +1 -0
- package/dist/editor/types.js +2 -0
- package/dist/editor/types.js.map +1 -0
- package/dist/editor/useMosaicChartEditor.d.ts +9 -0
- package/dist/editor/useMosaicChartEditor.d.ts.map +1 -0
- package/dist/editor/useMosaicChartEditor.js +199 -0
- package/dist/editor/useMosaicChartEditor.js.map +1 -0
- package/dist/index.d.ts +27 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/profiler/MosaicProfiler.d.ts +32 -0
- package/dist/profiler/MosaicProfiler.d.ts.map +1 -0
- package/dist/profiler/MosaicProfiler.js +57 -0
- package/dist/profiler/MosaicProfiler.js.map +1 -0
- package/dist/profiler/MosaicProfilerHeader.d.ts +7 -0
- package/dist/profiler/MosaicProfilerHeader.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerHeader.js +196 -0
- package/dist/profiler/MosaicProfilerHeader.js.map +1 -0
- package/dist/profiler/MosaicProfilerRows.d.ts +9 -0
- package/dist/profiler/MosaicProfilerRows.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerRows.js +65 -0
- package/dist/profiler/MosaicProfilerRows.js.map +1 -0
- package/dist/profiler/MosaicProfilerStatusBar.d.ts +9 -0
- package/dist/profiler/MosaicProfilerStatusBar.d.ts.map +1 -0
- package/dist/profiler/MosaicProfilerStatusBar.js +28 -0
- package/dist/profiler/MosaicProfilerStatusBar.js.map +1 -0
- package/dist/profiler/ProfilerCategoryClient.d.ts +50 -0
- package/dist/profiler/ProfilerCategoryClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerCategoryClient.js +121 -0
- package/dist/profiler/ProfilerCategoryClient.js.map +1 -0
- package/dist/profiler/ProfilerCountClient.d.ts +28 -0
- package/dist/profiler/ProfilerCountClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerCountClient.js +51 -0
- package/dist/profiler/ProfilerCountClient.js.map +1 -0
- package/dist/profiler/ProfilerHistogramClient.d.ts +69 -0
- package/dist/profiler/ProfilerHistogramClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerHistogramClient.js +179 -0
- package/dist/profiler/ProfilerHistogramClient.js.map +1 -0
- package/dist/profiler/ProfilerPageClient.d.ts +37 -0
- package/dist/profiler/ProfilerPageClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerPageClient.js +65 -0
- package/dist/profiler/ProfilerPageClient.js.map +1 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts +24 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.d.ts.map +1 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.js +51 -0
- package/dist/profiler/ProfilerUnsupportedSummaryClient.js.map +1 -0
- package/dist/profiler/createProfilerStore.d.ts +45 -0
- package/dist/profiler/createProfilerStore.d.ts.map +1 -0
- package/dist/profiler/createProfilerStore.js +120 -0
- package/dist/profiler/createProfilerStore.js.map +1 -0
- package/dist/profiler/layout.d.ts +7 -0
- package/dist/profiler/layout.d.ts.map +1 -0
- package/dist/profiler/layout.js +13 -0
- package/dist/profiler/layout.js.map +1 -0
- package/dist/profiler/profilerController.d.ts +64 -0
- package/dist/profiler/profilerController.d.ts.map +1 -0
- package/dist/profiler/profilerController.js +123 -0
- package/dist/profiler/profilerController.js.map +1 -0
- package/dist/profiler/types.d.ts +86 -0
- package/dist/profiler/types.d.ts.map +1 -0
- package/dist/profiler/types.js +2 -0
- package/dist/profiler/types.js.map +1 -0
- package/dist/profiler/useMosaicProfiler.d.ts +7 -0
- package/dist/profiler/useMosaicProfiler.d.ts.map +1 -0
- package/dist/profiler/useMosaicProfiler.js +339 -0
- package/dist/profiler/useMosaicProfiler.js.map +1 -0
- package/dist/profiler/utils.d.ts +61 -0
- package/dist/profiler/utils.d.ts.map +1 -0
- package/dist/profiler/utils.js +347 -0
- package/dist/profiler/utils.js.map +1 -0
- package/dist/tableInterop.d.ts +30 -0
- package/dist/tableInterop.d.ts.map +1 -0
- package/dist/tableInterop.js +85 -0
- package/dist/tableInterop.js.map +1 -0
- package/dist/use-mosaic.d.ts +11 -0
- package/dist/use-mosaic.d.ts.map +1 -0
- package/dist/use-mosaic.js +42 -0
- package/dist/use-mosaic.js.map +1 -0
- package/dist/useMosaicClient.d.ts +5 -4
- package/dist/useMosaicClient.d.ts.map +1 -1
- package/dist/useMosaicClient.js +13 -3
- package/dist/useMosaicClient.js.map +1 -1
- package/package.json +24 -6
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { MosaicClient, type Selection } from '@uwdata/mosaic-core';
|
|
2
|
+
import { type ExprNode, Query } from '@uwdata/mosaic-sql';
|
|
3
|
+
import type * as arrow from 'apache-arrow';
|
|
4
|
+
import type { MosaicProfilerCategorySummary } from './types';
|
|
5
|
+
import { type CategoryCountRow } from './utils';
|
|
6
|
+
type CategoryClientOptions = {
|
|
7
|
+
categoryLimit: number;
|
|
8
|
+
field: arrow.Field;
|
|
9
|
+
onStateChange: (summary: MosaicProfilerCategorySummary) => void;
|
|
10
|
+
selection: Selection;
|
|
11
|
+
tableName: string;
|
|
12
|
+
};
|
|
13
|
+
export declare class ProfilerCategoryClient extends MosaicClient {
|
|
14
|
+
private readonly categoryLimit;
|
|
15
|
+
private filteredError?;
|
|
16
|
+
private filteredLoading;
|
|
17
|
+
private readonly field;
|
|
18
|
+
private readonly onStateChange;
|
|
19
|
+
private selectedKey?;
|
|
20
|
+
private filteredRows?;
|
|
21
|
+
private readonly tableName;
|
|
22
|
+
private totalError?;
|
|
23
|
+
private totalLoading;
|
|
24
|
+
private totalRows?;
|
|
25
|
+
constructor(options: CategoryClientOptions);
|
|
26
|
+
get filterStable(): boolean;
|
|
27
|
+
private emitSummary;
|
|
28
|
+
setTotalError(error?: Error): void;
|
|
29
|
+
setTotalLoading(isLoading: boolean): void;
|
|
30
|
+
setTotalRows(rows: CategoryCountRow[]): void;
|
|
31
|
+
queryPending(): this;
|
|
32
|
+
query(filter?: Array<ExprNode>): Query;
|
|
33
|
+
queryResult(data: unknown): this;
|
|
34
|
+
queryError(error: Error): this;
|
|
35
|
+
reset(): void;
|
|
36
|
+
toggleValue(key: string): void;
|
|
37
|
+
}
|
|
38
|
+
type ProfilerCategoryTotalClientOptions = {
|
|
39
|
+
summaryClient: ProfilerCategoryClient;
|
|
40
|
+
};
|
|
41
|
+
export declare class ProfilerCategoryTotalClient extends MosaicClient {
|
|
42
|
+
private readonly summaryClient;
|
|
43
|
+
constructor(options: ProfilerCategoryTotalClientOptions);
|
|
44
|
+
queryPending(): this;
|
|
45
|
+
query(filter?: Array<ExprNode>): Query;
|
|
46
|
+
queryResult(data: unknown): this;
|
|
47
|
+
queryError(error: Error): this;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
50
|
+
//# sourceMappingURL=ProfilerCategoryClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerCategoryClient.d.ts","sourceRoot":"","sources":["../../src/profiler/ProfilerCategoryClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAe,KAAK,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,EAAC,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAC,6BAA6B,EAAC,MAAM,SAAS,CAAC;AAC3D,OAAO,EAIL,KAAK,gBAAgB,EAGtB,MAAM,SAAS,CAAC;AAEjB,KAAK,qBAAqB,GAAG;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,aAAa,EAAE,CAAC,OAAO,EAAE,6BAA6B,KAAK,IAAI,CAAC;IAChE,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,YAAY;IACtD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,aAAa,CAAC,CAAQ;IAC9B,OAAO,CAAC,eAAe,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAEpB;IACV,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAAC,CAAQ;IAC3B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAqB;gBAE3B,OAAO,EAAE,qBAAqB;IAQ1C,IAAa,YAAY,IAAI,OAAO,CAEnC;IAED,OAAO,CAAC,WAAW;IAuBnB,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK;IAM3B,eAAe,CAAC,SAAS,EAAE,OAAO;IAQlC,YAAY,CAAC,IAAI,EAAE,gBAAgB,EAAE;IAY5B,YAAY,IAAI,IAAI;IAOpB,KAAK,CAAC,MAAM,GAAE,KAAK,CAAC,QAAQ,CAAM,GAAG,KAAK;IAI1C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAchC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAOvC,KAAK;IAKL,WAAW,CAAC,GAAG,EAAE,MAAM;CAiBxB;AAED,KAAK,kCAAkC,GAAG;IACxC,aAAa,EAAE,sBAAsB,CAAC;CACvC,CAAC;AAEF,qBAAa,2BAA4B,SAAQ,YAAY;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;gBAE3C,OAAO,EAAE,kCAAkC;IAK9C,YAAY,IAAI,IAAI;IAKpB,KAAK,CAAC,MAAM,GAAE,KAAK,CAAC,QAAQ,CAAM,GAAG,KAAK;IAI1C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAOhC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAIxC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { MosaicClient, clausePoint } from '@uwdata/mosaic-core';
|
|
2
|
+
import { buildCategoryBuckets, buildCategorySummaryQuery, categoryKeyToSelectionValue, isSelectableCategoryKey, rowsFromQueryResult, } from './utils';
|
|
3
|
+
export class ProfilerCategoryClient extends MosaicClient {
|
|
4
|
+
categoryLimit;
|
|
5
|
+
filteredError;
|
|
6
|
+
filteredLoading = true;
|
|
7
|
+
field;
|
|
8
|
+
onStateChange;
|
|
9
|
+
selectedKey;
|
|
10
|
+
filteredRows;
|
|
11
|
+
tableName;
|
|
12
|
+
totalError;
|
|
13
|
+
totalLoading = true;
|
|
14
|
+
totalRows;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super(options.selection);
|
|
17
|
+
this.categoryLimit = options.categoryLimit;
|
|
18
|
+
this.field = options.field;
|
|
19
|
+
this.onStateChange = options.onStateChange;
|
|
20
|
+
this.tableName = options.tableName;
|
|
21
|
+
}
|
|
22
|
+
get filterStable() {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
emitSummary() {
|
|
26
|
+
const filteredRows = this.filteredRows ?? (this.filteredLoading ? (this.totalRows ?? []) : []);
|
|
27
|
+
const totalRows = this.totalRows ?? (this.totalLoading ? (this.filteredRows ?? []) : []);
|
|
28
|
+
const { bucketCount, buckets } = buildCategoryBuckets(filteredRows, totalRows, this.categoryLimit, this.selectedKey);
|
|
29
|
+
this.onStateChange({
|
|
30
|
+
bucketCount,
|
|
31
|
+
buckets,
|
|
32
|
+
error: this.filteredError ?? this.totalError,
|
|
33
|
+
isLoading: this.filteredLoading || this.totalLoading,
|
|
34
|
+
kind: 'category',
|
|
35
|
+
selectedKey: this.selectedKey,
|
|
36
|
+
toggleValue: (key) => this.toggleValue(key),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
setTotalError(error) {
|
|
40
|
+
this.totalError = error;
|
|
41
|
+
this.totalLoading = false;
|
|
42
|
+
this.emitSummary();
|
|
43
|
+
}
|
|
44
|
+
setTotalLoading(isLoading) {
|
|
45
|
+
this.totalLoading = isLoading;
|
|
46
|
+
if (isLoading) {
|
|
47
|
+
this.totalError = undefined;
|
|
48
|
+
}
|
|
49
|
+
this.emitSummary();
|
|
50
|
+
}
|
|
51
|
+
setTotalRows(rows) {
|
|
52
|
+
this.totalRows = rows
|
|
53
|
+
.slice()
|
|
54
|
+
.sort((left, right) => right.total - left.total);
|
|
55
|
+
this.totalError = undefined;
|
|
56
|
+
this.totalLoading = false;
|
|
57
|
+
this.emitSummary();
|
|
58
|
+
}
|
|
59
|
+
queryPending() {
|
|
60
|
+
this.filteredLoading = true;
|
|
61
|
+
this.filteredError = undefined;
|
|
62
|
+
this.emitSummary();
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
query(filter = []) {
|
|
66
|
+
return buildCategorySummaryQuery(this.tableName, this.field.name, filter);
|
|
67
|
+
}
|
|
68
|
+
queryResult(data) {
|
|
69
|
+
const rows = rowsFromQueryResult(data)
|
|
70
|
+
.slice()
|
|
71
|
+
.sort((left, right) => right.total - left.total);
|
|
72
|
+
this.filteredRows = rows;
|
|
73
|
+
this.filteredError = undefined;
|
|
74
|
+
this.filteredLoading = false;
|
|
75
|
+
this.emitSummary();
|
|
76
|
+
return this;
|
|
77
|
+
}
|
|
78
|
+
queryError(error) {
|
|
79
|
+
this.filteredError = error;
|
|
80
|
+
this.filteredLoading = false;
|
|
81
|
+
this.emitSummary();
|
|
82
|
+
return this;
|
|
83
|
+
}
|
|
84
|
+
reset() {
|
|
85
|
+
this.selectedKey = undefined;
|
|
86
|
+
this.emitSummary();
|
|
87
|
+
}
|
|
88
|
+
toggleValue(key) {
|
|
89
|
+
if (!isSelectableCategoryKey(key)) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
this.selectedKey = this.selectedKey === key ? undefined : key;
|
|
93
|
+
this.filterBy?.update(clausePoint(this.field.name, categoryKeyToSelectionValue(this.selectedKey), {
|
|
94
|
+
source: this,
|
|
95
|
+
}));
|
|
96
|
+
this.emitSummary();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export class ProfilerCategoryTotalClient extends MosaicClient {
|
|
100
|
+
summaryClient;
|
|
101
|
+
constructor(options) {
|
|
102
|
+
super();
|
|
103
|
+
this.summaryClient = options.summaryClient;
|
|
104
|
+
}
|
|
105
|
+
queryPending() {
|
|
106
|
+
this.summaryClient.setTotalLoading(true);
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
query(filter = []) {
|
|
110
|
+
return this.summaryClient.query(filter);
|
|
111
|
+
}
|
|
112
|
+
queryResult(data) {
|
|
113
|
+
this.summaryClient.setTotalRows(rowsFromQueryResult(data));
|
|
114
|
+
return this;
|
|
115
|
+
}
|
|
116
|
+
queryError(error) {
|
|
117
|
+
this.summaryClient.setTotalError(error);
|
|
118
|
+
return this;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=ProfilerCategoryClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerCategoryClient.js","sourceRoot":"","sources":["../../src/profiler/ProfilerCategoryClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {MosaicClient, clausePoint, type Selection} from '@uwdata/mosaic-core';\nimport {type ExprNode, Query} from '@uwdata/mosaic-sql';\nimport type * as arrow from 'apache-arrow';\nimport type {MosaicProfilerCategorySummary} from './types';\nimport {\n buildCategoryBuckets,\n buildCategorySummaryQuery,\n categoryKeyToSelectionValue,\n type CategoryCountRow,\n isSelectableCategoryKey,\n rowsFromQueryResult,\n} from './utils';\n\ntype CategoryClientOptions = {\n categoryLimit: number;\n field: arrow.Field;\n onStateChange: (summary: MosaicProfilerCategorySummary) => void;\n selection: Selection;\n tableName: string;\n};\n\nexport class ProfilerCategoryClient extends MosaicClient {\n private readonly categoryLimit: number;\n private filteredError?: Error;\n private filteredLoading = true;\n private readonly field: arrow.Field;\n private readonly onStateChange: (\n summary: MosaicProfilerCategorySummary,\n ) => void;\n private selectedKey?: string;\n private filteredRows?: CategoryCountRow[];\n private readonly tableName: string;\n private totalError?: Error;\n private totalLoading = true;\n private totalRows?: CategoryCountRow[];\n\n constructor(options: CategoryClientOptions) {\n super(options.selection);\n this.categoryLimit = options.categoryLimit;\n this.field = options.field;\n this.onStateChange = options.onStateChange;\n this.tableName = options.tableName;\n }\n\n override get filterStable(): boolean {\n return false;\n }\n\n private emitSummary() {\n const filteredRows =\n this.filteredRows ?? (this.filteredLoading ? (this.totalRows ?? []) : []);\n const totalRows =\n this.totalRows ?? (this.totalLoading ? (this.filteredRows ?? []) : []);\n const {bucketCount, buckets} = buildCategoryBuckets(\n filteredRows,\n totalRows,\n this.categoryLimit,\n this.selectedKey,\n );\n\n this.onStateChange({\n bucketCount,\n buckets,\n error: this.filteredError ?? this.totalError,\n isLoading: this.filteredLoading || this.totalLoading,\n kind: 'category',\n selectedKey: this.selectedKey,\n toggleValue: (key) => this.toggleValue(key),\n });\n }\n\n setTotalError(error?: Error) {\n this.totalError = error;\n this.totalLoading = false;\n this.emitSummary();\n }\n\n setTotalLoading(isLoading: boolean) {\n this.totalLoading = isLoading;\n if (isLoading) {\n this.totalError = undefined;\n }\n this.emitSummary();\n }\n\n setTotalRows(rows: CategoryCountRow[]) {\n this.totalRows = rows\n .slice()\n .sort(\n (left: CategoryCountRow, right: CategoryCountRow) =>\n right.total - left.total,\n );\n this.totalError = undefined;\n this.totalLoading = false;\n this.emitSummary();\n }\n\n override queryPending(): this {\n this.filteredLoading = true;\n this.filteredError = undefined;\n this.emitSummary();\n return this;\n }\n\n override query(filter: Array<ExprNode> = []): Query {\n return buildCategorySummaryQuery(this.tableName, this.field.name, filter);\n }\n\n override queryResult(data: unknown): this {\n const rows = rowsFromQueryResult<CategoryCountRow>(data)\n .slice()\n .sort(\n (left: CategoryCountRow, right: CategoryCountRow) =>\n right.total - left.total,\n );\n this.filteredRows = rows;\n this.filteredError = undefined;\n this.filteredLoading = false;\n this.emitSummary();\n return this;\n }\n\n override queryError(error: Error): this {\n this.filteredError = error;\n this.filteredLoading = false;\n this.emitSummary();\n return this;\n }\n\n reset() {\n this.selectedKey = undefined;\n this.emitSummary();\n }\n\n toggleValue(key: string) {\n if (!isSelectableCategoryKey(key)) {\n return;\n }\n\n this.selectedKey = this.selectedKey === key ? undefined : key;\n this.filterBy?.update(\n clausePoint(\n this.field.name,\n categoryKeyToSelectionValue(this.selectedKey),\n {\n source: this,\n },\n ),\n );\n this.emitSummary();\n }\n}\n\ntype ProfilerCategoryTotalClientOptions = {\n summaryClient: ProfilerCategoryClient;\n};\n\nexport class ProfilerCategoryTotalClient extends MosaicClient {\n private readonly summaryClient: ProfilerCategoryClient;\n\n constructor(options: ProfilerCategoryTotalClientOptions) {\n super();\n this.summaryClient = options.summaryClient;\n }\n\n override queryPending(): this {\n this.summaryClient.setTotalLoading(true);\n return this;\n }\n\n override query(filter: Array<ExprNode> = []): Query {\n return this.summaryClient.query(filter);\n }\n\n override queryResult(data: unknown): this {\n this.summaryClient.setTotalRows(\n rowsFromQueryResult<CategoryCountRow>(data),\n );\n return this;\n }\n\n override queryError(error: Error): this {\n this.summaryClient.setTotalError(error);\n return this;\n }\n}\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { MosaicClient, type Selection } from '@uwdata/mosaic-core';
|
|
2
|
+
import { type ExprNode, type Query } from '@uwdata/mosaic-sql';
|
|
3
|
+
export type ProfilerCountState = {
|
|
4
|
+
count?: number;
|
|
5
|
+
error?: Error;
|
|
6
|
+
isLoading: boolean;
|
|
7
|
+
};
|
|
8
|
+
type ProfilerCountClientOptions = {
|
|
9
|
+
filterStable?: boolean;
|
|
10
|
+
onStateChange: (state: ProfilerCountState) => void;
|
|
11
|
+
selection?: Selection;
|
|
12
|
+
tableName: string;
|
|
13
|
+
};
|
|
14
|
+
export declare class ProfilerCountClient extends MosaicClient {
|
|
15
|
+
private count?;
|
|
16
|
+
private error?;
|
|
17
|
+
private readonly isFilterStable;
|
|
18
|
+
private readonly onStateChange;
|
|
19
|
+
private readonly tableName;
|
|
20
|
+
constructor(options: ProfilerCountClientOptions);
|
|
21
|
+
get filterStable(): boolean;
|
|
22
|
+
queryPending(): this;
|
|
23
|
+
query(filter?: Array<ExprNode>): Query;
|
|
24
|
+
queryResult(data: unknown): this;
|
|
25
|
+
queryError(error: Error): this;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=ProfilerCountClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerCountClient.d.ts","sourceRoot":"","sources":["../../src/profiler/ProfilerCountClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,KAAK,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAG7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACnD,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsC;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,0BAA0B;IAO/C,IAAa,YAAY,IAAI,OAAO,CAEnC;IAEQ,YAAY,IAAI,IAAI;IASpB,KAAK,CAAC,MAAM,GAAE,KAAK,CAAC,QAAQ,CAAM,GAAG,KAAK;IAO1C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAUhC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CASxC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { MosaicClient } from '@uwdata/mosaic-core';
|
|
2
|
+
import { buildCountQuery, readCountData } from './utils';
|
|
3
|
+
export class ProfilerCountClient extends MosaicClient {
|
|
4
|
+
count;
|
|
5
|
+
error;
|
|
6
|
+
isFilterStable;
|
|
7
|
+
onStateChange;
|
|
8
|
+
tableName;
|
|
9
|
+
constructor(options) {
|
|
10
|
+
super(options.selection);
|
|
11
|
+
this.isFilterStable = options.filterStable ?? false;
|
|
12
|
+
this.onStateChange = options.onStateChange;
|
|
13
|
+
this.tableName = options.tableName;
|
|
14
|
+
}
|
|
15
|
+
get filterStable() {
|
|
16
|
+
return this.isFilterStable;
|
|
17
|
+
}
|
|
18
|
+
queryPending() {
|
|
19
|
+
this.onStateChange({
|
|
20
|
+
count: this.count,
|
|
21
|
+
error: this.error,
|
|
22
|
+
isLoading: true,
|
|
23
|
+
});
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
query(filter = []) {
|
|
27
|
+
return buildCountQuery({
|
|
28
|
+
filter,
|
|
29
|
+
tableName: this.tableName,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
queryResult(data) {
|
|
33
|
+
this.count = readCountData(data);
|
|
34
|
+
this.error = undefined;
|
|
35
|
+
this.onStateChange({
|
|
36
|
+
count: this.count,
|
|
37
|
+
isLoading: false,
|
|
38
|
+
});
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
queryError(error) {
|
|
42
|
+
this.error = error;
|
|
43
|
+
this.onStateChange({
|
|
44
|
+
count: this.count,
|
|
45
|
+
error,
|
|
46
|
+
isLoading: false,
|
|
47
|
+
});
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=ProfilerCountClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerCountClient.js","sourceRoot":"","sources":["../../src/profiler/ProfilerCountClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AAEjE,OAAO,EAAC,eAAe,EAAE,aAAa,EAAC,MAAM,SAAS,CAAC;AAevD,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IAC3C,KAAK,CAAU;IACf,KAAK,CAAS;IACL,cAAc,CAAU;IACxB,aAAa,CAAsC;IACnD,SAAS,CAAS;IAEnC,YAAY,OAAmC;QAC7C,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC;QACpD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,IAAa,YAAY;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEQ,YAAY;QACnB,IAAI,CAAC,aAAa,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,KAAK,CAAC,SAA0B,EAAE;QACzC,OAAO,eAAe,CAAC;YACrB,MAAM;YACN,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAEQ,WAAW,CAAC,IAAa;QAChC,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAEQ,UAAU,CAAC,KAAY;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,aAAa,CAAC;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK;YACL,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["import {MosaicClient, type Selection} from '@uwdata/mosaic-core';\nimport {type ExprNode, type Query} from '@uwdata/mosaic-sql';\nimport {buildCountQuery, readCountData} from './utils';\n\nexport type ProfilerCountState = {\n count?: number;\n error?: Error;\n isLoading: boolean;\n};\n\ntype ProfilerCountClientOptions = {\n filterStable?: boolean;\n onStateChange: (state: ProfilerCountState) => void;\n selection?: Selection;\n tableName: string;\n};\n\nexport class ProfilerCountClient extends MosaicClient {\n private count?: number;\n private error?: Error;\n private readonly isFilterStable: boolean;\n private readonly onStateChange: (state: ProfilerCountState) => void;\n private readonly tableName: string;\n\n constructor(options: ProfilerCountClientOptions) {\n super(options.selection);\n this.isFilterStable = options.filterStable ?? false;\n this.onStateChange = options.onStateChange;\n this.tableName = options.tableName;\n }\n\n override get filterStable(): boolean {\n return this.isFilterStable;\n }\n\n override queryPending(): this {\n this.onStateChange({\n count: this.count,\n error: this.error,\n isLoading: true,\n });\n return this;\n }\n\n override query(filter: Array<ExprNode> = []): Query {\n return buildCountQuery({\n filter,\n tableName: this.tableName,\n });\n }\n\n override queryResult(data: unknown): this {\n this.count = readCountData(data);\n this.error = undefined;\n this.onStateChange({\n count: this.count,\n isLoading: false,\n });\n return this;\n }\n\n override queryError(error: Error): this {\n this.error = error;\n this.onStateChange({\n count: this.count,\n error,\n isLoading: false,\n });\n return this;\n }\n}\n"]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { FieldInfo } from '@uwdata/mosaic-core';
|
|
2
|
+
import { MosaicClient, type Selection } from '@uwdata/mosaic-core';
|
|
3
|
+
import { type ExprNode, Query } from '@uwdata/mosaic-sql';
|
|
4
|
+
import type * as arrow from 'apache-arrow';
|
|
5
|
+
import type { MosaicProfilerHistogramSummary } from './types';
|
|
6
|
+
type HistogramStateChange = (summary: MosaicProfilerHistogramSummary) => void;
|
|
7
|
+
type HistogramClientOptions = {
|
|
8
|
+
field: arrow.Field;
|
|
9
|
+
onStateChange: HistogramStateChange;
|
|
10
|
+
selection: Selection;
|
|
11
|
+
steps: number;
|
|
12
|
+
tableName: string;
|
|
13
|
+
valueType: 'date' | 'number';
|
|
14
|
+
};
|
|
15
|
+
type HistogramRow = {
|
|
16
|
+
x1: number | Date | null;
|
|
17
|
+
x2: number | Date | null;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
export declare class ProfilerHistogramClient extends MosaicClient {
|
|
21
|
+
readonly type = "rectY";
|
|
22
|
+
private filteredError?;
|
|
23
|
+
private filteredLoading;
|
|
24
|
+
private readonly field;
|
|
25
|
+
private fieldInfo?;
|
|
26
|
+
private fieldInfoPromise?;
|
|
27
|
+
private filteredBins?;
|
|
28
|
+
private filteredNullCount?;
|
|
29
|
+
private readonly interactor;
|
|
30
|
+
private readonly onStateChange;
|
|
31
|
+
private readonly select;
|
|
32
|
+
private readonly tableName;
|
|
33
|
+
private totalBins?;
|
|
34
|
+
private totalError?;
|
|
35
|
+
private totalLoading;
|
|
36
|
+
private totalNullCount?;
|
|
37
|
+
private readonly valueType;
|
|
38
|
+
constructor(options: HistogramClientOptions);
|
|
39
|
+
get filterStable(): boolean;
|
|
40
|
+
private emitSummary;
|
|
41
|
+
ensureFieldInfo(): Promise<void>;
|
|
42
|
+
setTotalError(error?: Error): void;
|
|
43
|
+
setTotalLoading(isLoading: boolean): void;
|
|
44
|
+
setTotalRows(rows: HistogramRow[]): void;
|
|
45
|
+
queryPending(): this;
|
|
46
|
+
prepare(): Promise<void>;
|
|
47
|
+
query(filter?: Array<ExprNode>): Query;
|
|
48
|
+
queryResult(data: unknown): this;
|
|
49
|
+
queryError(error: Error): this;
|
|
50
|
+
channelField(channel: string): FieldInfo;
|
|
51
|
+
get plot(): {
|
|
52
|
+
getAttribute(name: string): undefined;
|
|
53
|
+
markSet: Set<ProfilerHistogramClient>;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
type ProfilerHistogramTotalClientOptions = {
|
|
57
|
+
summaryClient: ProfilerHistogramClient;
|
|
58
|
+
};
|
|
59
|
+
export declare class ProfilerHistogramTotalClient extends MosaicClient {
|
|
60
|
+
private readonly summaryClient;
|
|
61
|
+
constructor(options: ProfilerHistogramTotalClientOptions);
|
|
62
|
+
prepare(): Promise<void>;
|
|
63
|
+
queryPending(): this;
|
|
64
|
+
query(filter?: Array<ExprNode>): Query;
|
|
65
|
+
queryResult(data: unknown): this;
|
|
66
|
+
queryError(error: Error): this;
|
|
67
|
+
}
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=ProfilerHistogramClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerHistogramClient.d.ts","sourceRoot":"","sources":["../../src/profiler/ProfilerHistogramClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { MosaicClient, queryFieldInfo, } from '@uwdata/mosaic-core';
|
|
2
|
+
import { Interval1D, bin } from '@uwdata/mosaic-plot';
|
|
3
|
+
import { count, Query } from '@uwdata/mosaic-sql';
|
|
4
|
+
import { rowsFromQueryResult, splitHistogramBins } from './utils';
|
|
5
|
+
export class ProfilerHistogramClient extends MosaicClient {
|
|
6
|
+
type = 'rectY';
|
|
7
|
+
filteredError;
|
|
8
|
+
filteredLoading = true;
|
|
9
|
+
field;
|
|
10
|
+
fieldInfo;
|
|
11
|
+
fieldInfoPromise;
|
|
12
|
+
filteredBins;
|
|
13
|
+
filteredNullCount;
|
|
14
|
+
interactor;
|
|
15
|
+
onStateChange;
|
|
16
|
+
select;
|
|
17
|
+
tableName;
|
|
18
|
+
totalBins;
|
|
19
|
+
totalError;
|
|
20
|
+
totalLoading = true;
|
|
21
|
+
totalNullCount;
|
|
22
|
+
valueType;
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super(options.selection);
|
|
25
|
+
this.field = options.field;
|
|
26
|
+
this.onStateChange = options.onStateChange;
|
|
27
|
+
this.tableName = options.tableName;
|
|
28
|
+
this.valueType = options.valueType;
|
|
29
|
+
const binned = bin(options.field.name, { steps: options.steps })(this, 'x');
|
|
30
|
+
this.select = { x1: binned.x1, x2: binned.x2, y: count() };
|
|
31
|
+
this.interactor = new Interval1D(this, {
|
|
32
|
+
brush: undefined,
|
|
33
|
+
channel: 'x',
|
|
34
|
+
field: options.field.name,
|
|
35
|
+
peers: false,
|
|
36
|
+
selection: options.selection,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
get filterStable() {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
emitSummary() {
|
|
43
|
+
const totalRows = this.totalBins ?? (this.totalLoading ? (this.filteredBins ?? []) : []);
|
|
44
|
+
const total = splitHistogramBins(totalRows);
|
|
45
|
+
const filteredRows = this.filteredBins ?? (this.filteredLoading ? (this.totalBins ?? []) : []);
|
|
46
|
+
const filtered = splitHistogramBins(filteredRows);
|
|
47
|
+
this.onStateChange({
|
|
48
|
+
error: this.filteredError ?? this.totalError,
|
|
49
|
+
filteredBins: filtered.bins,
|
|
50
|
+
filteredNullCount: this.filteredNullCount ??
|
|
51
|
+
(this.filteredLoading ? total.nullCount : filtered.nullCount),
|
|
52
|
+
interactor: this.interactor,
|
|
53
|
+
isLoading: this.filteredLoading || this.totalLoading,
|
|
54
|
+
kind: 'histogram',
|
|
55
|
+
totalBins: total.bins,
|
|
56
|
+
totalNullCount: this.totalNullCount ??
|
|
57
|
+
(this.totalLoading ? filtered.nullCount : total.nullCount),
|
|
58
|
+
valueType: this.valueType,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async ensureFieldInfo() {
|
|
62
|
+
if (this.fieldInfo) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (!this.fieldInfoPromise) {
|
|
66
|
+
this.fieldInfoPromise = queryFieldInfo(this.coordinator, [
|
|
67
|
+
{
|
|
68
|
+
table: this.tableName,
|
|
69
|
+
column: this.field.name,
|
|
70
|
+
stats: ['min', 'max'],
|
|
71
|
+
},
|
|
72
|
+
])
|
|
73
|
+
.then(([info]) => {
|
|
74
|
+
this.fieldInfo = info;
|
|
75
|
+
})
|
|
76
|
+
.catch((error) => {
|
|
77
|
+
this.fieldInfo = undefined;
|
|
78
|
+
this.fieldInfoPromise = undefined;
|
|
79
|
+
throw error;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
await this.fieldInfoPromise;
|
|
83
|
+
}
|
|
84
|
+
setTotalError(error) {
|
|
85
|
+
this.totalError = error;
|
|
86
|
+
this.totalLoading = false;
|
|
87
|
+
this.emitSummary();
|
|
88
|
+
}
|
|
89
|
+
setTotalLoading(isLoading) {
|
|
90
|
+
this.totalLoading = isLoading;
|
|
91
|
+
if (isLoading) {
|
|
92
|
+
this.totalError = undefined;
|
|
93
|
+
}
|
|
94
|
+
this.emitSummary();
|
|
95
|
+
}
|
|
96
|
+
setTotalRows(rows) {
|
|
97
|
+
const { nullCount } = splitHistogramBins(rows);
|
|
98
|
+
this.totalBins = rows;
|
|
99
|
+
this.totalNullCount = nullCount;
|
|
100
|
+
this.totalError = undefined;
|
|
101
|
+
this.totalLoading = false;
|
|
102
|
+
this.emitSummary();
|
|
103
|
+
}
|
|
104
|
+
queryPending() {
|
|
105
|
+
this.filteredLoading = true;
|
|
106
|
+
this.filteredError = undefined;
|
|
107
|
+
this.emitSummary();
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
async prepare() {
|
|
111
|
+
await this.ensureFieldInfo();
|
|
112
|
+
}
|
|
113
|
+
query(filter = []) {
|
|
114
|
+
return Query.from({ source: this.tableName })
|
|
115
|
+
.select(this.select)
|
|
116
|
+
.groupby([this.select.x1, this.select.x2])
|
|
117
|
+
.where(filter);
|
|
118
|
+
}
|
|
119
|
+
queryResult(data) {
|
|
120
|
+
const rows = rowsFromQueryResult(data);
|
|
121
|
+
const { nullCount } = splitHistogramBins(rows);
|
|
122
|
+
this.filteredBins = rows;
|
|
123
|
+
this.filteredNullCount = nullCount;
|
|
124
|
+
this.filteredError = undefined;
|
|
125
|
+
this.filteredLoading = false;
|
|
126
|
+
this.emitSummary();
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
queryError(error) {
|
|
130
|
+
this.filteredError = error;
|
|
131
|
+
this.filteredLoading = false;
|
|
132
|
+
this.emitSummary();
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
channelField(channel) {
|
|
136
|
+
if (channel !== 'x') {
|
|
137
|
+
throw new Error('ProfilerHistogramClient only supports x bins');
|
|
138
|
+
}
|
|
139
|
+
if (!this.fieldInfo) {
|
|
140
|
+
throw new Error('Field info is required before histogram binning');
|
|
141
|
+
}
|
|
142
|
+
return this.fieldInfo;
|
|
143
|
+
}
|
|
144
|
+
get plot() {
|
|
145
|
+
const markSet = new Set([this]);
|
|
146
|
+
return {
|
|
147
|
+
getAttribute(_name) {
|
|
148
|
+
return undefined;
|
|
149
|
+
},
|
|
150
|
+
markSet,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
export class ProfilerHistogramTotalClient extends MosaicClient {
|
|
155
|
+
summaryClient;
|
|
156
|
+
constructor(options) {
|
|
157
|
+
super();
|
|
158
|
+
this.summaryClient = options.summaryClient;
|
|
159
|
+
}
|
|
160
|
+
async prepare() {
|
|
161
|
+
await this.summaryClient.ensureFieldInfo();
|
|
162
|
+
}
|
|
163
|
+
queryPending() {
|
|
164
|
+
this.summaryClient.setTotalLoading(true);
|
|
165
|
+
return this;
|
|
166
|
+
}
|
|
167
|
+
query(filter = []) {
|
|
168
|
+
return this.summaryClient.query(filter);
|
|
169
|
+
}
|
|
170
|
+
queryResult(data) {
|
|
171
|
+
this.summaryClient.setTotalRows(rowsFromQueryResult(data));
|
|
172
|
+
return this;
|
|
173
|
+
}
|
|
174
|
+
queryError(error) {
|
|
175
|
+
this.summaryClient.setTotalError(error);
|
|
176
|
+
return this;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=ProfilerHistogramClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerHistogramClient.js","sourceRoot":"","sources":["../../src/profiler/ProfilerHistogramClient.ts"],"names":[],"mappings":"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","sourcesContent":["import type {FieldInfo} from '@uwdata/mosaic-core';\nimport {\n MosaicClient,\n queryFieldInfo,\n type Selection,\n} from '@uwdata/mosaic-core';\nimport {Interval1D, bin} from '@uwdata/mosaic-plot';\nimport {count, type ExprNode, Query} from '@uwdata/mosaic-sql';\nimport type * as arrow from 'apache-arrow';\nimport type {MosaicProfilerHistogramSummary} from './types';\nimport {rowsFromQueryResult, splitHistogramBins} from './utils';\n\ntype HistogramStateChange = (summary: MosaicProfilerHistogramSummary) => void;\n\ntype HistogramClientOptions = {\n field: arrow.Field;\n onStateChange: HistogramStateChange;\n selection: Selection;\n steps: number;\n tableName: string;\n valueType: 'date' | 'number';\n};\n\ntype HistogramRow = {\n x1: number | Date | null;\n x2: number | Date | null;\n y: number;\n};\n\nexport class ProfilerHistogramClient extends MosaicClient {\n readonly type = 'rectY';\n private filteredError?: Error;\n private filteredLoading = true;\n private readonly field: arrow.Field;\n private fieldInfo?: FieldInfo;\n private fieldInfoPromise?: Promise<void>;\n private filteredBins?: HistogramRow[];\n private filteredNullCount?: number;\n private readonly interactor: Interval1D;\n private readonly onStateChange: HistogramStateChange;\n private readonly select: {\n x1: ExprNode;\n x2: ExprNode;\n y: ExprNode;\n };\n private readonly tableName: string;\n private totalBins?: HistogramRow[];\n private totalError?: Error;\n private totalLoading = true;\n private totalNullCount?: number;\n private readonly valueType: 'date' | 'number';\n\n constructor(options: HistogramClientOptions) {\n super(options.selection);\n this.field = options.field;\n this.onStateChange = options.onStateChange;\n this.tableName = options.tableName;\n this.valueType = options.valueType;\n\n const binned = bin(options.field.name, {steps: options.steps})(\n this,\n 'x',\n ) as unknown as {\n x1: ExprNode;\n x2: ExprNode;\n };\n this.select = {x1: binned.x1, x2: binned.x2, y: count()};\n this.interactor = new Interval1D(this, {\n brush: undefined,\n channel: 'x',\n field: options.field.name,\n peers: false,\n selection: options.selection,\n });\n }\n\n override get filterStable(): boolean {\n return true;\n }\n\n private emitSummary() {\n const totalRows =\n this.totalBins ?? (this.totalLoading ? (this.filteredBins ?? []) : []);\n const total = splitHistogramBins(totalRows);\n const filteredRows =\n this.filteredBins ?? (this.filteredLoading ? (this.totalBins ?? []) : []);\n const filtered = splitHistogramBins(filteredRows);\n\n this.onStateChange({\n error: this.filteredError ?? this.totalError,\n filteredBins: filtered.bins,\n filteredNullCount:\n this.filteredNullCount ??\n (this.filteredLoading ? total.nullCount : filtered.nullCount),\n interactor: this.interactor,\n isLoading: this.filteredLoading || this.totalLoading,\n kind: 'histogram',\n totalBins: total.bins,\n totalNullCount:\n this.totalNullCount ??\n (this.totalLoading ? filtered.nullCount : total.nullCount),\n valueType: this.valueType,\n });\n }\n\n async ensureFieldInfo(): Promise<void> {\n if (this.fieldInfo) {\n return;\n }\n\n if (!this.fieldInfoPromise) {\n this.fieldInfoPromise = queryFieldInfo(this.coordinator!, [\n {\n table: this.tableName,\n column: this.field.name,\n stats: ['min', 'max'],\n },\n ])\n .then(([info]) => {\n this.fieldInfo = info;\n })\n .catch((error) => {\n this.fieldInfo = undefined;\n this.fieldInfoPromise = undefined;\n throw error;\n });\n }\n\n await this.fieldInfoPromise;\n }\n\n setTotalError(error?: Error) {\n this.totalError = error;\n this.totalLoading = false;\n this.emitSummary();\n }\n\n setTotalLoading(isLoading: boolean) {\n this.totalLoading = isLoading;\n if (isLoading) {\n this.totalError = undefined;\n }\n this.emitSummary();\n }\n\n setTotalRows(rows: HistogramRow[]) {\n const {nullCount} = splitHistogramBins(rows);\n this.totalBins = rows;\n this.totalNullCount = nullCount;\n this.totalError = undefined;\n this.totalLoading = false;\n this.emitSummary();\n }\n\n override queryPending(): this {\n this.filteredLoading = true;\n this.filteredError = undefined;\n this.emitSummary();\n return this;\n }\n\n override async prepare(): Promise<void> {\n await this.ensureFieldInfo();\n }\n\n override query(filter: Array<ExprNode> = []): Query {\n return Query.from({source: this.tableName})\n .select(this.select)\n .groupby([this.select.x1, this.select.x2])\n .where(filter);\n }\n\n override queryResult(data: unknown): this {\n const rows = rowsFromQueryResult<HistogramRow>(data);\n const {nullCount} = splitHistogramBins(rows);\n this.filteredBins = rows;\n this.filteredNullCount = nullCount;\n this.filteredError = undefined;\n this.filteredLoading = false;\n this.emitSummary();\n return this;\n }\n\n override queryError(error: Error): this {\n this.filteredError = error;\n this.filteredLoading = false;\n this.emitSummary();\n return this;\n }\n\n channelField(channel: string) {\n if (channel !== 'x') {\n throw new Error('ProfilerHistogramClient only supports x bins');\n }\n if (!this.fieldInfo) {\n throw new Error('Field info is required before histogram binning');\n }\n return this.fieldInfo;\n }\n\n get plot(): {\n getAttribute(name: string): undefined;\n markSet: Set<ProfilerHistogramClient>;\n } {\n const markSet = new Set([this]);\n return {\n getAttribute(_name: string) {\n return undefined;\n },\n markSet,\n };\n }\n}\n\ntype ProfilerHistogramTotalClientOptions = {\n summaryClient: ProfilerHistogramClient;\n};\n\nexport class ProfilerHistogramTotalClient extends MosaicClient {\n private readonly summaryClient: ProfilerHistogramClient;\n\n constructor(options: ProfilerHistogramTotalClientOptions) {\n super();\n this.summaryClient = options.summaryClient;\n }\n\n override async prepare(): Promise<void> {\n await this.summaryClient.ensureFieldInfo();\n }\n\n override queryPending(): this {\n this.summaryClient.setTotalLoading(true);\n return this;\n }\n\n override query(filter: Array<ExprNode> = []): Query {\n return this.summaryClient.query(filter);\n }\n\n override queryResult(data: unknown): this {\n this.summaryClient.setTotalRows(rowsFromQueryResult<HistogramRow>(data));\n return this;\n }\n\n override queryError(error: Error): this {\n this.summaryClient.setTotalError(error);\n return this;\n }\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { MosaicClient, type Selection } from '@uwdata/mosaic-core';
|
|
2
|
+
import { type ExprNode, type Query } from '@uwdata/mosaic-sql';
|
|
3
|
+
import type { Table } from 'apache-arrow';
|
|
4
|
+
import type { MosaicProfilerPaginationState, MosaicProfilerSorting } from './types';
|
|
5
|
+
export type ProfilerPageState = {
|
|
6
|
+
datasetId?: string;
|
|
7
|
+
error?: Error;
|
|
8
|
+
isLoading: boolean;
|
|
9
|
+
pageTable?: Table;
|
|
10
|
+
};
|
|
11
|
+
type ProfilerPageClientOptions = {
|
|
12
|
+
columns: string[];
|
|
13
|
+
filter?: ReturnType<Selection['predicate']>;
|
|
14
|
+
onStateChange: (state: ProfilerPageState) => void;
|
|
15
|
+
pagination: MosaicProfilerPaginationState;
|
|
16
|
+
sorting: MosaicProfilerSorting;
|
|
17
|
+
tableName: string;
|
|
18
|
+
};
|
|
19
|
+
export declare class ProfilerPageClient extends MosaicClient {
|
|
20
|
+
private readonly columns;
|
|
21
|
+
private readonly datasetId;
|
|
22
|
+
private error?;
|
|
23
|
+
private readonly filter?;
|
|
24
|
+
private readonly onStateChange;
|
|
25
|
+
private readonly pagination;
|
|
26
|
+
private pageTable?;
|
|
27
|
+
private readonly sorting;
|
|
28
|
+
private readonly tableName;
|
|
29
|
+
constructor(options: ProfilerPageClientOptions);
|
|
30
|
+
get filterStable(): boolean;
|
|
31
|
+
queryPending(): this;
|
|
32
|
+
query(filter?: Array<ExprNode>): Query;
|
|
33
|
+
queryResult(data: unknown): this;
|
|
34
|
+
queryError(error: Error): this;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=ProfilerPageClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfilerPageClient.d.ts","sourceRoot":"","sources":["../../src/profiler/ProfilerPageClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,YAAY,EAAE,KAAK,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,KAAK,EAAC,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAC,KAAK,EAAC,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EACV,6BAA6B,EAC7B,qBAAqB,EACtB,MAAM,SAAS,CAAC;AAGjB,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,CAAC;CACnB,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAClD,UAAU,EAAE,6BAA6B,CAAC;IAC1C,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAC,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,yBAAyB;IAW9C,IAAa,YAAY,IAAI,OAAO,CAEnC;IAEQ,YAAY,IAAI,IAAI;IAUpB,KAAK,CAAC,MAAM,GAAE,KAAK,CAAC,QAAQ,CAAM,GAAG,KAAK;IAa1C,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAWhC,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;CAUxC"}
|