From b8a4dabab94bfaa73ec031337ce9ef9abd798383 Mon Sep 17 00:00:00 2001 From: Nick Kallen Date: Sat, 5 Jan 2008 16:04:41 -0800 Subject: quoting --- lib/sql_algebra/extensions/object.rb | 2 +- lib/sql_algebra/relations/inner_join_relation.rb | 1 + lib/sql_algebra/relations/join_relation.rb | 2 +- .../relations/left_outer_join_relation.rb | 1 + .../sql_builder/equals_condition_builder.rb | 2 +- lib/sql_algebra/sql_builder/join_builder.rb | 2 +- lib/sql_algebra/sql_builder/order_builder.rb | 2 +- lib/sql_algebra/sql_builder/select_builder.rb | 2 +- lib/sql_algebra/sql_builder/selects_builder.rb | 2 +- lib/sql_algebra/sql_builder/sql_builder.rb | 7 +++++ spec/integration/scratch_spec.rb | 26 +++++++++---------- spec/relations/join_relation_spec.rb | 11 +++----- spec/sql_builder/conditions_spec.rb | 4 +-- spec/sql_builder/select_builder_spec.rb | 30 +++++++++++----------- 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 """) -- cgit v1.2.3