mirror of
https://github.com/GothenburgBitFactory/timewarrior.git
synced 2025-07-07 20:06:39 +02:00
Filter: Merged Filter and Interval, removing Filter
This commit is contained in:
parent
35f54b64e1
commit
e7dd8edf26
8 changed files with 20 additions and 172 deletions
|
@ -12,7 +12,6 @@ set (timew_SRCS CLI.cpp CLI.h
|
|||
Daterange.cpp Daterange.h
|
||||
Exclusion.cpp Exclusion.h
|
||||
Extensions.cpp Extensions.h
|
||||
Filter.cpp Filter.h
|
||||
Interval.cpp Interval.h
|
||||
Lexer.cpp Lexer.h
|
||||
Rules.cpp Rules.h
|
||||
|
|
|
@ -1,80 +0,0 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright 2015 - 2016, Paul Beckingham, Federico Hernandez.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
//
|
||||
// http://www.opensource.org/licenses/mit-license.php
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include <cmake.h>
|
||||
#include <Filter.h>
|
||||
#include <sstream>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
bool Filter::empty () const
|
||||
{
|
||||
return _range.start ().toEpoch () == 0 &&
|
||||
_range.end ().toEpoch () == 0 &&
|
||||
_tags.size () == 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
Daterange Filter::range () const
|
||||
{
|
||||
return _range;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void Filter::range (const Daterange& range)
|
||||
{
|
||||
_range = range;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
std::set <std::string> Filter::tags () const
|
||||
{
|
||||
return _tags;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
void Filter::tag (const std::string& tag)
|
||||
{
|
||||
if (_tags.find (tag) == _tags.end ())
|
||||
_tags.insert (tag);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
std::string Filter::dump () const
|
||||
{
|
||||
std::stringstream out;
|
||||
|
||||
out << "Filter _range "
|
||||
<< _range.dump ()
|
||||
<< " _tags";
|
||||
|
||||
for (auto& tag : _tags)
|
||||
out << " '" << tag << "'";
|
||||
|
||||
out << "\n";
|
||||
return out.str ();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
53
src/Filter.h
53
src/Filter.h
|
@ -1,53 +0,0 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright 2015 - 2016, Paul Beckingham, Federico Hernandez.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
//
|
||||
// http://www.opensource.org/licenses/mit-license.php
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef INCLUDED_FILTER
|
||||
#define INCLUDED_FILTER
|
||||
|
||||
#include <Daterange.h>
|
||||
#include <string>
|
||||
#include <set>
|
||||
|
||||
class Filter
|
||||
{
|
||||
public:
|
||||
Filter () = default;
|
||||
bool empty () const;
|
||||
|
||||
Daterange range () const;
|
||||
void range (const Daterange&);
|
||||
|
||||
std::set <std::string> tags () const;
|
||||
void tag (const std::string&);
|
||||
|
||||
std::string dump () const;
|
||||
|
||||
private:
|
||||
Daterange _range {};
|
||||
std::set <std::string> _tags {};
|
||||
};
|
||||
|
||||
#endif
|
|
@ -35,7 +35,7 @@ int CmdExport (
|
|||
Rules& rules,
|
||||
Database& database)
|
||||
{
|
||||
auto filter = createFilterFromCLI (cli);
|
||||
auto filter = createFilterIntervalFromCLI (cli);
|
||||
auto timeline = createTimelineFromData (rules, database, filter);
|
||||
std::cout << jsonFromIntervals (timeline.tracked (rules));
|
||||
return 0;
|
||||
|
|
|
@ -79,7 +79,7 @@ int CmdReport (
|
|||
throw std::string ("Specify which report to run.");
|
||||
|
||||
// Filter the data.
|
||||
auto filter = createFilterFromCLI (cli);
|
||||
auto filter = createFilterIntervalFromCLI (cli);
|
||||
auto timeline = createTimelineFromData (rules, database, filter);
|
||||
auto intervals = timeline.tracked (rules);
|
||||
|
||||
|
|
|
@ -35,13 +35,12 @@ int CmdTrack (
|
|||
Rules& rules,
|
||||
Database& database)
|
||||
{
|
||||
auto filter = createFilterFromCLI (cli);
|
||||
auto tracked = createIntervalFromFilter (filter);
|
||||
database.addInterval (tracked);
|
||||
auto filter = createFilterIntervalFromCLI (cli);
|
||||
database.addInterval (filter);
|
||||
|
||||
// User feedback.
|
||||
if (rules.getBoolean ("verbose"))
|
||||
std::cout << intervalSummarize (rules, tracked);
|
||||
std::cout << intervalSummarize (rules, filter);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -115,17 +115,16 @@ bool expandIntervalHint (
|
|||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// A filter is a placeholder for a start datetime, end datetime and a set of
|
||||
// tags, which makes it essentially an interval.
|
||||
// A filter is just another interval, containing start, end and tags.
|
||||
//
|
||||
// Supported interval forms:
|
||||
// ["from"] <date> ["to"|"-" <date>]
|
||||
// ["from"] <date> "for" <duration>
|
||||
// <duration> ["before"|"after" <date>]
|
||||
//
|
||||
Filter createFilterFromCLI (const CLI& cli)
|
||||
Interval createFilterIntervalFromCLI (const CLI& cli)
|
||||
{
|
||||
Filter filter;
|
||||
Interval filter;
|
||||
std::string start;
|
||||
std::string end;
|
||||
std::string duration;
|
||||
|
@ -275,20 +274,6 @@ Filter createFilterFromCLI (const CLI& cli)
|
|||
return filter;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// An interval and a filter are almost identical.
|
||||
// TODO Why aren't they identical? Fix this.
|
||||
Interval createIntervalFromFilter (const Filter& filter)
|
||||
{
|
||||
Interval interval;
|
||||
interval.range (filter.range ());
|
||||
|
||||
for (auto& tag : filter.tags ())
|
||||
interval.tag (tag);
|
||||
|
||||
return interval;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// The five different overlap possibilities:
|
||||
//
|
||||
|
@ -307,7 +292,7 @@ Interval createIntervalFromFilter (const Filter& filter)
|
|||
Timeline createTimelineFromData (
|
||||
const Rules& rules,
|
||||
Database& database,
|
||||
const Filter& filter)
|
||||
const Interval& filter)
|
||||
{
|
||||
Timeline t;
|
||||
t.range (filter.range ());
|
||||
|
@ -320,7 +305,7 @@ Timeline createTimelineFromData (
|
|||
Interval i;
|
||||
i.initialize (line);
|
||||
|
||||
if (intervalMatchesFilter (i, filter))
|
||||
if (intervalMatchesFilterInterval (i, filter))
|
||||
t.include (i);
|
||||
}
|
||||
else if (line[0] == 'e')
|
||||
|
@ -350,17 +335,17 @@ Interval getLatestInterval (Database& database)
|
|||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// An interval matches a filter if the start/end overlaps, and all filter tags
|
||||
// are found in the interval.
|
||||
bool intervalMatchesFilter (const Interval& interval, const Filter& filter)
|
||||
// An interval matches a filter interval if the start/end overlaps, and all
|
||||
// filter interval tags are found in the interval.
|
||||
bool intervalMatchesFilterInterval (const Interval& interval, const Interval& filter)
|
||||
{
|
||||
if ((filter.range ().start ().toEpoch () == 0 &&
|
||||
filter.range ().end ().toEpoch () == 0)
|
||||
if ((filter.start ().toEpoch () == 0 &&
|
||||
filter.end ().toEpoch () == 0)
|
||||
|
||||
||
|
||||
|
||||
(interval.end () > filter.range ().start () &&
|
||||
interval.start () < filter.range ().end ()))
|
||||
(interval.end () > filter.start () &&
|
||||
interval.start () < filter.end ()))
|
||||
{
|
||||
for (auto& tag : filter.tags ())
|
||||
if (! interval.hasTag (tag))
|
||||
|
|
|
@ -32,7 +32,6 @@
|
|||
#include <Rules.h>
|
||||
#include <Extensions.h>
|
||||
#include <Interval.h>
|
||||
#include <Filter.h>
|
||||
#include <Timeline.h>
|
||||
#include <Color.h>
|
||||
|
||||
|
@ -48,11 +47,10 @@ int dispatchCommand (const CLI&, Database&, Rules&, const Extensions&);
|
|||
Color tagColor (const Rules&, const std::string&);
|
||||
std::string intervalSummarize (const Rules&, const Interval&);
|
||||
bool expandIntervalHint (const std::string&, std::string&, std::string&);
|
||||
Filter createFilterFromCLI (const CLI&);
|
||||
Interval createIntervalFromFilter (const Filter&);
|
||||
Timeline createTimelineFromData (const Rules&, Database&, const Filter&);
|
||||
Interval createFilterIntervalFromCLI (const CLI&);
|
||||
Timeline createTimelineFromData (const Rules&, Database&, const Interval&);
|
||||
Interval getLatestInterval (Database&);
|
||||
bool intervalMatchesFilter (const Interval&, const Filter&);
|
||||
bool intervalMatchesFilterInterval (const Interval&, const Interval&);
|
||||
std::string jsonFromIntervals (const std::vector <Interval>&);
|
||||
std::vector <Daterange> rangesFromHolidays (const Rules&);
|
||||
std::vector <Daterange> addRanges (const Daterange&, const std::vector <Daterange>&, const std::vector <Daterange>&);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue