diff options
Diffstat (limited to 'lib/sql_algebra/relations')
-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 |
4 files changed, 50 insertions, 2 deletions
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 |