aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorNick Kallen <nkallen@nick-kallens-computer-2.local>2007-12-30 23:59:29 -0800
committerNick Kallen <nkallen@nick-kallens-computer-2.local>2007-12-30 23:59:29 -0800
commitbd5a4d6d22321f10eb716024f01a1f84f1b80d3f (patch)
treea995cfe4e43fb76662e70baa06e6aa9ad3afaba5 /lib
parent1c1c878e2d2ea6d437f8e1011492c78f1916196e (diff)
downloadrails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.tar.gz
rails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.tar.bz2
rails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.zip
before doing crazy
Diffstat (limited to 'lib')
-rw-r--r--lib/sql_algebra.rb3
-rw-r--r--lib/sql_algebra/predicates/binary_predicate.rb6
-rw-r--r--lib/sql_algebra/predicates/equality_predicate.rb5
-rw-r--r--lib/sql_algebra/relations/attribute.rb4
-rw-r--r--lib/sql_algebra/relations/join_relation.rb36
-rw-r--r--lib/sql_algebra/relations/selection_relation.rb8
-rw-r--r--lib/sql_algebra/relations/table_relation.rb4
7 files changed, 64 insertions, 2 deletions
diff --git a/lib/sql_algebra.rb b/lib/sql_algebra.rb
index 8cd44386ad..e8955ae18b 100644
--- a/lib/sql_algebra.rb
+++ b/lib/sql_algebra.rb
@@ -37,3 +37,6 @@ require 'sql_algebra/sql_builder/join_builder'
require 'sql_algebra/sql_builder/inner_join_builder'
require 'sql_algebra/sql_builder/left_outer_join_builder'
require 'sql_algebra/sql_builder/equals_condition_builder'
+require 'sql_algebra/sql_builder/column_builder'
+require 'sql_algebra/sql_builder/conditions_builder'
+
diff --git a/lib/sql_algebra/predicates/binary_predicate.rb b/lib/sql_algebra/predicates/binary_predicate.rb
index d7f4cb20e7..3e5b9ce193 100644
--- a/lib/sql_algebra/predicates/binary_predicate.rb
+++ b/lib/sql_algebra/predicates/binary_predicate.rb
@@ -9,4 +9,10 @@ class BinaryPredicate < Predicate
super and
(attribute1.eql?(other.attribute1) and attribute2.eql?(other.attribute2))
end
+
+ def to_sql(builder = ConditionsBuilder.new)
+ builder.call do
+ send(predicate_name, attribute1.to_sql(self), attribute2.to_sql(self))
+ end
+ end
end \ No newline at end of file
diff --git a/lib/sql_algebra/predicates/equality_predicate.rb b/lib/sql_algebra/predicates/equality_predicate.rb
index 2d206e6c12..2061d0f644 100644
--- a/lib/sql_algebra/predicates/equality_predicate.rb
+++ b/lib/sql_algebra/predicates/equality_predicate.rb
@@ -4,4 +4,9 @@ class EqualityPredicate < BinaryPredicate
((attribute1.eql?(other.attribute1) and attribute2.eql?(other.attribute2)) or
(attribute1.eql?(other.attribute2) and attribute2.eql?(other.attribute1)))
end
+
+ protected
+ def predicate_name
+ :equals
+ end
end \ No newline at end of file
diff --git a/lib/sql_algebra/relations/attribute.rb b/lib/sql_algebra/relations/attribute.rb
index c0b8df3083..7a4a0d72c5 100644
--- a/lib/sql_algebra/relations/attribute.rb
+++ b/lib/sql_algebra/relations/attribute.rb
@@ -32,4 +32,8 @@ class Attribute
def =~(regexp)
MatchPredicate.new(self, regexp)
end
+
+ def to_sql(ignore_builder_because_i_can_only_exist_atomically)
+ ColumnBuilder.new(relation.table, attribute_name)
+ end
end \ No newline at end of file
diff --git a/lib/sql_algebra/relations/join_relation.rb b/lib/sql_algebra/relations/join_relation.rb
index 64db8e0e68..4052798d51 100644
--- a/lib/sql_algebra/relations/join_relation.rb
+++ b/lib/sql_algebra/relations/join_relation.rb
@@ -10,4 +10,40 @@ class JoinRelation < Relation
((relation1 == other.relation1 and relation2 == other.relation2) or
(relation2 == other.relation1 and relation1 == other.relation2))
end
+
+ def to_sql(builder = SelectBuilder.new)
+ enclosed_join_name, enclosed_predicates = join_name, predicates
+ relation2.to_sql(Adapter.new(relation1.to_sql(builder)) do
+ define_method :from do |table|
+ send(enclosed_join_name, table) do
+ enclosed_predicates.each do |predicate|
+ predicate.to_sql(self)
+ end
+ end
+ end
+ end)
+ end
+
+ class Adapter
+ instance_methods.each { |m| undef_method m unless m =~ /^__|^instance_eval/ }
+
+ def initialize(adaptee, &block)
+ @adaptee = adaptee
+ (class << self; self end).class_eval do
+ (adaptee.methods - instance_methods).each { |m| delegate m, :to => :@adaptee }
+ end
+ (class << self; self end).class_eval(&block)
+ end
+
+ def call(&block)
+ @caller = eval("self", block.binding)
+ returning self do |adapter|
+ instance_eval(&block)
+ end
+ end
+
+ def method_missing(method, *args, &block)
+ @caller.send(method, *args, &block)
+ end
+ end
end \ No newline at end of file
diff --git a/lib/sql_algebra/relations/selection_relation.rb b/lib/sql_algebra/relations/selection_relation.rb
index 5654d8de31..cce93917c4 100644
--- a/lib/sql_algebra/relations/selection_relation.rb
+++ b/lib/sql_algebra/relations/selection_relation.rb
@@ -9,4 +9,12 @@ class SelectionRelation < Relation
def ==(other)
relation == other.relation and predicate == other.predicate
end
+
+ def to_sql(builder = SelectBuilder.new)
+ relation.to_sql(builder).call do
+ where do
+ predicate.to_sql(self)
+ end
+ end
+ end
end \ No newline at end of file
diff --git a/lib/sql_algebra/relations/table_relation.rb b/lib/sql_algebra/relations/table_relation.rb
index 17cdbab61a..eee24e5d68 100644
--- a/lib/sql_algebra/relations/table_relation.rb
+++ b/lib/sql_algebra/relations/table_relation.rb
@@ -5,8 +5,8 @@ class TableRelation < Relation
@table = table
end
- def to_sql
- SelectBuilder.new do
+ def to_sql(builder = SelectBuilder.new)
+ builder.call do
select :*
from table
end