mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-06-26 10:54:26 +02:00
E9 - Date Handling
- Made dateformat a class member, to reduce multiple lookups to one. - Added operator-specific data handling.
This commit is contained in:
parent
06d54b2e72
commit
f1d429cc96
2 changed files with 100 additions and 2 deletions
101
src/E9.cpp
101
src/E9.cpp
|
@ -52,6 +52,8 @@ E9::E9 (const A3& args)
|
||||||
std::vector <Arg>::const_iterator arg;
|
std::vector <Arg>::const_iterator arg;
|
||||||
for (arg = args.begin (); arg != args.end (); ++arg)
|
for (arg = args.begin (); arg != args.end (); ++arg)
|
||||||
_terms.push_back (Term (*arg));
|
_terms.push_back (Term (*arg));
|
||||||
|
|
||||||
|
_dateformat = context.config.get ("dateformat");
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -91,7 +93,6 @@ void E9::eval (const Task& task, std::vector <Term>& value_stack)
|
||||||
{
|
{
|
||||||
// Case sensitivity is configurable.
|
// Case sensitivity is configurable.
|
||||||
bool case_sensitive = context.config.getBoolean ("search.case.sensitive");
|
bool case_sensitive = context.config.getBoolean ("search.case.sensitive");
|
||||||
std::string dateformat = context.config.get ("dateformat");
|
|
||||||
|
|
||||||
std::vector <Term>::iterator arg;
|
std::vector <Term>::iterator arg;
|
||||||
for (arg = _terms.begin (); arg != _terms.end (); ++arg)
|
for (arg = _terms.begin (); arg != _terms.end (); ++arg)
|
||||||
|
@ -184,7 +185,7 @@ void E9::eval (const Task& task, std::vector <Term>& value_stack)
|
||||||
if (arg->_category == "dom")
|
if (arg->_category == "dom")
|
||||||
arg->_value = context.dom.get (arg->_raw, task);
|
arg->_value = context.dom.get (arg->_raw, task);
|
||||||
else if (arg->_category == "date")
|
else if (arg->_category == "date")
|
||||||
arg->_value = Date (arg->_raw, dateformat).toEpochString ();
|
arg->_value = Date (arg->_raw, _dateformat).toEpochString ();
|
||||||
else if (arg->_category == "duration")
|
else if (arg->_category == "duration")
|
||||||
arg->_value = (std::string)Duration (arg->_raw);
|
arg->_value = (std::string)Duration (arg->_raw);
|
||||||
|
|
||||||
|
@ -297,6 +298,25 @@ void E9::operator_lt (Term& result, Term& left, Term& right)
|
||||||
else if (left._value == "" && right._value != "") result._raw = result._value = "true";
|
else if (left._value == "" && right._value != "") result._raw = result._value = "true";
|
||||||
else result._raw = result._value = "false";
|
else result._raw = result._value = "false";
|
||||||
}
|
}
|
||||||
|
else if (left._category == "date" ||
|
||||||
|
right._category == "date")
|
||||||
|
{
|
||||||
|
Date left_date;
|
||||||
|
if (digitsOnly (left._value))
|
||||||
|
left_date = Date (left._value);
|
||||||
|
else
|
||||||
|
left_date = Date (left._value, _dateformat);
|
||||||
|
|
||||||
|
Date right_date;
|
||||||
|
if (digitsOnly (right._value))
|
||||||
|
right_date = Date (right._value);
|
||||||
|
else
|
||||||
|
right_date = Date (right._value, _dateformat);
|
||||||
|
|
||||||
|
result._raw = result._value = (left_date < right_date)
|
||||||
|
? "true"
|
||||||
|
: "false";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result._raw = result._value = (left._value < right._value)
|
result._raw = result._value = (left._value < right._value)
|
||||||
|
@ -320,6 +340,25 @@ void E9::operator_lte (Term& result, Term& left, Term& right)
|
||||||
else if (left._value == "" ) result._raw = result._value = "true";
|
else if (left._value == "" ) result._raw = result._value = "true";
|
||||||
else result._raw = result._value = "false";
|
else result._raw = result._value = "false";
|
||||||
}
|
}
|
||||||
|
else if (left._category == "date" ||
|
||||||
|
right._category == "date")
|
||||||
|
{
|
||||||
|
Date left_date;
|
||||||
|
if (digitsOnly (left._value))
|
||||||
|
left_date = Date (left._value);
|
||||||
|
else
|
||||||
|
left_date = Date (left._value, _dateformat);
|
||||||
|
|
||||||
|
Date right_date;
|
||||||
|
if (digitsOnly (right._value))
|
||||||
|
right_date = Date (right._value);
|
||||||
|
else
|
||||||
|
right_date = Date (right._value, _dateformat);
|
||||||
|
|
||||||
|
result._raw = result._value = (left_date <= right_date)
|
||||||
|
? "true"
|
||||||
|
: "false";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result._raw = result._value = (left._value <= right._value)
|
result._raw = result._value = (left._value <= right._value)
|
||||||
|
@ -343,6 +382,25 @@ void E9::operator_gte (Term& result, Term& left, Term& right)
|
||||||
else if ( right._value == "" ) result._raw = result._value = "true";
|
else if ( right._value == "" ) result._raw = result._value = "true";
|
||||||
else result._raw = result._value = "false";
|
else result._raw = result._value = "false";
|
||||||
}
|
}
|
||||||
|
else if (left._category == "date" ||
|
||||||
|
right._category == "date")
|
||||||
|
{
|
||||||
|
Date left_date;
|
||||||
|
if (digitsOnly (left._value))
|
||||||
|
left_date = Date (left._value);
|
||||||
|
else
|
||||||
|
left_date = Date (left._value, _dateformat);
|
||||||
|
|
||||||
|
Date right_date;
|
||||||
|
if (digitsOnly (right._value))
|
||||||
|
right_date = Date (right._value);
|
||||||
|
else
|
||||||
|
right_date = Date (right._value, _dateformat);
|
||||||
|
|
||||||
|
result._raw = result._value = (left_date >= right_date)
|
||||||
|
? "true"
|
||||||
|
: "false";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result._raw = result._value = (left._value >= right._value)
|
result._raw = result._value = (left._value >= right._value)
|
||||||
|
@ -365,6 +423,25 @@ void E9::operator_gt (Term& result, Term& left, Term& right)
|
||||||
else if (left._value != "" && right._value == "") result._raw = result._value = "true";
|
else if (left._value != "" && right._value == "") result._raw = result._value = "true";
|
||||||
else result._raw = result._value = "false";
|
else result._raw = result._value = "false";
|
||||||
}
|
}
|
||||||
|
else if (left._category == "date" ||
|
||||||
|
right._category == "date")
|
||||||
|
{
|
||||||
|
Date left_date;
|
||||||
|
if (digitsOnly (left._value))
|
||||||
|
left_date = Date (left._value);
|
||||||
|
else
|
||||||
|
left_date = Date (left._value, _dateformat);
|
||||||
|
|
||||||
|
Date right_date;
|
||||||
|
if (digitsOnly (right._value))
|
||||||
|
right_date = Date (right._value);
|
||||||
|
else
|
||||||
|
right_date = Date (right._value, _dateformat);
|
||||||
|
|
||||||
|
result._raw = result._value = (left_date > right_date)
|
||||||
|
? "true"
|
||||||
|
: "false";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result._raw = result._value = (left._value > right._value)
|
result._raw = result._value = (left._value > right._value)
|
||||||
|
@ -426,6 +503,26 @@ void E9::operator_equal (
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dates.
|
||||||
|
else if (left._category == "date" ||
|
||||||
|
right._category == "date")
|
||||||
|
{
|
||||||
|
Date left_date;
|
||||||
|
if (digitsOnly (left._value))
|
||||||
|
left_date = Date (left._value);
|
||||||
|
else
|
||||||
|
left_date = Date (left._value, _dateformat);
|
||||||
|
|
||||||
|
Date right_date;
|
||||||
|
if (digitsOnly (right._value))
|
||||||
|
right_date = Date (right._value);
|
||||||
|
else
|
||||||
|
right_date = Date (right._value, _dateformat);
|
||||||
|
|
||||||
|
result._raw = result._value = (left_date == right_date)
|
||||||
|
? "true"
|
||||||
|
: "false";
|
||||||
|
}
|
||||||
// Regular equality matching.
|
// Regular equality matching.
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
1
src/E9.h
1
src/E9.h
|
@ -139,6 +139,7 @@ private:
|
||||||
private:
|
private:
|
||||||
std::vector <Term> _terms;
|
std::vector <Term> _terms;
|
||||||
std::map <std::string, RX> _regexes;
|
std::map <std::string, RX> _regexes;
|
||||||
|
std::string _dateformat;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue