sql_query_executor 0.1.0 → 0.1.1

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: d35ed6525f34f2fa2b89077179627bb398e60569
4
- data.tar.gz: d7f5b1378fe6932180ed501143f8282620b36ee1
3
+ metadata.gz: 5ffa9b8c4f66f8c73e4accab049add69370287f2
4
+ data.tar.gz: e127e07ab476cf8e6286e20cda3c02605a2f5f18
5
5
  SHA512:
6
- metadata.gz: 17f7149a30b187f41262d8dfe826cf3a100400764aea984b5783cb440f9874b356038574ee5a16e9dd0e7f87d24c40e2085dad37ead3fe0f23db9f23fe8971b5
7
- data.tar.gz: 407df8d2c2a114b9979b17f7249bfcf9698a04b317087a59b3199e9cda64bcb2fa58e74657069c76190954bc80b6cba1cc2f97a2e6e8f9e23047629724358ece
6
+ metadata.gz: 8fdb2800683d3cc07b58ca3f311ad47f4606179fb87a1b2f70d42e5a1d44c8e28c9f40024d3fb42481b376df671fedd8595166ca3b15b3cb1d1b2ed8319f2c5a
7
+ data.tar.gz: 58fbe23d4bebfd7dc6ddcf8ad3d01efc32df3aa3938b5a9edb41204ef74c269664da482d8effa6a703f656934c6183582f1c0503efe46788f6e247a0a2c7d55a
@@ -1,5 +1,6 @@
1
1
  require 'ostruct'
2
2
  require 'sql_query_executor/query/base'
3
+ require 'sql_query_executor/query/sub_query'
3
4
 
4
5
  # Simulates a SQL where clause to filter objects from the database
5
6
  module SqlQueryExecutor #:nodoc:
@@ -17,6 +18,12 @@ module SqlQueryExecutor #:nodoc:
17
18
  # Recursive method that divides the query in sub queries, executes each part individually
18
19
  # and finally relates its results as specified in the query.
19
20
  def where(*query)
21
+ raise ArgumentError.new("must pass at least one argument") if query.empty?
22
+ query = query.first if query.respond_to?(:size) && query.size == 1
23
+
24
+ message = check_query(query)
25
+ raise ArgumentError.new(message) if message
26
+
20
27
  query = SqlQueryExecutor::Query::Base.new(query, @collection)
21
28
  query.execute!
22
29
  end
@@ -33,5 +40,11 @@ module SqlQueryExecutor #:nodoc:
33
40
  def conforming_collection?(collection)
34
41
  collection.first.respond_to?(:attributes)
35
42
  end
43
+
44
+ def check_query(query)
45
+ if query.is_a?(Array) && !query.first.is_a?(String)
46
+ "First element from array must be a String. eg: [\"name = ?\", \"John\"]"
47
+ end
48
+ end
36
49
  end
37
50
  end
@@ -4,9 +4,9 @@ module SqlQueryExecutor
4
4
  attr_reader :query
5
5
 
6
6
  CONVERT_METHODS = {"String" => ["get_query", ""], "Array" => ["interpolate_query", "query.flatten"], "Hash" => ["concatenate_hash", "query"]}
7
- STRING_SPACE = "$SS$"
8
- QUERY_SPACE = "$QS$"
9
- TEMP_SPACE = "$TS$"
7
+ STRING_SPACE = "$SS$"
8
+ QUERY_SPACE = "$QS$"
9
+ TEMP_SPACE = "$TS$"
10
10
 
11
11
  def initialize(query, collection)
12
12
  query = clean_query_attribute(query)
@@ -50,33 +50,34 @@ module SqlQueryExecutor
50
50
 
51
51
  # Removes all accents and other non default characters
52
52
  def sanitize(query)
