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.
@@ -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