sqlstmt 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.
- data/lib/sqlstmt/delete.rb +34 -0
- data/lib/sqlstmt/from_query.rb +71 -0
- data/lib/sqlstmt/insert_select.rb +10 -4
- data/lib/sqlstmt/query.rb +4 -41
- data/lib/sqlstmt/select.rb +6 -54
- data/lib/sqlstmt/update.rb +16 -1
- data/lib/sqlstmt/value_util.rb +14 -0
- data/lib/sqlstmt.rb +4 -0
- data/test/delete.dt.rb +17 -0
- data/test/insert_select.dt.rb +1 -1
- data/test/select.dt.rb +4 -4
- data/test/update.dt.rb +1 -1
- metadata +22 -5
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'sqlstmt/from_query'
|
2
|
+
|
3
|
+
module SqlStmt
|
4
|
+
|
5
|
+
class Delete < FromQuery
|
6
|
+
def initialize
|
7
|
+
super
|
8
|
+
@from_table = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def from(table)
|
12
|
+
@from_table = table
|
13
|
+
@tables.push(table)
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def verify_minimum_requirements
|
19
|
+
super
|
20
|
+
combined_table_count = @tables.size + @joins.size
|
21
|
+
raise SqlStmt::Error, "unable to build sql - must call :from when including multiple tables" if @from_table.nil? && (combined_table_count > 1)
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_stmt
|
25
|
+
if @from_table
|
26
|
+
table_clause = " #@from_table"
|
27
|
+
else
|
28
|
+
table_clause = ''
|
29
|
+
end
|
30
|
+
"DELETE#{table_clause}#{build_from_clause}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'sqlstmt/query'
|
2
|
+
|
3
|
+
module SqlStmt
|
4
|
+
|
5
|
+
class FromQuery < Query
|
6
|
+
force_deep_copy :joins
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
super
|
10
|
+
@joins = []
|
11
|
+
@group_by = nil
|
12
|
+
@order_by = nil
|
13
|
+
@limit = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def join(table, expr)
|
17
|
+
@joins.push("JOIN #{table} ON #{expr}")
|
18
|
+
self
|
19
|
+
end
|
20
|
+
|
21
|
+
def join_using(table, *fields)
|
22
|
+
@joins.push("JOIN #{table} USING (#{fields.join(',')})")
|
23
|
+
self
|
24
|
+
end
|
25
|
+
|
26
|
+
def left_join(table, expr)
|
27
|
+
@joins.push("LEFT JOIN #{table} ON #{expr}")
|
28
|
+
self
|
29
|
+
end
|
30
|
+
|
31
|
+
def left_join_using(table, *fields)
|
32
|
+
@joins.push("LEFT JOIN #{table} USING (#{fields.join(',')})")
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def group_by(clause)
|
37
|
+
@group_by = clause
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def order_by(clause)
|
42
|
+
@order_by = clause
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def limit(clause)
|
47
|
+
@limit = clause
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
def verify_minimum_requirements
|
53
|
+
super
|
54
|
+
raise SqlStmt::Error, "unable to build sql - must call :table or :join (or one if it's variants)" if @tables.empty? && @joins.empty?
|
55
|
+
raise SqlStmt::Error, "unable to build sql - must call :table if using :join (or one if it's variants)" if @tables.empty? && !@joins.empty?
|
56
|
+
end
|
57
|
+
|
58
|
+
def simple_clause(keywords, value)
|
59
|
+
if value then " #{keywords} #{value}" else '' end
|
60
|
+
end
|
61
|
+
|
62
|
+
def build_from_clause
|
63
|
+
join_clause = if @joins.empty? then '' else " #{@joins.join(' ')}" end
|
64
|
+
group_clause = simple_clause('GROUP BY', @group_by)
|
65
|
+
order_clause = simple_clause('ORDER BY', @order_by)
|
66
|
+
limit_clause = simple_clause('LIMIT', @limit)
|
67
|
+
" FROM #{build_table_list}#{join_clause}#{build_where_clause}#{group_clause}#{order_clause}#{limit_clause}"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
@@ -1,10 +1,15 @@
|
|
1
|
-
require 'sqlstmt/
|
1
|
+
require 'sqlstmt/from_query'
|
2
|
+
require 'sqlstmt/value_util'
|
2
3
|
|
3
4
|
module SqlStmt
|
4
5
|
|
5
|
-
class InsertSelect <
|
6
|
+
class InsertSelect < FromQuery
|
7
|
+
force_deep_copy :values
|
8
|
+
include ValueUtil
|
9
|
+
|
6
10
|
def initialize
|
7
11
|
super
|
12
|
+
@values = []
|
8
13
|
@into_table = nil
|
9
14
|
end
|
10
15
|
|
@@ -16,13 +21,14 @@ class InsertSelect < FieldValueQuery
|
|
16
21
|
private
|
17
22
|
def verify_minimum_requirements
|
18
23
|
super
|
19
|
-
raise SqlStmt::Error, "unable to build sql - must
|
24
|
+
raise SqlStmt::Error, "unable to build sql - must call :into" if @into_table.nil?
|
25
|
+
raise SqlStmt::Error, "unable to build sql - must call :field or :fieldq" if @fields.empty?
|
20
26
|
end
|
21
27
|
|
22
28
|
def build_stmt
|
23
29
|
into_str = @fields.join(',')
|
24
30
|
select_str = @values.join(',')
|
25
|
-
"INSERT INTO #@into_table (#{into_str}) SELECT #{select_str}
|
31
|
+
"INSERT INTO #@into_table (#{into_str}) SELECT #{select_str}#{build_from_clause}"
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
data/lib/sqlstmt/query.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
require 'doh/core_ext/
|
1
|
+
require 'doh/core_ext/force_deep_copy'
|
2
2
|
require 'sqlstmt/error'
|
3
|
-
require 'sqlstmt/to_sql'
|
4
3
|
|
5
4
|
module SqlStmt
|
6
5
|
|
7
6
|
class Query
|
8
7
|
force_deep_copy :fields, :tables, :wheres
|
8
|
+
attr_reader :fields, :tables, :wheres
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@fields = []
|
@@ -34,27 +34,10 @@ class Query
|
|
34
34
|
build_stmt
|
35
35
|
end
|
36
36
|
|
37
|
-
def group_by(clause)
|
38
|
-
@group_by = clause
|
39
|
-
self
|
40
|
-
end
|
41
|
-
|
42
|
-
def order_by(clause)
|
43
|
-
@order_by = clause
|
44
|
-
self
|
45
|
-
end
|
46
|
-
|
47
|
-
def limit(clause)
|
48
|
-
@limit = clause
|
49
|
-
self
|
50
|
-
end
|
51
|
-
|
52
37
|
private
|
53
38
|
def verify_minimum_requirements
|
54
|
-
raise SqlStmt::Error, "unable to build sql - must
|
55
|
-
raise SqlStmt::Error, "unable to build sql - must
|
56
|
-
raise SqlStmt::Error, "unable to build sql - must first call :where or :no_where" if @use_wheres && @wheres.empty?
|
57
|
-
raise SqlStmt::Error, "unable to build sql - :where and :no_where must not be called on same builder instance" if !@use_wheres && !@wheres.empty?
|
39
|
+
raise SqlStmt::Error, "unable to build sql - must call :where or :no_where" if @use_wheres && @wheres.empty?
|
40
|
+
raise SqlStmt::Error, "unable to build sql - :where and :no_where must not both be called" if !@use_wheres && !@wheres.empty?
|
58
41
|
end
|
59
42
|
|
60
43
|
def build_table_list
|
@@ -66,24 +49,4 @@ private
|
|
66
49
|
end
|
67
50
|
end
|
68
51
|
|
69
|
-
class FieldValueQuery < Query
|
70
|
-
force_deep_copy :values
|
71
|
-
|
72
|
-
def initialize
|
73
|
-
super
|
74
|
-
@values = []
|
75
|
-
end
|
76
|
-
|
77
|
-
def field(field, value)
|
78
|
-
raise "trying to include field #{field} again" if @fields.include?(field)
|
79
|
-
@fields.push(field)
|
80
|
-
@values.push(if value.is_a?(String) then value else value.to_sql end)
|
81
|
-
self
|
82
|
-
end
|
83
|
-
|
84
|
-
def fieldq(field, value)
|
85
|
-
field(field, value.to_sql)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
52
|
end
|
data/lib/sqlstmt/select.rb
CHANGED
@@ -1,70 +1,22 @@
|
|
1
|
-
require 'sqlstmt/
|
1
|
+
require 'sqlstmt/from_query'
|
2
2
|
|
3
3
|
module SqlStmt
|
4
4
|
|
5
|
-
class Select <
|
6
|
-
force_deep_copy :joins
|
7
|
-
|
8
|
-
def initialize
|
9
|
-
super
|
10
|
-
@joins = []
|
11
|
-
@group_by = nil
|
12
|
-
@order_by = nil
|
13
|
-
@limit = nil
|
14
|
-
end
|
15
|
-
|
5
|
+
class Select < FromQuery
|
16
6
|
def field(*field_exprs)
|
17
7
|
@fields.concat(field_exprs)
|
18
8
|
self
|
19
9
|
end
|
20
10
|
|
21
|
-
def join(table, expr)
|
22
|
-
@joins.push("JOIN #{table} ON #{expr}")
|
23
|
-
self
|
24
|
-
end
|
25
|
-
|
26
|
-
def join_using(table, *fields)
|
27
|
-
@joins.push("JOIN #{table} USING (#{fields.join(',')})")
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
|
-
def left_join(table, expr)
|
32
|
-
@joins.push("LEFT JOIN #{table} ON #{expr}")
|
33
|
-
self
|
34
|
-
end
|
35
|
-
|
36
|
-
def left_join_using(table, *fields)
|
37
|
-
@joins.push("LEFT JOIN #{table} USING (#{fields.join(',')})")
|
38
|
-
self
|
39
|
-
end
|
40
|
-
|
41
|
-
def group_by(clause)
|
42
|
-
@group_by = clause
|
43
|
-
self
|
44
|
-
end
|
45
|
-
|
46
|
-
def order_by(clause)
|
47
|
-
@order_by = clause
|
48
|
-
self
|
49
|
-
end
|
50
|
-
|
51
|
-
def limit(clause)
|
52
|
-
@limit = clause
|
53
|
-
self
|
54
|
-
end
|
55
|
-
|
56
11
|
private
|
57
|
-
def
|
58
|
-
|
12
|
+
def verify_minimum_requirements
|
13
|
+
super
|
14
|
+
raise SqlStmt::Error, "unable to build sql - must call :field" if @fields.empty?
|
59
15
|
end
|
60
16
|
|
61
17
|
def build_stmt
|
62
18
|
select_str = @fields.join(',')
|
63
|
-
|
64
|
-
group_clause = simple_clause('GROUP BY', @group_by)
|
65
|
-
order_clause = simple_clause('ORDER BY', @order_by)
|
66
|
-
limit_clause = simple_clause('LIMIT', @limit)
|
67
|
-
"SELECT #{select_str} FROM #{build_table_list}#{join_clause}#{build_where_clause}#{group_clause}#{order_clause}#{limit_clause}"
|
19
|
+
"SELECT #{select_str}#{build_from_clause}"
|
68
20
|
end
|
69
21
|
end
|
70
22
|
|
data/lib/sqlstmt/update.rb
CHANGED
@@ -1,9 +1,24 @@
|
|
1
1
|
require 'sqlstmt/query'
|
2
|
+
require 'sqlstmt/value_util'
|
2
3
|
|
3
4
|
module SqlStmt
|
4
5
|
|
5
|
-
class Update <
|
6
|
+
class Update < Query
|
7
|
+
force_deep_copy :values
|
8
|
+
include ValueUtil
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
super
|
12
|
+
@values = []
|
13
|
+
end
|
14
|
+
|
6
15
|
private
|
16
|
+
def verify_minimum_requirements
|
17
|
+
super
|
18
|
+
raise SqlStmt::Error, "unable to build sql - must call :table" if @tables.empty?
|
19
|
+
raise SqlStmt::Error, "unable to build sql - must call :field or :fieldq" if @fields.empty?
|
20
|
+
end
|
21
|
+
|
7
22
|
def build_set_clause
|
8
23
|
set_exprs = []
|
9
24
|
@fields.each_with_index do |field, index|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'sqlstmt/to_sql'
|
2
|
+
|
3
|
+
module ValueUtil
|
4
|
+
def field(field, value)
|
5
|
+
raise "trying to include field #{field} again" if @fields.include?(field)
|
6
|
+
@fields.push(field)
|
7
|
+
@values.push(if value.is_a?(String) then value else value.to_sql end)
|
8
|
+
self
|
9
|
+
end
|
10
|
+
|
11
|
+
def fieldq(field, value)
|
12
|
+
field(field, value.to_sql)
|
13
|
+
end
|
14
|
+
end
|
data/lib/sqlstmt.rb
ADDED
data/test/delete.dt.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'sqlstmt/delete'
|
2
|
+
|
3
|
+
module SqlStmt
|
4
|
+
|
5
|
+
class TestDelete < DohTest::TestGroup
|
6
|
+
def test_minimum_requirements
|
7
|
+
assert_raises(SqlStmt::Error) { Delete.new.table('target').to_s }
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_simple
|
11
|
+
assert_equal('DELETE target FROM target,other_table', Delete.new.from('target').table('other_table').no_where.to_s)
|
12
|
+
assert_equal('DELETE FROM target', Delete.new.table('target').no_where.to_s)
|
13
|
+
assert_equal('DELETE FROM target WHERE target_id = 1', Delete.new.table('target').where('target_id = 1').to_s)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
data/test/insert_select.dt.rb
CHANGED
@@ -2,7 +2,7 @@ require 'sqlstmt/insert_select'
|
|
2
2
|
|
3
3
|
module SqlStmt
|
4
4
|
|
5
|
-
class
|
5
|
+
class TestInsertSelect < DohTest::TestGroup
|
6
6
|
def test_minimum_requirements
|
7
7
|
assert_raises(SqlStmt::Error) { InsertSelect.new.into('target').to_s }
|
8
8
|
assert_raises(SqlStmt::Error) { InsertSelect.new.into('target').no_where.to_s }
|
data/test/select.dt.rb
CHANGED
@@ -2,10 +2,10 @@ require 'sqlstmt/select'
|
|
2
2
|
|
3
3
|
module SqlStmt
|
4
4
|
|
5
|
-
class
|
6
|
-
def
|
7
|
-
assert_raises(SqlStmt::Error) { Select.new('target').to_s }
|
8
|
-
assert_raises(SqlStmt::Error) { Select.new('target').no_where.to_s }
|
5
|
+
class TestSelect < DohTest::TestGroup
|
6
|
+
def test_minimum_requirements
|
7
|
+
assert_raises(SqlStmt::Error) { Select.new.table('target').to_s }
|
8
|
+
assert_raises(SqlStmt::Error) { Select.new.table('target').no_where.to_s }
|
9
9
|
end
|
10
10
|
|
11
11
|
def test_stuff
|
data/test/update.dt.rb
CHANGED
@@ -2,7 +2,7 @@ require 'sqlstmt/update'
|
|
2
2
|
|
3
3
|
module SqlStmt
|
4
4
|
|
5
|
-
class
|
5
|
+
class TestUpdate < DohTest::TestGroup
|
6
6
|
def test_minimum_requirements
|
7
7
|
assert_raises(SqlStmt::Error) { Update.new.table('target').to_s }
|
8
8
|
assert_raises(SqlStmt::Error) { Update.new.table('target').no_where.to_s }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqlstmt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,19 +10,30 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-03-14 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: dohutil
|
17
|
-
requirement: &
|
17
|
+
requirement: &70104173090000 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.1.
|
22
|
+
version: 0.1.7
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70104173090000
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: dohtest
|
28
|
+
requirement: &70104173071680 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.1.7
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *70104173071680
|
26
37
|
description: mysql centric (for now) object helpers for building SQL statements
|
27
38
|
email:
|
28
39
|
- devinfo@atpsoft.com
|
@@ -31,12 +42,17 @@ extensions: []
|
|
31
42
|
extra_rdoc_files:
|
32
43
|
- MIT-LICENSE
|
33
44
|
files:
|
45
|
+
- lib/sqlstmt/delete.rb
|
34
46
|
- lib/sqlstmt/error.rb
|
47
|
+
- lib/sqlstmt/from_query.rb
|
35
48
|
- lib/sqlstmt/insert_select.rb
|
36
49
|
- lib/sqlstmt/query.rb
|
37
50
|
- lib/sqlstmt/select.rb
|
38
51
|
- lib/sqlstmt/to_sql.rb
|
39
52
|
- lib/sqlstmt/update.rb
|
53
|
+
- lib/sqlstmt/value_util.rb
|
54
|
+
- lib/sqlstmt.rb
|
55
|
+
- test/delete.dt.rb
|
40
56
|
- test/insert_select.dt.rb
|
41
57
|
- test/select.dt.rb
|
42
58
|
- test/to_sql.dt.rb
|
@@ -68,6 +84,7 @@ signing_key:
|
|
68
84
|
specification_version: 3
|
69
85
|
summary: helper for building SQL statements
|
70
86
|
test_files:
|
87
|
+
- test/delete.dt.rb
|
71
88
|
- test/insert_select.dt.rb
|
72
89
|
- test/select.dt.rb
|
73
90
|
- test/to_sql.dt.rb
|