diff options
author | Nick Kallen <nkallen@nick-kallens-computer-2.local> | 2008-01-03 23:41:43 -0800 |
---|---|---|
committer | Nick Kallen <nkallen@nick-kallens-computer-2.local> | 2008-01-03 23:41:43 -0800 |
commit | a5d62729799ed58ce344dba0621e951dbc92ab3f (patch) | |
tree | 11e3b9f32b649c32d5e7b84f4546c835e6a29b2e /lib | |
parent | 6c89e3818d85e3169a7fb8de27b25357c2259881 (diff) | |
download | rails-a5d62729799ed58ce344dba0621e951dbc92ab3f.tar.gz rails-a5d62729799ed58ce344dba0621e951dbc92ab3f.tar.bz2 rails-a5d62729799ed58ce344dba0621e951dbc92ab3f.zip |
new usage of builder
`
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sql_algebra.rb | 6 | ||||
-rw-r--r-- | lib/sql_algebra/extensions/base.rb | 15 | ||||
-rw-r--r-- | lib/sql_algebra/extensions/object.rb | 8 | ||||
-rw-r--r-- | lib/sql_algebra/relations/inner_join_relation.rb | 2 | ||||
-rw-r--r-- | lib/sql_algebra/relations/join_relation.rb | 32 | ||||
-rw-r--r-- | lib/sql_algebra/relations/left_outer_join_relation.rb | 2 | ||||
-rw-r--r-- | lib/sql_algebra/relations/relation.rb | 75 | ||||
-rw-r--r-- | lib/sql_algebra/relations/selection_relation.rb | 12 | ||||
-rw-r--r-- | lib/sql_algebra/relations/table_relation.rb | 17 | ||||
-rw-r--r-- | lib/sql_algebra/sql_builder/order_builder.rb | 16 | ||||
-rw-r--r-- | lib/sql_algebra/sql_builder/selects_builder.rb | 20 | ||||
-rw-r--r-- | lib/sql_algebra/sql_builder/sql_builder_adapter.rb | 22 |
12 files changed, 149 insertions, 78 deletions
diff --git a/lib/sql_algebra.rb b/lib/sql_algebra.rb index 5753a48d2f..b3e3c8d176 100644 --- a/lib/sql_algebra.rb +++ b/lib/sql_algebra.rb @@ -1,8 +1,10 @@ $LOAD_PATH.unshift(File.dirname(__FILE__)) require 'rubygems' -require 'active_support' +require 'activesupport' +require 'activerecord' require 'sql_algebra/relations/relation' +require 'sql_algebra/relations/compound_relation' require 'sql_algebra/relations/table_relation' require 'sql_algebra/relations/join_operation' require 'sql_algebra/relations/inner_join_operation' @@ -15,6 +17,7 @@ require 'sql_algebra/relations/projection_relation' require 'sql_algebra/relations/selection_relation' require 'sql_algebra/relations/order_relation' require 'sql_algebra/relations/range_relation' +require 'sql_algebra/relations/join' require 'sql_algebra/predicates/predicate' require 'sql_algebra/predicates/binary_predicate' @@ -30,7 +33,6 @@ require 'sql_algebra/predicates/match_predicate' require 'sql_algebra/extensions/range' require 'sql_algebra/extensions/object' -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/joins_builder' diff --git a/lib/sql_algebra/extensions/base.rb b/lib/sql_algebra/extensions/base.rb new file mode 100644 index 0000000000..79f2ce75d1 --- /dev/null +++ b/lib/sql_algebra/extensions/base.rb @@ -0,0 +1,15 @@ +class ActiveRecord::Base + def self.bring_forth(record, includes = []) + object = cache.get(record % klass.primary_key) { Klass.instantiate(record % Klass.attributes) } + includes.each do |include| + case include + when Symbol + object.send(association = include).bring_forth(record) + when Hash + include.each do |association, nested_associations| + object.send(association).bring_forth(record, nested_associations) + end + end + end + end +end
\ No newline at end of file diff --git a/lib/sql_algebra/extensions/object.rb b/lib/sql_algebra/extensions/object.rb new file mode 100644 index 0000000000..639e810a97 --- /dev/null +++ b/lib/sql_algebra/extensions/object.rb @@ -0,0 +1,8 @@ +class Object + def to_sql(builder = EqualsConditionBuilder.new) + me = self + builder.call do + value me + end + end +end
\ No newline at end of file diff --git a/lib/sql_algebra/relations/inner_join_relation.rb b/lib/sql_algebra/relations/inner_join_relation.rb index 1ef965a6f5..6b932e3b21 100644 --- a/lib/sql_algebra/relations/inner_join_relation.rb +++ b/lib/sql_algebra/relations/inner_join_relation.rb @@ -1,5 +1,5 @@ class InnerJoinRelation < JoinRelation - def join_name + def join_type :inner_join 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 b96cd175de..dc57e24c96 100644 --- a/lib/sql_algebra/relations/join_relation.rb +++ b/lib/sql_algebra/relations/join_relation.rb @@ -11,24 +11,22 @@ class JoinRelation < Relation (relation2 == other.relation1 and relation1 == other.relation2)) end - def to_sql(builder = SelectBuilder.new) - relation2.to_sql(translate_from_to_inner_join_on_predicates(relation1.to_sql(builder))) + def joins + relation1.joins + relation2.joins + [Join.new(relation1, relation2, predicates, join_type)] 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| - builder.call do - send(schmoin_name, table) do - schmredicates.each do |predicate| - predicate.to_sql(self) - end - end - end - end - end + def selects + relation1.selects + relation2.selects end + + def attributes + relation1.attributes + relation2.attributes + end + + def attribute(name) + relation1[name] || relation2[name] + end + + protected + delegate :table, :to => :relation1 end
\ No newline at end of file diff --git a/lib/sql_algebra/relations/left_outer_join_relation.rb b/lib/sql_algebra/relations/left_outer_join_relation.rb index c7722c394d..f4ece43861 100644 --- a/lib/sql_algebra/relations/left_outer_join_relation.rb +++ b/lib/sql_algebra/relations/left_outer_join_relation.rb @@ -1,5 +1,5 @@ class LeftOuterJoinRelation < JoinRelation - def join_name + def join_type :left_outer_join end end
\ No newline at end of file diff --git a/lib/sql_algebra/relations/relation.rb b/lib/sql_algebra/relations/relation.rb index bd812b368d..8c21927d01 100644 --- a/lib/sql_algebra/relations/relation.rb +++ b/lib/sql_algebra/relations/relation.rb @@ -1,34 +1,65 @@ class Relation - def <=>(other) - InnerJoinOperation.new(self, other) - end + module Operations + def <=>(other) + InnerJoinOperation.new(self, other) + end - def <<(other) - LeftOuterJoinOperation.new(self, other) - end + def <<(other) + LeftOuterJoinOperation.new(self, other) + end - def [](index) - case index - when Symbol - Attribute.new(self, index) - when Range - RangeRelation.new(self, index) + def [](index) + case index + when Symbol + attribute(index) + when Range + RangeRelation.new(self, index) + end end - end - def include?(attribute) - RelationInclusionPredicate.new(attribute, self) - end + def include?(attribute) + RelationInclusionPredicate.new(attribute, self) + end - def select(*predicates) - SelectionRelation.new(self, *predicates) + def select(*predicates) + SelectionRelation.new(self, *predicates) + end + + def project(*attributes) + ProjectionRelation.new(self, *attributes) + end + + def order(*attributes) + OrderRelation.new(self, *attributes) + end end + include Operations - def project(*attributes) - ProjectionRelation.new(self, *attributes) + def connection + ActiveRecord::Base.connection end - def order(*attributes) - OrderRelation.new(self, *attributes) + def to_sql(builder = SelectBuilder.new) + builder.call do + select do + attributes.each { |a| a.to_sql(self) } + end + from table do + joins.each { |j| j.to_sql(self) } + end + where do + selects.each { |s| s.to_sql(self) } + end + order_by do + orders.each { |o| o.to_sql(self) } + end + end end + + protected + def attributes; [] end + def joins; [] end + def selects; [] end + def orders; [] 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 51461de7d2..72911aa65a 100644 --- a/lib/sql_algebra/relations/selection_relation.rb +++ b/lib/sql_algebra/relations/selection_relation.rb @@ -1,4 +1,4 @@ -class SelectionRelation < Relation +class SelectionRelation < CompoundRelation attr_reader :relation, :predicate def initialize(relation, *predicates) @@ -10,13 +10,7 @@ class SelectionRelation < Relation 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 + def selects + [predicate] end - - delegate :[], :to => :relation 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 60bdfda8ee..1915b42565 100644 --- a/lib/sql_algebra/relations/table_relation.rb +++ b/lib/sql_algebra/relations/table_relation.rb @@ -5,10 +5,19 @@ class TableRelation < Relation @table = table end - def to_sql(builder = SelectBuilder.new) - builder.call do - select { all } - from table + def attributes + attributes_by_name.values + end + + protected + def attribute(name) + attributes_by_name[name.to_s] + end + + private + def attributes_by_name + @attributes_by_name ||= connection.columns(table, "#{table} Columns").inject({}) do |attributes_by_name, column| + attributes_by_name.merge(column.name => Attribute.new(self, column.name.to_sym)) end end end
\ No newline at end of file diff --git a/lib/sql_algebra/sql_builder/order_builder.rb b/lib/sql_algebra/sql_builder/order_builder.rb new file mode 100644 index 0000000000..4eea40fa36 --- /dev/null +++ b/lib/sql_algebra/sql_builder/order_builder.rb @@ -0,0 +1,16 @@ +class OrderBuilder < SqlBuilder + def initialize(&block) + @orders = [] + super(&block) + end + + def column(table, column, aliaz = nil) + @orders << (aliaz ? aliaz : "#{table}.#{column}") + end + + def to_s + @orders.join(', ') + end + + delegate :blank?, :to => :@orders +end
\ No newline at end of file diff --git a/lib/sql_algebra/sql_builder/selects_builder.rb b/lib/sql_algebra/sql_builder/selects_builder.rb new file mode 100644 index 0000000000..72f6f52397 --- /dev/null +++ b/lib/sql_algebra/sql_builder/selects_builder.rb @@ -0,0 +1,20 @@ +class SelectsBuilder < SqlBuilder + def initialize(&block) + @selects = [] + super(&block) + end + + def to_s + @selects.join(', ') + end + + def all + @selects << :* + end + + def column(table, column, aliaz = nil) + @selects << "#{table}.#{column}" + (aliaz ? " AS #{aliaz}" : '') + end + + delegate :blank?, :to => :@selects +end
\ No newline at end of file diff --git a/lib/sql_algebra/sql_builder/sql_builder_adapter.rb b/lib/sql_algebra/sql_builder/sql_builder_adapter.rb deleted file mode 100644 index 9bb5271f33..0000000000 --- a/lib/sql_algebra/sql_builder/sql_builder_adapter.rb +++ /dev/null @@ -1,22 +0,0 @@ -class SqlBuilderAdapter - instance_methods.each { |m| undef_method m unless m =~ /^__|^instance_eval|class/ } - - 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).instance_exec(@adaptee, &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
\ No newline at end of file |