sqlstmt 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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/query'
1
+ require 'sqlstmt/from_query'
2
+ require 'sqlstmt/value_util'
2
3
 
3
4
  module SqlStmt
4
5
 
5
- class InsertSelect < FieldValueQuery
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 first call :into" if @into_table.nil?
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} FROM #{build_table_list}#{build_where_clause}"
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/class/force_deep_copy'
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 first call :field" if @fields.empty?
55
- raise SqlStmt::Error, "unable to build sql - must first call :table" if @tables.empty?
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
@@ -1,70 +1,22 @@
1
- require 'sqlstmt/query'
1
+ require 'sqlstmt/from_query'
2
2
 
3
3
  module SqlStmt
4
4
 
5
- class Select < 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
-
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 simple_clause(keywords, value)
58
- if value then " #{keywords} #{value}" else '' end
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
- 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
- "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
 
@@ -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 < FieldValueQuery
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
@@ -0,0 +1,4 @@
1
+ require 'sqlstmt/select'
2
+ require 'sqlstmt/update'
3
+ require 'sqlstmt/insert_select'
4
+ require 'sqlstmt/delete'
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
@@ -2,7 +2,7 @@ require 'sqlstmt/insert_select'
2
2
 
3
3
  module SqlStmt
4
4
 
5
- class TC_insert_select < DohTest::TestGroup
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 Test_Select < DohTest::TestGroup
6
- def notest_minimum_requirements
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 TC_update < DohTest::TestGroup
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.0
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-02-27 00:00:00.000000000Z
13
+ date: 2012-03-14 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: dohutil
17
- requirement: &70289917880740 !ruby/object:Gem::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.5
22
+ version: 0.1.7
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *70289917880740
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