allow to filter by start and end

This commit is contained in:
Abraham Toriz 2021-06-30 19:20:10 -05:00
parent 5062a7b699
commit fdc45cea3f
No known key found for this signature in database
GPG Key ID: D5B4A746DB5DD42A
3 changed files with 145 additions and 22 deletions

View File

@ -97,36 +97,30 @@ pub struct DisplayCommand { }
impl<'a> Command<'a> for DisplayCommand {
type Args = Args;
fn handle<D, O, E>(args: Self::Args, db: &mut D, out: &mut O, err: &mut E, config: &Config) -> error::Result<()>
fn handle<D, O, E>(args: Self::Args, db: &mut D, out: &mut O, err: &mut E, _config: &Config) -> error::Result<()>
where
D: Database,
O: Write,
E: Write,
{
let entries = match args.sheet {
Some(Sheet::All) => db.entries_all_visible()?,
Some(Sheet::Full) => db.entries_full()?,
Some(Sheet::Sheet(name)) => db.entries_by_sheet(&name)?,
Some(Sheet::All) => db.entries_all_visible(args.start, args.end)?,
Some(Sheet::Full) => db.entries_full(args.start, args.end)?,
Some(Sheet::Sheet(name)) => db.entries_by_sheet(&name, args.start, args.end)?,
None => {
let current_sheet = db.current_sheet()?.unwrap_or("default".into());
db.entries_by_sheet(&current_sheet)?
db.entries_by_sheet(&current_sheet, args.start, args.end)?
}
};
let entries = if let DBVersion::Timetrap = db.version()? {
let (entries, needs_warning) = if let DBVersion::Timetrap = db.version()? {
// this indicates that times in the database are specified in the
// local time and need to be converted to utc before displaying
writeln!(
err,
"{} You are using the old timetrap format, it is advised that \
you update your database using t migrate",
Yellow.bold().paint("[WARNING]"),
)?;
local_to_utc_vec(entries)?
(local_to_utc_vec(entries)?, true)
} else {
entries
(entries, false)
};
args.format.print_formatted(
@ -135,7 +129,18 @@ impl<'a> Command<'a> for DisplayCommand {
Utc::now(),
args.ids,
term_width(),
)
)?;
if needs_warning {
writeln!(
err,
"{} You are using the old timetrap format, it is advised that \
you update your database using t migrate",
Yellow.bold().paint("[WARNING]"),
)?;
}
Ok(())
}
}
@ -153,6 +158,7 @@ mod tests {
let mut out = Vec::new();
let mut err = Vec::new();
let config = Default::default();
std::env::set_var("TZ", "UTC");
DisplayCommand::handle(args, &mut db, &mut out, &mut err, &config).unwrap();
@ -176,4 +182,45 @@ mod tests {
assert!(false, "start with a newly created database");
assert!(false, "correctly display times in local timezone");
}
#[test]
fn filter_by_start() {
let args = Args {
format: Formatter::Csv,
start: Some(Utc.ymd(2021, 6, 30).and_hms(10, 5, 0)),
..Default::default()
};
let mut db = SqliteDatabase::from_memory().unwrap();
let mut out = Vec::new();
let mut err = Vec::new();
let config = Default::default();
db.init().unwrap();
db.entry_insert(Utc.ymd(2021, 6, 30).and_hms(10, 0, 0), None, Some("hola".into()), "default".into()).unwrap();
db.entry_insert(Utc.ymd(2021, 6, 30).and_hms(10, 10, 0), None, Some("hola".into()), "default".into()).unwrap();
DisplayCommand::handle(args, &mut db, &mut out, &mut err, &config).unwrap();
assert_eq!(PrettyString(&String::from_utf8_lossy(&out)), PrettyString("start,end,note,sheet
2021-06-30T10:10:00Z,,hola,default
"));
assert_eq!(
String::from_utf8_lossy(&err),
String::new(),
);
}
#[test]
fn filter_by_end() {
}
#[test]
fn filter_by_start_and_end() {
}
#[test]
fn filter_by_match() {
}
}

View File

@ -39,6 +39,7 @@ pub trait Database {
`value` varchar(255)
)
", &[])?;
self.execute("INSERT INTO meta (key, value) VALUES ('database_version', 1)", &[])?;
Ok(())
}
@ -46,16 +47,91 @@ pub trait Database {
// -------------
// Entry queries
// -------------
fn entries_by_sheet(&self, sheet: &str) -> Result<Vec<Entry>> {
self.entry_query("select * from entries where sheet=?1 order by start asc", &[&sheet])
fn entries_by_sheet(&self, sheet: &str, start: Option<DateTime<Utc>>, end: Option<DateTime<Utc>>) -> Result<Vec<Entry>> {
match (start, end) {
(Some(start), Some(end)) => {
self.entry_query(
"select * from entries where sheet=?1 and start >= ?2 and end <= ?2 order by start asc",
&[&sheet, &start, &end]
)
}
(Some(start), None) => {
self.entry_query(
"select * from entries where sheet=?1 and start >= ?2 order by start asc",
&[&sheet, &start]
)
}
(None, Some(end)) => {
self.entry_query(
"select * from entries where sheet=?1 and end <= ?2 order by start asc",
&[&sheet, &end]
)
}
(None, None) => {
self.entry_query(
"select * from entries where sheet=?1 order by start asc",
&[&sheet]
)
}
}
}
fn entries_all_visible(&self) -> Result<Vec<Entry>> {
self.entry_query("select * from entries where sheet not like '!_%' escape \"!\" order by sheet asc, start asc", &[])
fn entries_all_visible(&self, start: Option<DateTime<Utc>>, end: Option<DateTime<Utc>>) -> Result<Vec<Entry>> {
match (start, end) {
(Some(start), Some(end)) => {
self.entry_query(
"select * from entries where sheet not like '!_%' escape \"!\" and start >= ?2 and end <= ?2 order by start asc",
&[&start, &end]
)
}
(Some(start), None) => {
self.entry_query(
"select * from entries where sheet not like '!_%' escape \"!\" and start >= ?2 order by start asc",
&[&start]
)
}
(None, Some(end)) => {
self.entry_query(
"select * from entries where sheet not like '!_%' escape \"!\" and end <= ?2 order by start asc",
&[&end]
)
}
(None, None) => {
self.entry_query(
"select * from entries where sheet not like '!_%' escape \"!\" order by start asc",
&[]
)
}
}
}
fn entries_full(&self) -> Result<Vec<Entry>> {
self.entry_query("select * from entries order by sheet asc, start asc", &[])
fn entries_full(&self, start: Option<DateTime<Utc>>, end: Option<DateTime<Utc>>) -> Result<Vec<Entry>> {
match (start, end) {
(Some(start), Some(end)) => {
self.entry_query(
"select * from entries where start >= ?2 and end <= ?2 order by start asc",
&[&start, &end]
)
}
(Some(start), None) => {
self.entry_query(
"select * from entries where start >= ?2 order by start asc",
&[&start]
)
}
(None, Some(end)) => {
self.entry_query(
"select * from entries where end <= ?2 order by start asc",
&[&end]
)
}
(None, None) => {
self.entry_query(
"select * from entries where sheet=?1 order by start asc",
&[]
)
}
}
}
fn entry_insert(&mut self, start: DateTime<Utc>, end: Option<DateTime<Utc>>, note: Option<String>, sheet: String) -> Result<()> {

View File

@ -123,7 +123,7 @@ fn main() {
.arg(Arg::with_name("format")
.short("f").long("format")
.takes_value(true).value_name("FORMAT").default_value("text")
.help("The output format. Valid built-in formats are ical, csv, json, ids, factor, and text (default). Documentation on defining custom formats can be found in the README included in this distribution."))
.help("The output format. Valid built-in formats are ical, csv, json, ids, factor, and text. Documentation on defining custom formats can be found in the README included in this distribution."))
.arg(Arg::with_name("grep")
.short("g").long("grep")
.takes_value(true).value_name("REGEXP")