sql_query_executor 0.1.1 → 0.1.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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3687167aeee2a4c5247df316603b0395d041b26b
|
4
|
+
data.tar.gz: f2709f263731b76b601a6a158c36fb64a00d1932
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 97c5d6546a812e34a7b6fc4246f55e92b454f59f1f3b58dae49dba2aca0d24d22145002b8feb81d8e548fc0720efe8b52168ee07d430d4a94dd52f13c0c336fd
|
7
|
+
data.tar.gz: 4644918b41c5aec118c84a26a5cca0a4d6a8bfbe102ef009a171854a1bebd86ca2aeda6f7194f6cce10c606824a2a7c8d3b317e61b4e40e6173646a4bac42705
|
@@ -1,18 +1,16 @@
|
|
1
|
+
require 'sql_query_executor/query/query_normalizer'
|
2
|
+
|
1
3
|
module SqlQueryExecutor
|
2
4
|
module Query
|
3
5
|
class Base
|
4
6
|
attr_reader :query
|
5
7
|
|
6
|
-
CONVERT_METHODS = {"String" => ["get_query", ""], "Array" => ["interpolate_query", "query.flatten"], "Hash" => ["concatenate_hash", "query"]}
|
7
8
|
STRING_SPACE = "$SS$"
|
8
9
|
QUERY_SPACE = "$QS$"
|
9
10
|
TEMP_SPACE = "$TS$"
|
10
11
|
|
11
12
|
def initialize(query, collection)
|
12
|
-
query =
|
13
|
-
array = CONVERT_METHODS[query.class.name]
|
14
|
-
|
15
|
-
query = sanitize(send(array.first, query))
|
13
|
+
query = QueryNormalizer.execute(query)
|
16
14
|
@query = SqlQueryExecutor::Query::SubQuery.new query, collection
|
17
15
|
end
|
18
16
|
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require 'sql_query_executor'
|
2
|
+
|
3
|
+
module SqlQueryExecutor
|
4
|
+
module Query
|
5
|
+
class SqlQueryExecutor::Query::QueryNormalizer
|
6
|
+
class << self
|
7
|
+
CONVERT_METHODS = {"String" => ["get_query", ""], "Array" => ["interpolate_query", "query.flatten"], "Hash" => ["concatenate_hash", "query"]}
|
8
|
+
|
9
|
+
def execute(query)
|
10
|
+
query = clean_query_attribute(query)
|
11
|
+
array = CONVERT_METHODS[query.class.name]
|
12
|
+
|
13
|
+
query = sanitize(send(array.first, query))
|
14
|
+
end
|
15
|
+
|
16
|
+
def clean_query(query)
|
17
|
+
query = execute(query)
|
18
|
+
|
19
|
+
remove_placeholders(query)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def remove_placeholders(query)
|
24
|
+
query.gsub(Base::QUERY_SPACE, ' ').gsub(Base::STRING_SPACE, ' ').gsub(Base::TEMP_SPACE, ' ')
|
25
|
+
end
|
26
|
+
|
27
|
+
def clean_query_attribute(query)
|
28
|
+
return query unless query.is_a?(Array)
|
29
|
+
|
30
|
+
query = query.flatten
|
31
|
+
|
32
|
+
query.size == 1 ? query.first : query
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_query(query)
|
36
|
+
query
|
37
|
+
end
|
38
|
+
|
39
|
+
# Prepares query by replacing all ? by it's real values in #args
|
40
|
+
def interpolate_query(args)
|
41
|
+
args.flatten!
|
42
|
+
return args.first if args.size == 1 && args.first.is_a?(String)
|
43
|
+
|
44
|
+
query = args.first
|
45
|
+
param = args.delete_at(1)
|
46
|
+
|
47
|
+
param = convert_param(param)
|
48
|
+
|
49
|
+
args[0] = query.sub("?", param.is_a?(Numeric) ? param : "#{param}")
|
50
|
+
|
51
|
+
interpolate_query(args)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Removes all accents and other non default characters
|
55
|
+
def sanitize(query)
|
56
|
+
new_query = replace_on_query(query, /(["|'].*?["|'])/, " ", Base::STRING_SPACE)
|
57
|
+
new_query = replace_on_query(new_query, /(\(.*?\))/, " ", Base::QUERY_SPACE)
|
58
|
+
|
59
|
+
remove_spaces(prepare_query(new_query))
|
60
|
+
end
|
61
|
+
|
62
|
+
def replace_on_query(query, regexp, pattern, replacement)
|
63
|
+
new_query = query ? query.dup : query
|
64
|
+
|
65
|
+
params = new_query.scan(regexp).flatten.compact
|
66
|
+
|
67
|
+
params.each do |param|
|
68
|
+
new_param = param.dup
|
69
|
+
|
70
|
+
new_param = new_param.gsub(pattern, replacement)
|
71
|
+
|
72
|
+
new_query = new_query.gsub(param, new_param)
|
73
|
+
end
|
74
|
+
|
75
|
+
new_query
|
76
|
+
end
|
77
|
+
|
78
|
+
def prepare_query(query)
|
79
|
+
SubQuery::BINDING_OPERATORS.keys.each do |operator|
|
80
|
+
query.gsub!(" #{operator} ", "#{Base::TEMP_SPACE}#{operator}#{Base::QUERY_SPACE}")
|
81
|
+
end
|
82
|
+
|
83
|
+
query.gsub(" ", Base::QUERY_SPACE).gsub(Base::TEMP_SPACE, " ")
|
84
|
+
end
|
85
|
+
|
86
|
+
def remove_spaces(query)
|
87
|
+
query.gsub!(/\[.*?\]/) { |substr| substr.gsub(' ', '') }
|
88
|
+
query
|
89
|
+
end
|
90
|
+
|
91
|
+
# Returns converted #param based on its Class, so it can be used on the query
|
92
|
+
def convert_param(param)
|
93
|
+
case param.class.name
|
94
|
+
when "String"
|
95
|
+
param = "'#{param}'"
|
96
|
+
when "Date"
|
97
|
+
param = "'#{param.strftime("%Y-%m-%d")}'"
|
98
|
+
when "Time"
|
99
|
+
param = "'#{param.strftime("%Y-%m-%d %H:%M:%S %z")}'"
|
100
|
+
else
|
101
|
+
param = param.to_s
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def concatenate_hash(query)
|
106
|
+
return "" unless query.is_a?(Hash)
|
107
|
+
query_array = []
|
108
|
+
|
109
|
+
query.each do |key, value|
|
110
|
+
if value.is_a?(Array)
|
111
|
+
value = value.first.is_a?(Numeric) ? value : value.map{ |v| "'#{v}'" }
|
112
|
+
query_array << "#{key} in (#{value.join(',')})"
|
113
|
+
else
|
114
|
+
value = value.is_a?(Numeric) ? value : "'#{value}'"
|
115
|
+
query_array << "#{key} = #{value}"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
query_array.join(" and ")
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -24,7 +24,7 @@ module SqlQueryExecutor
|
|
24
24
|
result = child.execute!(result)
|
25
25
|
end
|
26
26
|
|
27
|
-
result = data.send(@binding_operator, result) if @binding_operator
|
27
|
+
result = (data || []).send(@binding_operator, result) if @binding_operator
|
28
28
|
|
29
29
|
result.sort_by(&:id)
|
30
30
|
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.1.
|
4
|
+
version: 0.1.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-02-
|
11
|
+
date: 2014-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- lib/sql_query_executor/operators/in.rb
|
70
70
|
- lib/sql_query_executor/operators/is.rb
|
71
71
|
- lib/sql_query_executor/query/base.rb
|
72
|
+
- lib/sql_query_executor/query/query_normalizer.rb
|
72
73
|
- lib/sql_query_executor/query/sentence.rb
|
73
74
|
- lib/sql_query_executor/query/sub_query.rb
|
74
75
|
- lib/sql_query_executor/version.rb
|