sql_query_executor 0.3.1 → 0.3.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3c2510b202eeac4b6e79770f6395b636d90ca8e2
4
- data.tar.gz: be4eb8d91ec1a237374a0d9ffb795efb715f3392
3
+ metadata.gz: 69f41682d9033acdb640a38d097d9f99eb13cabd
4
+ data.tar.gz: 3a0b636c3771ca0fbece8a6a9cfef45df2abca80
5
5
  SHA512:
6
- metadata.gz: ff562466f8d562bf0ef3d14b5d788f9d9faa31f1dbce72b8e48d214cbfa2aea5b3f0840a0b4c88c2d95e19b87907298e33f4f154bdfb0753e0ddec3772e95a56
7
- data.tar.gz: 8ee24c50076d39fdec78b8187d19b944ee024ac0efd136f6d1cb6d5b1bc80935e7449e1c604df2358c4198193ab1bfea73f46b5433cd9c4a6196f201426708b8
6
+ metadata.gz: 535d00055be485560c0c2a41e4dab3ddf16cb4d462f5656cdc40f84a65838e6a003c37076fb5d68f0c58488bd2908b83c9ac783327644ebb1e03c3c0410e1299
7
+ data.tar.gz: c353d5a6f9b4e55cfb2c0a5fd868e10f205539a6d5a6fd0f400eb3d7e2d731b9b595bea31b6423c88386221fe92de36dba58661f28de9e6a86e2f4e85fba5a00
@@ -1,5 +1,5 @@
1
1
  require 'ostruct'
2
- require 'sql_query_executor/query/query_normalizer'
2
+ require 'sql_query_executor/query/normalizers/query_normalizer'
3
3
  require 'sql_query_executor/query/sub_query'
4
4
 
5
5
  # Simulates a SQL where clause to filter objects from the database
