From 41f80e494af3ce7c8f3d6aa34f8303524a48373b Mon Sep 17 00:00:00 2001 From: Nick Kallen Date: Tue, 20 May 2008 10:11:07 -0700 Subject: limits and offsets need to be externalized too. first draft --- lib/arel/predicates.rb | 7 ++----- lib/arel/relations/operations/group.rb | 2 +- lib/arel/relations/operations/join.rb | 4 ++-- lib/arel/relations/operations/project.rb | 4 ++-- lib/arel/relations/operations/skip.rb | 4 ++++ lib/arel/relations/operations/take.rb | 4 ++++ lib/arel/relations/utilities/aggregation.rb | 8 ++++---- lib/arel/relations/utilities/compound.rb | 2 +- lib/arel/relations/writes/delete.rb | 2 +- lib/arel/relations/writes/update.rb | 2 +- 10 files changed, 22 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/arel/predicates.rb b/lib/arel/predicates.rb index f21376d4c9..a83bad3c22 100644 --- a/lib/arel/predicates.rb +++ b/lib/arel/predicates.rb @@ -3,11 +3,8 @@ module Arel end class Binary < Predicate - attr_reader :operand1, :operand2 - - def initialize(operand1, operand2) - @operand1, @operand2 = operand1, operand2 - end + attributes :operand1, :operand2 + deriving :initialize def ==(other) self.class === other and diff --git a/lib/arel/relations/operations/group.rb b/lib/arel/relations/operations/group.rb index 22af2734a6..253c4215b6 100644 --- a/lib/arel/relations/operations/group.rb +++ b/lib/arel/relations/operations/group.rb @@ -8,7 +8,7 @@ module Arel @groupings = (groupings + (block_given?? [yield(self)] : [])).collect { |g| g.bind(relation) } end - def aggregation? + def externalizable? true end end diff --git a/lib/arel/relations/operations/join.rb b/lib/arel/relations/operations/join.rb index 243a0289c7..8025db095e 100644 --- a/lib/arel/relations/operations/join.rb +++ b/lib/arel/relations/operations/join.rb @@ -39,8 +39,8 @@ module Arel end # TESTME - def aggregation? - relation1.aggregation? or relation2.aggregation? + def externalizable? + relation1.externalizable? or relation2.externalizable? end def join? diff --git a/lib/arel/relations/operations/project.rb b/lib/arel/relations/operations/project.rb index 2be87fe694..c92a9df5a5 100644 --- a/lib/arel/relations/operations/project.rb +++ b/lib/arel/relations/operations/project.rb @@ -12,8 +12,8 @@ module Arel @attributes ||= projections.collect { |p| p.bind(self) } end - def aggregation? - attributes.any?(&:aggregation?) + def externalizable? + attributes.any?(&:aggregation?) or relation.externalizable? end end end \ No newline at end of file diff --git a/lib/arel/relations/operations/skip.rb b/lib/arel/relations/operations/skip.rb index ea5df21f53..930e4c94ea 100644 --- a/lib/arel/relations/operations/skip.rb +++ b/lib/arel/relations/operations/skip.rb @@ -2,5 +2,9 @@ module Arel class Skip < Compound attributes :relation, :skipped deriving :initialize, :== + + def externalizable? + true + end end end \ No newline at end of file diff --git a/lib/arel/relations/operations/take.rb b/lib/arel/relations/operations/take.rb index 095e430417..2fd3fdf635 100644 --- a/lib/arel/relations/operations/take.rb +++ b/lib/arel/relations/operations/take.rb @@ -2,5 +2,9 @@ module Arel class Take < Compound attributes :relation, :taken deriving :initialize, :== + + def externalizable? + true + end end end \ No newline at end of file diff --git a/lib/arel/relations/utilities/aggregation.rb b/lib/arel/relations/utilities/aggregation.rb index 9f5ead8f86..bdc7650a20 100644 --- a/lib/arel/relations/utilities/aggregation.rb +++ b/lib/arel/relations/utilities/aggregation.rb @@ -1,5 +1,5 @@ module Arel - class Aggregation < Compound + class Externalization < Compound attributes :relation deriving :initialize, :== include Recursion::BaseCase @@ -17,16 +17,16 @@ module Arel end def name - relation.name + '_aggregation' + relation.name + '_external' end end class Relation def externalize - @externalized ||= aggregation?? Aggregation.new(self) : self + @externalized ||= externalizable?? Externalization.new(self) : self end - def aggregation? + def externalizable? false end end diff --git a/lib/arel/relations/utilities/compound.rb b/lib/arel/relations/utilities/compound.rb index 23a55d4b5b..a91cec1127 100644 --- a/lib/arel/relations/utilities/compound.rb +++ b/lib/arel/relations/utilities/compound.rb @@ -2,7 +2,7 @@ module Arel class Compound < Relation attr_reader :relation hash_on :relation - delegate :joins, :join?, :inserts, :taken, :skipped, :name, :aggregation?, + delegate :joins, :join?, :inserts, :taken, :skipped, :name, :externalizable?, :column_for, :engine, :table, :table_sql, :to => :relation diff --git a/lib/arel/relations/writes/delete.rb b/lib/arel/relations/writes/delete.rb index e72679c4d6..318a299b8b 100644 --- a/lib/arel/relations/writes/delete.rb +++ b/lib/arel/relations/writes/delete.rb @@ -8,7 +8,7 @@ module Arel "DELETE", "FROM #{table_sql}", ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ), - ("LIMIT #{taken}" unless taken.blank? ), + ("LIMIT #{taken}" unless taken.blank? ), ].compact.join("\n") end diff --git a/lib/arel/relations/writes/update.rb b/lib/arel/relations/writes/update.rb index 18b7ad9de1..720b9d697d 100644 --- a/lib/arel/relations/writes/update.rb +++ b/lib/arel/relations/writes/update.rb @@ -14,7 +14,7 @@ module Arel "#{value.format(attribute)} = #{attribute.format(value)}" end.join(",\n"), ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ), - ("LIMIT #{taken}" unless taken.blank? ) + ("LIMIT #{taken}" unless taken.blank? ) ].join("\n") end -- cgit v1.2.3