aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/sql_algebra/extensions/object.rb2
-rw-r--r--lib/sql_algebra/relations/inner_join_relation.rb1
-rw-r--r--lib/sql_algebra/relations/join_relation.rb2
-rw-r--r--lib/sql_algebra/relations/left_outer_join_relation.rb1
-rw-r--r--lib/sql_algebra/sql_builder/equals_condition_builder.rb2
-rw-r--r--lib/sql_algebra/sql_builder/join_builder.rb2
-rw-r--r--lib/sql_algebra/sql_builder/order_builder.rb2
-rw-r--r--lib/sql_algebra/sql_builder/select_builder.rb2
-rw-r--r--lib/sql_algebra/sql_builder/selects_builder.rb2
-rw-r--r--lib/sql_algebra/sql_builder/sql_builder.rb7
-rw-r--r--spec/integration/scratch_spec.rb26
-rw-r--r--spec/relations/join_relation_spec.rb11
-rw-r--r--spec/sql_builder/conditions_spec.rb4
-rw-r--r--spec/sql_builder/select_builder_spec.rb30
14 files changed, 49 insertions, 45 deletions
diff --git a/lib/sql_algebra/extensions/object.rb b/lib/sql_algebra/extensions/object.rb
index 6ea66d7484..c241581f86 100644
--- a/lib/sql_algebra/extensions/object.rb
+++ b/lib/sql_algebra/extensions/object.rb
@@ -6,7 +6,7 @@ class Object
def to_sql(builder = EqualsConditionBuilder.new)
me = self
builder.call do
- value me
+ value me.to_s
end
end
end \ No newline at end of file
diff --git a/lib/sql_algebra/relations/inner_join_relation.rb b/lib/sql_algebra/relations/inner_join_relation.rb
index 6b932e3b21..5e58f241f8 100644
--- a/lib/sql_algebra/relations/inner_join_relation.rb
+++ b/lib/sql_algebra/relations/inner_join_relation.rb
@@ -1,4 +1,5 @@
class InnerJoinRelation < JoinRelation
+ protected
def join_type
:inner_join
end
diff --git a/lib/sql_algebra/relations/join_relation.rb b/lib/sql_algebra/relations/join_relation.rb
index 6dd63ad117..79c8a915b8 100644
--- a/lib/sql_algebra/relations/join_relation.rb
+++ b/lib/sql_algebra/relations/join_relation.rb
@@ -12,7 +12,7 @@ class JoinRelation < Relation
end
def qualify
- JoinRelation.new(relation1.qualify, relation2.qualify, *predicates.collect(&:qualify))
+ self.class.new(relation1.qualify, relation2.qualify, *predicates.collect(&:qualify))
end
protected
diff --git a/lib/sql_algebra/relations/left_outer_join_relation.rb b/lib/sql_algebra/relations/left_outer_join_relation.rb
index f4ece43861..6d13d8da07 100644
--- a/lib/sql_algebra/relations/left_outer_join_relation.rb
+++ b/lib/sql_algebra/relations/left_outer_join_relation.rb
@@ -1,4 +1,5 @@
class LeftOuterJoinRelation < JoinRelation
+ protected
def join_type
:left_outer_join
end
diff --git a/lib/sql_algebra/sql_builder/equals_condition_builder.rb b/lib/sql_algebra/sql_builder/equals_condition_builder.rb
index 016395556a..70067c20ca 100644
--- a/lib/sql_algebra/sql_builder/equals_condition_builder.rb
+++ b/lib/sql_algebra/sql_builder/equals_condition_builder.rb
@@ -5,7 +5,7 @@ class EqualsConditionBuilder < SqlBuilder
end
def column(table, column, aliaz = nil)
- @operands << (aliaz ? aliaz : "#{table}.#{column}")
+ @operands << (aliaz ? quote(aliaz) : "#{quote_table_name(table)}.#{quote_column_name(column)}")
end
def value(value)
diff --git a/lib/sql_algebra/sql_builder/join_builder.rb b/lib/sql_algebra/sql_builder/join_builder.rb
index 28f4437dec..ef63d1fcb1 100644
--- a/lib/sql_algebra/sql_builder/join_builder.rb
+++ b/lib/sql_algebra/sql_builder/join_builder.rb
@@ -8,6 +8,6 @@ class JoinBuilder < SqlBuilder
delegate :call, :to => :@conditions
def to_s
- "#{join_type} #{@table} ON #{@conditions}"
+ "#{join_type} #{quote_table_name(@table)} ON #{@conditions}"
end
end \ No newline at end of file
diff --git a/lib/sql_algebra/sql_builder/order_builder.rb b/lib/sql_algebra/sql_builder/order_builder.rb
index 4eea40fa36..43f705faf0 100644
--- a/lib/sql_algebra/sql_builder/order_builder.rb
+++ b/lib/sql_algebra/sql_builder/order_builder.rb
@@ -5,7 +5,7 @@ class OrderBuilder < SqlBuilder
end
def column(table, column, aliaz = nil)
- @orders << (aliaz ? aliaz : "#{table}.#{column}")
+ @orders << (aliaz ? quote(aliaz) : "#{quote_table_name(table)}.#{quote_column_name(column)}")
end
def to_s
diff --git a/lib/sql_algebra/sql_builder/select_builder.rb b/lib/sql_algebra/sql_builder/select_builder.rb
index 68df68db93..9a85ad7eec 100644
--- a/lib/sql_algebra/sql_builder/select_builder.rb
+++ b/lib/sql_algebra/sql_builder/select_builder.rb
@@ -41,7 +41,7 @@ class SelectBuilder < SqlBuilder
end
def from_clause
- "FROM #{@table} #{@joins}" unless @table.blank?
+ "FROM #{quote_table_name(@table)} #{@joins}" unless @table.blank?
end
def where_clause
diff --git a/lib/sql_algebra/sql_builder/selects_builder.rb b/lib/sql_algebra/sql_builder/selects_builder.rb
index 72f6f52397..ce6ee1eb67 100644
--- a/lib/sql_algebra/sql_builder/selects_builder.rb
+++ b/lib/sql_algebra/sql_builder/selects_builder.rb
@@ -13,7 +13,7 @@ class SelectsBuilder < SqlBuilder
end
def column(table, column, aliaz = nil)
- @selects << "#{table}.#{column}" + (aliaz ? " AS #{aliaz}" : '')
+ @selects << "#{quote_table_name(table)}.#{quote_column_name(column)}" + (aliaz ? " AS #{quote(aliaz)}" : '')
end
delegate :blank?, :to => :@selects
diff --git a/lib/sql_algebra/sql_builder/sql_builder.rb b/lib/sql_algebra/sql_builder/sql_builder.rb
index 5cfbe578d5..c984444e41 100644
--- a/lib/sql_algebra/sql_builder/sql_builder.rb
+++ b/lib/sql_algebra/sql_builder/sql_builder.rb
@@ -25,4 +25,11 @@ class SqlBuilder
end
end
end
+
+ private
+ delegate :quote_table_name, :quote_column_name, :quote, :to => :connection
+
+ def connection
+ ActiveRecord::Base.connection
+ end
end \ No newline at end of file
diff --git a/spec/integration/scratch_spec.rb b/spec/integration/scratch_spec.rb
index 725ac755c0..32ee98d361 100644
--- a/spec/integration/scratch_spec.rb
+++ b/spec/integration/scratch_spec.rb
@@ -12,30 +12,30 @@ describe 'Relational Algebra' do
it 'simulates User.has_many :photos' do
@user_photos.project(*@photos.attributes).to_s.should be_like("""
- SELECT photos.id, photos.user_id, photos.camera_id
- FROM users
- LEFT OUTER JOIN photos
- ON users.id = photos.user_id
+ SELECT `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id`
+ FROM `users`
+ LEFT OUTER JOIN `photos`
+ ON `users`.`id` = `photos`.`user_id`
WHERE
- users.id = 1
+ `users`.`id` = 1
""")
end
it 'simulates a User.has_many :cameras :through => :photos' do
@user_cameras.project(*@cameras.attributes).to_s.should be_like("""
- SELECT cameras.id
- FROM users
- LEFT OUTER JOIN photos
- ON users.id = photos.user_id
- LEFT OUTER JOIN cameras
- ON photos.camera_id = cameras.id
+ SELECT `cameras`.`id`
+ FROM `users`
+ LEFT OUTER JOIN `photos`
+ ON `users`.`id` = `photos`.`user_id`
+ LEFT OUTER JOIN `cameras`
+ ON `photos`.`camera_id` = `cameras`.`id`
WHERE
- users.id = 1
+ `users`.`id` = 1
""")
end
it '' do
- # @user_cameras.qualify.to_s
+ # p @user_cameras.qualify.to_s
#
# @users.rename()
end
diff --git a/spec/relations/join_relation_spec.rb b/spec/relations/join_relation_spec.rb
index b70bf553b1..ece7e61cc1 100644
--- a/spec/relations/join_relation_spec.rb
+++ b/spec/relations/join_relation_spec.rb
@@ -20,23 +20,18 @@ describe JoinRelation do
describe '#qualify' do
it 'distributes over the relations and predicates' do
- JoinRelation.new(@relation1, @relation2, @predicate).qualify. \
- should == JoinRelation.new(@relation1.qualify, @relation2.qualify, @predicate.qualify)
+ InnerJoinRelation.new(@relation1, @relation2, @predicate).qualify. \
+ should == InnerJoinRelation.new(@relation1.qualify, @relation2.qualify, @predicate.qualify)
end
end
describe '#to_sql' do
before do
@relation1 = @relation1.select(@relation1[:id] == @relation2[:foo_id])
- class ConcreteJoinRelation < JoinRelation
- def join_type
- :inner_join
- end
- end
end
it 'manufactures sql joining the two tables on the predicate, merging the selects' do
- ConcreteJoinRelation.new(@relation1, @relation2, @predicate).to_s.should == SelectBuilder.new do
+ InnerJoinRelation.new(@relation1, @relation2, @predicate).to_s.should == SelectBuilder.new do
select do
column :foo, :name
column :foo, :id
diff --git a/spec/sql_builder/conditions_spec.rb b/spec/sql_builder/conditions_spec.rb
index 78590e2631..c1cae902c1 100644
--- a/spec/sql_builder/conditions_spec.rb
+++ b/spec/sql_builder/conditions_spec.rb
@@ -7,10 +7,10 @@ describe ConditionsBuilder do
ConditionsBuilder.new do
equals do
column(:a, :b)
- column(:c, :d, :e)
+ column(:c, :d, 'e')
end
end.to_s.should be_like("""
- a.b = e
+ `a`.`b` = 'e'
""")
end
end
diff --git a/spec/sql_builder/select_builder_spec.rb b/spec/sql_builder/select_builder_spec.rb
index 7b059bd6bd..060c642c1b 100644
--- a/spec/sql_builder/select_builder_spec.rb
+++ b/spec/sql_builder/select_builder_spec.rb
@@ -11,7 +11,7 @@ describe SelectBuilder do
from :users
end.to_s.should be_like("""
SELECT *
- FROM users
+ FROM `users`
""")
end
end
@@ -20,13 +20,13 @@ describe SelectBuilder do
it 'manufactures correct sql' do
SelectBuilder.new do
select do
- column(:a, :b, :c)
- column(:e, :f)
+ column :a, :b, 'c'
+ column :e, :f
end
from :users
end.to_s.should be_like("""
- SELECT a.b AS c, e.f
- FROM users
+ SELECT `a`.`b` AS 'c', `e`.`f`
+ FROM `users`
""")
end
end
@@ -40,14 +40,14 @@ describe SelectBuilder do
from :users
where do
equals do
- value :a
+ value 1
column :b, :c
end
end
end.to_s.should be_like("""
SELECT *
- FROM users
- WHERE a = b.c
+ FROM `users`
+ WHERE 1 = `b`.`c`
""")
end
end
@@ -61,14 +61,14 @@ describe SelectBuilder do
from :users do
inner_join(:friendships) do
equals do
- value :id
- value :user_id
+ column :users, :id
+ column :friendships, :user_id
end
end
end
end.to_s.should be_like("""
SELECT *
- FROM users INNER JOIN friendships ON id = user_id
+ FROM `users` INNER JOIN `friendships` ON `users`.`id` = `friendships`.`user_id`
""")
end
end
@@ -82,12 +82,12 @@ describe SelectBuilder do
from :users
order_by do
column :users, :id
- column :users, :created_at, :alias
+ column :users, :created_at, 'alias'
end
end.to_s.should be_like("""
SELECT *
- FROM users
- ORDER BY users.id, alias
+ FROM `users`
+ ORDER BY `users`.`id`, 'alias'
""")
end
end
@@ -103,7 +103,7 @@ describe SelectBuilder do
offset 10
end.to_s.should be_like("""
SELECT *
- FROM users
+ FROM `users`
LIMIT 10
OFFSET 10
""")