Skip to content

Commit f77561d

Browse files
committed
Fix a variety of issues and improve performance
1 parent 499fedc commit f77561d

12 files changed

Lines changed: 102 additions & 62 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import {
2+
Box,
3+
CircularProgress,
4+
Fade,
5+
Stack,
6+
Typography,
7+
useTheme,
8+
} from "@mui/material";
9+
import { ReactElement, cloneElement } from "react";
10+
import { useCss, useTimeout } from "react-use";
11+
import { ResponsiveContainer, ResponsiveContainerProps } from "recharts";
12+
import { fontFamily } from "theme";
13+
14+
export function Loading() {
15+
"use no memo";
16+
const [ready] = useTimeout(4500);
17+
return (
18+
<Stack
19+
sx={{
20+
gap: 4,
21+
flex: 1,
22+
alignItems: "center",
23+
justifyContent: "center",
24+
textAlign: "center",
25+
}}
26+
>
27+
<CircularProgress />
28+
{ready() && (
29+
<Typography color="text.secondary" variant="body2">
30+
Generating data for the first time (this may take a while)
31+
</Typography>
32+
)}
33+
</Stack>
34+
);
35+
}

client/src/components/analysis/Chart.tsx

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,13 @@ import {
66
Typography,
77
useTheme,
88
} from "@mui/material";
9+
import { Loading } from "components/LoadingLong";
910
import { ReactElement, cloneElement } from "react";
1011
import { useCss, useTimeout } from "react-use";
1112
import { ResponsiveContainer, ResponsiveContainerProps } from "recharts";
1213
import { fontFamily } from "theme";
1314

14-
export function Loading() {
15-
"use no memo";
16-
const [ready] = useTimeout(4500);
17-
return (
18-
<Stack
19-
sx={{
20-
gap: 4,
21-
flex: 1,
22-
alignItems: "center",
23-
justifyContent: "center",
24-
textAlign: "center",
25-
}}
26-
>
27-
<CircularProgress />
28-
{ready() && (
29-
<Typography color="text.secondary" variant="body2">
30-
Generating data for the first time (this may take a while)
31-
</Typography>
32-
)}
33-
</Stack>
34-
);
35-
}
15+
3616

