aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel
diff options
context:
space:
mode:
authorNick Kallen <nkallen@nick-kallens-computer-2.local>2008-05-16 12:32:59 -0700
committerNick Kallen <nkallen@nick-kallens-computer-2.local>2008-05-16 12:32:59 -0700
commit6a0097468213e928f477f638ec53e9efa396febe (patch)
tree6c68d5c95d66a5896aed259ee22a92a8fbfe8591 /lib/arel
parent71bb593fb240f8e49931b3e3415a827900a032fd (diff)
downloadrails-6a0097468213e928f477f638ec53e9efa396febe.tar.gz
rails-6a0097468213e928f477f638ec53e9efa396febe.tar.bz2
rails-6a0097468213e928f477f638ec53e9efa396febe.zip
some cleanup, notes for further cleanup/investigation
Diffstat (limited to 'lib/arel')
-rw-r--r--lib/arel/predicates.rb2
-rw-r--r--lib/arel/primitives/attribute.rb28
-rw-r--r--lib/arel/primitives/expression.rb32
-rw-r--r--lib/arel/relations/aggregation.rb6
-rw-r--r--lib/arel/relations/compound.rb1
-rw-r--r--lib/arel/relations/join.rb31
-rw-r--r--lib/arel/relations/nil.rb1
-rw-r--r--lib/arel/relations/projection.rb13
-rw-r--r--lib/arel/relations/recursion.rb1
-rw-r--r--lib/arel/relations/table.rb10
10 files changed, 65 insertions, 60 deletions
diff --git a/lib/arel/predicates.rb b/lib/arel/predicates.rb
index 7faaebfc17..cad4969952 100644
--- a/lib/arel/predicates.rb
+++ b/lib/arel/predicates.rb
@@ -55,7 +55,7 @@ module Arel
end
class Match < Binary
- alias_method :regexp, :operand2
+ def predicate_sql; 'LIKE' end
end
class In < Binary
diff --git a/lib/arel/primitives/attribute.rb b/lib/arel/primitives/attribute.rb
index 22ee37524e..9d5b98474f 100644
--- a/lib/arel/primitives/attribute.rb
+++ b/lib/arel/primitives/attribute.rb
@@ -20,17 +20,9 @@ module Arel
def column
original_relation.column_for(self)
end
-
- def original_relation
- relation.relation_for(self)
- end
-
- def original_attribute
- original_relation[self]
- end
-
+
def format(object)
- object.to_sql(formatter)
+ object.to_sql(Sql::Attribute.new(self))
end
def to_sql(formatter = Sql::WhereCondition.new(relation))
@@ -45,6 +37,17 @@ module Arel
ancestor == other.ancestor
end
+ module Origin
+ def original_relation
+ relation.relation_for(self)
+ end
+
+ def original_attribute
+ original_relation[self]
+ end
+ end
+ include Origin
+
module Transformations
def self.included(klass)
klass.hash_on :name
@@ -134,10 +137,5 @@ module Arel
end
end
include Expressions
-
- private
- def formatter
- Sql::Attribute.new(self)
- end
end
end \ No newline at end of file
diff --git a/lib/arel/primitives/expression.rb b/lib/arel/primitives/expression.rb
index 10e72f426e..3cde9d8724 100644
--- a/lib/arel/primitives/expression.rb
+++ b/lib/arel/primitives/expression.rb
@@ -7,22 +7,6 @@ module Arel
def initialize(attribute, function_sql, aliaz = nil, ancestor = nil)
@attribute, @function_sql, @alias, @ancestor = attribute, function_sql, aliaz, ancestor
end
-
- module Transformations
- def as(aliaz)
- Expression.new(attribute, function_sql, aliaz, self)
- end
-
- def bind(new_relation)
- # new_relation == relation ? self : Expression.new(attribute.bind(new_relation), function_sql, @alias, self)
- self
- end
-
- def to_attribute
- Attribute.new(relation, @alias, :ancestor => self)
- end
- end
- include Transformations
def to_sql(formatter = Sql::SelectClause.new(relation))
formatter.expression self
@@ -39,5 +23,21 @@ module Arel
ancestor == other.ancestor and
@alias == other.alias
end
+
+ module Transformations
+ def as(aliaz)
+ Expression.new(attribute, function_sql, aliaz, self)
+ end
+
+ def bind(new_relation)
+ # new_relation == relation ? self : Expression.new(attribute.bind(new_relation), function_sql, @alias, self)
+ self
+ end
+
+ def to_attribute
+ Attribute.new(relation, @alias, :ancestor => self)
+ end
+ end
+ include Transformations
end
end \ No newline at end of file
diff --git a/lib/arel/relations/aggregation.rb b/lib/arel/relations/aggregation.rb
index 55f24997cc..4c4ef0dfed 100644
--- a/lib/arel/relations/aggregation.rb
+++ b/lib/arel/relations/aggregation.rb
@@ -22,4 +22,10 @@ module Arel
self.class == other.class and self.relation == other.relation
end
end
+
+ class Relation
+ def externalize
+ aggregation?? Aggregation.new(self) : self
+ end
+ end
end \ No newline at end of file
diff --git a/lib/arel/relations/compound.rb b/lib/arel/relations/compound.rb
index 94616ff14f..1459c163cf 100644
--- a/lib/arel/relations/compound.rb
+++ b/lib/arel/relations/compound.rb
@@ -11,6 +11,7 @@ module Arel
@attributes ||= relation.attributes.collect { |a| a.bind(self) }
end
+ # XXX
def relation_for(attribute)
join? && relation.relation_for(attribute) || self[attribute] && self
end
diff --git a/lib/arel/relations/join.rb b/lib/arel/relations/join.rb
index 05ed6efc23..92bbbd5626 100644
--- a/lib/arel/relations/join.rb
+++ b/lib/arel/relations/join.rb
@@ -16,39 +16,42 @@ module Arel
)
end
+ def table_sql(formatter = Sql::TableReference.new(self))
+ relation1.externalize.table_sql(formatter)
+ end
+
def joins(environment, formatter = Sql::TableReference.new(environment))
this_join = [
join_sql,
- externalize(relation2).table_sql(formatter),
+ relation2.externalize.table_sql(formatter),
("ON" unless predicates.blank?),
- (predicates + externalize(relation2).selects).collect { |p| p.bind(environment).to_sql }.join(' AND ')
+ (predicates + relation2.externalize.selects).collect { |p| p.bind(environment).to_sql }.join(' AND ')
].compact.join(" ")
[relation1.joins(environment), this_join, relation2.joins(environment)].compact.join(" ")
end
def attributes
- @attributes ||= (externalize(relation1).attributes +
- externalize(relation2).attributes).collect { |a| a.bind(self) }
+ @attributes ||= (relation1.externalize.attributes +
+ relation2.externalize.attributes).collect { |a| a.bind(self) }
end
+ # XXX
def selects
- (externalize(relation1).selects).collect { |s| s.bind(self) }
- end
-
- def table_sql(formatter = Sql::TableReference.new(self))
- externalize(relation1).table_sql(formatter)
+ (relation1.externalize.selects).collect { |s| s.bind(self) }
end
+ # XXX
def relation_for(attribute)
[
- externalize(relation1).relation_for(attribute),
- externalize(relation2).relation_for(attribute)
+ relation1.externalize.relation_for(attribute),
+ relation2.externalize.relation_for(attribute)
].max do |r1, r2|
a1, a2 = r1 && r1[attribute], r2 && r2[attribute]
attribute / a1 <=> attribute / a2
end
end
+ # TESTME
def aggregation?
relation1.aggregation? or relation2.aggregation?
end
@@ -56,11 +59,5 @@ module Arel
def join?
true
end
-
- private
- # FIXME - make instance method
- def externalize(relation)
- relation.aggregation?? Aggregation.new(relation) : relation
- end
end
end \ No newline at end of file
diff --git a/lib/arel/relations/nil.rb b/lib/arel/relations/nil.rb
index 34f9ea8722..e78ebe6088 100644
--- a/lib/arel/relations/nil.rb
+++ b/lib/arel/relations/nil.rb
@@ -1,5 +1,6 @@
module Arel
class Nil < Relation
+ # XXX
include Recursion::BaseCase
def table_sql(formatter = nil); '' end
diff --git a/lib/arel/relations/projection.rb b/lib/arel/relations/projection.rb
index 66aa61f1d9..87b952d672 100644
--- a/lib/arel/relations/projection.rb
+++ b/lib/arel/relations/projection.rb
@@ -10,18 +10,19 @@ module Arel
@attributes ||= projections.collect { |p| p.bind(self) }
end
- def ==(other)
- self.class == other.class and
- relation == other.relation and
- projections == other.projections
- end
-
def aggregation?
attributes.any?(&:aggregation?)
end
+ # XXX
def relation_for(attribute)
self[attribute] && self || relation.relation_for(attribute)
end
+
+ def ==(other)
+ self.class == other.class and
+ relation == other.relation and
+ projections == other.projections
+ end
end
end \ No newline at end of file
diff --git a/lib/arel/relations/recursion.rb b/lib/arel/relations/recursion.rb
index c5ca171fd2..7507613a12 100644
--- a/lib/arel/relations/recursion.rb
+++ b/lib/arel/relations/recursion.rb
@@ -1,6 +1,7 @@
module Arel
module Recursion
module BaseCase
+ # XXX
def table
self
end
diff --git a/lib/arel/relations/table.rb b/lib/arel/relations/table.rb
index 5c3ba6c575..b95e51a307 100644
--- a/lib/arel/relations/table.rb
+++ b/lib/arel/relations/table.rb
@@ -20,11 +20,6 @@ module Arel
self[attribute] and columns.detect { |c| c.name == attribute.name.to_s }
end
- def ==(other)
- self.class == other.class and
- name == other.name
- end
-
def columns
@columns ||= engine.columns(name, "#{name} Columns")
end
@@ -32,5 +27,10 @@ module Arel
def reset
@attributes = @columns = nil
end
+
+ def ==(other)
+ self.class == other.class and
+ name == other.name
+ end
end
end \ No newline at end of file