aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--doc/TODO2
-rw-r--r--lib/arel.rb3
-rw-r--r--lib/arel/engine.rb42
-rw-r--r--lib/arel/engines.rb2
-rw-r--r--lib/arel/engines/array/array.rb1
-rw-r--r--lib/arel/engines/array/relations/array.rb (renamed from lib/arel/relations/array.rb)0
-rw-r--r--lib/arel/engines/sql/christener.rb (renamed from lib/arel/sql/christener.rb)0
-rw-r--r--lib/arel/engines/sql/engine.rb41
-rw-r--r--lib/arel/engines/sql/extensions.rb4
-rw-r--r--lib/arel/engines/sql/extensions/array.rb9
-rw-r--r--lib/arel/engines/sql/extensions/nil_class.rb (renamed from lib/arel/extensions/nil_class.rb)0
-rw-r--r--lib/arel/engines/sql/extensions/object.rb9
-rw-r--r--lib/arel/engines/sql/extensions/range.rb (renamed from lib/arel/extensions/range.rb)0
-rw-r--r--lib/arel/engines/sql/formatters.rb (renamed from lib/arel/sql/formatters.rb)0
-rw-r--r--lib/arel/engines/sql/predicates.rb37
-rw-r--r--lib/arel/engines/sql/primitives.rb3
-rw-r--r--lib/arel/engines/sql/primitives/attribute.rb17
-rw-r--r--lib/arel/engines/sql/primitives/expression.rb7
-rw-r--r--lib/arel/engines/sql/primitives/value.rb11
-rw-r--r--lib/arel/engines/sql/relations.rb5
-rw-r--r--lib/arel/engines/sql/relations/operations.rb2
-rw-r--r--lib/arel/engines/sql/relations/operations/alias.rb5
-rw-r--r--lib/arel/engines/sql/relations/operations/join.rb19
-rw-r--r--lib/arel/engines/sql/relations/relation.rb28
-rw-r--r--lib/arel/engines/sql/relations/table.rb (renamed from lib/arel/relations/table.rb)0
-rw-r--r--lib/arel/engines/sql/relations/utilities.rb3
-rw-r--r--lib/arel/engines/sql/relations/utilities/externalization.rb14
-rw-r--r--lib/arel/engines/sql/relations/utilities/nil.rb6
-rw-r--r--lib/arel/engines/sql/relations/utilities/recursion.rb (renamed from lib/arel/relations/utilities/recursion.rb)0
-rw-r--r--lib/arel/engines/sql/relations/writes.rb3
-rw-r--r--lib/arel/engines/sql/relations/writes/delete.rb12
-rw-r--r--lib/arel/engines/sql/relations/writes/insert.rb12
-rw-r--r--lib/arel/engines/sql/relations/writes/update.rb14
-rw-r--r--lib/arel/engines/sql/sql.rb7
-rw-r--r--lib/arel/extensions.rb2
-rw-r--r--lib/arel/extensions/array.rb8
-rw-r--r--lib/arel/extensions/object.rb8
-rw-r--r--lib/arel/predicates.rb15
-rw-r--r--lib/arel/primitives/attribute.rb12
-rw-r--r--lib/arel/primitives/expression.rb4
-rw-r--r--lib/arel/primitives/value.rb13
-rw-r--r--lib/arel/relations.rb2
-rw-r--r--lib/arel/relations/operations/alias.rb1
-rw-r--r--lib/arel/relations/operations/join.rb16
-rw-r--r--lib/arel/relations/relation.rb32
-rw-r--r--lib/arel/relations/utilities.rb2
-rw-r--r--lib/arel/relations/utilities/externalization.rb10
-rw-r--r--lib/arel/relations/utilities/nil.rb3
-rw-r--r--lib/arel/relations/writes/delete.rb9
-rw-r--r--lib/arel/relations/writes/insert.rb9
-rw-r--r--lib/arel/relations/writes/update.rb11
-rw-r--r--lib/arel/sql.rb2
-rw-r--r--spec/arel/unit/relations/skip_spec.rb2
-rw-r--r--spec/arel/unit/relations/table_spec.rb4
-rw-r--r--spec/arel/unit/relations/take_spec.rb2
-rw-r--r--spec/spec_helper.rb2
56 files changed, 279 insertions, 208 deletions
diff --git a/doc/TODO b/doc/TODO
index ad12640881..8a8dcf5380 100644
--- a/doc/TODO
+++ b/doc/TODO
@@ -1,5 +1,5 @@
todo:
-
+- expressions should be class-based, and joins too, anything _sql should be renamed
- refactor adapter pattern
- implement in memory adapter
- implement mnesia adapter
diff --git a/lib/arel.rb b/lib/arel.rb
index 00bfa1e292..f22287fcc5 100644
--- a/lib/arel.rb
+++ b/lib/arel.rb
@@ -7,9 +7,8 @@ require 'active_record/connection_adapters/abstract/quoting'
require 'arel/arel'
require 'arel/extensions'
-require 'arel/sql'
require 'arel/predicates'
require 'arel/relations'
-require 'arel/engine'
+require 'arel/engines'
require 'arel/session'
require 'arel/primitives'
diff --git a/lib/arel/engine.rb b/lib/arel/engine.rb
deleted file mode 100644
index 2bb4bbbd90..0000000000
--- a/lib/arel/engine.rb
+++ /dev/null
@@ -1,42 +0,0 @@
-module Arel
- # this file is currently just a hack to adapt between activerecord::base which holds the connection specification
- # and active relation. ultimately, this file should be in effect what the connection specification is in active record;
- # that is: a spec of the database (url, password, etc.), a quoting adapter layer, and a connection pool.
- class Engine
- def initialize(ar = nil)
- @ar = ar
- end
-
- def connection
- @ar.connection
- end
-
- def method_missing(method, *args, &block)
- @ar.connection.send(method, *args, &block)
- end
-
- module CRUD
- def create(relation)
- connection.insert(relation.to_sql)
- end
-
- def read(relation)
- results = connection.execute(relation.to_sql)
- rows = []
- results.each do |row|
- rows << attributes.zip(row).to_hash
- end
- rows
- end
-
- def update(relation)
- connection.update(relation.to_sql)
- end
-
- def delete(relation)
- connection.delete(relation.to_sql)
- end
- end
- include CRUD
- end
-end
diff --git a/lib/arel/engines.rb b/lib/arel/engines.rb
new file mode 100644
index 0000000000..63a929528f
--- /dev/null
+++ b/lib/arel/engines.rb
@@ -0,0 +1,2 @@
+require 'arel/engines/sql/sql'
+require 'arel/engines/array/array' \ No newline at end of file
diff --git a/lib/arel/engines/array/array.rb b/lib/arel/engines/array/array.rb
new file mode 100644
index 0000000000..3a3a47308a
--- /dev/null
+++ b/lib/arel/engines/array/array.rb
@@ -0,0 +1 @@
+require 'arel/engines/array/relations/array' \ No newline at end of file
diff --git a/lib/arel/relations/array.rb b/lib/arel/engines/array/relations/array.rb
index dac65abbc2..dac65abbc2 100644
--- a/lib/arel/relations/array.rb
+++ b/lib/arel/engines/array/relations/array.rb
diff --git a/lib/arel/sql/christener.rb b/lib/arel/engines/sql/christener.rb
index 5883a75f41..5883a75f41 100644
--- a/lib/arel/sql/christener.rb
+++ b/lib/arel/engines/sql/christener.rb
diff --git a/lib/arel/engines/sql/engine.rb b/lib/arel/engines/sql/engine.rb
new file mode 100644
index 0000000000..e5d1a8b0ca
--- /dev/null
+++ b/lib/arel/engines/sql/engine.rb
@@ -0,0 +1,41 @@
+module Arel
+ module Sql
+ class Engine
+ def initialize(ar = nil)
+ @ar = ar
+ end
+
+ def connection
+ @ar.connection
+ end
+
+ def method_missing(method, *args, &block)
+ @ar.connection.send(method, *args, &block)
+ end
+
+ module CRUD
+ def create(relation)
+ connection.insert(relation.to_sql)
+ end
+
+ def read(relation)
+ results = connection.execute(relation.to_sql)
+ rows = []
+ results.each do |row|
+ rows << attributes.zip(row).to_hash
+ end
+ rows
+ end
+
+ def update(relation)
+ connection.update(relation.to_sql)
+ end
+
+ def delete(relation)
+ connection.delete(relation.to_sql)
+ end
+ end
+ include CRUD
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/extensions.rb b/lib/arel/engines/sql/extensions.rb
new file mode 100644
index 0000000000..6f4ad32148
--- /dev/null
+++ b/lib/arel/engines/sql/extensions.rb
@@ -0,0 +1,4 @@
+require 'arel/engines/sql/extensions/object'
+require 'arel/engines/sql/extensions/array'
+require 'arel/engines/sql/extensions/range'
+require 'arel/engines/sql/extensions/nil_class' \ No newline at end of file
diff --git a/lib/arel/engines/sql/extensions/array.rb b/lib/arel/engines/sql/extensions/array.rb
new file mode 100644
index 0000000000..1daa5abca7
--- /dev/null
+++ b/lib/arel/engines/sql/extensions/array.rb
@@ -0,0 +1,9 @@
+class Array
+ def to_sql(formatter = nil)
+ "(" + collect { |e| e.to_sql(formatter) }.join(', ') + ")"
+ end
+
+ def inclusion_predicate_sql
+ "IN"
+ end
+end \ No newline at end of file
diff --git a/lib/arel/extensions/nil_class.rb b/lib/arel/engines/sql/extensions/nil_class.rb
index 729c4cada7..729c4cada7 100644
--- a/lib/arel/extensions/nil_class.rb
+++ b/lib/arel/engines/sql/extensions/nil_class.rb
diff --git a/lib/arel/engines/sql/extensions/object.rb b/lib/arel/engines/sql/extensions/object.rb
new file mode 100644
index 0000000000..ef990eee2f
--- /dev/null
+++ b/lib/arel/engines/sql/extensions/object.rb
@@ -0,0 +1,9 @@
+class Object
+ def to_sql(formatter)
+ formatter.scalar self
+ end
+
+ def equality_predicate_sql
+ '='
+ end
+end \ No newline at end of file
diff --git a/lib/arel/extensions/range.rb b/lib/arel/engines/sql/extensions/range.rb
index d7329efe34..d7329efe34 100644
--- a/lib/arel/extensions/range.rb
+++ b/lib/arel/engines/sql/extensions/range.rb
diff --git a/lib/arel/sql/formatters.rb b/lib/arel/engines/sql/formatters.rb
index f82ddf631f..f82ddf631f 100644
--- a/lib/arel/sql/formatters.rb
+++ b/lib/arel/engines/sql/formatters.rb
diff --git a/lib/arel/engines/sql/predicates.rb b/lib/arel/engines/sql/predicates.rb
new file mode 100644
index 0000000000..dfeddb2de1
--- /dev/null
+++ b/lib/arel/engines/sql/predicates.rb
@@ -0,0 +1,37 @@
+module Arel
+ class Binary < Predicate
+ def to_sql(formatter = nil)
+ "#{operand1.to_sql} #{predicate_sql} #{operand1.format(operand2)}"
+ end
+ end
+
+ class Equality < Binary
+ def predicate_sql
+ operand2.equality_predicate_sql
+ end
+ end
+
+ class GreaterThanOrEqualTo < Binary
+ def predicate_sql; '>=' end
+ end
+
+ class GreaterThan < Binary
+ def predicate_sql; '>' end
+ end
+
+ class LessThanOrEqualTo < Binary
+ def predicate_sql; '<=' end
+ end
+
+ class LessThan < Binary
+ def predicate_sql; '<' end
+ end
+
+ class Match < Binary
+ def predicate_sql; 'LIKE' end
+ end
+
+ class In < Binary
+ def predicate_sql; operand2.inclusion_predicate_sql end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/primitives.rb b/lib/arel/engines/sql/primitives.rb
new file mode 100644
index 0000000000..405b1ca803
--- /dev/null
+++ b/lib/arel/engines/sql/primitives.rb
@@ -0,0 +1,3 @@
+require 'arel/engines/sql/primitives/attribute'
+require 'arel/engines/sql/primitives/value'
+require 'arel/engines/sql/primitives/expression' \ No newline at end of file
diff --git a/lib/arel/engines/sql/primitives/attribute.rb b/lib/arel/engines/sql/primitives/attribute.rb
new file mode 100644
index 0000000000..48de690b6f
--- /dev/null
+++ b/lib/arel/engines/sql/primitives/attribute.rb
@@ -0,0 +1,17 @@
+require 'set'
+
+module Arel
+ class Attribute
+ def column
+ original_relation.column_for(self)
+ end
+
+ def format(object)
+ object.to_sql(Sql::Attribute.new(self))
+ end
+
+ def to_sql(formatter = Sql::WhereCondition.new(relation))
+ formatter.attribute self
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/primitives/expression.rb b/lib/arel/engines/sql/primitives/expression.rb
new file mode 100644
index 0000000000..24f6879848
--- /dev/null
+++ b/lib/arel/engines/sql/primitives/expression.rb
@@ -0,0 +1,7 @@
+module Arel
+ class Expression < Attribute
+ def to_sql(formatter = Sql::SelectClause.new(relation))
+ formatter.expression self
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/primitives/value.rb b/lib/arel/engines/sql/primitives/value.rb
new file mode 100644
index 0000000000..a44acc26e0
--- /dev/null
+++ b/lib/arel/engines/sql/primitives/value.rb
@@ -0,0 +1,11 @@
+module Arel
+ class Value
+ def to_sql(formatter = Sql::WhereCondition.new(relation))
+ formatter.value value
+ end
+
+ def format(object)
+ object.to_sql(Sql::Value.new(relation))
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations.rb b/lib/arel/engines/sql/relations.rb
new file mode 100644
index 0000000000..4de01b2691
--- /dev/null
+++ b/lib/arel/engines/sql/relations.rb
@@ -0,0 +1,5 @@
+require 'arel/engines/sql/relations/utilities'
+require 'arel/engines/sql/relations/relation'
+require 'arel/engines/sql/relations/operations'
+require 'arel/engines/sql/relations/writes'
+require 'arel/engines/sql/relations/table' \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/operations.rb b/lib/arel/engines/sql/relations/operations.rb
new file mode 100644
index 0000000000..ff33fc6bc3
--- /dev/null
+++ b/lib/arel/engines/sql/relations/operations.rb
@@ -0,0 +1,2 @@
+require 'arel/engines/sql/relations/operations/alias'
+require 'arel/engines/sql/relations/operations/join'
diff --git a/lib/arel/engines/sql/relations/operations/alias.rb b/lib/arel/engines/sql/relations/operations/alias.rb
new file mode 100644
index 0000000000..32c9911a69
--- /dev/null
+++ b/lib/arel/engines/sql/relations/operations/alias.rb
@@ -0,0 +1,5 @@
+module Arel
+ class Alias < Compound
+ include Recursion::BaseCase
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/operations/join.rb b/lib/arel/engines/sql/relations/operations/join.rb
new file mode 100644
index 0000000000..be21119bc9
--- /dev/null
+++ b/lib/arel/engines/sql/relations/operations/join.rb
@@ -0,0 +1,19 @@
+module Arel
+ class Join < Relation
+ def table_sql(formatter = Sql::TableReference.new(self))
+ relation1.externalize.table_sql(formatter)
+ end
+
+ def joins(environment, formatter = Sql::TableReference.new(environment))
+ @joins ||= begin
+ this_join = [
+ join_sql,
+ relation2.externalize.table_sql(formatter),
+ ("ON" unless predicates.blank?),
+ (ons + relation2.externalize.wheres).collect { |p| p.bind(environment).to_sql(Sql::WhereClause.new(environment)) }.join(' AND ')
+ ].compact.join(" ")
+ [relation1.joins(environment), this_join, relation2.joins(environment)].compact.join(" ")
+ end
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/relation.rb b/lib/arel/engines/sql/relations/relation.rb
new file mode 100644
index 0000000000..5fd4121176
--- /dev/null
+++ b/lib/arel/engines/sql/relations/relation.rb
@@ -0,0 +1,28 @@
+module Arel
+ class Relation
+ def to_sql(formatter = Sql::SelectStatement.new(self))
+ formatter.select select_sql, self
+ end
+
+ def select_sql
+ [
+ "SELECT #{attributes.collect { |a| a.to_sql(Sql::SelectClause.new(self)) }.join(', ')}",
+ "FROM #{table_sql(Sql::TableReference.new(self))}",
+ (joins(self) unless joins(self).blank? ),
+ ("WHERE #{wheres .collect { |w| w.to_sql(Sql::WhereClause.new(self)) }.join("\n\tAND ")}" unless wheres.blank? ),
+ ("GROUP BY #{groupings.collect { |g| g.to_sql(Sql::GroupClause.new(self)) }.join(', ')}" unless groupings.blank? ),
+ ("ORDER BY #{orders .collect { |o| o.to_sql(Sql::OrderClause.new(self)) }.join(', ')}" unless orders.blank? ),
+ ("LIMIT #{taken}" unless taken.blank? ),
+ ("OFFSET #{skipped}" unless skipped.blank? )
+ ].compact.join("\n")
+ end
+
+ def inclusion_predicate_sql
+ "IN"
+ end
+
+ def christener
+ @christener ||= Sql::Christener.new
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/relations/table.rb b/lib/arel/engines/sql/relations/table.rb
index 0433abbbb2..0433abbbb2 100644
--- a/lib/arel/relations/table.rb
+++ b/lib/arel/engines/sql/relations/table.rb
diff --git a/lib/arel/engines/sql/relations/utilities.rb b/lib/arel/engines/sql/relations/utilities.rb
new file mode 100644
index 0000000000..a1451ed448
--- /dev/null
+++ b/lib/arel/engines/sql/relations/utilities.rb
@@ -0,0 +1,3 @@
+require 'arel/engines/sql/relations/utilities/recursion'
+require 'arel/engines/sql/relations/utilities/externalization'
+require 'arel/engines/sql/relations/utilities/nil'
diff --git a/lib/arel/engines/sql/relations/utilities/externalization.rb b/lib/arel/engines/sql/relations/utilities/externalization.rb
new file mode 100644
index 0000000000..1ac6f2de8e
--- /dev/null
+++ b/lib/arel/engines/sql/relations/utilities/externalization.rb
@@ -0,0 +1,14 @@
+module Arel
+ class Externalization < Compound
+ include Recursion::BaseCase
+
+ def table_sql(formatter = Sql::TableReference.new(relation))
+ formatter.select relation.select_sql, self
+ end
+
+ # REMOVEME
+ def name
+ relation.name + '_external'
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/utilities/nil.rb b/lib/arel/engines/sql/relations/utilities/nil.rb
new file mode 100644
index 0000000000..77534b25ad
--- /dev/null
+++ b/lib/arel/engines/sql/relations/utilities/nil.rb
@@ -0,0 +1,6 @@
+module Arel
+ class Nil < Relation
+ def table_sql(formatter = nil); '' end
+ def name; '' end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/relations/utilities/recursion.rb b/lib/arel/engines/sql/relations/utilities/recursion.rb
index 848b059507..848b059507 100644
--- a/lib/arel/relations/utilities/recursion.rb
+++ b/lib/arel/engines/sql/relations/utilities/recursion.rb
diff --git a/lib/arel/engines/sql/relations/writes.rb b/lib/arel/engines/sql/relations/writes.rb
new file mode 100644
index 0000000000..dcadc326d9
--- /dev/null
+++ b/lib/arel/engines/sql/relations/writes.rb
@@ -0,0 +1,3 @@
+require 'arel/engines/sql/relations/writes/delete'
+require 'arel/engines/sql/relations/writes/insert'
+require 'arel/engines/sql/relations/writes/update'
diff --git a/lib/arel/engines/sql/relations/writes/delete.rb b/lib/arel/engines/sql/relations/writes/delete.rb
new file mode 100644
index 0000000000..b22ee51e24
--- /dev/null
+++ b/lib/arel/engines/sql/relations/writes/delete.rb
@@ -0,0 +1,12 @@
+module Arel
+ class Deletion < Compound
+ def to_sql(formatter = nil)
+ [
+ "DELETE",
+ "FROM #{table_sql}",
+ ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
+ ("LIMIT #{taken}" unless taken.blank? ),
+ ].compact.join("\n")
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/writes/insert.rb b/lib/arel/engines/sql/relations/writes/insert.rb
new file mode 100644
index 0000000000..aac9c87a5b
--- /dev/null
+++ b/lib/arel/engines/sql/relations/writes/insert.rb
@@ -0,0 +1,12 @@
+module Arel
+ class Insert < Compound
+ def to_sql(formatter = nil)
+ [
+ "INSERT",
+ "INTO #{table_sql}",
+ "(#{record.keys.collect { |key| engine.quote_column_name(key.name) }.join(', ')})",
+ "VALUES (#{record.collect { |key, value| key.format(value) }.join(', ')})"
+ ].join("\n")
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/relations/writes/update.rb b/lib/arel/engines/sql/relations/writes/update.rb
new file mode 100644
index 0000000000..3e35a0d5cc
--- /dev/null
+++ b/lib/arel/engines/sql/relations/writes/update.rb
@@ -0,0 +1,14 @@
+module Arel
+ class Update < Compound
+ def to_sql(formatter = nil)
+ [
+ "UPDATE #{table_sql} SET",
+ assignments.collect do |attribute, value|
+ "#{engine.quote_column_name(attribute.name)} = #{attribute.format(value)}"
+ end.join(",\n"),
+ ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
+ ("LIMIT #{taken}" unless taken.blank? )
+ ].join("\n")
+ end
+ end
+end \ No newline at end of file
diff --git a/lib/arel/engines/sql/sql.rb b/lib/arel/engines/sql/sql.rb
new file mode 100644
index 0000000000..aed1fd861e
--- /dev/null
+++ b/lib/arel/engines/sql/sql.rb
@@ -0,0 +1,7 @@
+require 'arel/engines/sql/engine'
+require 'arel/engines/sql/relations'
+require 'arel/engines/sql/primitives'
+require 'arel/engines/sql/predicates'
+require 'arel/engines/sql/formatters'
+require 'arel/engines/sql/extensions'
+require 'arel/engines/sql/christener' \ No newline at end of file
diff --git a/lib/arel/extensions.rb b/lib/arel/extensions.rb
index 160cf36e5b..299ba0631c 100644
--- a/lib/arel/extensions.rb
+++ b/lib/arel/extensions.rb
@@ -2,5 +2,3 @@ require 'arel/extensions/object'
require 'arel/extensions/class'
require 'arel/extensions/array'
require 'arel/extensions/hash'
-require 'arel/extensions/range'
-require 'arel/extensions/nil_class' \ No newline at end of file
diff --git a/lib/arel/extensions/array.rb b/lib/arel/extensions/array.rb
index 793c06aad8..5b6d6d6abd 100644
--- a/lib/arel/extensions/array.rb
+++ b/lib/arel/extensions/array.rb
@@ -2,12 +2,4 @@ class Array
def to_hash
Hash[*flatten]
end
-
- def to_sql(formatter = nil)
- "(" + collect { |e| e.to_sql(formatter) }.join(', ') + ")"
- end
-
- def inclusion_predicate_sql
- "IN"
- end
end \ No newline at end of file
diff --git a/lib/arel/extensions/object.rb b/lib/arel/extensions/object.rb
index 14e2f82ce5..d626407dcb 100644
--- a/lib/arel/extensions/object.rb
+++ b/lib/arel/extensions/object.rb
@@ -7,14 +7,6 @@ class Object
bind(relation)
end
- def to_sql(formatter)
- formatter.scalar self
- end
-
- def equality_predicate_sql
- '='
- end
-
def metaclass
class << self
self
diff --git a/lib/arel/predicates.rb b/lib/arel/predicates.rb
index b639022b4e..aa206d4e96 100644
--- a/lib/arel/predicates.rb
+++ b/lib/arel/predicates.rb
@@ -22,11 +22,6 @@ module Arel
def bind(relation)
self.class.new(operand1.find_correlate_in(relation), operand2.find_correlate_in(relation))
end
-
- def to_sql(formatter = nil)
- "#{operand1.to_sql} #{predicate_sql} #{operand1.format(operand2)}"
- end
- alias_method :to_s, :to_sql
end
class CompoundPredicate < Binary
@@ -49,33 +44,23 @@ module Arel
((operand1 == other.operand1 and operand2 == other.operand2) or
(operand1 == other.operand2 and operand2 == other.operand1))
end
-
- def predicate_sql
- operand2.equality_predicate_sql
- end
end
class GreaterThanOrEqualTo < Binary
- def predicate_sql; '>=' end
end
class GreaterThan < Binary
- def predicate_sql; '>' end
end
class LessThanOrEqualTo < Binary
- def predicate_sql; '<=' end
end
class LessThan < Binary
- def predicate_sql; '<' end
end
class Match < Binary
- def predicate_sql; 'LIKE' end
end
class In < Binary
- def predicate_sql; operand2.inclusion_predicate_sql end
end
end
diff --git a/lib/arel/primitives/attribute.rb b/lib/arel/primitives/attribute.rb
index 6cb558d8ce..5e216770e4 100644
--- a/lib/arel/primitives/attribute.rb
+++ b/lib/arel/primitives/attribute.rb
@@ -18,18 +18,6 @@ module Arel
false
end
- def column
- original_relation.column_for(self)
- end
-
- def format(object)
- object.to_sql(Sql::Attribute.new(self))
- end
-
- def to_sql(formatter = Sql::WhereCondition.new(relation))
- formatter.attribute self
- end
-
module Transformations
def self.included(klass)
klass.send :alias_method, :eql?, :==
diff --git a/lib/arel/primitives/expression.rb b/lib/arel/primitives/expression.rb
index 836f014745..b67a5e1f8e 100644
--- a/lib/arel/primitives/expression.rb
+++ b/lib/arel/primitives/expression.rb
@@ -9,10 +9,6 @@ module Arel
@attribute, @function_sql, @alias, @ancestor = attribute, function_sql, aliaz, ancestor
end
- def to_sql(formatter = Sql::SelectClause.new(relation))
- formatter.expression self
- end
-
def aggregation?
true
end
diff --git a/lib/arel/primitives/value.rb b/lib/arel/primitives/value.rb
index 9c6e518a95..91c4045507 100644
--- a/lib/arel/primitives/value.rb
+++ b/lib/arel/primitives/value.rb
@@ -4,19 +4,6 @@ module Arel
deriving :initialize, :==
delegate :inclusion_predicate_sql, :equality_predicate_sql, :to => :value
-
- def to_sql(formatter = Sql::WhereCondition.new(relation))
- if value =~ /^\(.*\)$/
- value
- else
- formatter.value value
- end
- end
-
- def format(object)
- object.to_sql(Sql::Value.new(relation))
- end
-
def bind(relation)
Value.new(value, relation)
end
diff --git a/lib/arel/relations.rb b/lib/arel/relations.rb
index fd758ed15d..f97c35e56e 100644
--- a/lib/arel/relations.rb
+++ b/lib/arel/relations.rb
@@ -1,6 +1,4 @@
require 'arel/relations/relation'
require 'arel/relations/utilities'
-require 'arel/relations/table'
-require 'arel/relations/array'
require 'arel/relations/writes'
require 'arel/relations/operations' \ No newline at end of file
diff --git a/lib/arel/relations/operations/alias.rb b/lib/arel/relations/operations/alias.rb
index 8ed33fc597..67837f6a75 100644
--- a/lib/arel/relations/operations/alias.rb
+++ b/lib/arel/relations/operations/alias.rb
@@ -1,6 +1,5 @@
module Arel
class Alias < Compound
- include Recursion::BaseCase
attributes :relation
deriving :initialize
alias_method :==, :equal?
diff --git a/lib/arel/relations/operations/join.rb b/lib/arel/relations/operations/join.rb
index 8fe89358d8..8e19254378 100644
--- a/lib/arel/relations/operations/join.rb
+++ b/lib/arel/relations/operations/join.rb
@@ -9,22 +9,6 @@ module Arel
@join_sql, @relation1, @relation2, @predicates = join_sql, relation1, relation2, predicates
end
- def table_sql(formatter = Sql::TableReference.new(self))
- relation1.externalize.table_sql(formatter)
- end
-
- def joins(environment, formatter = Sql::TableReference.new(environment))
- @joins ||= begin
- this_join = [
- join_sql,
- relation2.externalize.table_sql(formatter),
- ("ON" unless predicates.blank?),
- (ons + relation2.externalize.wheres).collect { |p| p.bind(environment).to_sql(Sql::WhereClause.new(environment)) }.join(' AND ')
- ].compact.join(" ")
- [relation1.joins(environment), this_join, relation2.joins(environment)].compact.join(" ")
- end
- end
-
def attributes
@attributes ||= (relation1.externalize.attributes +
relation2.externalize.attributes).collect { |a| a.bind(self) }
diff --git a/lib/arel/relations/relation.rb b/lib/arel/relations/relation.rb
index ef295dfdd7..20badaf165 100644
--- a/lib/arel/relations/relation.rb
+++ b/lib/arel/relations/relation.rb
@@ -6,32 +6,6 @@ module Arel
Session.new
end
- def count
- @count = "COUNT(*) AS count_all"
- end
-
- def to_sql(formatter = Sql::SelectStatement.new(self))
- formatter.select select_sql, self
- end
- alias_method :to_s, :to_sql
-
- def select_sql
- [
- "SELECT #{@count} #{attributes.collect { |a| a.to_sql(Sql::SelectClause.new(self)) }.join(', ') unless @count}",
- "FROM #{table_sql(Sql::TableReference.new(self))}",
- (joins(self) unless joins(self).blank? ),
- ("WHERE #{wheres .collect { |w| w.to_sql(Sql::WhereClause.new(self)) }.join("\n\tAND ")}" unless wheres.blank? ),
- ("GROUP BY #{groupings.collect { |g| g.to_sql(Sql::GroupClause.new(self)) }.join(', ')}" unless groupings.blank? ),
- ("ORDER BY #{orders .collect { |o| o.to_sql(Sql::OrderClause.new(self)) }.join(', ')}" unless orders.blank? ),
- ("LIMIT #{taken}" unless taken.blank? ),
- ("OFFSET #{skipped}" unless skipped.blank? )
- ].compact.join("\n")
- end
-
- def inclusion_predicate_sql
- "IN"
- end
-
def call
engine.read(self)
end
@@ -44,10 +18,6 @@ module Arel
self
end
- def christener
- @christener ||= Sql::Christener.new
- end
-
module Enumerable
include ::Enumerable
@@ -155,7 +125,7 @@ module Arel
def orders; [] end
def inserts; [] end
def groupings; [] end
- def joins(formatter = nil); nil end
+ def joins(formatter = nil); nil end # FIXME
def taken; nil end
def skipped; nil end
end
diff --git a/lib/arel/relations/utilities.rb b/lib/arel/relations/utilities.rb
index 454d455359..fbd949ef0c 100644
--- a/lib/arel/relations/utilities.rb
+++ b/lib/arel/relations/utilities.rb
@@ -1,5 +1,3 @@
require 'arel/relations/utilities/compound'
-require 'arel/relations/utilities/recursion'
require 'arel/relations/utilities/nil'
require 'arel/relations/utilities/externalization'
-require 'arel/relations/utilities/recursion' \ No newline at end of file
diff --git a/lib/arel/relations/utilities/externalization.rb b/lib/arel/relations/utilities/externalization.rb
index 3b9b2296dc..bd067f2304 100644
--- a/lib/arel/relations/utilities/externalization.rb
+++ b/lib/arel/relations/utilities/externalization.rb
@@ -2,24 +2,14 @@ module Arel
class Externalization < Compound
attributes :relation
deriving :initialize, :==
- include Recursion::BaseCase
def wheres
[]
end
- def table_sql(formatter = Sql::TableReference.new(relation))
- formatter.select relation.select_sql, self
- end
-
def attributes
@attributes ||= relation.attributes.collect(&:to_attribute).collect { |a| a.bind(self) }
end
-
- # REMOVEME
- def name
- relation.name + '_external'
- end
end
class Relation
diff --git a/lib/arel/relations/utilities/nil.rb b/lib/arel/relations/utilities/nil.rb
index 56cf395d2c..6a9d678c45 100644
--- a/lib/arel/relations/utilities/nil.rb
+++ b/lib/arel/relations/utilities/nil.rb
@@ -3,8 +3,5 @@ require 'singleton'
module Arel
class Nil < Relation
include Singleton
-
- def table_sql(formatter = nil); '' end
- def name; '' end
end
end
diff --git a/lib/arel/relations/writes/delete.rb b/lib/arel/relations/writes/delete.rb
index 0a04454e7f..a94067c7fa 100644
--- a/lib/arel/relations/writes/delete.rb
+++ b/lib/arel/relations/writes/delete.rb
@@ -3,15 +3,6 @@ module Arel
attributes :relation
deriving :initialize, :==
- def to_sql(formatter = nil)
- [
- "DELETE",
- "FROM #{table_sql}",
- ("WHERE #{wheres.collect(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
- ("LIMIT #{taken}" unless taken.blank? ),
- ].compact.join("\n")
- end
-
def call
engine.delete(self)
end
diff --git a/lib/arel/relations/writes/insert.rb b/lib/arel/relations/writes/insert.rb
index d05bd9cdc8..6d85e9769a 100644
--- a/lib/arel/relations/writes/insert.rb
+++ b/lib/arel/relations/writes/insert.rb
@@ -7,15 +7,6 @@ module Arel
@relation, @record = relation, record.bind(relation)
end
- def to_sql(formatter = nil)
- [
- "INSERT",
- "INTO #{table_sql}",
- "(#{record.keys.map { |key| engine.quote_column_name(key.name) }.join(', ')})",
- "VALUES (#{record.map { |key, value| key.format(value) }.join(', ')})"
- ].join("\n")
- end
-
def call
engine.create(self)
end
diff --git a/lib/arel/relations/writes/update.rb b/lib/arel/relations/writes/update.rb
index fd0aadb479..e647218a80 100644
--- a/lib/arel/relations/writes/update.rb
+++ b/lib/arel/relations/writes/update.rb
@@ -7,17 +7,6 @@ module Arel
@relation, @assignments = relation, assignments
end
- def to_sql(formatter = nil)
- [
- "UPDATE #{table_sql} SET",
- assignments.collect do |attribute, value|
- "#{engine.quote_column_name(attribute.name)} = #{attribute.format(value)}"
- end.join(",\n"),
- ("WHERE #{wheres.map(&:to_sql).join('\n\tAND ')}" unless wheres.blank? ),
- ("LIMIT #{taken}" unless taken.blank? )
- ].join("\n")
- end
-
def call
engine.update(self)
end
diff --git a/lib/arel/sql.rb b/lib/arel/sql.rb
deleted file mode 100644
index 7e7dd0a80f..0000000000
--- a/lib/arel/sql.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-require 'arel/sql/formatters'
-require 'arel/sql/christener' \ No newline at end of file
diff --git a/spec/arel/unit/relations/skip_spec.rb b/spec/arel/unit/relations/skip_spec.rb
index 0653d795b1..2c8f6ccadb 100644
--- a/spec/arel/unit/relations/skip_spec.rb
+++ b/spec/arel/unit/relations/skip_spec.rb
@@ -9,7 +9,7 @@ module Arel
describe '#to_sql' do
it "manufactures sql with limit and offset" do
- sql = Skip.new(@relation, @skipped).to_s
+ sql = Skip.new(@relation, @skipped).to_sql
adapter_is :mysql do
sql.should be_like(%Q{
diff --git a/spec/arel/unit/relations/table_spec.rb b/spec/arel/unit/relations/table_spec.rb
index 08486c7b6c..211e6921f8 100644
--- a/spec/arel/unit/relations/table_spec.rb
+++ b/spec/arel/unit/relations/table_spec.rb
@@ -87,12 +87,12 @@ module Arel
describe '#engine' do
it "defaults to global engine" do
- Table.engine = engine = Engine.new
+ Table.engine = engine = Sql::Engine.new
Table.new(:users).engine.should == engine
end
it "can be specified" do
- Table.new(:users, engine = Engine.new).engine.should == engine
+ Table.new(:users, engine = Sql::Engine.new).engine.should == engine
end
end
end
diff --git a/spec/arel/unit/relations/take_spec.rb b/spec/arel/unit/relations/take_spec.rb
index 911b84e01e..d6442fc9d1 100644
--- a/spec/arel/unit/relations/take_spec.rb
+++ b/spec/arel/unit/relations/take_spec.rb
@@ -9,7 +9,7 @@ module Arel
describe '#to_sql' do
it "manufactures sql with limit and offset" do
- sql = Take.new(@relation, @taken).to_s
+ sql = Take.new(@relation, @taken).to_sql
adapter_is :mysql do
sql.should be_like(%Q{
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 8d515d66f1..6a9a2ef23c 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -30,6 +30,6 @@ Spec::Runner.configure do |config|
config.include AdapterGuards
config.mock_with :rr
config.before do
- Arel::Table.engine = Arel::Engine.new(ActiveRecord::Base)
+ Arel::Table.engine = Arel::Sql::Engine.new(ActiveRecord::Base)
end
end