Skip to content

Commit 049c7eb

Browse files
AdityaHegdeericpgreen2
authored andcommitted
fix: citation urls for multiple measures (#8127)
* fix: citation urls for multiple measures * PR comments
1 parent 916e280 commit 049c7eb

File tree

2 files changed

+203
-6
lines changed

2 files changed

+203
-6
lines changed
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import { PivotChipType } from "@rilldata/web-common/features/dashboards/pivot/types.ts";
2+
import type { ExploreState } from "@rilldata/web-common/features/dashboards/stores/explore-state.ts";
3+
import {
4+
AD_BIDS_DOMAIN_DIMENSION,
5+
AD_BIDS_EXPLORE_WITH_3_MEASURES_DIMENSIONS,
6+
AD_BIDS_IMPRESSIONS_MEASURE,
7+
AD_BIDS_METRICS_3_MEASURES_DIMENSIONS_WITH_TIME,
8+
AD_BIDS_PUBLISHER_DIMENSION,
9+
AD_BIDS_TIMESTAMP_DIMENSION,
10+
} from "@rilldata/web-common/features/dashboards/stores/test-data/data.ts";
11+
import { TDDChart } from "@rilldata/web-common/features/dashboards/time-dimension-details/types.ts";
12+
import { mapMetricsResolverQueryToDashboard } from "@rilldata/web-common/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts";
13+
import {
14+
type DashboardTimeControls,
15+
TimeRangePreset,
16+
} from "@rilldata/web-common/lib/time/types.ts";
17+
import {
18+
DashboardState_ActivePage,
19+
DashboardState_LeaderboardSortDirection,
20+
DashboardState_LeaderboardSortType,
21+
} from "@rilldata/web-common/proto/gen/rill/ui/v1/dashboard_pb.ts";
22+
import { V1TimeGrain } from "@rilldata/web-common/runtime-client";
23+
import type { Schema as MetricsResolverQuery } from "@rilldata/web-common/runtime-client/gen/resolvers/metrics/schema.ts";
24+
import { describe, expect, it } from "vitest";
25+
26+
describe("mapMetricsResolverQueryToDashboard", () => {
27+
const TestCases: {
28+
title: string;
29+
query: MetricsResolverQuery;
30+
expectedPartialExplore: Partial<ExploreState>;
31+
}[] = [
32+
{
33+
title: "single measure and dimension, sort by compare measure value",
34+
query: {
35+
time_range: { start: "2022-01-01", end: "2022-01-07" },
36+
comparison_time_range: { start: "2022-02-01", end: "2022-02-07" },
37+
measures: [
38+
{ name: AD_BIDS_IMPRESSIONS_MEASURE },
39+
{
40+
name: AD_BIDS_IMPRESSIONS_MEASURE + "_delta",
41+
compute: {
42+
comparison_delta: { measure: AD_BIDS_IMPRESSIONS_MEASURE },
43+
},
44+
},
45+
],
46+
dimensions: [{ name: AD_BIDS_PUBLISHER_DIMENSION }],
47+
sort: [{ desc: true, name: AD_BIDS_IMPRESSIONS_MEASURE + "_delta" }],
48+
},
49+
expectedPartialExplore: {
50+
activePage: DashboardState_ActivePage.DIMENSION_TABLE,
51+
selectedTimeRange: {
52+
name: TimeRangePreset.CUSTOM,
53+
start: new Date("2022-01-01T00:00:00.000Z"),
54+
end: new Date("2022-01-07T00:00:00.000Z"),
55+
},
56+
selectedComparisonTimeRange: {
57+
name: TimeRangePreset.CUSTOM,
58+
start: new Date("2022-02-01T00:00:00.000Z"),
59+
end: new Date("2022-02-07T00:00:00.000Z"),
60+
},
61+
showTimeComparison: true,
62+
63+
visibleMeasures: [AD_BIDS_IMPRESSIONS_MEASURE],
64+
allMeasuresVisible: false,
65+
visibleDimensions: [AD_BIDS_PUBLISHER_DIMENSION],
66+
allDimensionsVisible: false,
67+
selectedDimensionName: AD_BIDS_PUBLISHER_DIMENSION,
68+
leaderboardSortByMeasureName: AD_BIDS_IMPRESSIONS_MEASURE,
69+
dashboardSortType: DashboardState_LeaderboardSortType.DELTA_ABSOLUTE,
70+
sortDirection: DashboardState_LeaderboardSortDirection.DESCENDING,
71+
},
72+
},
73+
74+
{
75+
title: "single measure and dimensions with additional time dimension",
76+
query: {
77+
measures: [{ name: AD_BIDS_IMPRESSIONS_MEASURE }],
78+
dimensions: [
79+
{ name: AD_BIDS_PUBLISHER_DIMENSION },
80+
{
81+
name: AD_BIDS_TIMESTAMP_DIMENSION,
82+
compute: {
83+
time_floor: {
84+
dimension: AD_BIDS_TIMESTAMP_DIMENSION,
85+
grain: "day",
86+
},
87+
},
88+
},
89+
],
90+
sort: [{ desc: true, name: AD_BIDS_IMPRESSIONS_MEASURE }],
91+
},
92+
expectedPartialExplore: {
93+
activePage: DashboardState_ActivePage.TIME_DIMENSIONAL_DETAIL,
94+
selectedTimeRange: {
95+
name: TimeRangePreset.ALL_TIME,
96+
interval: V1TimeGrain.TIME_GRAIN_DAY,
97+
} as DashboardTimeControls,
98+
99+
visibleMeasures: [AD_BIDS_IMPRESSIONS_MEASURE],
100+
allMeasuresVisible: false,
101+
visibleDimensions: [AD_BIDS_PUBLISHER_DIMENSION],
102+
allDimensionsVisible: false,
103+
leaderboardSortByMeasureName: AD_BIDS_IMPRESSIONS_MEASURE,
104+
dashboardSortType: DashboardState_LeaderboardSortType.VALUE,
105+
sortDirection: DashboardState_LeaderboardSortDirection.DESCENDING,
106+
107+
selectedComparisonDimension: AD_BIDS_PUBLISHER_DIMENSION,
108+
tdd: {
109+
expandedMeasureName: AD_BIDS_IMPRESSIONS_MEASURE,
110+
chartType: TDDChart.DEFAULT,
111+
pinIndex: -1,
112+
},
113+
},
114+
},
115+
116+
{
117+
title: "single measure and 2 dimensions",
118+
query: {
119+
measures: [{ name: AD_BIDS_IMPRESSIONS_MEASURE }],
120+
dimensions: [
121+
{ name: AD_BIDS_PUBLISHER_DIMENSION },
122+
{ name: AD_BIDS_DOMAIN_DIMENSION },
123+
],
124+
sort: [{ desc: true, name: AD_BIDS_IMPRESSIONS_MEASURE }],
125+
},
126+
expectedPartialExplore: {
127+
activePage: DashboardState_ActivePage.PIVOT,
128+
selectedTimeRange: {
129+
name: TimeRangePreset.ALL_TIME,
130+
} as DashboardTimeControls,
131+
132+
visibleMeasures: [AD_BIDS_IMPRESSIONS_MEASURE],
133+
allMeasuresVisible: false,
134+
visibleDimensions: [
135+
AD_BIDS_PUBLISHER_DIMENSION,
136+
AD_BIDS_DOMAIN_DIMENSION,
137+
],
138+
allDimensionsVisible: false,
139+
leaderboardSortByMeasureName: AD_BIDS_IMPRESSIONS_MEASURE,
140+
dashboardSortType: DashboardState_LeaderboardSortType.VALUE,
141+
sortDirection: DashboardState_LeaderboardSortDirection.DESCENDING,
142+
143+
pivot: {
144+
rows: [],
145+
columns: [
146+
{
147+
id: AD_BIDS_PUBLISHER_DIMENSION,
148+
title: AD_BIDS_PUBLISHER_DIMENSION,
149+
type: PivotChipType.Dimension,
150+
},
151+
{
152+
id: AD_BIDS_DOMAIN_DIMENSION,
153+
title: AD_BIDS_DOMAIN_DIMENSION,
154+
type: PivotChipType.Dimension,
155+
},
156+
{
157+
id: AD_BIDS_IMPRESSIONS_MEASURE,
158+
title: AD_BIDS_IMPRESSIONS_MEASURE,
159+
type: PivotChipType.Measure,
160+
},
161+
],
162+
sorting: [{ desc: true, id: AD_BIDS_IMPRESSIONS_MEASURE }],
163+
expanded: {},
164+
columnPage: 0,
165+
rowPage: 0,
166+
enableComparison: false,
167+
tableMode: "flat",
168+
activeCell: null,
169+
},
170+
},
171+
},
172+
];
173+
174+
for (const { title, query, expectedPartialExplore } of TestCases) {
175+
it(title, () => {
176+
expect(
177+
mapMetricsResolverQueryToDashboard(
178+
AD_BIDS_METRICS_3_MEASURES_DIMENSIONS_WITH_TIME,
179+
AD_BIDS_EXPLORE_WITH_3_MEASURES_DIMENSIONS,
180+
query,
181+
),
182+
).toEqual(expectedPartialExplore);
183+
});
184+
}
185+
});

web-common/src/features/explore-mappers/map-metrics-resolver-query-to-dashboard.ts

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,11 @@ export function mapMetricsResolverQueryToDashboard(
8080
}
8181

8282
// Convert where filter
83-
partialExploreState.whereFilter = mapResolverExpressionToV1Expression(
84-
query.where,
85-
);
83+
if (query.where) {
84+
partialExploreState.whereFilter = mapResolverExpressionToV1Expression(
85+
query.where,
86+
);
87+
}
8688

8789
// Convert sort
8890
if (query.sort) {
@@ -256,12 +258,12 @@ function mapActivePage(
256258
partialExploreState: Partial<ExploreState>,
257259
timeDimensions: Dimension[],
258260
) {
259-
const hasVisibleMeasures =
260-
(partialExploreState.visibleMeasures?.length ?? 0) > 0;
261+
const hasExactlyOneMeasure =
262+
(partialExploreState.visibleMeasures?.length ?? 0) === 1;
261263
const visibleDimensions = partialExploreState.visibleDimensions ?? [];
262264
const showTDD =
263265
timeDimensions.length === 1 &&
264-
hasVisibleMeasures &&
266+
hasExactlyOneMeasure &&
265267
visibleDimensions.length <= 1;
266268
const showDimensionTable = !showTDD && visibleDimensions.length === 1;
267269
const showPivot = timeDimensions.length > 1 || visibleDimensions.length > 1;
@@ -275,6 +277,16 @@ function mapActivePage(
275277
partialExploreState.selectedComparisonDimension = visibleDimensions[0];
276278
partialExploreState.activePage =
277279
DashboardState_ActivePage.TIME_DIMENSIONAL_DETAIL;
280+
281+
const timeDimension = timeDimensions[0];
282+
const shouldUpdateTimeGrain =
283+
partialExploreState.selectedTimeRange &&
284+
timeDimension?.compute?.time_floor?.grain;
285+
if (shouldUpdateTimeGrain) {
286+
// Selected time grain is used in TDD's pivot table at the bottom.
287+
partialExploreState.selectedTimeRange!.interval =
288+
DateTimeUnitToV1TimeGrain[timeDimension.compute!.time_floor!.grain];
289+
}
278290
} else if (showDimensionTable) {
279291
partialExploreState.selectedDimensionName = visibleDimensions[0];
280292
partialExploreState.activePage = DashboardState_ActivePage.DIMENSION_TABLE;

0 commit comments

Comments
 (0)