diff options
Diffstat (limited to 'lib')
31 files changed, 429 insertions, 407 deletions
diff --git a/lib/active_relation.rb b/lib/active_relation.rb index 2120d09bc8..3f277df1a5 100644 --- a/lib/active_relation.rb +++ b/lib/active_relation.rb @@ -9,12 +9,7 @@ require 'active_relation/sql_builder' require 'active_relation/relations/relation' require 'active_relation/relations/compound_relation' require 'active_relation/relations/table_relation' -require 'active_relation/relations/join_operation' -require 'active_relation/relations/inner_join_operation' -require 'active_relation/relations/left_outer_join_operation' require 'active_relation/relations/join_relation' -require 'active_relation/relations/inner_join_relation' -require 'active_relation/relations/left_outer_join_relation' require 'active_relation/relations/attribute' require 'active_relation/relations/projection_relation' require 'active_relation/relations/selection_relation' @@ -24,15 +19,7 @@ require 'active_relation/relations/rename_relation' require 'active_relation/relations/deletion_relation' require 'active_relation/relations/insertion_relation' -require 'active_relation/predicates/predicate' -require 'active_relation/predicates/binary_predicate' -require 'active_relation/predicates/equality_predicate' -require 'active_relation/predicates/less_than_predicate' -require 'active_relation/predicates/less_than_or_equal_to_predicate' -require 'active_relation/predicates/greater_than_predicate' -require 'active_relation/predicates/greater_than_or_equal_to_predicate' -require 'active_relation/predicates/relation_inclusion_predicate' -require 'active_relation/predicates/match_predicate' +require 'active_relation/predicates' require 'active_relation/extensions/object' require 'active_relation/extensions/array' diff --git a/lib/active_relation/extensions/base.rb b/lib/active_relation/extensions/base.rb index 0dbdef703f..53523e9d12 100644 --- a/lib/active_relation/extensions/base.rb +++ b/lib/active_relation/extensions/base.rb @@ -5,7 +5,7 @@ class ActiveRecord::Base end def relation - @relation ||= TableRelation.new(table_name) + @relation ||= ActiveRelation::Relations::Table.new(table_name) end end diff --git a/lib/active_relation/extensions/object.rb b/lib/active_relation/extensions/object.rb index 79d7613d9a..ea582d1ca1 100644 --- a/lib/active_relation/extensions/object.rb +++ b/lib/active_relation/extensions/object.rb @@ -1,5 +1,5 @@ class Object - include SqlBuilder + include ActiveRelation::SqlBuilder def qualify self diff --git a/lib/active_relation/predicates.rb b/lib/active_relation/predicates.rb index 0179a15035..5ac879899b 100644 --- a/lib/active_relation/predicates.rb +++ b/lib/active_relation/predicates.rb @@ -1,4 +1,74 @@ module ActiveRelation module Predicates + class Base + def ==(other) + self.class == other.class + end + end + + class Binary < Base + attr_reader :attribute1, :attribute2 + + def initialize(attribute1, attribute2) + @attribute1, @attribute2 = attribute1, attribute2 + end + + def ==(other) + super and @attribute1.eql?(other.attribute1) and @attribute2.eql?(other.attribute2) + end + + def qualify + self.class.new(attribute1.qualify, attribute2.qualify) + end + + def to_sql(options = {}) + "#{attribute1.to_sql} #{predicate_sql} #{attribute2.to_sql}" + end + end + + class Equality < Binary + def ==(other) + self.class == other.class and + ((attribute1.eql?(other.attribute1) and attribute2.eql?(other.attribute2)) or + (attribute1.eql?(other.attribute2) and attribute2.eql?(other.attribute1))) + end + + protected + def predicate_sql + '=' + end + end + + class GreaterThanOrEqualTo < Binary + end + + class GreaterThan < Binary + end + + class LessThanOrEqualTo < Binary + end + + class LessThan < Binary + end + + class Match < Base + attr_reader :attribute, :regexp + + def initialize(attribute, regexp) + @attribute, @regexp = attribute, regexp + end + end + + class RelationInclusion < Base + attr_reader :attribute, :relation + + def initialize(attribute, relation) + @attribute, @relation = attribute, relation + end + + def ==(other) + super and attribute == other.attribute and relation == other.relation + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/predicates/binary_predicate.rb b/lib/active_relation/predicates/binary_predicate.rb deleted file mode 100644 index f3ce430d00..0000000000 --- a/lib/active_relation/predicates/binary_predicate.rb +++ /dev/null @@ -1,19 +0,0 @@ -class BinaryPredicate < Predicate - attr_reader :attribute1, :attribute2 - - def initialize(attribute1, attribute2) - @attribute1, @attribute2 = attribute1, attribute2 - end - - def ==(other) - super and @attribute1.eql?(other.attribute1) and @attribute2.eql?(other.attribute2) - end - - def qualify - self.class.new(attribute1.qualify, attribute2.qualify) - end - - def to_sql(options = {}) - "#{attribute1.to_sql} #{predicate_sql} #{attribute2.to_sql}" - end -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/equality_predicate.rb b/lib/active_relation/predicates/equality_predicate.rb deleted file mode 100644 index 4f4113c740..0000000000 --- a/lib/active_relation/predicates/equality_predicate.rb +++ /dev/null @@ -1,12 +0,0 @@ -class EqualityPredicate < BinaryPredicate - def ==(other) - self.class == other.class and - ((attribute1.eql?(other.attribute1) and attribute2.eql?(other.attribute2)) or - (attribute1.eql?(other.attribute2) and attribute2.eql?(other.attribute1))) - end - - protected - def predicate_sql - '=' - end -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/greater_than_or_equal_to_predicate.rb b/lib/active_relation/predicates/greater_than_or_equal_to_predicate.rb deleted file mode 100644 index 49127c312c..0000000000 --- a/lib/active_relation/predicates/greater_than_or_equal_to_predicate.rb +++ /dev/null @@ -1,2 +0,0 @@ -class GreaterThanOrEqualToPredicate < BinaryPredicate -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/greater_than_predicate.rb b/lib/active_relation/predicates/greater_than_predicate.rb deleted file mode 100644 index 03aecaed62..0000000000 --- a/lib/active_relation/predicates/greater_than_predicate.rb +++ /dev/null @@ -1,2 +0,0 @@ -class GreaterThanPredicate < BinaryPredicate -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/less_than_or_equal_to_predicate.rb b/lib/active_relation/predicates/less_than_or_equal_to_predicate.rb deleted file mode 100644 index fee6ea7f35..0000000000 --- a/lib/active_relation/predicates/less_than_or_equal_to_predicate.rb +++ /dev/null @@ -1,2 +0,0 @@ -class LessThanOrEqualToPredicate < BinaryPredicate -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/less_than_predicate.rb b/lib/active_relation/predicates/less_than_predicate.rb deleted file mode 100644 index 03cbdcf000..0000000000 --- a/lib/active_relation/predicates/less_than_predicate.rb +++ /dev/null @@ -1,2 +0,0 @@ -class LessThanPredicate < BinaryPredicate -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/match_predicate.rb b/lib/active_relation/predicates/match_predicate.rb deleted file mode 100644 index 90a13090d4..0000000000 --- a/lib/active_relation/predicates/match_predicate.rb +++ /dev/null @@ -1,7 +0,0 @@ -class MatchPredicate < Predicate - attr_reader :attribute, :regexp - - def initialize(attribute, regexp) - @attribute, @regexp = attribute, regexp - end -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/predicate.rb b/lib/active_relation/predicates/predicate.rb deleted file mode 100644 index 4c395a3fdc..0000000000 --- a/lib/active_relation/predicates/predicate.rb +++ /dev/null @@ -1,5 +0,0 @@ -class Predicate - def ==(other) - self.class == other.class - end -end
\ No newline at end of file diff --git a/lib/active_relation/predicates/relation_inclusion_predicate.rb b/lib/active_relation/predicates/relation_inclusion_predicate.rb deleted file mode 100644 index 5881a85d99..0000000000 --- a/lib/active_relation/predicates/relation_inclusion_predicate.rb +++ /dev/null @@ -1,11 +0,0 @@ -class RelationInclusionPredicate < Predicate - attr_reader :attribute, :relation - - def initialize(attribute, relation) - @attribute, @relation = attribute, relation - end - - def ==(other) - super and attribute == other.attribute and relation == other.relation - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/attribute.rb b/lib/active_relation/relations/attribute.rb index 8193132de6..30cd9798d9 100644 --- a/lib/active_relation/relations/attribute.rb +++ b/lib/active_relation/relations/attribute.rb @@ -1,56 +1,60 @@ -class Attribute - include SqlBuilder +module ActiveRelation + module Primitives + class Attribute + include ::ActiveRelation::SqlBuilder - attr_reader :relation, :name, :alias + attr_reader :relation, :name, :alias - def initialize(relation, name, aliaz = nil) - @relation, @name, @alias = relation, name, aliaz - end + def initialize(relation, name, aliaz = nil) + @relation, @name, @alias = relation, name, aliaz + end - def alias(aliaz = nil) - aliaz ? Attribute.new(relation, name, aliaz) : @alias - end + def alias(aliaz = nil) + aliaz ? ActiveRelation::Primitives::Attribute.new(relation, name, aliaz) : @alias + end - def qualified_name - "#{relation.table}.#{name}" - end + def qualified_name + "#{relation.table}.#{name}" + end - def qualify - self.alias(qualified_name) - end + def qualify + self.alias(qualified_name) + end - def eql?(other) - relation == other.relation and name == other.name and self.alias == other.alias - end + def eql?(other) + relation == other.relation and name == other.name and self.alias == other.alias + end - module Predications - def ==(other) - EqualityPredicate.new(self, other) - end - - def <(other) - LessThanPredicate.new(self, other) - end - - def <=(other) - LessThanOrEqualToPredicate.new(self, other) + module Predications + def ==(other) + Predicates::Equality.new(self, other) + end + + def <(other) + Predicates::LessThan.new(self, other) + end + + def <=(other) + Predicates::LessThanOrEqualTo.new(self, other) + end + + def >(other) + Predicates::GreaterThan.new(self, other) + end + + def >=(other) + Predicates::GreaterThanOrEqualTo.new(self, other) + end + + def =~(regexp) + Predicates::Match.new(self, regexp) + end + end + include Predications + + def to_sql(options = {}) + "#{quote_table_name(relation.table)}.#{quote_column_name(name)}" + (options[:use_alias] && self.alias ? " AS #{self.alias.to_s.to_sql}" : "") + end end - - def >(other) - GreaterThanPredicate.new(self, other) - end - - def >=(other) - GreaterThanOrEqualToPredicate.new(self, other) - end - - def =~(regexp) - MatchPredicate.new(self, regexp) - end - end - include Predications - - def to_sql(options = {}) - "#{quote_table_name(relation.table)}.#{quote_column_name(name)}" + (options[:use_alias] && self.alias ? " AS #{self.alias.to_s.to_sql}" : "") end end
\ No newline at end of file diff --git a/lib/active_relation/relations/compound_relation.rb b/lib/active_relation/relations/compound_relation.rb index b18921e06d..442224a011 100644 --- a/lib/active_relation/relations/compound_relation.rb +++ b/lib/active_relation/relations/compound_relation.rb @@ -1,5 +1,9 @@ -class CompoundRelation < Relation - attr_reader :relation +module ActiveRelation + module Relations + class Compound < Base + attr_reader :relation - delegate :attributes, :attribute, :joins, :selects, :orders, :table, :inserts, :limit, :offset, :to => :relation + delegate :attributes, :attribute, :joins, :selects, :orders, :table, :inserts, :limit, :offset, :to => :relation + end + end end
\ No newline at end of file diff --git a/lib/active_relation/relations/deletion_relation.rb b/lib/active_relation/relations/deletion_relation.rb index 8418319055..f218d9da6d 100644 --- a/lib/active_relation/relations/deletion_relation.rb +++ b/lib/active_relation/relations/deletion_relation.rb @@ -1,13 +1,17 @@ -class DeletionRelation < CompoundRelation - def initialize(relation) - @relation = relation - end +module ActiveRelation + module Relations + class Deletion < Compound + def initialize(relation) + @relation = relation + end - def to_sql(options = {}) - [ - "DELETE", - "FROM #{quote_table_name(table)}", - ("WHERE #{selects.collect(&:to_sql).join('\n\tAND ')}" unless selects.blank?) - ].compact.join("\n") - end + def to_sql(options = {}) + [ + "DELETE", + "FROM #{quote_table_name(table)}", + ("WHERE #{selects.collect(&:to_sql).join('\n\tAND ')}" unless selects.blank?) + ].compact.join("\n") + end + end + end end
\ No newline at end of file diff --git a/lib/active_relation/relations/inner_join_operation.rb b/lib/active_relation/relations/inner_join_operation.rb deleted file mode 100644 index 6b5c5ce8d0..0000000000 --- a/lib/active_relation/relations/inner_join_operation.rb +++ /dev/null @@ -1,6 +0,0 @@ -class InnerJoinOperation < JoinOperation - protected - def relation_class - InnerJoinRelation - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/inner_join_relation.rb b/lib/active_relation/relations/inner_join_relation.rb deleted file mode 100644 index 74160c559f..0000000000 --- a/lib/active_relation/relations/inner_join_relation.rb +++ /dev/null @@ -1,6 +0,0 @@ -class InnerJoinRelation < JoinRelation - protected - def join_sql - "INNER JOIN" - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/insertion_relation.rb b/lib/active_relation/relations/insertion_relation.rb index 002ebbf062..a0042a18a5 100644 --- a/lib/active_relation/relations/insertion_relation.rb +++ b/lib/active_relation/relations/insertion_relation.rb @@ -1,21 +1,25 @@ -class InsertionRelation < CompoundRelation - attr_reader :record +module ActiveRelation + module Relations + class Insertion < Compound + attr_reader :record - def initialize(relation, record) - @relation, @record = relation, record - end + def initialize(relation, record) + @relation, @record = relation, record + end - def to_sql(options = {}) - [ - "INSERT", - "INTO #{quote_table_name(table)}", - "(#{record.keys.collect(&:to_sql).join(', ')})", - "VALUES #{inserts.collect(&:to_sql).join(', ')}" - ].join("\n") - end + def to_sql(options = {}) + [ + "INSERT", + "INTO #{quote_table_name(table)}", + "(#{record.keys.collect(&:to_sql).join(', ')})", + "VALUES #{inserts.collect(&:to_sql).join(', ')}" + ].join("\n") + end - protected - def inserts - relation.inserts + [record] + protected + def inserts + relation.inserts + [record] + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/join_operation.rb b/lib/active_relation/relations/join_operation.rb deleted file mode 100644 index 2b4548a041..0000000000 --- a/lib/active_relation/relations/join_operation.rb +++ /dev/null @@ -1,16 +0,0 @@ -class JoinOperation - attr_reader :relation1, :relation2 - - def initialize(relation1, relation2) - @relation1, @relation2 = relation1, relation2 - end - - def on(*predicates) - relation_class.new(relation1, relation2, *predicates) - end - - def ==(other) - (relation1 == other.relation1 and relation2 == other.relation2) or - (relation1 == other.relation2 and relation2 == other.relation1) - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/join_relation.rb b/lib/active_relation/relations/join_relation.rb index 845dfd732f..1bd1439dd6 100644 --- a/lib/active_relation/relations/join_relation.rb +++ b/lib/active_relation/relations/join_relation.rb @@ -1,41 +1,45 @@ -class JoinRelation < Relation - attr_reader :relation1, :relation2, :predicates - - def initialize(relation1, relation2, *predicates) - @relation1, @relation2, @predicates = relation1, relation2, predicates - end - - def ==(other) - predicates == other.predicates and - ((relation1 == other.relation1 and relation2 == other.relation2) or - (relation2 == other.relation1 and relation1 == other.relation2)) - end +module ActiveRelation + module Relations + class Join < Base + attr_reader :join_sql, :relation1, :relation2, :predicates + + def initialize(join_sql, relation1, relation2, *predicates) + @join_sql, @relation1, @relation2, @predicates = join_sql, relation1, relation2, predicates + end + + def ==(other) + predicates == other.predicates and + ((relation1 == other.relation1 and relation2 == other.relation2) or + (relation2 == other.relation1 and relation1 == other.relation2)) + end - def qualify - self.class.new(relation1.qualify, relation2.qualify, *predicates.collect(&:qualify)) - end - - protected - def joins - [relation1.joins, relation2.joins, join].compact.join(" ") - end - - def selects - relation1.send(:selects) + relation2.send(:selects) - end - - def attributes - relation1.attributes + relation2.attributes - end - - def attribute(name) - relation1[name] || relation2[name] - end - - delegate :table, :to => :relation1 - - private - def join - "#{join_sql} #{quote_table_name(relation2.table)} ON #{predicates.collect { |p| p.to_sql(:quote => false) }.join(' AND ')}" + def qualify + Join.new(join_sql, relation1.qualify, relation2.qualify, *predicates.collect(&:qualify)) + end + + protected + def joins + [relation1.joins, relation2.joins, join].compact.join(" ") + end + + def selects + relation1.send(:selects) + relation2.send(:selects) + end + + def attributes + relation1.attributes + relation2.attributes + end + + def attribute(name) + relation1[name] || relation2[name] + end + + delegate :table, :to => :relation1 + + private + def join + "#{join_sql} #{quote_table_name(relation2.table)} ON #{predicates.collect { |p| p.to_sql(:quote => false) }.join(' AND ')}" + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/left_outer_join_operation.rb b/lib/active_relation/relations/left_outer_join_operation.rb deleted file mode 100644 index fbb2a4e2ed..0000000000 --- a/lib/active_relation/relations/left_outer_join_operation.rb +++ /dev/null @@ -1,6 +0,0 @@ -class LeftOuterJoinOperation < JoinOperation - protected - def relation_class - LeftOuterJoinRelation - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/left_outer_join_relation.rb b/lib/active_relation/relations/left_outer_join_relation.rb deleted file mode 100644 index 57eda4e1fc..0000000000 --- a/lib/active_relation/relations/left_outer_join_relation.rb +++ /dev/null @@ -1,6 +0,0 @@ -class LeftOuterJoinRelation < JoinRelation - protected - def join_sql - "LEFT OUTER JOIN" - end -end
\ No newline at end of file diff --git a/lib/active_relation/relations/order_relation.rb b/lib/active_relation/relations/order_relation.rb index dfb0c0bf25..99ff939528 100644 --- a/lib/active_relation/relations/order_relation.rb +++ b/lib/active_relation/relations/order_relation.rb @@ -1,15 +1,19 @@ -class OrderRelation < CompoundRelation - attr_reader :relation, :orders +module ActiveRelation + module Relations + class Order < Compound + attr_reader :relation, :orders - def initialize(relation, *orders) - @relation, @orders = relation, orders - end + def initialize(relation, *orders) + @relation, @orders = relation, orders + end - def ==(other) - relation == other.relation and orders.eql?(other.orders) - end + def ==(other) + relation == other.relation and orders.eql?(other.orders) + end - def qualify - OrderRelation.new(relation.qualify, *orders.collect { |o| o.qualify }) + def qualify + Order.new(relation.qualify, *orders.collect { |o| o.qualify }) + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/projection_relation.rb b/lib/active_relation/relations/projection_relation.rb index 53b0ad1e91..b30c76898d 100644 --- a/lib/active_relation/relations/projection_relation.rb +++ b/lib/active_relation/relations/projection_relation.rb @@ -1,15 +1,19 @@ -class ProjectionRelation < CompoundRelation - attr_reader :relation, :attributes +module ActiveRelation + module Relations + class Projection < Compound + attr_reader :relation, :attributes - def initialize(relation, *attributes) - @relation, @attributes = relation, attributes - end + def initialize(relation, *attributes) + @relation, @attributes = relation, attributes + end - def ==(other) - relation == other.relation and attributes.eql?(other.attributes) - end + def ==(other) + relation == other.relation and attributes.eql?(other.attributes) + end - def qualify - ProjectionRelation.new(relation.qualify, *attributes.collect(&:qualify)) + def qualify + Projection.new(relation.qualify, *attributes.collect(&:qualify)) + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/range_relation.rb b/lib/active_relation/relations/range_relation.rb index 6a2b0b3470..d7e08efa06 100644 --- a/lib/active_relation/relations/range_relation.rb +++ b/lib/active_relation/relations/range_relation.rb @@ -1,19 +1,23 @@ -class RangeRelation < CompoundRelation - attr_reader :range +module ActiveRelation + module Relations + class Range < Compound + attr_reader :range - def initialize(relation, range) - @relation, @range = relation, range - end + def initialize(relation, range) + @relation, @range = relation, range + end - def ==(other) - relation == other.relation and range == other.range - end + def ==(other) + relation == other.relation and range == other.range + end - def limit - range.end - range.begin + 1 - end + def limit + range.end - range.begin + 1 + end - def offset - range.begin + def offset + range.begin + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/relation.rb b/lib/active_relation/relations/relation.rb index 0a8455b39c..c4a887eecd 100644 --- a/lib/active_relation/relations/relation.rb +++ b/lib/active_relation/relations/relation.rb @@ -1,90 +1,111 @@ -class Relation - include SqlBuilder +module ActiveRelation + module Relations + class Base + include SqlBuilder - module Iteration - include Enumerable + module Iteration + include Enumerable - def each(&block) - connection.select_all(to_s).each(&block) - end + def each(&block) + connection.select_all(to_s).each(&block) + end - def first - connection.select_one(to_s) - end - end - include Iteration + def first + connection.select_one(to_s) + end + end + include Iteration - module Operations - def <=>(other) - InnerJoinOperation.new(self, other) - end + module Operations + def <=>(other) + JoinOperation.new("INNER JOIN", self, other) + end - def <<(other) - LeftOuterJoinOperation.new(self, other) - end + def <<(other) + JoinOperation.new("LEFT OUTER JOIN", self, other) + end - def [](index) - case index - when Symbol - attribute(index) - when Range - RangeRelation.new(self, index) - end - end + def [](index) + case index + when Symbol + attribute(index) + when ::Range + Range.new(self, index) + end + end - def include?(attribute) - RelationInclusionPredicate.new(attribute, self) - end + def include?(attribute) + Predicates::RelationInclusion.new(attribute, self) + end - def select(*predicates) - SelectionRelation.new(self, *predicates) - end + def select(*s) + Selection.new(self, *s) + end - def project(*attributes) - ProjectionRelation.new(self, *attributes) - end + def project(*attributes) + Projection.new(self, *attributes) + end - def order(*attributes) - OrderRelation.new(self, *attributes) - end + def order(*attributes) + Order.new(self, *attributes) + end - def rename(attribute, aliaz) - RenameRelation.new(self, attribute => aliaz) - end + def rename(attribute, aliaz) + Rename.new(self, attribute => aliaz) + end - def insert(record) - InsertionRelation.new(self, record) - end + def insert(record) + Insertion.new(self, record) + end - def delete - DeletionRelation.new(self) - end - end - include Operations + def delete + Deletion.new(self) + end + + class JoinOperation + attr_reader :join_sql, :relation1, :relation2 + + def initialize(join_sql, relation1, relation2) + @join_sql, @relation1, @relation2 = join_sql, relation1, relation2 + end + + def on(*predicates) + Join.new(join_sql, relation1, relation2, *predicates) + end + + def ==(other) + (relation1 == other.relation1 and relation2 == other.relation2) or + (relation1 == other.relation2 and relation2 == other.relation1) + end + end + end + include Operations - def connection - ActiveRecord::Base.connection - end + def connection + ActiveRecord::Base.connection + end - def to_sql(options = {}) - [ - "SELECT #{attributes.collect{ |a| a.to_sql(:use_alias => true) }.join(', ')}", - "FROM #{quote_table_name(table)}", - (joins.to_sql(:quote => false) unless joins.blank?), - ("WHERE #{selects.collect{|s| s.to_sql(:quote => false)}.join("\n\tAND ")}" unless selects.blank?), - ("ORDER BY #{orders.collect(&:to_sql)}" unless orders.blank?), - ("LIMIT #{limit.to_sql}" unless limit.blank?), - ("OFFSET #{offset.to_sql}" unless offset.blank?) - ].compact.join("\n") - end - alias_method :to_s, :to_sql + def to_sql(options = {}) + [ + "SELECT #{attributes.collect{ |a| a.to_sql(:use_alias => true) }.join(', ')}", + "FROM #{quote_table_name(table)}", + (joins.to_sql(:quote => false) unless joins.blank?), + ("WHERE #{selects.collect{|s| s.to_sql(:quote => false)}.join("\n\tAND ")}" unless selects.blank?), + ("ORDER BY #{orders.collect(&:to_sql)}" unless orders.blank?), + ("LIMIT #{limit.to_sql}" unless limit.blank?), + ("OFFSET #{offset.to_sql}" unless offset.blank?) + ].compact.join("\n") + end + alias_method :to_s, :to_sql - protected - def attributes; [] end - def selects; [] end - def orders; [] end - def inserts; [] end - def joins; nil end - def limit; nil end - def offset; nil end + protected + def attributes; [] end + def selects; [] end + def orders; [] end + def inserts; [] end + def joins; nil end + def limit; nil end + def offset; nil end + end + end end
\ No newline at end of file diff --git a/lib/active_relation/relations/rename_relation.rb b/lib/active_relation/relations/rename_relation.rb index 3218889f33..7a1693df57 100644 --- a/lib/active_relation/relations/rename_relation.rb +++ b/lib/active_relation/relations/rename_relation.rb @@ -1,34 +1,38 @@ -class RenameRelation < CompoundRelation - attr_reader :relation, :schmattribute, :alias +module ActiveRelation + module Relations + class Rename < Compound + attr_reader :relation, :schmattribute, :alias - def initialize(relation, renames) - @schmattribute, @alias = renames.shift - @relation = renames.empty?? relation : RenameRelation.new(relation, renames) - end + def initialize(relation, renames) + @schmattribute, @alias = renames.shift + @relation = renames.empty?? relation : Rename.new(relation, renames) + end - def ==(other) - relation == other.relation and schmattribute.eql?(other.schmattribute) and self.alias == other.alias - end + def ==(other) + relation == other.relation and schmattribute.eql?(other.schmattribute) and self.alias == other.alias + end - def attributes - relation.attributes.collect { |a| substitute(a) } - end + def attributes + relation.attributes.collect { |a| substitute(a) } + end - def qualify - RenameRelation.new(relation.qualify, schmattribute.qualify => self.alias) - end + def qualify + Rename.new(relation.qualify, schmattribute.qualify => self.alias) + end - protected - def attribute(name) - case - when name == self.alias then schmattribute.alias(self.alias) - when relation[name].eql?(schmattribute) then nil - else relation[name] - end - end + protected + def attribute(name) + case + when name == self.alias then schmattribute.alias(self.alias) + when relation[name].eql?(schmattribute) then nil + else relation[name] + end + end - private - def substitute(a) - a.eql?(schmattribute) ? a.alias(self.alias) : a + private + def substitute(a) + a.eql?(schmattribute) ? a.alias(self.alias) : a + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/selection_relation.rb b/lib/active_relation/relations/selection_relation.rb index 77864efb28..e102d105a0 100644 --- a/lib/active_relation/relations/selection_relation.rb +++ b/lib/active_relation/relations/selection_relation.rb @@ -1,21 +1,25 @@ -class SelectionRelation < CompoundRelation - attr_reader :relation, :predicate +module ActiveRelation + module Relations + class Selection < Compound + attr_reader :relation, :predicate - def initialize(relation, *predicates) - @predicate = predicates.shift - @relation = predicates.empty?? relation : SelectionRelation.new(relation, *predicates) - end + def initialize(relation, *predicates) + @predicate = predicates.shift + @relation = predicates.empty?? relation : Selection.new(relation, *predicates) + end - def ==(other) - relation == other.relation and predicate == other.predicate - end + def ==(other) + relation == other.relation and predicate == other.predicate + end - def qualify - SelectionRelation.new(relation.qualify, predicate.qualify) - end + def qualify + Selection.new(relation.qualify, predicate.qualify) + end - protected - def selects - relation.send(:selects) + [predicate] + protected + def selects + relation.send(:selects) + [predicate] + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/relations/table_relation.rb b/lib/active_relation/relations/table_relation.rb index 5a47ae7a34..38f540cc52 100644 --- a/lib/active_relation/relations/table_relation.rb +++ b/lib/active_relation/relations/table_relation.rb @@ -1,31 +1,35 @@ -class TableRelation < Relation - attr_reader :table +module ActiveRelation + module Relations + class Table < Base + attr_reader :table - def initialize(table) - @table = table - end + def initialize(table) + @table = table + end - def attributes - attributes_by_name.values - end + def attributes + attributes_by_name.values + end - def qualify - RenameRelation.new self, qualifications - end + def qualify + Rename.new self, qualifications + end - protected - def attribute(name) - attributes_by_name[name.to_s] - end + protected + def attribute(name) + attributes_by_name[name.to_s] + end - private - def attributes_by_name - @attributes_by_name ||= connection.columns(table, "#{table} Columns").inject({}) do |attributes_by_name, column| - attributes_by_name.merge(column.name => Attribute.new(self, column.name.to_sym)) - end - end + private + def attributes_by_name + @attributes_by_name ||= connection.columns(table, "#{table} Columns").inject({}) do |attributes_by_name, column| + attributes_by_name.merge(column.name => ActiveRelation::Primitives::Attribute.new(self, column.name.to_sym)) + end + end - def qualifications - attributes.zip(attributes.collect(&:qualified_name)).to_hash + def qualifications + attributes.zip(attributes.collect(&:qualified_name)).to_hash + end + end end end
\ No newline at end of file diff --git a/lib/active_relation/sql_builder.rb b/lib/active_relation/sql_builder.rb index 0d2187173e..07a4ebabb7 100644 --- a/lib/active_relation/sql_builder.rb +++ b/lib/active_relation/sql_builder.rb @@ -1,7 +1,9 @@ -module SqlBuilder - def connection - ActiveRecord::Base.connection - end +module ActiveRelation + module SqlBuilder + def connection + ActiveRecord::Base.connection + end - delegate :quote_table_name, :quote_column_name, :quote, :to => :connection + delegate :quote_table_name, :quote_column_name, :quote, :to => :connection + end end
\ No newline at end of file |