chartable 0.0.0.2 → 0.0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7366c67606157ae0f28e3cda5bd591858a662fb4d1ac27dca22d3e26e1155a3b
4
- data.tar.gz: 63db758f26ae8057f200727a2fb735e8cb675a28f01d751bd31a8dcd3bc16aba
3
+ metadata.gz: e69c2973a90eafdeb2ff247ad5653aff3f3b7e5c6d8149d122c92c8f117fc95f
4
+ data.tar.gz: dcc4ac8c3356dbc9f31fb779445c2c532e49acac783d112ad1cb91d79b0dd158
5
5
  SHA512:
6
- metadata.gz: 8ccdf6bf85dd948d187caa1cd4d4455bd30c7c2c1831e872896802ef909ca1d572ff3db9e212781d2335e1b2a2d4d9e29f2b847bf08f342a0069292bfa09496e
7
- data.tar.gz: 0fba6005933df7394b20ea0c69c3a27611acb00e863f793a3910c5b8eaea24496e0896eae700080b99f8e9ac7fcd376958d094ef6d8fc0476830c2aa41026358
6
+ metadata.gz: 4c974ab80c5a3c70cc15657a94e60102acb9dc4f3f438a27a7104d389ff1680596276220f406a97fa78a328f118b1e114ad48c7ad2f9bec409c8452273fbd2a2
7
+ data.tar.gz: 79c08ed35789e123fe4d908d9065eb5c9ca9a59e5cee63efdd913477bc612097b7a794cf36d1a49b0434b69ddbbbe1bb45537ced9a9984b56f5edddb74cf4153
@@ -9,10 +9,16 @@ module Chartable
9
9
  # It returns analytics hash created from the given criteria
10
10
  #
11
11
  # @return [Hash]
12
- def analytics(period, from: nil, to: nil, on: 'created_at')
12
+ def analytics(period, from: nil, to: nil, on: 'created_at', order: 'asc')
13
+ query_order = if order.to_s.downcase == 'desc'
14
+ 'desc'
15
+ else
16
+ 'asc'
17
+ end
18
+
13
19
  period_query = Chartable::PeriodQuery.build(period)
14
20
  scope = Chartable::RangeQuery.call(self, on: on, from: from, to: to)
15
- period_query.call(scope, on: on)
21
+ period_query.call(scope, on: on, order: query_order)
16
22
  end
17
23
  end
18
24
  end
@@ -5,19 +5,11 @@ module Chartable
5
5
  # Example output: `{"October 09, 2018" => 1, "October 10, 2018" => 1}`
6
6
  #
7
7
  # @return [Hash]
8
- def self.call(scope, on:)
9
- if ActiveRecord::Base.connection.class.to_s.match(/sqlite/i)
10
- scope.group("strftime('%m %d, %Y', #{on})").size.transform_keys do |key|
11
- data = key.split(" ")
12
- month_number = data.shift
13
- month_name = Date::MONTHNAMES[month_number.to_i]
14
- data.unshift(month_name)
15
- data.join(" ")
16
- end
17
- elsif ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
18
- scope.group("to_char(#{on},'FMMonth DD, YYYY')").size
8
+ def self.call(scope, on:, order:)
9
+ if ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
10
+ scope.group(Arel.sql("to_char(#{on},'FMMonth DD, YYYY')")).order(Arel.sql("to_char(#{on},'FMMonth DD, YYYY') #{order}")).size
19
11
  else
20
- scope.group("DATE_FORMAT(#{on}, '%M %d, %Y')").size
12
+ scope.group(Arel.sql("DATE_FORMAT(#{on}, '%M %d, %Y')")).order(Arel.sql("DATE_FORMAT(#{on}, '%M %d, %Y') #{order}")).size
21
13
  end
22
14
  end
23
15
  end
@@ -6,16 +6,11 @@ module Chartable
6
6
  # SQLite does not support DATE_FORMAT function so a little hack is needed
7
7
  #
8
8
  # @return [Hash]
9
- def self.call(scope, on:)
10
- if ActiveRecord::Base.connection.class.to_s.match(/sqlite/i)
11
- scope.group("strftime('%m %Y', #{on})").size.transform_keys do |key|
12
- month_number = key.match(/^[0-9]{2}(?= )/).to_s
13
- key.gsub(month_number, Date::MONTHNAMES[month_number.to_i])
14
- end
15
- elsif ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
16
- scope.group("to_char(#{on},'FMMonth YYYY')").size
9
+ def self.call(scope, on:, order:)
10
+ if ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
11
+ scope.group(Arel.sql("#{on}, to_char(#{on},'FMMonth YYYY')")).order(Arel.sql("#{on} #{order}")).size
17
12
  else
18
- scope.group("DATE_FORMAT(#{on},'%M %Y')").size
13
+ scope.group(Arel.sql("#{on}, DATE_FORMAT(#{on},'%M %Y')")).order(Arel.sql("#{on} #{order}")).size
19
14
  end
20
15
  end
21
16
  end
@@ -5,24 +5,11 @@ module Chartable
5
5
  # Example output: `{"Q1 2018" => 1, "Q2 2018" => 1}`
6
6
  #
7
7
  # @return [Hash]
