sqldsl 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.
data/README ADDED
@@ -0,0 +1,91 @@
1
+ = SQL DSL
2
+
3
+ SQL DSL is a library for creating SQL statements using ruby code.
4
+
5
+ by Jay[http://jayfields.blogspot.com] Fields[http://jayfields.blogspot.com]
6
+
7
+ == Download and Installation
8
+
9
+ You can download SQL DSL from here[http://rubyforge.org/projects/sqldsl] or install it with the following command.
10
+
11
+ $ gem install sqldsl
12
+
13
+ == License
14
+
15
+ You may use, copy and redistribute this library under the same terms as Ruby itself (see http://www.ruby-lang.org/en/LICENSE.txt).
16
+
17
+ == Examples
18
+
19
+ See the tests for more examples
20
+
21
+ === Test Helper
22
+
23
+ require 'test/unit'
24
+ require File.dirname(__FILE__) + '/../lib/sqldsl'
25
+
26
+ === Insert Example
27
+
28
+ require File.dirname(__FILE__) + '/test_helper'
29
+
30
+ class InsertAcceptanceTest < Test::Unit::TestCase
31
+ def test_insert_select
32
+ statement = Insert.into[:table1][:column1, :column2, :column3].values do
33
+ Select[1]
34
+ end
35
+ assert_equal 'insert into table1 (column1, column2, column3) select 1', statement.to_sql
36
+ end
37
+
38
+ def test_insert_with_values
39
+ statement = Insert.into[:table1][:column1, :column2, :column3].values(10, 'book', :column4)
40
+ assert_equal "insert into table1 (column1, column2, column3) values (10, 'book', column4)", statement.to_sql
41
+ end
42
+ end
43
+
44
+ === Update Example
45
+
46
+ require File.dirname(__FILE__) + '/test_helper'
47
+
48
+ class UpdateAcceptanceTest < Test::Unit::TestCase
49
+ def test_insert_select
50
+ statement = Update[:table1].set[:column1=>10, :column2=>'book'].where do
51
+ not_exists(Select[1].from[:table2])
52
+ end
53
+ assert_equal "update table1 set column1=10, column2='book' where not exists (select 1 from table2)", statement.to_sql
54
+ end
55
+ end
56
+
57
+ === Delete Example
58
+
59
+ require File.dirname(__FILE__) + '/test_helper'
60
+
61
+ class DeleteAcceptanceTest < Test::Unit::TestCase
62
+ def test_insert_select
63
+ statement = Delete.from[:table1].where do
64
+ exists(Select[1].from[:table2])
65
+ end
66
+ assert_equal "delete from table1 where exists (select 1 from table2)", statement.to_sql
67
+ end
68
+ end
69
+
70
+ === Select Example
71
+
72
+ require File.dirname(__FILE__) + '/test_helper'
73
+
74
+ class SelectAcceptanceTest < Test::Unit::TestCase
75
+ def test_simple_select
76
+ statement = Select[:column1, 'book', 10].from[:table1].where do
77
+ equal :column1, 99
78
+ equal :column2, 'star'
79
+ end
80
+ expected = "select column1, 'book', 10 from table1 where column1 = 99 and column2 = 'star'"
81
+ assert_equal expected, statement.to_sql
82
+ end
83
+
84
+ def test_select_with_join
85
+ statement = Select[:column1, :column2].from[:table1, :table2].where do
86
+ equal :'table1.id', :'table2.table1_id'
87
+ end
88
+ expected = "select column1, column2 from table1, table2 where table1.id = table2.table1_id"
89
+ assert_equal expected, statement.to_sql
90
+ end
91
+ end
data/README_TEMPLATE ADDED
@@ -0,0 +1,39 @@
1
+ = SQL DSL
2
+
3
+ SQL DSL is a library for creating SQL statements using ruby code.
4
+
5
+ by Jay[http://jayfields.blogspot.com] Fields[http://jayfields.blogspot.com]
6
+
7
+ == Download and Installation
8
+
9
+ You can download SQL DSL from here[http://rubyforge.org/projects/sqldsl] or install it with the following command.
10
+
11
+ $ gem install sqldsl
12
+
13
+ == License
14
+
15
+ You may use, copy and redistribute this library under the same terms as Ruby itself (see http://www.ruby-lang.org/en/LICENSE.txt).
16
+
17
+ == Examples
18
+
19
+ See the tests for more examples
20
+
21
+ === Test Helper
22
+
23
+ <%= File.readlines("test/test_helper.rb").collect { |line| " " + line } %>
24
+
25
+ === Insert Example
26
+
27
+ <%= File.readlines("test/insert_acceptance_test.rb").collect { |line| " " + line } %>
28
+
29
+ === Update Example
30
+
31
+ <%= File.readlines("test/update_acceptance_test.rb").collect { |line| " " + line } %>
32
+
33
+ === Delete Example
34
+
35
+ <%= File.readlines("test/delete_acceptance_test.rb").collect { |line| " " + line } %>
36
+
37
+ === Select Example
38
+
39
+ <%= File.readlines("test/select_acceptance_test.rb").collect { |line| " " + line } %>
data/lib/array.rb ADDED
@@ -0,0 +1,20 @@
1
+ class Array
2
+ # call-seq: array.to_sql -> a_string
3
+ #
4
+ # Returns a string by collecting all elements, calling +to_sql+ on each one, and
5
+ # then joins them with ', '.
6
+ #
7
+ # [10, 'book', :column2].to_sql #=> "10, 'book', column2"
8
+ def to_sql
9
+ self.collect { |element| element.to_sql }.join(', ')
10
+ end
11
+
12
+ # call-seq: array.to_sql_equal(any) -> a_string
13
+ #
14
+ # Returns a string containing the sql in expression
15
+ #
16
+ # [10, :column2, 'book'].to_sql_equal(:column1) #=> "column1 in (10, column2, 'book')"
17
+ def to_sql_equal(lval)
18
+ "#{lval.to_sql } in (#{ self.to_sql })"
19
+ end
20
+ end
data/lib/delete.rb ADDED
@@ -0,0 +1,22 @@
1
+ class Delete < SqlStatement
2
+ class << self
3
+ # call-seq: Delete.from -> a_delete
4
+ #
5
+ # Returns a Delete instance with the SQL initialized to 'delete from '
6
+ #
7
+ # Delete.from.to_sql #=> "delete from "
8
+ def from
9
+ self.new('delete from ')
10
+ end
11
+ end
12
+
13
+ # call-seq: delete[table] -> a_delete
14
+ #
15
+ # Returns a Delete instance with the table appended to the SQL statement.
16
+ #
17
+ # Delete.from[:table1].to_sql #=> "delete from table1"
18
+ def [](table)
19
+ @to_sql += table.to_sql
20
+ self
21
+ end
22
+ end
data/lib/insert.rb ADDED
@@ -0,0 +1,55 @@
1
+ class Insert < SqlStatement
2
+ class << self
3
+ # call-seq: Insert.into -> Insert
4
+ #
5
+ # Returns the Insert class. Unnecessary and only available to mimic SQL statements.
6
+ #
7
+ # Insert.into #=> Insert
8
+ def into
9
+ self
10
+ end
11
+
12
+ # call-seq: Insert[table] -> an_insert
13
+ #
14
+ # Returns an Insert instance with the SQL initialized to 'insert into [table] '
15
+ #
16
+ # Insert[:table1].to_sql #=> "insert into table1 "
17
+ def [](table)
18
+ self.new("insert into #{table.to_sql}")
19
+ end
20
+ end
21
+
22
+ # call-seq: insert[column1,...] -> an_insert
23
+ #
24
+ # Returns an Insert instance with the columns appended to the SQL statement.
25
+ #
26
+ # Insert.into[:table1][:column1, :column2].to_sql #=> "insert into table1 (column1, column2)"
27
+ def [](*columns)
28
+ @to_sql += " (#{columns.join(', ')})"
29
+ self
30
+ end
31
+
32
+ # call-seq: insert.values { block } -> an_insert
33
+ # insert.values(arg,...)
34
+ #
35
+ # If a block is given:
36
+ # Ignores any parameters given to the method.
37
+ # Executes the block then calls +to_sql+ on the result.
38
+ # Returns an Insert instance with the result of the block's execution appended to the SQL statement.
39
+ #
40
+ # insert = Insert.into[:table1][:column1].values { Select['book'] }
41
+ # insert.to_sql #=> "insert into table1 (column1) select 'book'"
42
+ #
43
+ # If no block is given:
44
+ # Returns an Insert instance with the args appended to the SQL statement as values
45
+ #
46
+ # insert = Insert.into[:table1][:column1, :column2].values(10, 'book')
47
+ # insert.to_sql #=> "insert into table1 (column1, column2) values (10, 'book')"
48
+ def values(*args)
49
+ @to_sql += case
50
+ when block_given? then " #{yield.to_sql}"
51
+ else " values (#{args.to_sql})"
52
+ end
53
+ self
54
+ end
55
+ end
data/lib/numeric.rb ADDED
@@ -0,0 +1,10 @@
1
+ class Numeric
2
+ # call-seq: numeric.to_sql -> a_numeric
3
+ #
4
+ # Returns self
5
+ #
6
+ # 10.to_sql #=> 10
7
+ def to_sql
8
+ self
9
+ end
10
+ end
data/lib/object.rb ADDED
@@ -0,0 +1,34 @@
1
+ class Object
2
+
3
+ # call-seq: obj.to_sql_equal(any) -> a_string
4
+ #
5
+ # Returns a string containing the sql equality expression
6
+ #
7
+ # 10.to_sql_equal(:column1) #=> "column1 = 10"
8
+ def to_sql_equal(lval)
9
+ sql_expression(lval, "=")
10
+ end
11
+
12
+ def to_sql_more_than(lval) #:nodoc:
13
+ sql_expression(lval, ">")
14
+ end
15
+
16
+ def to_sql_less_than(lval) #:nodoc:
17
+ sql_expression(lval, "<")
18
+ end
19
+
20
+ def to_sql_less_than_or_equal_to(lval) #:nodoc:
21
+ sql_expression(lval, "<=")
22
+ end
23
+
24
+ def to_sql_more_than_or_equal_to(lval) #:nodoc:
25
+ sql_expression(lval, ">=")
26
+ end
27
+
28
+ protected
29
+
30
+ def sql_expression(lval, operator) #:nodoc:
31
+ "#{ lval.to_sql } #{operator} #{ self.to_sql }"
32
+ end
33
+
34
+ end
data/lib/select.rb ADDED
@@ -0,0 +1,33 @@
1
+ class Select < SqlStatement
2
+ class << self
3
+ # call-seq: Select[arg,...] -> a_select
4
+ #
5
+ # Returns a Select instance with the SQL initialized to 'select ' plus the args joined by ', '
6
+ #
7
+ # Select[1, :column1, 'book'].to_sql #=> "select 1, column1, 'book'"
8
+ def [](*columns)
9
+ self.new("select #{columns.collect{ |column| column.to_sql }.join(', ')}")
10
+ end
11
+ end
12
+
13
+ # call-seq: select.from -> a_select
14
+ #
15
+ # Returns a Select instance with ' from ' appended to the SQL statement.
16
+ #
17
+ # Select[1, :column1, 'book'].from.to_sql #=> "select 1, column1, 'book' from "
18
+ def from
19
+ @to_sql += " from "
20
+ self
21
+ end
22
+
23
+ # call-seq: select[table,...] -> a_select
24
+ #
25
+ # Returns a Select instance with the table names, joined by ', ' appended to the SQL statement.
26
+ #
27
+ # Select[1, :column1, 'book'].from[:table1, :table2].to_sql #=> "select 1, column1, 'book' from table1, table2"
28
+ def [](*table_names)
29
+ @to_sql += table_names.collect{ |table| table.to_s }.sort.join(', ')
30
+ self
31
+ end
32
+
33
+ end
@@ -0,0 +1,19 @@
1
+ class SqlStatement
2
+ attr_reader :to_sql
3
+
4
+ def initialize(sql) #:nodoc:
5
+ @to_sql = sql
6
+ end
7
+
8
+ # call-seq: sql_statement.where { block } -> a_sql_statement
9
+ #
10
+ # Creates a new WhereBuilder instance, passing the block as a parameter, then executes to_sql on the WhereBuilder instance.
11
+ # The resulting string from the WhereBuilder instance is appended to the SQL statement.
12
+ # Returns self.
13
+ #
14
+ # Select[1].where { equal :column1, 1 }.to_sql #=> "select 1 where column1 = 1"
15
+ def where(&block)
16
+ @to_sql += WhereBuilder.new(&block).to_sql
17
+ self
18
+ end
19
+ end
data/lib/sqldsl.rb ADDED
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/object.rb'
2
+ require File.dirname(__FILE__) + '/symbol.rb'
3
+ require File.dirname(__FILE__) + '/array.rb'
4
+ require File.dirname(__FILE__) + '/string.rb'
5
+ require File.dirname(__FILE__) + '/numeric.rb'
6
+ require File.dirname(__FILE__) + '/time.rb'
7
+ require File.dirname(__FILE__) + '/sql_statement.rb'
8
+ require File.dirname(__FILE__) + '/where_builder.rb'
9
+ require File.dirname(__FILE__) + '/select.rb'
10
+ require File.dirname(__FILE__) + '/insert.rb'
11
+ require File.dirname(__FILE__) + '/update.rb'
12
+ require File.dirname(__FILE__) + '/delete.rb'
data/lib/string.rb ADDED
@@ -0,0 +1,12 @@
1
+ class String
2
+
3
+ # call-seq: string.to_sql -> a_string
4
+ #
5
+ # Returns a string with single quotes escaped.
6
+ #
7
+ # :book.to_sql #=> "book"
8
+ def to_sql
9
+ "'#{self.gsub(/'/, "''")}'"
10
+ end
11
+
12
+ end
data/lib/symbol.rb ADDED
@@ -0,0 +1,12 @@
1
+ class Symbol
2
+
3
+ # call-seq: symbol.to_sql -> a_string
4
+ #
5
+ # Returns a string with single quotes escaped.
6
+ #
7
+ # "it's".to_sql #=> "'it''s'"
8
+ def to_sql
9
+ to_s
10
+ end
11
+
12
+ end
data/lib/time.rb ADDED
@@ -0,0 +1,20 @@
1
+ class Time
2
+ # call-seq: time.to_sql -> a_string
3
+ #
4
+ # Returns a string that represents a database agnostic time.
5
+ #
6
+ # Time.at(946702800).to_sql #=> "to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')"
7
+ def to_sql
8
+ "to_timestamp('" + formatted + "', 'YYYY-MM-DD HH24:MI:SS')"
9
+ end
10
+
11
+ protected
12
+
13
+ def formatted #:nodoc:
14
+ "#{year.to_s}-#{pad(month)}-#{pad(day)} #{pad(hour)}:#{pad(min)}:#{pad(sec)}"
15
+ end
16
+
17
+ def pad(num) #:nodoc:
18
+ num.to_s.rjust(2,'0')
19
+ end
20
+ end
data/lib/update.rb ADDED
@@ -0,0 +1,37 @@
1
+ class Update < SqlStatement
2
+ class << self
3
+ # call-seq: Update[table] -> an_update
4
+ #
5
+ # Returns an Update instance with the SQL initialized to 'update [table] '
6
+ #
7
+ # Update[:table1].to_sql #=> "update table1"
8
+ def [](table)
9
+ self.new("update #{table.to_sql}")
10
+ end
11
+ end
12
+
13
+ # call-seq: update.set -> update
14
+ #
15
+ # Returns self. Unnecessary and only available to mimic SQL statements.
16
+ #
17
+ # Update[:table1].set.to_sql #=> "update table1"
18
+ def set
19
+ self
20
+ end
21
+
22
+ # call-seq: update[column1=>'book',...] -> an_update
23
+ #
24
+ # Returns an Update instance with the set values appended to the SQL statement.
25
+ #
26
+ # update = Update[:table1].set[:column1=>'book', :column2=>10]
27
+ # update.to_sql #=> "update table1 set column1 = 'book, column2 = 10"
28
+ def [](hash)
29
+ @to_sql += " set "
30
+ set_args = []
31
+ hash.each_pair do |col, val|
32
+ set_args << "#{col.to_sql}=#{val.to_sql}"
33
+ end
34
+ @to_sql += set_args.sort.join(', ')
35
+ self
36
+ end
37
+ end
@@ -0,0 +1,58 @@
1
+ class WhereBuilder
2
+
3
+ # call-seq: WhereBuilder.new(&block) -> a_where_builder
4
+ #
5
+ # Returns a new WhereBuilder. At initialization time the block is instance evaled on the
6
+ # new WhereBuilder instance.
7
+ #
8
+ # WhereBuilder.new { equal :column1, 10 }.to_sql #=> " where column1 = 10"
9
+ def initialize(&block)
10
+ instance_eval(&block)
11
+ end
12
+
13
+ # call-seq: where.equal(arg1, arg2)
14
+ #
15
+ # Appends an equality condition to the where SQL clause.
16
+ #
17
+ # WhereBuilder.new { equal :column1, 10 }.to_sql #=> " where column1 = 10"
18
+ def equal(lval, rval)
19
+ sql_parts << rval.to_sql_equal(lval)
20
+ end
21
+
22
+ # call-seq: where.exists(clause)
23
+ #
24
+ # Appends an exists condition to the where SQL clause.
25
+ #
26
+ # WhereBuilder.new { exists 'select id from table1' }.to_sql #=> " where exists (select id from table1)"
27
+ def exists(clause)
28
+ sql_parts << "exists (#{clause.to_sql})"
29
+ end
30
+
31
+ # call-seq: where.not_exists(clause)
32
+ #
33
+ # Appends an exists condition to the where SQL clause.
34
+ #
35
+ # WhereBuilder.new { not_exists 'select id from table1' }.to_sql #=> " where not exists (select id from table1)"
36
+ def not_exists(clause)
37
+ sql_parts << "not exists (#{clause.to_sql})"
38
+ end
39
+
40
+ # call-seq: where.to_sql -> a_string
41
+ #
42
+ # Returns a string by collecting all the conditions and joins them with ' and '.
43
+ #
44
+ # WhereBuilder.new do
45
+ # equal :column1, 10
46
+ # equal :column2, 'book'
47
+ # end.to_sql #=> " where column1 = 10 and column2 = 'book'"
48
+ def to_sql
49
+ " where #{sql_parts.join(' and ')}"
50
+ end
51
+
52
+ protected
53
+
54
+ def sql_parts #:nodoc:
55
+ @sql_parts ||= []
56
+ end
57
+
58
+ end
data/test/all_tests.rb ADDED
@@ -0,0 +1 @@
1
+ Dir['**/*_test.rb'].each { |testCase| require testCase }
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ArrayTest < Test::Unit::TestCase
4
+ def test_to_sql_gives_of_to_sql_objects_comma_delimited
5
+ assert_equal "too, 'the', 2", [:too, 'the', 2].to_sql
6
+ end
7
+
8
+ def test_sql_equal_uses_in
9
+ assert_equal "column1 in (too, 'the', 2)", [:too, 'the', 2].to_sql_equal(:column1)
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class DeleteAcceptanceTest < Test::Unit::TestCase
4
+ def test_insert_select
5
+ statement = Delete.from[:table1].where do
6
+ exists(Select[1].from[:table2])
7
+ end
8
+ assert_equal "delete from table1 where exists (select 1 from table2)", statement.to_sql
9
+ end
10
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class DeleteTest < Test::Unit::TestCase
4
+
5
+ def test_delete_without_where_clause
6
+ assert_equal 'delete from foo', Delete.from[:foo].to_sql
7
+ end
8
+
9
+ def test_delete_with_where_clause
10
+ statement = Delete.from[:table].where do
11
+ equal :'table.column1', :'table.column2'
12
+ end
13
+ assert_equal 'delete from table where table.column1 = table.column2', statement.to_sql
14
+ end
15
+
16
+ def test_delete_with_select_statement_including_tables_from_delete_context
17
+ statement = Delete.from[:potential_account_offers].where do
18
+ exists(Select[:'potential_account_offers.id'].from[:foo].where do
19
+ equal :'potential_account_offers.id', :'foo.bar'
20
+ end)
21
+ end
22
+ expected = 'delete from potential_account_offers where exists (select potential_account_offers.id from foo where potential_account_offers.id = foo.bar)'
23
+ assert_equal expected, statement.to_sql
24
+ end
25
+
26
+ def test_if_where_is_called_with_no_block_gives_reminder_to_use_parents
27
+ assert_raise(ArgumentError) do
28
+ statement = Delete.from[:potential_account_offers].where do
29
+ exists Select[:'potential_account_offers.id'].from[:foo].where do
30
+ equal :'foo.id', :'foo.bar'
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,15 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class InsertAcceptanceTest < Test::Unit::TestCase
4
+ def test_insert_select
5
+ statement = Insert.into[:table1][:column1, :column2, :column3].values do
6
+ Select[1]
7
+ end
8
+ assert_equal 'insert into table1 (column1, column2, column3) select 1', statement.to_sql
9
+ end
10
+
11
+ def test_insert_with_values
12
+ statement = Insert.into[:table1][:column1, :column2, :column3].values(10, 'book', :column4)
13
+ assert_equal "insert into table1 (column1, column2, column3) values (10, 'book', column4)", statement.to_sql
14
+ end
15
+ end
@@ -0,0 +1,37 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class InsertTest < Test::Unit::TestCase
4
+
5
+ def test_table_name_saved
6
+ assert_equal "insert into table", Insert.into[:table].to_sql
7
+ end
8
+
9
+ def test_insert_with_statement_block
10
+ statement = Insert.into[:foo].values do
11
+ Struct.new(:to_sql).new('bar')
12
+ end
13
+ assert_equal "insert into foo bar", statement.to_sql
14
+ end
15
+
16
+ def test_insert_with_explicit_column_order
17
+ statement = Insert.into[:foo][:column1, :column2].values do
18
+ Struct.new(:to_sql).new('more')
19
+ end
20
+ assert_equal "insert into foo (column1, column2) more", statement.to_sql
21
+ end
22
+
23
+ def test_insert_with_multiple_sql_statements_in_block_uses_last
24
+ statement = Insert.into[:foo].values do
25
+ Struct.new(:to_sql).new('woo')
26
+ Struct.new(:to_sql).new('hoo')
27
+ end
28
+ assert_equal "insert into foo hoo", statement.to_sql
29
+ end
30
+
31
+
32
+ def test_values_WITH_no_block
33
+ statement = Insert.into[:foo].values(10, :book)
34
+ assert_equal "insert into foo values (10, book)", statement.to_sql
35
+ end
36
+ end
37
+
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class ObjectTest < Test::Unit::TestCase
4
+
5
+ def test_to_sql_equal
6
+ assert_equal "column1 = foo", foo.to_sql_equal(:column1)
7
+ end
8
+
9
+ def test_to_sql_more_than
10
+ assert_equal "column1 > foo", foo.to_sql_more_than(:column1)
11
+ end
12
+
13
+ def test_to_sql_less_than
14
+ assert_equal "column1 < foo", foo.to_sql_less_than(:column1)
15
+ end
16
+
17
+ def test_to_sql_less_than_equal
18
+ assert_equal "column1 <= foo", foo.to_sql_less_than_or_equal_to(:column1)
19
+ end
20
+
21
+ def test_to_sql_more_than_equal
22
+ assert_equal "column1 >= foo", foo.to_sql_more_than_or_equal_to(:column1)
23
+ end
24
+
25
+ def foo
26
+ Struct.new(:to_sql).new(:foo)
27
+ end
28
+
29
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class SelectAcceptanceTest < Test::Unit::TestCase
4
+ def test_simple_select
5
+ statement = Select[:column1, 'book', 10].from[:table1].where do
6
+ equal :column1, 99
7
+ equal :column2, 'star'
8
+ end
9
+ expected = "select column1, 'book', 10 from table1 where column1 = 99 and column2 = 'star'"
10
+ assert_equal expected, statement.to_sql
11
+ end
12
+
13
+ def test_select_with_join
14
+ statement = Select[:column1, :column2].from[:table1, :table2].where do
15
+ equal :'table1.id', :'table2.table1_id'
16
+ end
17
+ expected = "select column1, column2 from table1, table2 where table1.id = table2.table1_id"
18
+ assert_equal expected, statement.to_sql
19
+ end
20
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class SelectTest < Test::Unit::TestCase
4
+ def test_select_with_single_column
5
+ assert_equal 'select foo', Select[:foo].to_sql
6
+ end
7
+
8
+ def test_select_with_multiple_columns
9
+ assert_equal 'select foo, bar', Select[:foo, :bar].to_sql
10
+ end
11
+
12
+ def test_time_literals_quoted
13
+ time = Time.at(946702800)
14
+ assert_equal "select to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')", Select[time].to_sql
15
+ end
16
+
17
+ def test_select_with_symbol_and_literal_columns
18
+ assert_equal "select symbol, 'literal'", Select[:symbol, 'literal'].to_sql
19
+ end
20
+
21
+ def test_select_with_single_table
22
+ assert_equal 'select foo from foo', Select[:foo].from[:foo].to_sql
23
+ end
24
+
25
+ def test_select_with_multiple_tables
26
+ assert_equal 'select column from bar, foo',
27
+ Select[:column].from[:foo, :bar].to_sql
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class StringTest < Test::Unit::TestCase
4
+ def test_to_sql_gives_quoted
5
+ assert_equal "'123'", "123".to_sql
6
+ end
7
+
8
+ def test_to_sql_gives_quoted_and_escapes_single_quotes
9
+ assert_equal "'it''s'", "it's".to_sql
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class SymbolTest < Test::Unit::TestCase
4
+ def test_to_sql_returns_to_s
5
+ assert_equal 'asdf', :asdf.to_sql
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/sqldsl'
data/test/time_test.rb ADDED
@@ -0,0 +1,8 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class TimeTest < Test::Unit::TestCase
4
+ def test_to_sql_gives_quoted
5
+ t = Time.at(946702800)
6
+ assert_equal "to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')", t.to_sql
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class UpdateAcceptanceTest < Test::Unit::TestCase
4
+ def test_insert_select
5
+ statement = Update[:table1].set[:column1=>10, :column2=>'book'].where do
6
+ not_exists(Select[1].from[:table2])
7
+ end
8
+ assert_equal "update table1 set column1=10, column2='book' where not exists (select 1 from table2)", statement.to_sql
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class UpdateTest < Test::Unit::TestCase
4
+
5
+ def test_update_takes_a_table_name
6
+ assert_equal "update account_info", Update[:account_info].to_sql
7
+ end
8
+
9
+ def test_update_set_appends_hash_values
10
+ assert_equal "update account_info set bar='cat', foo=1", Update[:account_info].set[:foo=>1, :bar=> 'cat'].to_sql
11
+ end
12
+
13
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class WhereBuilderTest < Test::Unit::TestCase
4
+
5
+ def test_single_equal_where_criteria
6
+ statement = WhereBuilder.new do
7
+ equal :'foo.column1', :'bar.column2'
8
+ end
9
+ assert_equal ' where foo.column1 = bar.column2', statement.to_sql
10
+ end
11
+
12
+ def test_single_equal_with_array_where_criteria
13
+ statement = WhereBuilder.new do
14
+ equal :'foo.column1', ['foo','bar']
15
+ end
16
+ assert_equal " where foo.column1 in ('foo', 'bar')", statement.to_sql
17
+ end
18
+
19
+ def test_multiple_equal_with_more_than_one_where_criteria
20
+ statement = WhereBuilder.new do
21
+ equal :'foo.column1', :'bar.column2'
22
+ equal :'foo.column3', :'bar.column5'
23
+ end
24
+ expected = " where foo.column1 = bar.column2 and foo.column3 = bar.column5"
25
+ assert_equal expected, statement.to_sql
26
+ end
27
+
28
+ def test_with_literal_where_criteria
29
+ statement = WhereBuilder.new do
30
+ equal 'foo.column1', :'bar.column2'
31
+ equal :'foo.column3', 'bar.column5'
32
+ end
33
+ expected = " where 'foo.column1' = bar.column2 and foo.column3 = 'bar.column5'"
34
+ assert_equal expected, statement.to_sql
35
+ end
36
+
37
+ def test_exists_evaluates_sql_statement_followed
38
+ statement = WhereBuilder.new do
39
+ exists Struct.new(:to_sql).new('select foo')
40
+ end
41
+ assert_equal ' where exists (select foo)', statement.to_sql
42
+ end
43
+
44
+ def test_not_exists_evaluates_sql_statement_followed
45
+ statement = WhereBuilder.new do
46
+ not_exists Struct.new(:to_sql).new('select foo')
47
+ end
48
+ assert_equal ' where not exists (select foo)', statement.to_sql
49
+ end
50
+ end
metadata ADDED
@@ -0,0 +1,79 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: sqldsl
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.0.2
7
+ date: 2006-09-16 00:00:00 -04:00
8
+ summary: A DSL for creating SQL Statements
9
+ require_paths:
10
+ - lib
11
+ email: sqldsl-developer@rubyforge.org
12
+ homepage: http://sqldsl.rubyforge.org
13
+ rubyforge_project: sqldsl
14
+ description: A DSL for creating SQL Statements
15
+ autorequire: sqldsl
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Jay Fields
30
+ files:
31
+ - lib/array.rb
32
+ - lib/delete.rb
33
+ - lib/insert.rb
34
+ - lib/numeric.rb
35
+ - lib/object.rb
36
+ - lib/select.rb
37
+ - lib/sql_statement.rb
38
+ - lib/sqldsl.rb
39
+ - lib/string.rb
40
+ - lib/symbol.rb
41
+ - lib/time.rb
42
+ - lib/update.rb
43
+ - lib/where_builder.rb
44
+ - test/all_tests.rb
45
+ - test/array_test.rb
46
+ - test/delete_acceptance_test.rb
47
+ - test/delete_test.rb
48
+ - test/insert_acceptance_test.rb
49
+ - test/insert_test.rb
50
+ - test/object_test.rb
51
+ - test/select_acceptance_test.rb
52
+ - test/select_test.rb
53
+ - test/string_test.rb
54
+ - test/symbol_test.rb
55
+ - test/test_helper.rb
56
+ - test/time_test.rb
57
+ - test/update_acceptance_test.rb
58
+ - test/update_test.rb
59
+ - test/where_builder_test.rb
60
+ - README
61
+ - README_TEMPLATE
62
+ test_files:
63
+ - test/all_tests.rb
64
+ rdoc_options:
65
+ - --title
66
+ - SQL DSL
67
+ - --main
68
+ - README
69
+ - --line-numbers
70
+ extra_rdoc_files:
71
+ - README
72
+ executables: []
73
+
74
+ extensions: []
75
+
76
+ requirements: []
77
+
78
+ dependencies: []
79
+