aboutsummaryrefslogtreecommitdiffstats
path: root/lib/arel/algebra
diff options
context:
space:
mode:
authorBryan Helmkamp <bryan@brynary.com>2009-05-17 14:58:46 -0400
committerBryan Helmkamp <bryan@brynary.com>2009-05-17 14:58:46 -0400
commit4e3c9a01307339916f6b947d24f19b0f442afd78 (patch)
tree21d75fb31b0c920deaeb8eb0d8c71e84525dca50 /lib/arel/algebra
parent437429764510338bdc5f4915286425f07565a573 (diff)
downloadrails-4e3c9a01307339916f6b947d24f19b0f442afd78.tar.gz
rails-4e3c9a01307339916f6b947d24f19b0f442afd78.tar.bz2
rails-4e3c9a01307339916f6b947d24f19b0f442afd78.zip
most in memory operations save join and group
Conflicts: lib/arel/algebra/extensions/object.rb lib/arel/algebra/primitives/value.rb lib/arel/engines/memory/relations.rb lib/arel/engines/sql/formatters.rb lib/arel/engines/sql/primitives.rb spec/arel/unit/relations/alias_spec.rb spec/arel/unit/relations/array_spec.rb spec/arel/unit/relations/order_spec.rb
Diffstat (limited to 'lib/arel/algebra')
-rw-r--r--lib/arel/algebra/extensions/array.rb7
-rw-r--r--lib/arel/algebra/extensions/hash.rb7
-rw-r--r--lib/arel/algebra/extensions/object.rb5
-rw-r--r--lib/arel/algebra/primitives.rb1
-rw-r--r--lib/arel/algebra/primitives/attribute.rb17
-rw-r--r--lib/arel/algebra/primitives/ordering.rb18
-rw-r--r--lib/arel/algebra/primitives/value.rb8
-rw-r--r--lib/arel/algebra/relations/operations/order.rb3
8 files changed, 59 insertions, 7 deletions
diff --git a/lib/arel/algebra/extensions/array.rb b/lib/arel/algebra/extensions/array.rb
index 5b6d6d6abd..935569a07b 100644
--- a/lib/arel/algebra/extensions/array.rb
+++ b/lib/arel/algebra/extensions/array.rb
@@ -2,4 +2,11 @@ class Array
def to_hash
Hash[*flatten]
end
+
+ def group_by
+ inject({}) do |groups, element|
+ (groups[yield(element)] ||= []) << element
+ groups
+ end
+ end
end \ No newline at end of file
diff --git a/lib/arel/algebra/extensions/hash.rb b/lib/arel/algebra/extensions/hash.rb
index 7472b5aa73..bc97785e62 100644
--- a/lib/arel/algebra/extensions/hash.rb
+++ b/lib/arel/algebra/extensions/hash.rb
@@ -4,4 +4,11 @@ class Hash
bound.merge(key.bind(relation) => value.bind(relation))
end
end
+
+ def slice(*attributes)
+ inject({}) do |cheese, (key, value)|
+ cheese[key] = value if attributes.include?(key)
+ cheese
+ end
+ end
end \ No newline at end of file
diff --git a/lib/arel/algebra/extensions/object.rb b/lib/arel/algebra/extensions/object.rb
index d626407dcb..efdbbf525f 100644
--- a/lib/arel/algebra/extensions/object.rb
+++ b/lib/arel/algebra/extensions/object.rb
@@ -12,4 +12,9 @@ class Object
self
end
end
+
+ def let
+ yield(self)
+ end
end
+
diff --git a/lib/arel/algebra/primitives.rb b/lib/arel/algebra/primitives.rb
index a4c3169e0b..df8d16a5d5 100644
--- a/lib/arel/algebra/primitives.rb
+++ b/lib/arel/algebra/primitives.rb
@@ -1,4 +1,5 @@
require 'arel/algebra/primitives/attribute'
+require 'arel/algebra/primitives/ordering'
require 'arel/algebra/primitives/value'
require 'arel/algebra/primitives/expression'
diff --git a/lib/arel/algebra/primitives/attribute.rb b/lib/arel/algebra/primitives/attribute.rb
index 943c5b030e..7a4411e248 100644
--- a/lib/arel/algebra/primitives/attribute.rb
+++ b/lib/arel/algebra/primitives/attribute.rb
@@ -17,6 +17,10 @@ module Arel
def aggregation?
false
end
+
+ def inspect
+ "<Attribute #{name}>"
+ end
module Transformations
def self.included(klass)
@@ -129,5 +133,18 @@ module Arel
end
end
include Expressions
+
+ module Orderings
+ def asc
+ Ascending.new(self)
+ end
+
+ def desc
+ Descending.new(self)
+ end
+
+ alias_method :to_ordering, :asc
+ end
+ include Orderings
end
end
diff --git a/lib/arel/algebra/primitives/ordering.rb b/lib/arel/algebra/primitives/ordering.rb
new file mode 100644
index 0000000000..e8d8f97188
--- /dev/null
+++ b/lib/arel/algebra/primitives/ordering.rb
@@ -0,0 +1,18 @@
+module Arel
+ class Ordering
+ attributes :attribute
+ deriving :initialize, :==
+ delegate :relation, :to => :attribute
+
+ def bind(relation)
+ self.class.new(attribute.bind(relation))
+ end
+
+ def to_ordering
+ self
+ end
+ end
+
+ class Ascending < Ordering; end
+ class Descending < Ordering; end
+end \ No newline at end of file
diff --git a/lib/arel/algebra/primitives/value.rb b/lib/arel/algebra/primitives/value.rb
index 76c82890d0..e363805140 100644
--- a/lib/arel/algebra/primitives/value.rb
+++ b/lib/arel/algebra/primitives/value.rb
@@ -7,12 +7,8 @@ module Arel
Value.new(value, relation)
end
- def aggregation?
- false
- end
-
- def to_attribute
- value
+ def to_ordering
+ self
end
end
end
diff --git a/lib/arel/algebra/relations/operations/order.rb b/lib/arel/algebra/relations/operations/order.rb
index 05af3fde4d..eccd8bcda0 100644
--- a/lib/arel/algebra/relations/operations/order.rb
+++ b/lib/arel/algebra/relations/operations/order.rb
@@ -10,7 +10,8 @@ module Arel
# TESTME
def orders
- (orderings + relation.orders).collect { |o| o.bind(self) }
+ # QUESTION - do we still need relation.orders ?
+ (orderings + relation.orders).collect { |o| o.bind(self) }.collect { |o| o.to_ordering }
end
end
end \ No newline at end of file