summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEllie Huxtable <ellie@elliehuxtable.com>2022-04-22 22:15:50 +0100
committerGitHub <noreply@github.com>2022-04-22 21:15:50 +0000
commitb22929222f7328422e0eb9e4a5dfe538f91b37b8 (patch)
treeb699b8b8719315c945fabe7c2f1e0c6086b3f018
parent89549b367b694ae7a5570d5e50975979aa1bceee (diff)
Fix empty queries with filters (#332)
-rw-r--r--atuin-client/src/database.rs59
1 files changed, 36 insertions, 23 deletions
diff --git a/atuin-client/src/database.rs b/atuin-client/src/database.rs
index d1b892e2..3c3167c1 100644
--- a/atuin-client/src/database.rs
+++ b/atuin-client/src/database.rs
@@ -242,7 +242,11 @@ impl Database for Sqlite {
FilterMode::Directory => format!("cwd = '{}'", context.cwd).to_string(),
};
- let filter = format!("{} {}", join, filter_query);
+ let filter = if filter_query.is_empty() {
+ "".to_string()
+ } else {
+ format!("{} {}", join, filter_query)
+ };
let limit = if let Some(max) = max {
format!("limit {}", max)
@@ -252,9 +256,9 @@ impl Database for Sqlite {
let query = format!(
"select * from history h
- {}
+ {} {}
order by timestamp desc
- {} {}",
+ {}",
query, filter, limit,
);
@@ -402,32 +406,41 @@ impl Database for Sqlite {
}
};
- let filter_sql = match filter {
+ let filter_base = if query_sql.is_empty() {
+ "".to_string()
+ } else {
+ "and".to_string()
+ };
+
+ let filter_query = match filter {
FilterMode::Global => String::from(""),
- FilterMode::Session => format!("and session = '{}'", context.session),
- FilterMode::Directory => format!("and cwd = '{}'", context.cwd),
- FilterMode::Host => format!("and hostname = '{}'", context.hostname),
+ FilterMode::Session => format!("session = '{}'", context.session),
+ FilterMode::Directory => format!("cwd = '{}'", context.cwd),
+ FilterMode::Host => format!("hostname = '{}'", context.hostname),
};
- let res = query_params
- .iter()
- .fold(
- sqlx::query(
- format!(
- "select * from history h
- where {}
- {}
+ let filter_sql = if filter_query.is_empty() {
+ "".to_string()
+ } else {
+ format!("{} {}", filter_base, filter_query)
+ };
+
+ let sql = format!(
+ "select * from history h
+ where {} {}
group by command
having max(timestamp)
order by timestamp desc {}",
- query_sql.as_str(),
- filter_sql.as_str(),
- limit.clone()
- )
- .as_str(),
- ),
- |query, query_param| query.bind(query_param),
- )
+ query_sql.as_str(),
+ filter_sql.as_str(),
+ limit.clone()
+ );
+
+ let res = query_params
+ .iter()
+ .fold(sqlx::query(sql.as_str()), |query, query_param| {
+ query.bind(query_param)
+ })
.map(Self::query_history)
.fetch_all(&self.pool)
.await?;