querier 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/querier.rb +91 -83
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b9b2cf6f8f3a3f4aa087c68f85753ddcca380e076a165d0abef3fe750815630a
4
- data.tar.gz: b8825c18fae966fbcdc54dd33a799c108efa7c5cebb4c46336c53093cb03bd1d
3
+ metadata.gz: b665dcde0c37b483e764ddcf1d30221ba9c4b34f478533e6fb911aaf11a81996
4
+ data.tar.gz: 4bd3bb6e6e3cc430b257ac9b408629440b8249ad642c1db89a6f9ece21d671f3
5
5
  SHA512:
6
- metadata.gz: 84affb4d1704196d94de6dfbefb66795dc68636ddbfdf0fd6131a7b925313954642032d052d756124bff9e6a04a38b3a0a0917fc50d923c7d85d0cd9cd571a37
7
- data.tar.gz: e4ff00606711107491de8ea7f9e7066786136859da62f2fdc3ff1b1f27e7a8ef4e85d7918c1fc9fa8962c840ecf71961f9c8464748a5ad1f39ba862f063d3cf7
6
+ metadata.gz: 5e0fc946d4e39bc164ffeda2bd762c4e3bddc4f769363d9590e4dc08a6a7379b3f3e27f5516b93baaea2a8c8216ac2808946096a0f48a28b847246d8a73d1da7
7
+ data.tar.gz: 3af81af98208e77a0f9360de68a5d15cd45e153613aaa5e1654157bcf4ea4ccf77977c80d1e30b22259db96eabff5d13bc6b66a843c4cbbcb210ad114ac905c6
data/lib/querier.rb CHANGED
@@ -1,83 +1,91 @@
1
- class Querier
2
- PARAM_NAME_INDEX = 0
3
- PARAM_VALUE_INDEX = 1
4
-
5
- attr_reader :query_execution_count, :query_template, :query_params
6
-
7
- def initialize(**template_query_params)
8
- @query_execution_count = 0
9
- @query_params = template_query_params.dup
10
- end
11
-
12
- def execute
13
- @query_execution_count += 1
14
- @execution_cached_result = ActiveRecord::Base.connection.select_all(fill_query_params(query_template: @query_template,
15
- query_params: @query_params)).map(&:symbolize_keys!)
16
- end
17
-
18
- def cached_result(format: :hash)
19
- raise 'query not executed yet' if @query_execution_count.eql?(0)
20
-
21
- case format
22
- when :hash
23
- @execution_cached_result
24
- when :open_struct
25
- hash_to_open_struct(dataset: @execution_cached_result)
26
- else
27
- raise 'invalid value type'
28
- end
29
- end
30
-
31
- def structured_results
32
- hash_to_open_struct(dataset: execute)
33
- end
34
-
35
- def to_sql
36
- fill_query_params(query_template: @query_template, query_params: @query_params)
37
- end
38
-
39
- def to_file
40
- file_name = "querier #{Time.now.strftime '[%d-%m-%Y]-[%Hh %Mm %Ss]'}.sql"
41
- File.open("tmp/#{file_name}", 'w') { |f| f << to_sql }
42
- end
43
-
44
- def field_group_and_count(field_name:, sort_element_index: nil, reverse_sort: true)
45
- count_result = cached_results(format: :open_struct).group_by(&field_name).map { |k, v| [k, v.count] }
46
-
47
- unless sort_element_index.nil?
48
- count_result = count_result.sort_by { |el| el[sort_element_index] }
49
- count_result.reverse! if reverse_sort.eql? true
50
- end
51
-
52
- count_result
53
- end
54
-
55
- private
56
-
57
- def hash_to_open_struct(dataset:)
58
- dataset.map { |record| OpenStruct.new(record.symbolize_keys!) }
59
- end
60
-
61
- def get_param_value(raw_query_param:, quotefy_param: true)
62
- # where's String#quote when we need it?
63
- raw_query_param.instance_of?(String) && quotefy_param ? "'#{raw_query_param.to_s}'" : raw_query_param.to_s
64
- end
65
-
66
- def fill_query_params(query_template:, query_params:)
67
- query = query_template.dup
68
-
69
- query_params.each do |query_param|
70
- query_param_name = query_param[PARAM_NAME_INDEX].to_s
71
-
72
- query.gsub!(/\${#{query_param_name}}/,
73
- get_param_value(raw_query_param: query_param[PARAM_VALUE_INDEX],
74
- quotefy_param: true))
75
-
76
- query.gsub!(/\${#{query_param_name}\/no_quote}/,
77
- get_param_value(raw_query_param: query_param[PARAM_VALUE_INDEX],
78
- quotefy_param: false))
79
- end
80
-
81
- query
82
- end
83
- end
1
+ class Querier
2
+ PARAM_NAME_INDEX = 0
3
+ PARAM_VALUE_INDEX = 1
4
+
5
+ @active_record_class = ActiveRecord::Base
6
+ # based on rubocop's tips at: https://www.rubydoc.info/gems/rubocop/RuboCop/Cop/Style/ClassVars
7
+ # solution here: https://www.ruby-lang.org/en/documentation/faq/8/
8
+ class << self
9
+ attr_accessor :active_record_class
10
+ end
11
+
12
+ attr_reader :query_execution_count, :query_template, :query_params
13
+
14
+ def initialize(**template_query_params)
15
+ @active_record_class = self.class.active_record_class || self.class.superclass.active_record_class
16
+ @query_execution_count = 0
17
+ @query_params = template_query_params.dup
18
+ end
19
+
20
+ def execute
21
+ @query_execution_count += 1
22
+ @execution_cached_result = @active_record_class.connection.select_all(fill_query_params(query_template: @query_template,
23
+ query_params: @query_params)).map(&:symbolize_keys!)
24
+ end
25
+
26
+ def cached_result(format: :hash)
27
+ raise 'query not executed yet' if @query_execution_count.eql?(0)
28
+
29
+ case format
30
+ when :hash
31
+ @execution_cached_result
32
+ when :open_struct
33
+ hash_to_open_struct(dataset: @execution_cached_result)
34
+ else
35
+ raise 'invalid value type'
36
+ end
37
+ end
38
+
39
+ def structured_results
40
+ hash_to_open_struct(dataset: execute)
41
+ end
42
+
43
+ def to_sql
44
+ fill_query_params(query_template: @query_template, query_params: @query_params)
45
+ end
46
+
47
+ def to_file
48
+ file_name = "querier #{Time.now.strftime '[%d-%m-%Y]-[%Hh %Mm %Ss]'}.sql"
49
+ File.open("tmp/#{file_name}", 'w') { |f| f << to_sql }
50
+ end
51
+
52
+ def field_group_and_count(field_name:, sort_element_index: nil, reverse_sort: true)
53
+ count_result = cached_results(format: :open_struct).group_by(&field_name).map { |k, v| [k, v.count] }
54
+
55
+ unless sort_element_index.nil?
56
+ count_result = count_result.sort_by { |el| el[sort_element_index] }
57
+ count_result.reverse! if reverse_sort.eql? true
58
+ end
59
+
60
+ count_result
61
+ end
62
+
63
+ private
64
+
65
+ def hash_to_open_struct(dataset:)
66
+ dataset.map { |record| OpenStruct.new(record.symbolize_keys!) }
67
+ end
68
+
69
+ def get_param_value(raw_query_param:, quotefy_param: true)
70
+ # where's String#quote when we need it?
71
+ raw_query_param.instance_of?(String) && quotefy_param ? "'#{raw_query_param.to_s}'" : raw_query_param.to_s
72
+ end
73
+
74
+ def fill_query_params(query_template:, query_params:)
75
+ query = query_template.dup
76
+
77
+ query_params.each do |query_param|
78
+ query_param_name = query_param[PARAM_NAME_INDEX].to_s
79
+
80
+ query.gsub!(/\${#{query_param_name}}/,
81
+ get_param_value(raw_query_param: query_param[PARAM_VALUE_INDEX],
82
+ quotefy_param: true))
83
+
84
+ query.gsub!(/\${#{query_param_name}\/no_quote}/,
85
+ get_param_value(raw_query_param: query_param[PARAM_VALUE_INDEX],
86
+ quotefy_param: false))
87
+ end
88
+
89
+ query
90
+ end
91
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: querier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gedean Dias
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-28 00:00:00.000000000 Z
11
+ date: 2021-04-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Active Record queries with variable number of params
14
14
  email: gedean.dias@gmail.com
@@ -37,7 +37,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  requirements: []
40
- rubygems_version: 3.2.3
40
+ rubygems_version: 3.2.15
41
41
  signing_key:
42
42
  specification_version: 4
43
43
  summary: Active Record Querier