53
- cruft = /\'|\"|\(|\)/
53
+ new_query = replace_on_query(query, /(["|'].*?["|'])/, " ", STRING_SPACE)
54
+ new_query = replace_on_query(new_query, /(\(.*?\))/, " ", QUERY_SPACE)
54
55
 
56
+ remove_spaces(prepare_query(new_query))
57
+ end
58
+
59
+ def replace_on_query(query, regexp, pattern, replacement)
55
60
  new_query = query ? query.dup : query
56
- params = new_query.scan(/(["|'].*?["|'])/).flatten.compact
61
+
62
+ params = new_query.scan(regexp).flatten.compact
57
63
 
58
64
  params.each do |param|
59
65
  new_param = param.dup
60
66
 
61
- new_param = new_param.gsub(" ", STRING_SPACE)
67
+ new_param = new_param.gsub(pattern, replacement)
62
68
 
63
69
  new_query = new_query.gsub(param, new_param)
64
70
  end
65
71
 
66
-
67
- params = new_query.scan(/(\(.*?\))/).flatten.compact
68
-
69
- params.each do |param|
70
- new_param = param.dup
71
-
72
- new_param = new_param.gsub(" ", QUERY_SPACE)
72
+ new_query
73
+ end
73
74
 
74
- new_query = new_query.gsub(param, new_param)
75
+ def prepare_query(query)
76
+ SubQuery::BINDING_OPERATORS.keys.each do |operator|
77
+ query.gsub!(" #{operator} ", "#{TEMP_SPACE}#{operator}#{QUERY_SPACE}")
75
78
  end
76
79
 
77
- query = new_query.gsub(" and ", "#{TEMP_SPACE}and#{QUERY_SPACE}").gsub(" or ", "#{TEMP_SPACE}or#{QUERY_SPACE}").gsub(" ", QUERY_SPACE).gsub(TEMP_SPACE, " ")
78
-
79
- remove_spaces(query)
80
+ query.gsub(" ", QUERY_SPACE).gsub(TEMP_SPACE, " ")
80
81
  end
81
82
 
82
83
  def remove_spaces(query)
@@ -6,7 +6,7 @@ require 'sql_query_executor/operators/in'
6
6
  module SqlQueryExecutor
7
7
  module Query
8
8
  class Sentence
9
- attr_reader :query, :binding_operator, :operator
9
+ attr_reader :query, :operator
10
10
 
11
11
  OPERATORS = {
12
12
  "between" => SqlQueryExecutor::Operators::Between,
@@ -23,28 +23,18 @@ module SqlQueryExecutor
23
23
  "exists" => SqlQueryExecutor::Operators::Default,#Exists
24
24
  }
25
25
 
26
- BINDING_OPERATORS = {
27
- "and" => "&",
28
- "or" => "+"
29
- }
30
-
31
26
  def initialize(query, collection)
32
27
  @query = query
33
28
  @collection = collection
34
29
  @array = query.split(' ')
35
30
 
36
- set_binding_operator
37
31
  set_operator
38
32
  end
39
33
 
40
34
  def execute!(data)
41
35
  return [] unless @operator
42
36
 
43
- result = @operator.execute!(data)
44
-
45
- result = data.send(@binding_operator, result) if @binding_operator && (data && !data.empty?)
46
-
47
- result
37
+ @operator.execute!(data)
48
38
  end
49
39
 
50
40
  private
@@ -54,12 +44,6 @@ module SqlQueryExecutor
54
44
  @operator = operator ? operator.new(@query, @collection) : nil
55
45
  end
56
46
 
57
- def set_binding_operator
58
- @binding_operator = BINDING_OPERATORS[@array.first]
59
-
60
- fix_query if @binding_operator
61
- end
62
-
63
47
  def fix_query
64
48
  @array.delete_at(0)
65
49
 
@@ -1,3 +1,5 @@
1
+ require 'sql_query_executor/query/sentence'
2
+
1
3
  module SqlQueryExecutor
2
4
  module Query
3
5
  class SubQuery
@@ -1,3 +1,3 @@
1
1
  module SqlQueryExecutor
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -16,6 +16,14 @@ describe SqlQueryExecutor, "Base" do
16
16
  subject { SqlQueryExecutor::Base.new(@data) }
17
17
 
18
18
  describe ".where" do
19
+ context "when invalid query is passed" do
20
+ it "raises an ArgumentError" do
21
+ query = [{name: "John"}]
22
+
23
+ expect { subject.where(query) }.to raise_error(ArgumentError, "First element from array must be a String. eg: [\"name = ?\", \"John\"]")
24
+ end
25
+ end
26
+
19
27
  describe "=" do
20
28
  context "when attribute is string" do
21
29
  it "matches a record" do
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.0
4
+ version: 0.1.1
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-14 00:00:00.000000000 Z
11
+ date: 2014-02-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec