aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/active_relation.rb15
-rw-r--r--lib/active_relation/extensions/base.rb2
-rw-r--r--lib/active_relation/extensions/object.rb2
-rw-r--r--lib/active_relation/predicates.rb70
-rw-r--r--lib/active_relation/predicates/binary_predicate.rb19
-rw-r--r--lib/active_relation/predicates/equality_predicate.rb12
-rw-r--r--lib/active_relation/predicates/greater_than_or_equal_to_predicate.rb2
-rw-r--r--lib/active_relation/predicates/greater_than_predicate.rb2
-rw-r--r--lib/active_relation/predicates/less_than_or_equal_to_predicate.rb2
-rw-r--r--lib/active_relation/predicates/less_than_predicate.rb2
-rw-r--r--lib/active_relation/predicates/match_predicate.rb7
-rw-r--r--lib/active_relation/predicates/predicate.rb5
-rw-r--r--lib/active_relation/predicates/relation_inclusion_predicate.rb11
-rw-r--r--lib/active_relation/relations/attribute.rb96
-rw-r--r--lib/active_relation/relations/compound_relation.rb10
-rw-r--r--lib/active_relation/relations/deletion_relation.rb26
-rw-r--r--lib/active_relation/relations/inner_join_operation.rb6
-rw-r--r--lib/active_relation/relations/inner_join_relation.rb6
-rw-r--r--lib/active_relation/relations/insertion_relation.rb36
-rw-r--r--lib/active_relation/relations/join_operation.rb16
-rw-r--r--lib/active_relation/relations/join_relation.rb80
-rw-r--r--lib/active_relation/relations/left_outer_join_operation.rb6
-rw-r--r--lib/active_relation/relations/left_outer_join_relation.rb6
-rw-r--r--lib/active_relation/relations/order_relation.rb24
-rw-r--r--lib/active_relation/relations/projection_relation.rb24
-rw-r--r--lib/active_relation/relations/range_relation.rb30
-rw-r--r--lib/active_relation/relations/relation.rb167
-rw-r--r--lib/active_relation/relations/rename_relation.rb56
-rw-r--r--lib/active_relation/relations/selection_relation.rb34
-rw-r--r--lib/active_relation/relations/table_relation.rb50
-rw-r--r--lib/active_relation/sql_builder.rb12
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