aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorNick Kallen <nkallen@nick-kallens-computer-2.local>2008-01-03 23:41:43 -0800
committerNick Kallen <nkallen@nick-kallens-computer-2.local>2008-01-03 23:41:43 -0800
commita5d62729799ed58ce344dba0621e951dbc92ab3f (patch)
tree11e3b9f32b649c32d5e7b84f4546c835e6a29b2e /lib
parent6c89e3818d85e3169a7fb8de27b25357c2259881 (diff)
downloadrails-a5d62729799ed58ce344dba0621e951dbc92ab3f.tar.gz
rails-a5d62729799ed58ce344dba0621e951dbc92ab3f.tar.bz2
rails-a5d62729799ed58ce344dba0621e951dbc92ab3f.zip
new usage of builder
`
Diffstat (limited to 'lib')
-rw-r--r--lib/sql_algebra.rb6
-rw-r--r--lib/sql_algebra/extensions/base.rb15
-rw-r--r--lib/sql_algebra/extensions/object.rb8
-rw-r--r--lib/sql_algebra/relations/inner_join_relation.rb2
-rw-r--r--lib/sql_algebra/relations/join_relation.rb32
-rw-r--r--lib/sql_algebra/relations/left_outer_join_relation.rb2
-rw-r--r--lib/sql_algebra/relations/relation.rb75
-rw-r--r--lib/sql_algebra/relations/selection_relation.rb12
-rw-r--r--lib/sql_algebra/relations/table_relation.rb17
-rw-r--r--lib/sql_algebra/sql_builder/order_builder.rb16
-rw-r--r--lib/sql_algebra/sql_builder/selects_builder.rb20
-rw-r--r--lib/sql_algebra/sql_builder/sql_builder_adapter.rb22
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