diff options
-rw-r--r-- | lib/sql_algebra.rb | 2 | ||||
-rw-r--r-- | lib/sql_algebra/relations/attribute.rb | 2 | ||||
-rw-r--r-- | lib/sql_algebra/relations/join_relation.rb | 41 |
3 files changed, 15 insertions, 30 deletions
diff --git a/lib/sql_algebra.rb b/lib/sql_algebra.rb index e8955ae18b..8389250755 100644 --- a/lib/sql_algebra.rb +++ b/lib/sql_algebra.rb @@ -29,9 +29,9 @@ require 'sql_algebra/predicates/match_predicate' require 'sql_algebra/extensions/range' +require 'sql_algebra/sql_builder/sql_builder_adapter' require 'sql_algebra/sql_builder/sql_builder' require 'sql_algebra/sql_builder/select_builder' -require 'sql_algebra/sql_builder/where_builder' require 'sql_algebra/sql_builder/joins_builder' require 'sql_algebra/sql_builder/join_builder' require 'sql_algebra/sql_builder/inner_join_builder' diff --git a/lib/sql_algebra/relations/attribute.rb b/lib/sql_algebra/relations/attribute.rb index 7a4a0d72c5..af448286f1 100644 --- a/lib/sql_algebra/relations/attribute.rb +++ b/lib/sql_algebra/relations/attribute.rb @@ -33,7 +33,7 @@ class Attribute MatchPredicate.new(self, regexp) end - def to_sql(ignore_builder_because_i_can_only_exist_atomically) + def to_sql(ignore_builder_because_i_can_only_exist_atomically = nil) 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 4052798d51..b96cd175de 100644 --- a/lib/sql_algebra/relations/join_relation.rb +++ b/lib/sql_algebra/relations/join_relation.rb @@ -12,38 +12,23 @@ class JoinRelation < Relation 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 + relation2.to_sql(translate_from_to_inner_join_on_predicates(relation1.to_sql(builder))) + end + + private + # translate 'from' to 'inner join on <predicates>' + def translate_from_to_inner_join_on_predicates(builder) + schmoin_name, schmredicates = join_name, predicates + SqlBuilderAdapter.new(builder) do |builder| define_method :from do |table| - send(enclosed_join_name, table) do - enclosed_predicates.each do |predicate| - predicate.to_sql(self) + builder.call do + send(schmoin_name, table) do + schmredicates.each do |predicate| + predicate.to_sql(self) + end 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 |