abstract-sql 0.0.1 → 0.0.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.
@@ -7,10 +7,12 @@ Gem::Specification.new do |s|
7
7
  s.version = Abstract::Sql::VERSION
8
8
  s.authors = ["Hallelujah"]
9
9
  s.email = ["hery@rails-royce.org"]
10
- s.homepage = "https://github.com/hallelujah/sql-abstract"
10
+ s.homepage = "https://github.com/hallelujah/abstract-sql"
11
11
  s.summary = %q{Transform a SQL statement to Perl SQL::Abstract JSON format}
12
12
  s.description = %q{It reverse an SQL statement to a Perl SQL::Abstract JSON format.}
13
13
 
14
+ s.rubyforge_project = "abstract-sql"
15
+
14
16
 
15
17
  s.add_dependency 'parslet'
16
18
  s.add_development_dependency 'test-unit', '>= 2.1.0'
@@ -9,6 +9,8 @@ module SQL
9
9
  rule(:spaces?){ spaces.maybe}
10
10
  rule(:digit) { match('[0-9]') }
11
11
  rule(:int){ digit.repeat(1).as(:int) }
12
+ rule(:bool_not) { spaces >> (str('not') | str('NOT')).as(:not) >> spaces}
13
+
12
14
  rule(:float) do
13
15
  (str('-').maybe >> (
14
16
  str('0') | (match('[1-9]') >> digit.repeat)
@@ -46,7 +48,7 @@ module SQL
46
48
  end
47
49
 
48
50
  rule(:entity) do
49
- (value.as(:lvalue) >> operator >> value.as(:rvalue))
51
+ bool_not.maybe >> (value.as(:lvalue) >> operator >> value.as(:rvalue))
50
52
  end
51
53
 
52
54
  rule(:statement) do
@@ -7,32 +7,57 @@ module SQL
7
7
  rule(:val =>{:int => simple(:x)}){ String(x).to_i }
8
8
  rule(:val =>{:string => simple(:x)}){ String(x) }
9
9
  # rule(:boolean_operator => simple(:x)){{ :boolean_operator => String(x).downcase.to_sym }}
10
- rule(:lvalue => {:column => simple(:x) }, :operator => simple(:op), :rvalue => {:column => simple(:z)}){ {operator(op) => { String(x).to_sym => String(z).to_sym } } }
11
- rule(:lvalue => {:column => simple(:x) }, :operator => simple(:op), :rvalue => simple(:z) ){ {operator(op) => { String(x).to_sym => z } } }
12
- rule(:lvalue => simple(:x) , :operator => simple(:op), :rvalue => {:column => simple(:z)}){ {operator(op) => { String(z).to_sym => x } } }
10
+
11
+ rule(:lvalue => {:column => simple(:x) }, :operator => simple(:op), :rvalue => {:column => simple(:z)}) do
12
+ { String(x).to_sym => { operator(op) => String(z).to_sym } }
13
+ end
14
+
15
+ rule(:lvalue => {:column => simple(:x) }, :operator => simple(:op), :rvalue => simple(:z) ) do
16
+ {String(x).to_sym => { operator(op) => z } }
17
+ end
18
+
19
+ rule(:lvalue => simple(:x) , :operator => simple(:op), :rvalue => {:column => simple(:z)}) do
20
+ { String(z).to_sym => { operator(op) => x } }
21
+ end
13
22
 
14
23
  # Statement right or left without right leaf
15
- rule(:lstatement => { :lstatement => subtree(:y) }){ {:lstatement => y }}
16
- rule(:rstatement => { :lstatement => subtree(:y) }){ {:rstatement => y}}
24
+ rule(:lstatement => { :lstatement => subtree(:y) })do
25
+ {:lstatement => y }
26
+ end
27
+
28
+ rule(:rstatement => { :lstatement => subtree(:y) })do
29
+ {:rstatement => y}
30
+ end
17
31
 
18
- rule({:lstatement=>{:lstatement=> subtree(:l)},
19
- :boolean_operator => simple(:op),
20
- :rstatement=>{:lstatement => subtree(:r)}}) do {:lstatement => l, :boolean_operator => op, :rstatement => r} end
32
+ rule({:lstatement=>{:lstatement=> subtree(:l)}, :boolean_operator => simple(:op), :rstatement=>{:lstatement => subtree(:r)}}) do
33
+ {:lstatement => l, :boolean_operator => op, :rstatement => r}
34
+ end
21
35
 
22
36
  # Statement right or left without right leaf and a boolean operator
23
- rule(:lstatement => { :lstatement => subtree(:y) }){ {:lstatement => y }}
24
- rule(:rstatement => { :lstatement => subtree(:y) }){ {:rstatement => y}}
37
+ rule(:lstatement => { :lstatement => subtree(:y) }) do
38
+ {:lstatement => y }
39
+ end
40
+
41
+ rule(:rstatement => { :lstatement => subtree(:y) }) do
42
+ {:rstatement => y}
43
+ end
44
+
45
+ rule({:lstatement => subtree(:l), :boolean_operator=> simple(:op), :rstatement=>{:lstatement=>subtree(:r)}}) do
46
+ {:lstatement => l, :boolean_operator => operator(op), :rstatement => r}
47
+ end
25
48
 
26
- rule({:lstatement => subtree(:l),
27
- :boolean_operator=> simple(:op),
28
- :rstatement=>{:lstatement=>subtree(:r)}}) do {:lstatement => l, :boolean_operator => operator(op), :rstatement => r} end
49
+ rule({:rstatement => subtree(:r), :boolean_operator=> simple(:op), :lstatement=>{:lstatement=>subtree(:l)}}) do
50
+ {:lstatement => l, :boolean_operator => operator(op), :rstatement => r}
51
+ end
29
52
 
30
- rule({:rstatement => subtree(:r),
31
- :boolean_operator=> simple(:op),
32
- :lstatement=>{:lstatement=>subtree(:l)}}) do {:lstatement => l, :boolean_operator => operator(op), :rstatement => r} end
33
53
 
54
+ rule(:boolean_operator => simple(:op), :lstatement => subtree(:l), :rstatement => subtree(:r) ) do
55
+ {operator(op) => [l, r] }
56
+ end
34
57
 
35
- rule(:boolean_operator => simple(:op), :lstatement => subtree(:l), :rstatement => subtree(:r) ) { {operator(op) => [l, r] } }
58
+ rule(:not => simple(:n), :lvalue=> subtree(:l), :operator=> simple(:op), :rvalue=> subtree(:r)) do
59
+ {bool(n) => {:lvalue => l, :operator => op, :rvalue => r}}
60
+ end
36
61
 
37
62
 
38
63
  end
@@ -48,4 +73,12 @@ class Parslet::Pattern::Context
48
73
  end
49
74
  end
50
75
 
76
+ def bool(n)
77
+ if (b = String(n).downcase) == 'not'
78
+ operator('not_bool')
79
+ else
80
+ n
81
+ end
82
+ end
83
+
51
84
  end
@@ -1,5 +1,5 @@
1
1
  module Abstract
2
2
  module Sql
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -7,22 +7,35 @@ class TestAbstract < Test::Unit::TestCase
7
7
  end
8
8
 
9
9
  test "parse a simple condition" do
10
- assert_equal( {:"-and" => [{:"-=" => { :id => 1}}, {:"-like" => {:label => '%webo%'}}]}, @abstract.parse("id = 1 and label like '%webo%'"))
11
- assert_equal( {:"-and" => [{:"-=" => { :id => 1}}, {:"-like" => {:label => '%webo%'}}]}, @abstract.parse("((id = 1 )) and label like '%webo%'"))
10
+ assert_equal( {:"-and" => [{:id => { :"-=" => 1}}, {:label => {:"-like" => '%webo%'}}]}, @abstract.parse("id = 1 and label like '%webo%'"))
11
+ assert_equal( {:"-and" => [{:id => { :"-=" => 1}}, {:label => {:"-like" => '%webo%'}}]}, @abstract.parse("((id = 1 )) and label like '%webo%'"))
12
12
  end
13
13
 
14
14
  test "parse a complex condition" do
15
15
  assert_equal(
16
16
  {
17
17
  :"-or" => [
18
- {:"-and" => [{:"-=" => { :id => 1}}, {:"-like" => {:label => '%webo%'}}]},
19
- {:"-and" => [{:"-!=" => { :id => 1}}, {:"-like" => {:label => '%api%'}}]}
18
+ {:"-and" => [{:id => { :"-=" => 1}}, {:label => {:"-like" => '%webo%'}}]},
19
+ {:"-and" => [{:id => { :"-!=" => 1}}, {:label => {:"-like" => '%api%'}}]}
20
20
  ]
21
21
  },
22
22
  @abstract.parse("(id = 1 AND label like '%webo%') OR (id !=1 and label like '%api%')")
23
23
  )
24
24
  end
25
25
 
26
+ test "Very complex condition" do
27
+ assert_equal(
28
+ {
29
+ :"-and" => [
30
+ { :"-or" => [ {:criterion_7 => {:"->=" => 8}}, {:criterion_1 => {:"-<" => 8}} ] },
31
+ { :"-or" => [ {:segment_1 => {:"-<" => 4}}, {:"-not_bool" => { :segment_2 => {:"-<" => 1} }}] }
32
+ ]
33
+ },
34
+ @abstract.parse("( criterion_7 >= 8 or criterion_1 < 8 ) and ( segment_1 < 4 or not segment_2 < 1 )")
35
+ )
36
+
37
+ end
38
+
26
39
  test "raise error when bad formatted sql" do
27
40
  assert_raise Parslet::ParseFailed do
28
41
  # No AND
metadata CHANGED
@@ -1,67 +1,91 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: abstract-sql
3
- version: !ruby/object:Gem::Version
4
- version: 0.0.1
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 2
10
+ version: 0.0.2
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Hallelujah
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2011-08-01 00:00:00.000000000Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
17
+
18
+ date: 2011-08-01 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
15
22
  name: parslet
16
- requirement: &9785380 !ruby/object:Gem::Requirement
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
24
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
23
32
  prerelease: false
24
- version_requirements: *9785380
25
- - !ruby/object:Gem::Dependency
33
+ requirement: *id001
34
+ type: :runtime
35
+ - !ruby/object:Gem::Dependency
26
36
  name: test-unit
27
- requirement: &9784880 !ruby/object:Gem::Requirement
37
+ version_requirements: &id002 !ruby/object:Gem::Requirement
28
38
  none: false
29
- requirements:
30
- - - ! '>='
31
- - !ruby/object:Gem::Version
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 11
43
+ segments:
44
+ - 2
45
+ - 1
46
+ - 0
32
47
  version: 2.1.0
33
- type: :development
34
48
  prerelease: false
35
- version_requirements: *9784880
36
- - !ruby/object:Gem::Dependency
49
+ requirement: *id002
50
+ type: :development
51
+ - !ruby/object:Gem::Dependency
37
52
  name: rcov
38
- requirement: &9784460 !ruby/object:Gem::Requirement
53
+ version_requirements: &id003 !ruby/object:Gem::Requirement
39
54
  none: false
40
- requirements:
41
- - - ! '>='
42
- - !ruby/object:Gem::Version
43
- version: '0'
44
- type: :development
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ hash: 3
59
+ segments:
60
+ - 0
61
+ version: "0"
45
62
  prerelease: false
46
- version_requirements: *9784460
47
- - !ruby/object:Gem::Dependency
63
+ requirement: *id003
64
+ type: :development
65
+ - !ruby/object:Gem::Dependency
48
66
  name: rake
49
- requirement: &9784000 !ruby/object:Gem::Requirement
67
+ version_requirements: &id004 !ruby/object:Gem::Requirement
50
68
  none: false
51
- requirements:
52
- - - ! '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- type: :development
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ hash: 3
73
+ segments:
74
+ - 0
75
+ version: "0"
56
76
  prerelease: false
57
- version_requirements: *9784000
77
+ requirement: *id004
78
+ type: :development
58
79
  description: It reverse an SQL statement to a Perl SQL::Abstract JSON format.
59
- email:
80
+ email:
60
81
  - hery@rails-royce.org
61
82
  executables: []
83
+
62
84
  extensions: []
85
+
63
86
  extra_rdoc_files: []
64
- files:
87
+
88
+ files:
65
89
  - .gitignore
66
90
  - .rvmrc
67
91
  - Gemfile
@@ -74,30 +98,40 @@ files:
74
98
  - lib/abstract-sql/version.rb
75
99
  - test/helper.rb
76
100
  - test/test_abstract.rb
77
- homepage: https://github.com/hallelujah/sql-abstract
101
+ has_rdoc: true
102
+ homepage: https://github.com/hallelujah/abstract-sql
78
103
  licenses: []
104
+
79
105
  post_install_message:
80
106
  rdoc_options: []
81
- require_paths:
107
+
108
+ require_paths:
82
109
  - lib
83
- required_ruby_version: !ruby/object:Gem::Requirement
110
+ required_ruby_version: !ruby/object:Gem::Requirement
84
111
  none: false
85
- requirements:
86
- - - ! '>='
87
- - !ruby/object:Gem::Version
88
- version: '0'
89
- required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
120
  none: false
91
- requirements:
92
- - - ! '>='
93
- - !ruby/object:Gem::Version
94
- version: '0'
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ hash: 3
125
+ segments:
126
+ - 0
127
+ version: "0"
95
128
  requirements: []
96
- rubyforge_project:
97
- rubygems_version: 1.8.6
129
+
130
+ rubyforge_project: abstract-sql
131
+ rubygems_version: 1.3.7
98
132
  signing_key:
99
133
  specification_version: 3
100
134
  summary: Transform a SQL statement to Perl SQL::Abstract JSON format
101
- test_files:
135
+ test_files:
102
136
  - test/helper.rb
103
137
  - test/test_abstract.rb