From e30c344d329e6dcfa6a560eabae00dd31e774e04 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 4 Sep 2024 22:42:36 +0200 Subject: [PATCH] feat: add load more to runs page if nb of jobs >= 1000 --- backend/windmill-api/openapi.yaml | 16 ++++++ backend/windmill-api/src/jobs.rs | 52 ++++++------------- frontend/src/lib/components/RunChart.svelte | 16 ++++++ .../src/lib/components/ScriptBuilder.svelte | 1 + .../src/lib/components/runs/JobLoader.svelte | 23 ++++++-- .../src/lib/components/runs/RunsTable.svelte | 32 +++++++++--- .../(logged)/runs/[...path]/+page.svelte | 25 +++++++-- 7 files changed, 115 insertions(+), 50 deletions(-) diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 046a4122d9..ff8e9dadd7 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -5856,6 +5856,8 @@ paths: - $ref: "#/components/parameters/ScriptExactHash" - $ref: "#/components/parameters/StartedBefore" - $ref: "#/components/parameters/StartedAfter" + - $ref: "#/components/parameters/CreatedBefore" + - $ref: "#/components/parameters/CreatedAfter" - $ref: "#/components/parameters/CreatedOrStartedBefore" - $ref: "#/components/parameters/Running" - $ref: "#/components/parameters/ScheduledForBeforeNow" @@ -9055,6 +9057,20 @@ components: in: query schema: type: string + CreatedBefore: + name: created_before + description: filter on created before (inclusive) timestamp + in: query + schema: + type: string + format: date-time + CreatedAfter: + name: created_after + description: filter on created after (exclusive) timestamp + in: query + schema: + type: string + format: date-time StartedBefore: name: started_before description: filter on started before (inclusive) timestamp diff --git a/backend/windmill-api/src/jobs.rs b/backend/windmill-api/src/jobs.rs index bee997a14e..346853b101 100644 --- a/backend/windmill-api/src/jobs.rs +++ b/backend/windmill-api/src/jobs.rs @@ -1161,16 +1161,10 @@ pub fn filter_list_queue_query( sqlb.and_where_eq("parent_job", "?".bind(pj)); } if let Some(dt) = &lq.started_before { - sqlb.and_where_le( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_le("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.started_after { - sqlb.and_where_ge( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_ge("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(fs) = &lq.is_flow_step { sqlb.and_where_eq("is_flow_step", fs); @@ -1182,16 +1176,10 @@ pub fn filter_list_queue_query( } if let Some(dt) = &lq.created_before { - sqlb.and_where_le( - "created_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_le("created_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.created_after { - sqlb.and_where_ge( - "created_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_ge("created_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.created_or_started_after { @@ -4701,36 +4689,28 @@ pub fn filter_list_completed_query( sqlb.and_where_eq("parent_job", "?".bind(pj)); } if let Some(dt) = &lq.started_before { - sqlb.and_where_le( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_le("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.started_after { - sqlb.and_where_ge( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_ge("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.created_or_started_before { - sqlb.and_where_le( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_le("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.created_or_started_after { - sqlb.and_where_ge( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_ge("started_at", "?".bind(&dt.to_rfc3339())); + } + + if let Some(dt) = &lq.created_before { + sqlb.and_where_le("created_at", "?".bind(&dt.to_rfc3339())); + } + if let Some(dt) = &lq.created_after { + sqlb.and_where_ge("created_at", "?".bind(&dt.to_rfc3339())); } if let Some(dt) = &lq.created_or_started_after_completed_jobs { - sqlb.and_where_ge( - "started_at", - format!("to_timestamp({} / 1000.0)", dt.timestamp_millis()), - ); + sqlb.and_where_ge("started_at", "?".bind(&dt.to_rfc3339())); } if let Some(sk) = &lq.is_skipped { diff --git a/frontend/src/lib/components/RunChart.svelte b/frontend/src/lib/components/RunChart.svelte index a4c39c9da0..3898bded6d 100644 --- a/frontend/src/lib/components/RunChart.svelte +++ b/frontend/src/lib/components/RunChart.svelte @@ -2,6 +2,7 @@ import { Scatter } from 'svelte-chartjs' import 'chartjs-adapter-date-fns' import zoomPlugin from 'chartjs-plugin-zoom' + import Tooltip2 from '$lib/components/Tooltip.svelte' import { Chart as ChartJS, Title, @@ -17,6 +18,7 @@ import type { CompletedJob } from '$lib/gen' import { createEventDispatcher } from 'svelte' import { getDbClockNow } from '$lib/forLater' + import Button from './common/button/Button.svelte' export let jobs: CompletedJob[] | undefined = [] export let maxIsNow: boolean = false @@ -24,6 +26,7 @@ export let maxTimeSet: string | undefined = undefined export let selectedIds: string[] = [] export let canSelect: boolean = true + export let lastFetchWentToEnd: boolean = false const dispatch = createEventDispatcher() const SUCCESS_COLOR = '#4ade80' @@ -283,5 +286,18 @@ {maxTime} -->
+ {#if !lastFetchWentToEnd} +
+ {/if}
diff --git a/frontend/src/lib/components/ScriptBuilder.svelte b/frontend/src/lib/components/ScriptBuilder.svelte index 6f6d156f07..770e17a588 100644 --- a/frontend/src/lib/components/ScriptBuilder.svelte +++ b/frontend/src/lib/components/ScriptBuilder.svelte @@ -1034,6 +1034,7 @@
+
{#if !lastFetchWentToEnd && jobs && jobs.length >= 1000} + + {/if}
{/if}
diff --git a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte index eab0f9a6ba..59b184f755 100644 --- a/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/runs/[...path]/+page.svelte @@ -88,6 +88,7 @@ let schedulePath = $page.url.searchParams.get('schedule_path') ?? undefined let jobKindsCat = $page.url.searchParams.get('job_kinds') ?? 'runs' let allWorkspaces = $page.url.searchParams.get('all_workspaces') == 'true' ?? false + let lastFetchWentToEnd = false function loadFromQuery() { path = $page.params.path @@ -316,6 +317,7 @@ maxTs = undefined jobs = undefined completedJobs = undefined + lastFetchWentToEnd = false selectedManualDate = 0 selectedIds = [] jobIdsToCancel = [] @@ -503,6 +505,13 @@ lookback = lookbackInDays } + async function loadExtra() { + if (jobLoader) { + lastFetchWentToEnd = await jobLoader.loadExtraJobs() + console.log(lastFetchWentToEnd) + } + } + const warnJobLimitMsg = 'The exact number of concurrent jobs at the beginning of the time range may be incorrect as only the last 1000 jobs are taken into account: a job that was started earlier than this limit will not be taken into account' @@ -739,12 +748,14 @@ {#if graph === 'RunChart'} { minTs = e.detail.min.toISOString() maxTs = e.detail.max.toISOString() @@ -904,7 +915,7 @@
- Max datetime + Max Reset { + lastFetchWentToEnd = false jobLoader?.loadJobs(minTs, maxTs, true, true) }} bind:minTs @@ -966,6 +978,8 @@ {isSelectingJobsToCancel} bind:selectedIds bind:selectedWorkspace + bind:lastFetchWentToEnd + on:loadExtra={loadExtra} on:filterByPath={filterByPath} on:filterByUser={filterByUser} on:filterByFolder={filterByFolder} @@ -1102,11 +1116,13 @@
{#if graph === 'RunChart'} { minTs = e.detail.min.toISOString() @@ -1236,7 +1252,7 @@
- Min datetime + Min
- Max datetime + Max Reset { + lastFetchWentToEnd = false jobLoader?.loadJobs(minTs, maxTs, true, true) }} bind:this={manualDatePicker} @@ -1330,6 +1347,8 @@ {isSelectingJobsToCancel} bind:selectedIds bind:selectedWorkspace + bind:lastFetchWentToEnd + on:loadExtra={loadExtra} on:select={() => { if (!isSelectingJobsToCancel) runDrawer.openDrawer() }}