sql_query_executor 0.3.1 → 0.3.2

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
  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