From 5ed9409f9477c2ff7016220a645a1c998ef3036b Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Sun, 19 May 2024 20:16:25 -0600 Subject: [PATCH] sqlite: simplify get_sensors query By dropping the timestamp clause, the index can be used more efficiently. --- src/server/api/stats.rs | 28 +++++++++++++--------------- src/sqlite/eventrepo.rs | 13 ++++--------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/src/server/api/stats.rs b/src/server/api/stats.rs index d4ecf004..b4d351f7 100644 --- a/src/server/api/stats.rs +++ b/src/server/api/stats.rs @@ -104,25 +104,23 @@ pub(crate) async fn get_sensor_names( _session: SessionExtractor, State(context): State>, ) -> Result { - if let EventRepo::Elastic(elastic) = &context.datastore { - let sensors = elastic.get_sensors().await.map_err(|err| { + let sensors = if let EventRepo::Elastic(elastic) = &context.datastore { + elastic.get_sensors().await.map_err(|err| { error!("Failed to get sensors: {:?}", err); ApiError::InternalServerError - })?; - let response = json!({ - "data": sensors, - }); - Ok(Json(response).into_response()) + })? } else if let EventRepo::SQLite(sqlite) = &context.datastore { - let sensors = sqlite.get_sensors().await.map_err(|err| { - error!("Failed to get sensors from datastore: {:?}", err); + sqlite.get_sensors().await.map_err(|err| { + error!("Failed to get sensors: {:?}", err); ApiError::InternalServerError - })?; - let response = json!({ - "data": sensors, - }); - return Ok(Json(response).into_response()); + })? } else { return Ok((StatusCode::NOT_IMPLEMENTED, "").into_response()); - } + }; + + let response = json!({ + "data": sensors, + }); + + Ok(Json(response).into_response()) } diff --git a/src/sqlite/eventrepo.rs b/src/sqlite/eventrepo.rs index ad5ae2d7..d44505a3 100644 --- a/src/sqlite/eventrepo.rs +++ b/src/sqlite/eventrepo.rs @@ -276,19 +276,14 @@ impl SqliteEventRepo { } pub async fn get_sensors(&self) -> anyhow::Result> { - let start_time = DateTime::now().datetime - chrono::Duration::hours(24); - let start_time = start_time.timestamp_nanos_opt().unwrap(); + // Turns out not putting a timestamp limit on this is much + // faster. let sql = r#" SELECT DISTINCT json_extract(events.source, '$.host') FROM events - WHERE timestamp >= ? - AND json_extract(events.source, '$.host') IS NOT NULL + WHERE json_extract(events.source, '$.host') IS NOT NULL "#; - - let rows: Vec = sqlx::query_scalar(sql) - .bind(start_time) - .fetch_all(&self.pool) - .await?; + let rows: Vec = sqlx::query_scalar(sql).fetch_all(&self.pool).await?; Ok(rows) } }