From 46bb01ccdc676ccd6dfc603719c0a98ff6ccded1 Mon Sep 17 00:00:00 2001 From: Orne Brocaar Date: Mon, 26 May 2025 14:48:54 +0100 Subject: [PATCH] Sort NULL values as smallest value (devices and gateways last seen). Fixes #683. --- chirpstack/src/storage/device.rs | 32 +++++++++++++++++++++++++------ chirpstack/src/storage/gateway.rs | 32 +++++++++++++++++++++++++------ 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/chirpstack/src/storage/device.rs b/chirpstack/src/storage/device.rs index 40bb5b62..1b6b069d 100644 --- a/chirpstack/src/storage/device.rs +++ b/chirpstack/src/storage/device.rs @@ -730,17 +730,37 @@ pub async fn list( true => match order_by { OrderBy::Name => q.order_by(device::dsl::name.desc()), OrderBy::DevEui => q.order_by(device::dsl::dev_eui.desc()), - OrderBy::LastSeenAt => q - .order_by(device::dsl::last_seen_at.desc()) - .then_order_by(device::dsl::name), + OrderBy::LastSeenAt => { + #[cfg(feature = "postgres")] + { + q.order_by(device::dsl::last_seen_at.desc().nulls_last()) + .then_order_by(device::dsl::name) + } + + #[cfg(feature = "sqlite")] + { + q.order_by(device::dsl::last_seen_at.desc()) + .then_order_by(device::dsl::name) + } + } OrderBy::DeviceProfileName => q.order_by(device_profile::dsl::name.desc()), }, false => match order_by { OrderBy::Name => q.order_by(device::dsl::name), OrderBy::DevEui => q.order_by(device::dsl::dev_eui), - OrderBy::LastSeenAt => q - .order_by(device::dsl::last_seen_at) - .then_order_by(device::dsl::name), + OrderBy::LastSeenAt => { + #[cfg(feature = "postgres")] + { + q.order_by(device::dsl::last_seen_at.asc().nulls_first()) + .then_order_by(device::dsl::name) + } + + #[cfg(feature = "sqlite")] + { + q.order_by(device::dsl::last_seen_at.asc()) + .then_order_by(device::dsl::name) + } + } OrderBy::DeviceProfileName => q.order_by(device_profile::dsl::name), }, }; diff --git a/chirpstack/src/storage/gateway.rs b/chirpstack/src/storage/gateway.rs index 77741f71..38636381 100644 --- a/chirpstack/src/storage/gateway.rs +++ b/chirpstack/src/storage/gateway.rs @@ -365,16 +365,36 @@ pub async fn list( true => match order_by { OrderBy::Name => q.order_by(gateway::dsl::name.desc()), OrderBy::GatewayId => q.order_by(gateway::dsl::gateway_id.desc()), - OrderBy::LastSeenAt => q - .order_by(gateway::dsl::last_seen_at.desc()) - .then_order_by(gateway::dsl::name), + OrderBy::LastSeenAt => { + #[cfg(feature = "postgres")] + { + q.order_by(gateway::dsl::last_seen_at.desc().nulls_last()) + .then_order_by(gateway::dsl::name) + } + + #[cfg(feature = "sqlite")] + { + q.order_by(gateway::dsl::last_seen_at.desc()) + .then_order_by(gateway::dsl::name) + } + } }, false => match order_by { OrderBy::Name => q.order_by(gateway::dsl::name), OrderBy::GatewayId => q.order_by(gateway::dsl::gateway_id), - OrderBy::LastSeenAt => q - .order_by(gateway::dsl::last_seen_at) - .then_order_by(gateway::dsl::name), + OrderBy::LastSeenAt => { + #[cfg(feature = "postgres")] + { + q.order_by(gateway::dsl::last_seen_at.asc().nulls_first()) + .then_order_by(gateway::dsl::name) + } + + #[cfg(feature = "sqlite")] + { + q.order_by(gateway::dsl::last_seen_at.asc()) + .then_order_by(gateway::dsl::name) + } + } }, };