querier 0.0.6 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -14
  3. data/lib/querier.rb +83 -61
  4. metadata +7 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fcc33d6a1dadd37a5731224a5ae632d86df0a90bacad5cc0795023b337c099d
4
- data.tar.gz: 27825d9168d18d5f08ceb206ccfe863694f38795e455b8fd4f3e286256219fcc
3
+ metadata.gz: b9b2cf6f8f3a3f4aa087c68f85753ddcca380e076a165d0abef3fe750815630a
4
+ data.tar.gz: b8825c18fae966fbcdc54dd33a799c108efa7c5cebb4c46336c53093cb03bd1d
5
5
  SHA512:
6
- metadata.gz: 1e807dcf2db351b1b79a3c1c9fd2db8da1e3cab636d31b9792949fd1b3b8f6158a8f7baf65bfcd1b37373fb321866fe088b50d4c838244bf3922f7d737d17797
7
- data.tar.gz: 1f0bdd06785eb2286c1ab243a2b040a79f5e91f397d4cd29072a2d4937ddf7c25a4653c74d9e5cdbee8a55cc0a17a9045dd9b036f7c133ce70783a20db532821
6
+ metadata.gz: 84affb4d1704196d94de6dfbefb66795dc68636ddbfdf0fd6131a7b925313954642032d052d756124bff9e6a04a38b3a0a0917fc50d923c7d85d0cd9cd571a37
7
+ data.tar.gz: e4ff00606711107491de8ea7f9e7066786136859da62f2fdc3ff1b1f27e7a8ef4e85d7918c1fc9fa8962c840ecf71961f9c8464748a5ad1f39ba862f063d3cf7
data/README.md CHANGED
@@ -1,22 +1,10 @@
1
1
  # querier
2
2
 
3
3
  # class UserQuerier < Querier
4
- QUERY_TEMPLATE = <<-END_OF_QUERY_TEMPLATE
5
-
6
- SELECT
7
- *
8
- FROM
9
- users
10
- WHERE
11
- name = {?user_name}
12
- AND active = {?active}
13
-
14
- END_OF_QUERY_TEMPLATE
15
-
16
4
  def initialize user_name:, active:
17
- @query_template = QUERY_TEMPLATE
5
+ @query_template = "SELECT * FROM users WHERE name = ${user_name} AND active = ${active}"
18
6
  super
19
7
  end
20
8
  end
21
9
 
22
- # UserQuerier.new(user_name: 'foo', active: true).execute
10
+ # UserQuerier.new(user_name: 'foo', active: true).execute
@@ -1,61 +1,83 @@
1
- class Querier
2
- PARAM_NAME_INDEX = 0
3
- PARAM_VALUE_INDEX = 1
4
-
5
- attr_reader :query_template, :query_params
6
-
7
- def initialize **template_query_params
8
- @query_params = template_query_params.dup
9
- end
10
-
11
- def execute
12
- ActiveRecord::Base.connection.select_all fill_query_params(query_template: @query_template, query_params: @query_params)
13
- end
14
-
15
- def structured_results
16
- query_results = self.execute
17
- structured_results = []
18
- query_results.each {|query_result| structured_results << OpenStruct.new(query_result.symbolize_keys!)}
19
- structured_results
20
- end
21
-
22
- def to_sql
23
- fill_query_params(query_template: @query_template, query_params: @query_params)
24
- end
25
-
26
- def to_file
27
- file_name = "querier #{Time.now.strftime "[%d-%m-%Y]-[%Hh %Mm %Ss]"}.sql"
28
- File.open("tmp/#{file_name}", 'w') {|f| f << self.to_sql}
29
- end
30
-
31
- def field_group_and_count field_name:, sort_element_index: nil, reverse_sort: true
32
- count_result = @cached_results.group_by(&field_name).map {|k, v| [k, v.count]}
33
-
34
- unless sort_element_index.nil?
35
- count_result = count_result.sort_by {|el| el[sort_element_index]}
36
- count_result.reverse! if reverse_sort.eql? true
37
- end
38
-
39
- count_result
40
- end
41
-
42
- private
43
-
44
- def get_param_value raw_query_param
45
- # where's String#quote when we need it?
46
- raw_query_param.class.eql?(String) ? "'#{raw_query_param.to_s}'" : raw_query_param.to_s
47
- end
48
-
49
- def fill_query_params query_template:, query_params:
50
- query = query_template.dup
51
-
52
- query_params.each do |query_param|
53
- query_param_name = query_param[PARAM_NAME_INDEX].to_s
54
- query_param_value = get_param_value(query_param[PARAM_VALUE_INDEX])
55
-
56
- query.gsub! /{\?#{query_param_name}}/, query_param_value
57
- end
58
-
59
- query
60
- end
61
- end
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
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.0.6
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gedean Dias
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-21 00:00:00.000000000 Z
11
+ date: 2020-12-28 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
@@ -22,7 +22,7 @@ homepage: https://github.com/gedean/querier
22
22
  licenses:
23
23
  - MIT
24
24
  metadata: {}
25
- post_install_message:
25
+ post_install_message:
26
26
  rdoc_options: []
27
27
  require_paths:
28
28
  - lib
@@ -30,16 +30,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 2.0.0
33
+ version: 2.7.0
34
34
  required_rubygems_version: !ruby/object:Gem::Requirement
35
35
  requirements:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  requirements: []
40
- rubyforge_project:
41
- rubygems_version: 2.7.4
42
- signing_key:
40
+ rubygems_version: 3.2.3
41
+ signing_key:
43
42
  specification_version: 4
44
43
  summary: Active Record Querier
45
44
  test_files: []