diff options
author | Nick Kallen <nkallen@nick-kallens-computer-2.local> | 2007-12-30 23:59:29 -0800 |
---|---|---|
committer | Nick Kallen <nkallen@nick-kallens-computer-2.local> | 2007-12-30 23:59:29 -0800 |
commit | bd5a4d6d22321f10eb716024f01a1f84f1b80d3f (patch) | |
tree | a995cfe4e43fb76662e70baa06e6aa9ad3afaba5 /lib | |
parent | 1c1c878e2d2ea6d437f8e1011492c78f1916196e (diff) | |
download | rails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.tar.gz rails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.tar.bz2 rails-bd5a4d6d22321f10eb716024f01a1f84f1b80d3f.zip |
before doing crazy
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sql_algebra.rb | 3 | ||||
-rw-r--r-- | lib/sql_algebra/predicates/binary_predicate.rb | 6 | ||||
-rw-r--r-- | lib/sql_algebra/predicates/equality_predicate.rb | 5 | ||||
-rw-r--r-- | lib/sql_algebra/relations/attribute.rb | 4 | ||||
-rw-r--r-- | lib/sql_algebra/relations/join_relation.rb | 36 | ||||
-rw-r--r-- | lib/sql_algebra/relations/selection_relation.rb | 8 | ||||
-rw-r--r-- | lib/sql_algebra/relations/table_relation.rb | 4 |
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 |