@@ -0,0 +1,24 @@
1
+ require 'sql_query_executor'
2
+
3
+ module SqlQueryExecutor
4
+ module Query
5
+ class BaseNormalizer
6
+ private
7
+ # Returns converted #param based on its Class, so it can be used on the query
8
+ def self.convert_param(param)
9
+ case param.class.name
10
+ when "NilClass"
11
+ nil
12
+ when "String"
13
+ "'#{param}'".gsub("''", "'").gsub('""', '"')
14
+ when "Date"
15
+ "'#{param.strftime("%Y-%m-%d")}'"
16
+ when "Time"
17
+ "'#{param.strftime("%Y-%m-%d %H:%M:%S %z")}'"
18
+ else
19
+ param.to_s
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ require 'sql_query_executor'
2
+ require 'sql_query_executor/query/normalizers/base_normalizer'
3
+
4
+ module SqlQueryExecutor
5
+ module Query
6
+ class OriginNormalizer < BaseNormalizer
7
+ BINDING_OPERATORS = ['$and', '$or']
8
+ OPERATORS = {
9
+ "$gt" => '>',
10
+ "$lt" => '<',
11
+ "$gte" => '>=',
12
+ "$lte" => '<=',
13
+ "$ne" => '!=',
14
+ "$in" => 'in'
15
+ }
16
+
17
+ def self.execute(query)
18
+ query_array = []
19
+
20
+ query.each do |key, value|
21
+ if value.is_a?(Array)
22
+ query_array << hash_with_array_value(key, value)
23
+ else
24
+ query_array << normal_hash(key, value)
25
+ end
26
+ end
27
+
28
+
29
+ query_array.join(" and ").gsub('!=', '<>')
30
+ end
31
+
32
+ private
33
+ def self.hash_with_array_value(key, value)
34
+ if BINDING_OPERATORS.include?(key)
35
+ key = key.gsub('$', '')
36
+ queries = []
37
+
38
+ value.each do |hash|
39
+ queries << execute(hash)
40
+ end
41
+
42
+ "(#{queries.join(" #{key.to_s} ")})"
43
+ else
44
+ value = value.first.is_a?(Numeric) ? value : value.map{ |v| "'#{v}'" }
45
+ "#{key} in (#{value.join(',')})"
46
+ end
47
+ end
48
+
49
+ def self.normal_hash(key, value)
50
+ operator = '='
51
+
52
+ if value.is_a?(Hash)
53
+ operator = OPERATORS[value.keys.first] || operator
54
+
55
+ value = convert_param(value.values.first)
56
+ end
57
+
58
+ value = convert_param(value)
59
+ value.nil? ? "#{key} is null" : "#{key} #{operator} #{value}"
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,96 @@
1
+ require 'sql_query_executor'
2
+ require 'sql_query_executor/query/normalizers/base_normalizer'
3
+ require 'sql_query_executor/query/normalizers/origin_normalizer'
4
+
5
+ module SqlQueryExecutor
6
+ module Query
7
+ class QueryNormalizer < BaseNormalizer
8
+ CONVERT_METHODS = {"String" => "get_query", "Array" => "interpolate_query", "Hash" => "convert_hash"}
9
+
10
+ def self.execute(query)
11
+ query = clean_query_attribute(query)
12
+ method = CONVERT_METHODS[query.class.name]
13
+
14
+ query = sanitize(send(method, query))
15
+ end
16
+
17
+ def self.clean_query(query)
18
+ remove_placeholders execute(query).gsub('!=', '<>')
19
+ end
20
+
21
+ private
22
+ def self.convert_hash(query)
23
+ OriginNormalizer.execute(query)
24
+ end
25
+
26
+ def self.remove_placeholders(query)
27
+ query.gsub(Base::QUERY_SPACE, ' ').gsub(Base::STRING_SPACE, ' ').gsub(Base::TEMP_SPACE, ' ')
28
+ end
29
+
30
+ def self.clean_query_attribute(query)
31
+ return query unless query.is_a?(Array)
32
+
33
+ query = query.flatten
34
+
35
+ (query.size == 1 ? query.first : query)
36
+ end
37
+
38
+ def self.get_query(query)
39
+ query
40
+ end
41
+
42
+ # Prepares query by replacing all ? by it's real values in #args
43
+ def self.interpolate_query(args)
44
+ args.flatten!
45
+ return args.first if args.size == 1 && args.first.is_a?(String)
46
+
47
+ query = args.first
48
+ param = args.delete_at(1)
49
+
50
+ param = convert_param(param)
51
+
52
+ args[0] = query.sub("?", param.is_a?(Numeric) ? param : "#{param}")
53
+
54
+ interpolate_query(args)
55
+ end
56
+
57
+ # Removes all accents and other non default characters
58
+ def self.sanitize(query)
59
+ new_query = replace_on_query(query, /(["|'].*?["|'])/, " ", Base::STRING_SPACE)
60
+ new_query = replace_on_query(new_query, /(\(.*?\))/, " ", Base::QUERY_SPACE)
61
+
62
+ remove_spaces(prepare_query(new_query))
63
+ end
64
+
65
+ def self.replace_on_query(query, regexp, pattern, replacement)
66
+ new_query = query ? query.dup : query
67
+
68
+ params = new_query.scan(regexp).flatten.compact
69
+
70
+ params.each do |param|
71
+ new_param = param.dup
72
+
73
+ new_param = new_param.gsub(pattern, replacement)
74
+
75
+ new_query = new_query.gsub(param, new_param)
76
+ end
77
+
78
+ new_query
79
+ end
80
+
81
+ def self.prepare_query(query)
82
+ SubQuery::BINDING_OPERATORS.keys.each do |operator|
83
+ query.gsub!(" #{operator} ", "#{Base::TEMP_SPACE}#{operator}#{Base::QUERY_SPACE}")
84
+ end
85
+
86
+ query.gsub(" ", Base::QUERY_SPACE).gsub(Base::TEMP_SPACE, " ")
87
+ end
88
+
89
+ def self.remove_spaces(query)
90
+ query.gsub!(",#{Base::QUERY_SPACE}", ',')
91
+ query.gsub!(/\[.*?\]/) { |substr| substr.gsub(' ', '') }
92
+ query
93
+ end
94
+ end
95
+ end
96
+ end
@@ -1,3 +1,3 @@
1
1
  module SqlQueryExecutor
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql_query_executor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Caio Torres
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-10 00:00:00.000000000 Z
11
+ date: 2014-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -68,7 +68,9 @@ files:
68
68
  - lib/sql_query_executor/operators/default.rb
69
69
  - lib/sql_query_executor/operators/in.rb
70
70
  - lib/sql_query_executor/operators/is.rb
71
- - lib/sql_query_executor/query/query_normalizer.rb
71
+ - lib/sql_query_executor/query/normalizers/base_normalizer.rb
72
+ - lib/sql_query_executor/query/normalizers/origin_normalizer.rb
73
+ - lib/sql_query_executor/query/normalizers/query_normalizer.rb
72
74
  - lib/sql_query_executor/query/sentence.rb
73
75
  - lib/sql_query_executor/query/sub_query.rb
74
76
  - lib/sql_query_executor/version.rb
@@ -1,146 +0,0 @@
1
- require 'sql_query_executor'
2
-
3
- module SqlQueryExecutor
4
- module Query
5
- class QueryNormalizer
6
- class << self
7
- CONVERT_METHODS = {"String" => "get_query", "Array" => "interpolate_query", "Hash" => "concatenate_hash"}
8
-
9
- def execute(query)
10
- query = clean_query_attribute(query)
11
- method = CONVERT_METHODS[query.class.name]
12
-
13
- query = sanitize(send(method, query))
14
- end
15
-
16
- def clean_query(query)
17
- remove_placeholders execute(query)
18
- end
19
-
20
- private
21
- def remove_placeholders(query)
22
- query.gsub(Base::QUERY_SPACE, ' ').gsub(Base::STRING_SPACE, ' ').gsub(Base::TEMP_SPACE, ' ')
23
- end
24
-
25
- def clean_query_attribute(query)
26
- return query unless query.is_a?(Array)
27
-
28
- query = query.flatten
29
-
30
- query.size == 1 ? query.first : query
31
- end
32
-
33
- def get_query(query)
34
- query
35
- end
36
-
37
- # Prepares query by replacing all ? by it's real values in #args
38
- def interpolate_query(args)
39
- args.flatten!
40
- return args.first if args.size == 1 && args.first.is_a?(String)
41
-
42
- query = args.first
43
- param = args.delete_at(1)
44
-
45
- param = convert_param(param)
46
-
47
- args[0] = query.sub("?", param.is_a?(Numeric) ? param : "#{param}")
48
-
49
- interpolate_query(args)
50
- end
51
-
52
- # Removes all accents and other non default characters
53
- def sanitize(query)
54
- new_query = replace_on_query(query, /(["|'].*?["|'])/, " ", Base::STRING_SPACE)
55
- new_query = replace_on_query(new_query, /(\(.*?\))/, " ", Base::QUERY_SPACE)
56
-
57
- remove_spaces(prepare_query(new_query))
58
- end
59
-
60
- def replace_on_query(query, regexp, pattern, replacement)
61
- new_query = query ? query.dup : query
62
-
63
- params = new_query.scan(regexp).flatten.compact
64
-
65
- params.each do |param|
66
- new_param = param.dup
67
-
68
- new_param = new_param.gsub(pattern, replacement)
69
-
70
- new_query = new_query.gsub(param, new_param)
71
- end
72
-
73
- new_query
74
- end
75
-
76
- def prepare_query(query)
77
- SubQuery::BINDING_OPERATORS.keys.each do |operator|
78
- query.gsub!(" #{operator} ", "#{Base::TEMP_SPACE}#{operator}#{Base::QUERY_SPACE}")
79
- end
80
-
81
- query.gsub(" ", Base::QUERY_SPACE).gsub(Base::TEMP_SPACE, " ")
82
- end
83
-
84
- def remove_spaces(query)
85
- query.gsub!(",#{Base::QUERY_SPACE}", ',')
86
- query.gsub!(/\[.*?\]/) { |substr| substr.gsub(' ', '') }
87
- query
88
- end
89
-
90
- # Returns converted #param based on its Class, so it can be used on the query
91
- def convert_param(param)
92
- case param.class.name
93
- when "NilClass"
94
- nil
95
- when "String"
96
- "'#{param}'".gsub("''", "'").gsub('""', '"')
97
- when "Date"
98
- "'#{param.strftime("%Y-%m-%d")}'"
99
- when "Time"
100
- "'#{param.strftime("%Y-%m-%d %H:%M:%S %z")}'"
101
- else
102
- param.to_s
103
- end
104
- end
105
-
106
- def concatenate_hash(query)
107
- return "" unless query.is_a?(Hash)
108
- query_array = []
109
- operators = {"$gt" => '>', "$lt" => '<', "$gte" => '>=', "$lte" => '<=', "$ne" => '!=', "$in" => 'in'}
110
-
111
- query.each do |key, value|
112
- if value.is_a?(Array)
113
- if ['$and', '$or'].include?(key)
114
- key = key.gsub('$', '')
115
- queries = []
116
-
117
- value.each do |hash|
118
- queries << concatenate_hash(hash)
119
- end
120
-
121
- query_array << "(#{queries.join(" #{key.to_s} ")})"
122
- else
123
- value = value.first.is_a?(Numeric) ? value : value.map{ |v| "'#{v}'" }
124
- query_array << "#{key} in (#{value.join(',')})"
125
- end
126
- else
127
- operator = '='
128
-
129
- if value.is_a?(Hash)
130
- operator = operators[value.keys.first] || operator
131
-
132
- value = convert_param(value.values.first)
133
- end
134
-
135
- value = convert_param(value)
136
- query_array << (value.nil? ? "#{key} is null" : "#{key} #{operator} #{value}")
137
- end
138
- end
139
-
140
-
141
- query_array.join(" and ")
142
- end
143
- end
144
- end
145
- end
146
- end