From f1d429cc96e15a55e0df43e336d1088d6db1b286 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 14 Aug 2011 12:32:37 -0400 Subject: [PATCH] E9 - Date Handling - Made dateformat a class member, to reduce multiple lookups to one. - Added operator-specific data handling. --- src/E9.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++-- src/E9.h | 1 + 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/E9.cpp b/src/E9.cpp index 9d9066712..b85004999 100644 --- a/src/E9.cpp +++ b/src/E9.cpp @@ -52,6 +52,8 @@ E9::E9 (const A3& args) std::vector ::const_iterator arg; for (arg = args.begin (); arg != args.end (); ++arg) _terms.push_back (Term (*arg)); + + _dateformat = context.config.get ("dateformat"); } //////////////////////////////////////////////////////////////////////////////// @@ -91,7 +93,6 @@ void E9::eval (const Task& task, std::vector & value_stack) { // Case sensitivity is configurable. bool case_sensitive = context.config.getBoolean ("search.case.sensitive"); - std::string dateformat = context.config.get ("dateformat"); std::vector ::iterator arg; for (arg = _terms.begin (); arg != _terms.end (); ++arg) @@ -184,7 +185,7 @@ void E9::eval (const Task& task, std::vector & value_stack) if (arg->_category == "dom") arg->_value = context.dom.get (arg->_raw, task); else if (arg->_category == "date") - arg->_value = Date (arg->_raw, dateformat).toEpochString (); + arg->_value = Date (arg->_raw, _dateformat).toEpochString (); else if (arg->_category == "duration") 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 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 { 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 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 { 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 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 { 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 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 { 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. else { diff --git a/src/E9.h b/src/E9.h index 196dee95c..77c393103 100644 --- a/src/E9.h +++ b/src/E9.h @@ -139,6 +139,7 @@ private: private: std::vector _terms; std::map _regexes; + std::string _dateformat; }; #endif