8
- def self.call(scope, on:)
9
- if ActiveRecord::Base.connection.class.to_s.match(/sqlite/i)
10
- scope.group("strftime('%m %Y', #{on})").size.transform_keys do |key|
11
- month_number = key.match(/^[0-9]{2}(?= )/).to_s
12
- quarter = case month_number.to_i
13
- when 1..3 then 1
14
- when 4..6 then 2
15
- when 7..9 then 3
16
- else
17
- 4
18
- end
19
-
20
- key.gsub(month_number, "Q#{quarter}")
21
- end
22
- elsif ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
23
- scope.group("concat('Q', to_char(#{on},'Q YYYY'))").size
8
+ def self.call(scope, on:, order:)
9
+ if ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
10
+ scope.group(Arel.sql("concat('Q', to_char(#{on},'Q YYYY'))")).order(Arel.sql("concat('Q', to_char(#{on},'Q YYYY')) #{order}")).size
24
11
  else
25
- scope.group("CONCAT('Q', QUARTER(#{on}), DATE_FORMAT(#{on},' %Y'))").size
12
+ scope.group(Arel.sql("CONCAT('Q', QUARTER(#{on}), DATE_FORMAT(#{on},' %Y'))")).order(Arel.sql("CONCAT('Q', QUARTER(#{on}), DATE_FORMAT(#{on},' %Y')) #{order}")).size
26
13
  end
27
14
  end
28
15
  end
@@ -5,13 +5,15 @@ module Chartable
5
5
  # Example output: `{"01/28/2018 - 02/03/2018" => 1, "02/11/2018 - 02/17/2018" => 1}`
6
6
  #
7
7
  # @return [Hash]
8
- def self.call(scope, on:)
9
- if ActiveRecord::Base.connection.class.to_s.match(/sqlite/i)
10
- scope.group("strftime('%m/%d/%Y', date(#{on}, 'weekday 0', '-7 days')) || ' - ' || strftime('%m/%d/%Y', date(#{on}, 'weekday 0', '-1 days'))").size
11
- elsif ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
12
- scope.group("concat(to_char(date_trunc('week', #{on}) + '-1 day', 'MM/DD/YYYY'), ' - ', to_char(date_trunc('week', #{on}) + '5 days', 'MM/DD/YYYY'))").size
8
+ def self.call(scope, on:, order:)
9
+ if ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
10
+ scope
11
+ .group(Arel.sql("concat(to_char(date_trunc('week', #{on}) + '-1 day', 'MM/DD/YYYY'), ' - ', to_char(date_trunc('week', #{on}) + '5 days', 'MM/DD/YYYY'))"))
12
+ .order(Arel.sql("concat(to_char(date_trunc('week', #{on}) + '-1 day', 'MM/DD/YYYY'), ' - ', to_char(date_trunc('week', #{on}) + '5 days', 'MM/DD/YYYY')) #{order}")).size
13
13
  else
14
- scope.group("CONCAT(DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(1-DAYOFWEEK(#{on})) DAY)), '%m/%d/%Y'), ' - ', DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(7-DAYOFWEEK(#{on})) DAY)),'%m/%d/%Y'))").size
14
+ scope
15
+ .group(Arel.sql("CONCAT(DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(1-DAYOFWEEK(#{on})) DAY)), '%m/%d/%Y'), ' - ', DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(7-DAYOFWEEK(#{on})) DAY)),'%m/%d/%Y'))"))
16
+ .order(Arel.sql("CONCAT(DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(1-DAYOFWEEK(#{on})) DAY)), '%m/%d/%Y'), ' - ', DATE_FORMAT(DATE(DATE_ADD(#{on}, INTERVAL(7-DAYOFWEEK(#{on})) DAY)),'%m/%d/%Y')) #{order}")).size
15
17
  end
16
18
  end
17
19
  end
@@ -5,13 +5,11 @@ module Chartable
5
5
  # Example output: `{ 2017 => 1, 2018 => 1 }`
6
6
  #
7
7
  # @return [Hash]
8
- def self.call(scope, on:)
9
- if ActiveRecord::Base.connection.class.to_s.match(/sqlite/i)
10
- scope.group("cast(strftime('%Y', #{on}) as decimal)").size
11
- elsif ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
12
- scope.group("cast(to_char(#{on},'YYYY') as integer)").size
8
+ def self.call(scope, on:, order:)
9
+ if ActiveRecord::Base.connection.class.to_s.match(/postgresql/i)
10
+ scope.group(Arel.sql("cast(to_char(#{on},'YYYY') as integer)")).order(Arel.sql("cast(to_char(#{on},'YYYY') as integer) #{order}")).size
13
11
  else
14
- scope.group("YEAR(#{on})").size
12
+ scope.group(Arel.sql("YEAR(#{on})")).order(Arel.sql("YEAR(#{on}) #{order}")).size
15
13
  end
16
14
  end
17
15
  end
@@ -6,7 +6,7 @@ module Chartable
6
6
  #
7
7
  # @return [String]
8
8
  def to_s
9
- "0.0.0.2"
9
+ "0.0.0.3"
10
10
  end
11
11
  end
12
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chartable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0.2
4
+ version: 0.0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paweł Dąbrowski
@@ -158,7 +158,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
158
  requirements:
159
159
  - - ">="
160
160
  - !ruby/object:Gem::Version
161
- version: 2.0.0
161
+ version: 2.1.0
162
162
  required_rubygems_version: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - ">="
@@ -166,7 +166,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
166
  version: '0'
167
167
  requirements: []
168
168
  rubyforge_project:
169
- rubygems_version: 2.7.3
169
+ rubygems_version: 2.7.6
170
170
  signing_key:
171
171
  specification_version: 4
172
172
  summary: A lightweight and database-level library to transform any Active Record query