From 7762ee2f9e6e528457a47f0cf2019ea00d29afbe Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 19 Jun 2011 10:25:53 -0400 Subject: [PATCH] Commands - Promoted filtering code to the Command base class. - Added filtering short-circuit. --- src/commands/CmdBurndown.cpp | 31 +++++------------------ src/commands/CmdCalendar.cpp | 12 +++------ src/commands/CmdCustom.cpp | 11 ++------- src/commands/CmdHistory.cpp | 45 +++++++++------------------------- src/commands/CmdIDs.cpp | 34 +++++++------------------ src/commands/CmdInfo.cpp | 12 +++------ src/commands/CmdQuery.cpp | 12 +++------ src/commands/CmdStatistics.cpp | 12 +++------ src/commands/CmdSummary.cpp | 12 +++------ src/commands/CmdTags.cpp | 23 +++++------------ src/commands/CmdTimesheet.cpp | 12 +++------ src/commands/CmdUrgency.cpp | 13 +++------- src/commands/Command.cpp | 19 ++++++++++++++ src/commands/Command.h | 4 +++ 14 files changed, 79 insertions(+), 173 deletions(-) diff --git a/src/commands/CmdBurndown.cpp b/src/commands/CmdBurndown.cpp index 297584c36..895665bf6 100644 --- a/src/commands/CmdBurndown.cpp +++ b/src/commands/CmdBurndown.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include @@ -991,15 +990,9 @@ int CmdBurndownMonthly::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Create a chart, scan the tasks, then render. Chart chart ('M'); @@ -1041,15 +1034,9 @@ int CmdBurndownWeekly::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Create a chart, scan the tasks, then render. Chart chart ('W'); @@ -1091,15 +1078,9 @@ int CmdBurndownDaily::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Create a chart, scan the tasks, then render. Chart chart ('D'); diff --git a/src/commands/CmdCalendar.cpp b/src/commands/CmdCalendar.cpp index 889a9b35f..d2acbb84b 100644 --- a/src/commands/CmdCalendar.cpp +++ b/src/commands/CmdCalendar.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -71,15 +70,9 @@ int CmdCalendar::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); Date today; bool getpendingdate = false; @@ -195,6 +188,7 @@ int CmdCalendar::execute (std::string& output) { // Find the oldest pending due date. Date oldest (12,31,2037); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { if (task->getStatus () == Task::pending) diff --git a/src/commands/CmdCustom.cpp b/src/commands/CmdCustom.cpp index 37150e72f..76df373bf 100644 --- a/src/commands/CmdCustom.cpp +++ b/src/commands/CmdCustom.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include #include #include @@ -92,15 +91,9 @@ int CmdCustom::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Sort the tasks. std::vector sequence; diff --git a/src/commands/CmdHistory.cpp b/src/commands/CmdHistory.cpp index 58a810f69..fd048d882 100644 --- a/src/commands/CmdHistory.cpp +++ b/src/commands/CmdHistory.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include #include @@ -63,16 +62,11 @@ int CmdHistoryMonthly::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { Date entry (task->get ("entry")); @@ -228,16 +222,11 @@ int CmdHistoryAnnual::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { Date entry (task->get ("entry")); @@ -390,16 +379,11 @@ int CmdGHistoryMonthly::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { Date entry (task->get ("entry")); @@ -595,16 +579,11 @@ int CmdGHistoryAnnual::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { Date entry (task->get ("entry")); diff --git a/src/commands/CmdIDs.cpp b/src/commands/CmdIDs.cpp index cb8cf640a..9009185eb 100644 --- a/src/commands/CmdIDs.cpp +++ b/src/commands/CmdIDs.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -56,18 +55,13 @@ int CmdIDs::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Find number of matching tasks. std::vector ids; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) if (task->id) ids.push_back (task->id); @@ -96,17 +90,12 @@ int CmdCompletionIds::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); std::vector ids; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) if (task->getStatus () != Task::deleted && task->getStatus () != Task::completed) @@ -142,17 +131,12 @@ int CmdZshCompletionIds::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); std::stringstream out; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) if (task->getStatus () != Task::deleted && task->getStatus () != Task::completed) diff --git a/src/commands/CmdInfo.cpp b/src/commands/CmdInfo.cpp index 2e89d8518..07edc976e 100644 --- a/src/commands/CmdInfo.cpp +++ b/src/commands/CmdInfo.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -60,15 +59,9 @@ int CmdInfo::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Read the undo file. std::vector undo; @@ -81,6 +74,7 @@ int CmdInfo::execute (std::string& output) // Find the task. std::stringstream out; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { ViewText view; diff --git a/src/commands/CmdQuery.cpp b/src/commands/CmdQuery.cpp index 20ee60ca0..16d36e8db 100644 --- a/src/commands/CmdQuery.cpp +++ b/src/commands/CmdQuery.cpp @@ -26,7 +26,6 @@ //////////////////////////////////////////////////////////////////////////////// #include -#include #include #include @@ -55,15 +54,9 @@ int CmdQuery::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); if (filtered.size () == 0) { @@ -81,6 +74,7 @@ int CmdQuery::execute (std::string& output) if (json_array) output += "[\n"; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { if (task != filtered.begin ()) diff --git a/src/commands/CmdStatistics.cpp b/src/commands/CmdStatistics.cpp index be60f76d9..3c26049a0 100644 --- a/src/commands/CmdStatistics.cpp +++ b/src/commands/CmdStatistics.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -84,15 +83,9 @@ int CmdStatistics::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); Date now; time_t earliest = time (NULL); @@ -110,6 +103,7 @@ int CmdStatistics::execute (std::string& output) std::map allTags; std::map allProjects; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { ++totalT; diff --git a/src/commands/CmdSummary.cpp b/src/commands/CmdSummary.cpp index 8543f69a9..40d9c8412 100644 --- a/src/commands/CmdSummary.cpp +++ b/src/commands/CmdSummary.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include @@ -63,18 +62,13 @@ int CmdSummary::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Generate unique list of project names from all pending tasks. std::map allProjects; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) if (task->getStatus () == Task::pending) allProjects[task->get ("project")] = false; diff --git a/src/commands/CmdTags.cpp b/src/commands/CmdTags.cpp index eeb3e743a..876b48266 100644 --- a/src/commands/CmdTags.cpp +++ b/src/commands/CmdTags.cpp @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include @@ -63,19 +62,14 @@ int CmdTags::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Scan all the tasks for their project name, building a map using project // names as keys. std::map unique; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { std::vector tags; @@ -154,19 +148,14 @@ int CmdCompletionTags::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Scan all the tasks for their tags, building a map using tag // names as keys. std::map unique; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { std::vector tags; diff --git a/src/commands/CmdTimesheet.cpp b/src/commands/CmdTimesheet.cpp index efe2f5469..cf296e325 100644 --- a/src/commands/CmdTimesheet.cpp +++ b/src/commands/CmdTimesheet.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -59,15 +58,9 @@ int CmdTimesheet::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); // Just do this once. int width = context.getWidth (); @@ -118,6 +111,7 @@ int CmdTimesheet::execute (std::string& output) completed.add (Column::factory ("string.right", "Due")); completed.add (Column::factory ("string", "Description")); + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) { // If task completed within range. diff --git a/src/commands/CmdUrgency.cpp b/src/commands/CmdUrgency.cpp index 35e593e8f..54c9137ef 100644 --- a/src/commands/CmdUrgency.cpp +++ b/src/commands/CmdUrgency.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include @@ -55,17 +54,10 @@ int CmdUrgency::execute (std::string& output) context.tdb.commit (); context.tdb.unlock (); - // Filter. - Arguments f = context.args.extract_read_only_filter (); - Expression e (f); - + // Apply filter. std::vector filtered; - std::vector ::iterator task; - for (task = tasks.begin (); task != tasks.end (); ++task) - if (e.eval (*task)) - filtered.push_back (*task); + filter (tasks, filtered); - // Filter sequence. if (filtered.size () == 0) { context.footnote ("No tasks specified."); @@ -74,6 +66,7 @@ int CmdUrgency::execute (std::string& output) // Find the task(s). std::stringstream out; + std::vector ::iterator task; for (task = filtered.begin (); task != filtered.end (); ++task) out << "task " << task->id diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 25af140f8..671236f50 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -27,7 +27,9 @@ #include #include +#include #include + #include #include #include @@ -249,3 +251,20 @@ bool Command::displays_id () const } //////////////////////////////////////////////////////////////////////////////// +void Command::filter (std::vector & input, std::vector & output) +{ + Arguments f = context.args.extract_read_only_filter (); + if (f.size ()) + { + Expression e (f); + + std::vector ::iterator task; + for (task = input.begin (); task != input.end (); ++task) + if (e.eval (*task)) + output.push_back (*task); + } + else + output = input; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/Command.h b/src/commands/Command.h index 7ffaf657f..7b5123e98 100644 --- a/src/commands/Command.h +++ b/src/commands/Command.h @@ -29,7 +29,9 @@ #define L10N // Localization complete. #include +#include #include +#include class Command { @@ -49,6 +51,8 @@ public: bool displays_id () const; virtual int execute (std::string&) = 0; + void filter (std::vector &, std::vector &); + protected: std::string _keyword; std::string _usage;