3717
export function Chart<T>({
3818
data,

client/src/components/charts/CompletionByAlgorithmChart.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Box, useTheme } from "@mui/material";
2-
import { Chart, Loading } from "components/analysis/Chart";
2+
import { Chart } from "components/analysis/Chart";
3+
import { Loading } from "components/LoadingLong";
34
import { Slice } from "components/analysis/useAlgorithmSelector";
45
import { Scroll } from "components/dialog/Scrollbars";
56
import { useNavigate } from "hooks/useNavigation";

client/src/components/charts/TotalSolvedClosedChart.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { alpha, Stack, useTheme } from "@mui/material";
22
import { useQueries } from "@tanstack/react-query";
3-
import { Chart, Loading } from "components/analysis/Chart";
3+
import { Chart, } from "components/analysis/Chart";
4+
5+
import { Loading } from "components/LoadingLong";
46
import { Bar } from "components/data-grid";
57
import { map } from "lodash";
68
import { aggregateQueryOne } from "queries/useAggregateQuery";

client/src/pages/submission-summary/index.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@ import SubmissionSummary from "./SubmissionSummary";
3232
import { Tickets } from "./Tickets";
3333
import { parseApiKeyStatus } from "./parseApiKeyStatus";
3434
import SummaryTable from "./table/SummaryTable";
35+
import { Loading } from "components/LoadingLong";
3536

3637
const hintText =
3738
"You will not be able to edit this submission after it has been submitted. To make a new submission, you must request a new submission key. \n\nInvalid or dominated entries will be ignored.";
3839

3940
export default function SubmissionSummaryPage() {
4041
const { apiKey } = useStableLocationState<SubmissionLocationState>();
41-
const { data, isLoading: summaryIncomplete } =
42+
const { data, isLoading: summaryIncomplete, isEmpty: summaryEmpty } =
4243
useOngoingSubmissionSummaryQuery(apiKey);
4344
const { data: apiKeyData, isLoading, error } = useSubmissionKeyQuery(apiKey);
4445
const { data: requestData } = useRequestData(apiKey);
@@ -100,9 +101,10 @@ export default function SubmissionSummaryPage() {
100101
</Button>,
101102
];
102103

104+
const isIncomplete = summaryIncomplete || someIsPending;
103105
const contentRight = [
104106
<Fragment key="incomplete">
105-
{(summaryIncomplete || someIsPending) && (
107+
{isIncomplete && (
106108
<Stack
107109
direction="row"
108110
sx={{
@@ -205,7 +207,7 @@ export default function SubmissionSummaryPage() {
205207
>
206208
<Title>Details</Title>
207209
{/* <DataGrid clickable columns={columns} rows={data} /> */}
208-
<SummaryTable apiKey={apiKey} />
210+
{!(isIncomplete && summaryEmpty) ? <SummaryTable apiKey={apiKey} /> : <Loading />}
209211
</Stack>
210212
</SubmissionSummary>,
211213
<Box key="gap" sx={{ height: "100dvh" }} />,

client/src/pages/submissions/index.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -217,17 +217,16 @@ export default function TrackSubmission() {
217217
path={
218218
xs
219219
? [
220-
{ name: "Home", url: "/" },
221-
{ name: "More", url: "/more" },
222-
]
220+
{ name: "Home", url: "/" },
221+
{ name: "More", url: "/more" },
222+
]
223223
: [{ name: "Home", url: "/" }]
224224
}
225225
>
226226
<Stack sx={{ gap: 2, mb: 2 }}>{header}</Stack>
227227
<Typography variant="h5">Previously used keys</Typography>
228228
<FlatCard>
229229
<DataGrid
230-
loading={isLoading}
231230
clickable
232231
columns={columns}
233232
rows={rows}

client/src/queries/useOngoingSubmissionQuery.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,17 @@ export function useOngoingSubmissionSummaryQuery(key?: string | number) {
177177
queries: range(pageCount).map((i) => summaryQuery(key, i)),
178178
combine: (results) => {
179179
const dataResults = results.map((r) => r.data);
180+
const lengths = dataResults.map((d) => d?.maps?.length ?? 0);
180181
return {
181182
data: {
182-
lengths: dataResults.map((d) => d?.maps?.length ?? 0),
183+
lengths,
183184
processed: mergeWith(
184185
{},
185186
...dataResults,
186187
mergeValues,
187188
) as SummaryResult,
188189
},
190+
isEmpty: lengths.every((l) => !l),
189191
isLoading: isLoadingPageCount || some(results, (r) => r.isLoading),
190192
};
191193
},

packages/config/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
export const appId = "com.shortestpathlab.tracker";
2-
export const version = "0.2.22";
2+
export const version = "0.2.23";

server/src/controllers/generateIndexes.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,34 @@ import { debounce, keyBy } from "lodash";
55
import { createCache } from "query";
66
import { connectToDatabase } from "connection";
77
import { log } from "logging";
8+
import { QueryOptions } from "mongoose";
9+
10+
const opts: QueryOptions = {
11+
batchSize: Number.MAX_SAFE_INTEGER,
12+
lean: true
13+
}
814

915
export const g = async () => {
1016
log.info("Generating indexes for the first time");
1117
await connectToDatabase();
12-
const maps = Map.find({}, { _id: 1, map_name: 1 });
13-
const scenarios = Scenario.find(
18+
const maps = await Map.find({}, { _id: 1, map_name: 1 }, opts)
19+
const scenarios = await Scenario.find(
1420
{},
15-
{ _id: 1, map_id: 1, type_id: 1, scen_type: 1 },
16-
);
17-
const instances = Instance.find(
21+
{ _id: 1, map_id: 1, type_id: 1, scen_type: 1 }, opts
22+
)
23+
const instances = await Instance.find(
1824
{},
19-
{ _id: 1, scen_id: 1, solution_cost: 1, lower_cost: 1 },
20-
);
25+
{ _id: 1, scen_id: 1, solution_cost: 1, lower_cost: 1 }, opts
26+
)
27+
log.info("Indexes generated");
2128
return {
22-
maps: keyBy(await maps, "_id"),
23-
scenarios: keyBy(await scenarios, "_id"),
24-
instances: keyBy(await instances, "_id"),
29+
maps: keyBy(maps, "_id"),
30+
scenarios: keyBy(scenarios, "_id"),
31+
instances: keyBy(instances, "_id"),
2532
};
33+
2634
};
35+
2736
export const [generateIndexes, generateIndexesCache] = createCache(g);
2837

2938
const watch = [Map, Scenario, Instance];

server/src/controllers/ongoingSubmission.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { Instance, instances, OngoingSubmission } from "models";
1818
import { set } from "models/PipelineStatus";
1919
import { AggregateBuilder, toString } from "mongodb-aggregate-builder";
2020
import { Types } from "mongoose";
21-
import { cached, queryClient, route } from "query";
21+
import { cached, createCache, queryClient, route } from "query";
2222
import { usingWorkerTaskReusable } from "queue/usingWorker";
2323
import { ResultTicketStatus, createPool } from "utils/ticket";
2424
import { createSubmissionValidator } from "validation/createSubmissionValidator";
@@ -73,13 +73,14 @@ const summaryByApiKeyWorker = usingWorkerTaskReusable<
7373
SummaryByApiKeyResult
7474
>(() => new Worker(summaryByApiKeyWorkerPath));
7575

76-
export const summaryByApiKey: RequestHandler<
77-
{},
78-
unknown,
79-
{ apiKey: string }
80-
> = async (req, res) => {
81-
res.json(await summaryByApiKeyWorker(req.params));
82-
};
76+
77+
export const summaryByApiKey = cached(
78+
[],
79+
z.unknown(),
80+
(params) => summaryByApiKeyWorker(params),
81+
"params",
82+
{ maxAge: 10 * 1000, maxSize: 1000 }
83+
)
8384

8485
export const summaryByApiKeyGeneral = aggregate(
8586
undefined,

0 commit comments

Comments
 (0)