aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--database/src/lib.rs2
-rw-r--r--database/src/query_ser.rs34
2 files changed, 27 insertions, 9 deletions
diff --git a/database/src/lib.rs b/database/src/lib.rs
index c09340b..6210a27 100644
--- a/database/src/lib.rs
+++ b/database/src/lib.rs
@@ -64,6 +64,8 @@ pub enum MultiBehaviour {
Min,
Count,
}
+
+#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)]
pub enum SortOrder {
Ascending,
Descending,
diff --git a/database/src/query_ser.rs b/database/src/query_ser.rs
index 7698fdc..498f2ad 100644
--- a/database/src/query_ser.rs
+++ b/database/src/query_ser.rs
@@ -4,9 +4,8 @@
Copyright (C) 2026 metamuffin <metamuffin.org>
*/
-use crate::{DEBUG_TAGREG, Filter, Query, Sort};
+use crate::{DEBUG_TAGREG, Filter, MultiBehaviour, Query, Sort, SortOrder};
use jellyobject::{Path, Registry, Tag};
-use std::any::TypeId;
impl Query {
pub fn show_debug(&self) -> String {
@@ -19,10 +18,10 @@ impl Query {
pub fn show(&self, reg: &Registry) -> String {
let mut o = String::new();
if !matches!(self.filter, Filter::True) {
- o += &format!("FILTER {}", self.filter.show(reg))
+ o += &format!("FILTER {} ", self.filter.show(reg))
}
if !matches!(self.sort, Sort::None) {
- o += &format!("SORT {}", self.sort.show(reg))
+ o += &format!("SORT {} ", self.sort.show(reg))
}
o
}
@@ -63,7 +62,21 @@ impl Sort {
match self {
Sort::None => "NONE".to_string(),
Sort::Value(vs) => {
- todo!()
+ format!(
+ "{} BY {} {}",
+ match vs.order {
+ SortOrder::Ascending => "ASCENDING",
+ SortOrder::Descending => "DESCENDING",
+ },
+ match vs.multi {
+ MultiBehaviour::Count => "COUNT",
+ MultiBehaviour::First => "FIRST",
+ MultiBehaviour::ForEach => "EACH",
+ MultiBehaviour::Max => "MAX",
+ MultiBehaviour::Min => "MIN",
+ },
+ show_path(reg, &vs.path),
+ )
}
Sort::TextSearch(path, value) => {
format!("TEXT SEARCH {} = {value:?}", show_path(reg, path),)
@@ -83,10 +96,13 @@ fn show_value(reg: &Registry, tag: Tag, value: &[u8]) -> String {
if let Some(info) = reg.info(tag)
&& let Some(ty) = info.r#type
{
- if ty == TypeId::of::<&str>() {
- format!("{:?}", str::from_utf8(value).unwrap())
- } else {
- format!("{value:?}")
+ use jellyobject::types::*;
+ match () {
+ () if ty == STR => format!("{:?}", str::from_utf8(value).unwrap()),
+ () if ty == U32 => format!("{:?}", u32::from_be_bytes(value.try_into().unwrap())),
+ () if ty == U64 => format!("{:?}", u64::from_be_bytes(value.try_into().unwrap())),
+ () if ty == F64 => format!("{:?}", f64::from_be_bytes(value.try_into().unwrap())),
+ () => format!("{value:?}"),
}
} else {
format!("{value:?}")