forest_liana 1.3.13 → 1.3.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/services/forest_liana/operator_date_interval_parser.rb +58 -0
- data/app/services/forest_liana/operator_value_parser.rb +14 -31
- data/app/services/forest_liana/search_query_builder.rb +11 -5
- data/app/services/forest_liana/value_stat_getter.rb +24 -4
- data/lib/forest_liana/version.rb +1 -1
- data/test/services/forest_liana/resources_getter_test.rb +15 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fec685427c5d1e79f304f7f38820ed656f7c46c
|
4
|
+
data.tar.gz: 876e3e4c683f864ddf234e8e97e3906116b3bbd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 154ad6d095ec785ee483ea2262348dea4fdb5456c950602a834dea5c5c3af974f21b48909e95cb69ec610b9fb71b57fa83193f1bd4913d272547ec5f0d930178
|
7
|
+
data.tar.gz: b700add97404c94f21b2de45e3f64c261a86cf545189508f3f74ad3ddacb68aafd78c8c69af85825a508c6689c147ae3c3670011a61f082364afcecea6923026
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module ForestLiana
|
2
|
+
class OperatorDateIntervalParser
|
3
|
+
PERIODS = {
|
4
|
+
yesterday: { duration: 1, period: 'day' },
|
5
|
+
lastWeek: { duration: 1, period: 'week' },
|
6
|
+
last2Weeks: { duration: 2, period: 'week' },
|
7
|
+
lastMonth: { duration: 1, period: 'month' },
|
8
|
+
last3Months: { duration: 3, period: 'month' },
|
9
|
+
lastYear: { duration: 1, period: 'year' }
|
10
|
+
}
|
11
|
+
|
12
|
+
PERIODS_LAST_X_DAYS = /^last(\d+)days$/
|
13
|
+
|
14
|
+
def initialize(value)
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
|
18
|
+
def is_interval_date_value
|
19
|
+
return true if PERIODS[@value.to_sym]
|
20
|
+
|
21
|
+
match = PERIODS_LAST_X_DAYS.match(@value)
|
22
|
+
return true if match && match[1]
|
23
|
+
|
24
|
+
false
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_interval_date_filter
|
28
|
+
return nil unless is_interval_date_value()
|
29
|
+
|
30
|
+
match = PERIODS_LAST_X_DAYS.match(@value)
|
31
|
+
return ">= #{Integer(match[1]).day.ago}" if match && match[1]
|
32
|
+
|
33
|
+
duration = PERIODS[@value.to_sym][:duration]
|
34
|
+
period = PERIODS[@value.to_sym][:period]
|
35
|
+
|
36
|
+
from = duration.send(period).ago.send("beginning_of_#{period}")
|
37
|
+
to = 1.send(period).ago.send("end_of_#{period}")
|
38
|
+
"BETWEEN '#{from}' AND '#{to}'"
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_interval_date_filter_for_previous_interval
|
42
|
+
return nil unless is_interval_date_value()
|
43
|
+
|
44
|
+
match = PERIODS_LAST_X_DAYS.match(@value)
|
45
|
+
if match && match[1]
|
46
|
+
return "BETWEEN #{Integer(match[1] * 2).day.ago}" +
|
47
|
+
" AND #{Integer(match[1]).day.ago}"
|
48
|
+
end
|
49
|
+
|
50
|
+
duration = PERIODS[@value.to_sym][:duration]
|
51
|
+
period = PERIODS[@value.to_sym][:period]
|
52
|
+
|
53
|
+
from = (duration * 2).send(period).ago.send("beginning_of_#{period}")
|
54
|
+
to = (1 + duration).send(period).ago.send("end_of_#{period}")
|
55
|
+
"BETWEEN '#{from}' AND '#{to}'"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -30,38 +30,12 @@ module ForestLiana
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.add_where(query, field, operator, value, resource)
|
33
|
-
|
34
|
-
field_name = "\"#{resource.table_name}\".\"#{field}\""
|
35
|
-
else
|
36
|
-
association = field.split(':')[0].pluralize
|
37
|
-
field_name = "\"#{association}\".\"#{field.split(':')[1]}\""
|
38
|
-
end
|
39
|
-
|
40
|
-
match = /^last(\d+)days$/.match(value)
|
41
|
-
if match && match[1]
|
42
|
-
return query = query.where("#{field_name} >= ?",
|
43
|
-
Integer(match[1]).day.ago)
|
44
|
-
end
|
33
|
+
field_name = self.get_field_name(field, resource)
|
45
34
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
when 'lastWeek'
|
51
|
-
query = query.where("#{field_name} BETWEEN " +
|
52
|
-
"'#{1.week.ago.beginning_of_week}' AND '#{1.week.ago.end_of_week}'")
|
53
|
-
when 'last2Weeks'
|
54
|
-
query = query.where("#{field_name} BETWEEN " +
|
55
|
-
"'#{2.week.ago.beginning_of_week}' AND '#{1.week.ago.end_of_week}'")
|
56
|
-
when 'lastMonth'
|
57
|
-
query = query.where("#{field_name} BETWEEN " +
|
58
|
-
"'#{1.month.ago.beginning_of_month}' AND '#{1.month.ago.end_of_month}'")
|
59
|
-
when 'last3Months'
|
60
|
-
query = query.where("#{field_name} BETWEEN " +
|
61
|
-
"'#{3.month.ago.beginning_of_month}' AND '#{1.month.ago.end_of_month}'")
|
62
|
-
when 'lastYear'
|
63
|
-
query = query.where("#{field_name} BETWEEN " +
|
64
|
-
"'#{1.year.ago.beginning_of_year}' AND '#{1.year.ago.end_of_year}'")
|
35
|
+
operator_date_interval_parser = OperatorDateIntervalParser.new(value)
|
36
|
+
if operator_date_interval_parser.is_interval_date_value()
|
37
|
+
filter = operator_date_interval_parser.get_interval_date_filter()
|
38
|
+
query = query.where("#{field_name} #{filter}")
|
65
39
|
else
|
66
40
|
where = "#{field_name} #{operator}"
|
67
41
|
where += " '#{value}'" if value
|
@@ -69,5 +43,14 @@ module ForestLiana
|
|
69
43
|
end
|
70
44
|
end
|
71
45
|
|
46
|
+
def self.get_field_name(field, resource)
|
47
|
+
if field.split(':').size < 2
|
48
|
+
"\"#{resource.table_name}\".\"#{field}\""
|
49
|
+
else
|
50
|
+
association = field.split(':')[0].pluralize
|
51
|
+
"\"#{association}\".\"#{field.split(':')[1]}\""
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
72
55
|
end
|
73
56
|
end
|
@@ -51,7 +51,7 @@ module ForestLiana
|
|
51
51
|
def filter_param
|
52
52
|
if @params[:filter]
|
53
53
|
@params[:filter].each do |field, values|
|
54
|
-
next if
|
54
|
+
next if association?(field)
|
55
55
|
values.split(',').each do |value|
|
56
56
|
operator, value = OperatorValueParser.parse(value)
|
57
57
|
@records = OperatorValueParser.add_where(@records, field, operator,
|
@@ -141,12 +141,18 @@ module ForestLiana
|
|
141
141
|
|
142
142
|
operator, value = OperatorValueParser.parse(value)
|
143
143
|
|
144
|
-
where = "#{association.table_name}.#{subfield} #{operator}"
|
145
|
-
where += " '#{value}'" if value
|
146
|
-
|
147
144
|
@records = @records
|
148
145
|
.joins(field.to_sym)
|
149
|
-
|
146
|
+
|
147
|
+
operator_date_interval_parser = OperatorDateIntervalParser.new(value)
|
148
|
+
if operator_date_interval_parser.is_interval_date_value()
|
149
|
+
filter = operator_date_interval_parser.get_interval_date_filter()
|
150
|
+
@records = @records.where("#{association.table_name}.#{subfield} #{filter}")
|
151
|
+
else
|
152
|
+
where = "#{association.table_name}.#{subfield} #{operator}"
|
153
|
+
where += " '#{value}'" if value
|
154
|
+
@records = @records.where(where)
|
155
|
+
end
|
150
156
|
end
|
151
157
|
|
152
158
|
def belongs_to_filter
|
@@ -9,15 +9,35 @@ module ForestLiana
|
|
9
9
|
|
10
10
|
def perform
|
11
11
|
return if @params[:aggregate].blank?
|
12
|
-
|
12
|
+
valueCurrent = @resource
|
13
|
+
valuePrevious = @resource
|
13
14
|
|
14
15
|
@params[:filters].try(:each) do |filter|
|
15
16
|
operator, filter_value = OperatorValueParser.parse(filter[:value])
|
16
|
-
|
17
|
-
|
17
|
+
valueCurrent = OperatorValueParser.add_where(valueCurrent,
|
18
|
+
filter[:field], operator, filter_value, @resource)
|
18
19
|
end
|
19
20
|
|
20
|
-
|
21
|
+
filter_date_interval = false
|
22
|
+
@params[:filters].try(:each) do |filter|
|
23
|
+
operator, filter_value = OperatorValueParser.parse(filter[:value])
|
24
|
+
operator_date_interval_parser = OperatorDateIntervalParser.new(filter_value)
|
25
|
+
if operator_date_interval_parser.is_interval_date_value()
|
26
|
+
field_name = OperatorValueParser.get_field_name(filter[:field], @resource)
|
27
|
+
filter = operator_date_interval_parser
|
28
|
+
.get_interval_date_filter_for_previous_interval()
|
29
|
+
valuePrevious = valuePrevious.where("#{field_name} #{filter}")
|
30
|
+
filter_date_interval = true
|
31
|
+
else
|
32
|
+
valuePrevious = OperatorValueParser.add_where(valuePrevious,
|
33
|
+
filter[:field], operator, filter_value, @resource)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
@record = Model::Stat.new(value: {
|
38
|
+
countCurrent: count(valueCurrent),
|
39
|
+
countPrevious: filter_date_interval ? count(valuePrevious) : nil
|
40
|
+
})
|
21
41
|
end
|
22
42
|
|
23
43
|
private
|
data/lib/forest_liana/version.rb
CHANGED
@@ -141,5 +141,20 @@ module ForestLiana
|
|
141
141
|
assert count = 1
|
142
142
|
assert records.first.id == 5
|
143
143
|
end
|
144
|
+
|
145
|
+
test 'Filter equal on an updated_at field of an associated collection' do
|
146
|
+
getter = ResourcesGetter.new(Tree, {
|
147
|
+
page: { size: 10, number: 1 },
|
148
|
+
filter: {
|
149
|
+
'owner:updated_at' => 'Sat Jul 02 2016 11:52:00 GMT-0400 (EDT)',
|
150
|
+
}
|
151
|
+
})
|
152
|
+
getter.perform
|
153
|
+
records = getter.records
|
154
|
+
count = getter.count
|
155
|
+
|
156
|
+
assert records.count == 0
|
157
|
+
assert count = 0
|
158
|
+
end
|
144
159
|
end
|
145
160
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forest_liana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sandro Munda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -165,6 +165,7 @@ files:
|
|
165
165
|
- app/services/forest_liana/intercom_attributes_getter.rb
|
166
166
|
- app/services/forest_liana/intercom_conversations_getter.rb
|
167
167
|
- app/services/forest_liana/line_stat_getter.rb
|
168
|
+
- app/services/forest_liana/operator_date_interval_parser.rb
|
168
169
|
- app/services/forest_liana/operator_value_parser.rb
|
169
170
|
- app/services/forest_liana/pie_stat_getter.rb
|
170
171
|
- app/services/forest_liana/resource_creator.rb
|