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: 5ffa9b8c4f66f8c73e4accab049add69370287f2
4
- data.tar.gz: e127e07ab476cf8e6286e20cda3c02605a2f5f18
3
+ metadata.gz: 3687167aeee2a4c5247df316603b0395d041b26b
4
+ data.tar.gz: f2709f263731b76b601a6a158c36fb64a00d1932
5
5
  SHA512:
6
- metadata.gz: 8fdb2800683d3cc07b58ca3f311ad47f4606179fb87a1b2f70d42e5a1d44c8e28c9f40024d3fb42481b376df671fedd8595166ca3b15b3cb1d1b2ed8319f2c5a
7
- data.tar.gz: 58fbe23d4bebfd7dc6ddcf8ad3d01efc32df3aa3938b5a9edb41204ef74c269664da482d8effa6a703f656934c6183582f1c0503efe46788f6e247a0a2c7d55a
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 = clean_query_attribute(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 && (data && !data.empty?)
27
+ result = (data || []).send(@binding_operator, result) if @binding_operator
28
28
 
29
29
  result.sort_by(&:id)
30
30
  end
@@ -1,3 +1,3 @@
1
1
  module SqlQueryExecutor
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.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.1.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-15 00:00:00.000000000 Z
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