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 +4 -4
- data/lib/sql_query_executor/base.rb +1 -1
- data/lib/sql_query_executor/query/normalizers/base_normalizer.rb +24 -0
- data/lib/sql_query_executor/query/normalizers/origin_normalizer.rb +63 -0
- data/lib/sql_query_executor/query/normalizers/query_normalizer.rb +96 -0
- data/lib/sql_query_executor/version.rb +1 -1
- metadata +5 -3
- data/lib/sql_query_executor/query/query_normalizer.rb +0 -146
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69f41682d9033acdb640a38d097d9f99eb13cabd
|
4
|
+
data.tar.gz: 3a0b636c3771ca0fbece8a6a9cfef45df2abca80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 535d00055be485560c0c2a41e4dab3ddf16cb4d462f5656cdc40f84a65838e6a003c37076fb5d68f0c58488bd2908b83c9ac783327644ebb1e03c3c0410e1299
|
7
|
+
data.tar.gz: c353d5a6f9b4e55cfb2c0a5fd868e10f205539a6d5a6fd0f400eb3d7e2d731b9b595bea31b6423c88386221fe92de36dba58661f28de9e6a86e2f4e85fba5a00
|
@@ -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
|
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.
|
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-
|
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/
|
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
|