Skip to content

Commit aa02186

Browse files
authored
fix(date-filter): filtering only on hours now returns the expected records (#449)
1 parent 049e805 commit aa02186

File tree

2 files changed

+44
-24
lines changed

2 files changed

+44
-24
lines changed

app/services/forest_liana/operator_date_interval_parser.rb

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -73,30 +73,34 @@ def to_client_timezone(date)
7373
def get_date_filter(operator, value)
7474
return nil unless is_date_operator? operator
7575

76-
case operator
77-
when OPERATOR_FUTURE
78-
return ">= '#{Time.now}'"
79-
when OPERATOR_PAST
80-
return "<= '#{Time.now}'"
81-
when OPERATOR_TODAY
82-
return "BETWEEN '#{to_client_timezone(Time.now.beginning_of_day)}' " +
83-
"AND '#{to_client_timezone(Time.now.end_of_day)}'"
84-
when OPERATOR_PREVIOUS_X_DAYS
85-
ensure_integer_value(value)
86-
return "BETWEEN '" +
87-
"#{to_client_timezone(Integer(value).day.ago.beginning_of_day)}'" +
88-
" AND '#{to_client_timezone(1.day.ago.end_of_day)}'"
89-
when OPERATOR_PREVIOUS_X_DAYS_TO_DATE
90-
ensure_integer_value(value)
91-
return "BETWEEN '" +
92-
"#{to_client_timezone((Integer(value) - 1).day.ago.beginning_of_day)}'" +
93-
" AND '#{Time.now}'"
94-
when OPERATOR_BEFORE_X_HOURS_AGO
95-
ensure_integer_value(value)
96-
return "< '#{to_client_timezone((Integer(value)).hour.ago)}'"
97-
when OPERATOR_AFTER_X_HOURS_AGO
98-
ensure_integer_value(value)
99-
return "> '#{to_client_timezone((Integer(value)).hour.ago)}'"
76+
filter = case operator
77+
when OPERATOR_FUTURE
78+
">= '#{Time.now}'"
79+
when OPERATOR_PAST
80+
"<= '#{Time.now}'"
81+
when OPERATOR_TODAY
82+
"BETWEEN '#{to_client_timezone(Time.now.beginning_of_day)}' " +
83+
"AND '#{to_client_timezone(Time.now.end_of_day)}'"
84+
when OPERATOR_PREVIOUS_X_DAYS
85+
ensure_integer_value(value)
86+
"BETWEEN '" +
87+
"#{to_client_timezone(Integer(value).day.ago.beginning_of_day)}'" +
88+
" AND '#{to_client_timezone(1.day.ago.end_of_day)}'"
89+
when OPERATOR_PREVIOUS_X_DAYS_TO_DATE
90+
ensure_integer_value(value)
91+
"BETWEEN '" +
92+
"#{to_client_timezone((Integer(value) - 1).day.ago.beginning_of_day)}'" +
93+
" AND '#{Time.now}'"
94+
when OPERATOR_BEFORE_X_HOURS_AGO
95+
ensure_integer_value(value)
96+
"< '#{(Integer(value)).hour.ago}'"
97+
when OPERATOR_AFTER_X_HOURS_AGO
98+
ensure_integer_value(value)
99+
"> '#{(Integer(value)).hour.ago}'"
100+
end
101+
102+
if filter != nil
103+
return filter
100104
end
101105

102106
duration = PERIODS[operator][:duration]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module ForestLiana
2+
class OperatorDateIntervalParserTest < ActiveSupport::TestCase
3+
test 'OPERATOR_AFTER_X_HOURS_AGO and OPERATOR_BEFORE_X_HOURS_AGO should not take timezone into account' do
4+
# Setting a big timezone (GMT+10) on purpose, the timezone should not be applied on the result date
5+
operatorDateIntervalParser = OperatorDateIntervalParser.new('Australia/Sydney')
6+
7+
result = operatorDateIntervalParser.get_date_filter(OperatorDateIntervalParser::OPERATOR_AFTER_X_HOURS_AGO, 2)
8+
hourComputed = result.split('> ')[1].tr('\'', '').to_datetime.hour
9+
assert hourComputed == Time.now.utc.hour - 2
10+
11+
result = operatorDateIntervalParser.get_date_filter(OperatorDateIntervalParser::OPERATOR_BEFORE_X_HOURS_AGO, 2)
12+
hourComputed = result.split('< ')[1].tr('\'', '').to_datetime.hour
13+
assert hourComputed == Time.now.utc.hour - 2
14+
end
15+
end
16+
end

0 commit comments

Comments
 (0)