From 5daafa8e959acc64fc19e9522470282ac0f25f33 Mon Sep 17 00:00:00 2001
From: Emilio Tagua <miloops@gmail.com>
Date: Sat, 11 Sep 2010 11:34:18 +0800
Subject: Add Min node.

---
 lib/arel/attributes/attribute.rb       | 4 ++++
 lib/arel/nodes.rb                      | 1 +
 lib/arel/nodes/min.rb                  | 6 ++++++
 lib/arel/visitors/to_sql.rb            | 5 +++++
 spec/arel/attributes/attribute_spec.rb | 7 +++++++
 5 files changed, 23 insertions(+)
 create mode 100644 lib/arel/nodes/min.rb

diff --git a/lib/arel/attributes/attribute.rb b/lib/arel/attributes/attribute.rb
index 617112f681..34c1f45ba6 100644
--- a/lib/arel/attributes/attribute.rb
+++ b/lib/arel/attributes/attribute.rb
@@ -25,6 +25,10 @@ module Arel
         Nodes::Max.new [self], Nodes::SqlLiteral.new('max_id')
       end
 
+      def minimum
+        Nodes::Min.new [self], Nodes::SqlLiteral.new('min_id')
+      end
+
       def average
         Nodes::Avg.new [self], Nodes::SqlLiteral.new('avg_id')
       end
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb
index 7510214cdf..3ffc81d7df 100644
--- a/lib/arel/nodes.rb
+++ b/lib/arel/nodes.rb
@@ -15,6 +15,7 @@ require 'arel/nodes/values'
 require 'arel/nodes/offset'
 require 'arel/nodes/sum'
 require 'arel/nodes/max'
+require 'arel/nodes/min'
 require 'arel/nodes/avg'
 require 'arel/nodes/having'
 require 'arel/nodes/sql_literal'
diff --git a/lib/arel/nodes/min.rb b/lib/arel/nodes/min.rb
new file mode 100644
index 0000000000..bdc1371858
--- /dev/null
+++ b/lib/arel/nodes/min.rb
@@ -0,0 +1,6 @@
+module Arel
+  module Nodes
+    class Min < Arel::Nodes::Function
+    end
+  end
+end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 599a25836a..65dc5fdb83 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -100,6 +100,11 @@ module Arel
           visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
       end
 
+      def visit_Arel_Nodes_Min o
+        "MIN(#{o.expressions.map { |x|
+          visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
+      end
+
       def visit_Arel_Nodes_Avg o
         "AVG(#{o.expressions.map { |x|
           visit x }.join(', ')})#{o.alias ? " AS #{visit o.alias}" : ''}"
diff --git a/spec/arel/attributes/attribute_spec.rb b/spec/arel/attributes/attribute_spec.rb
index 6679ca8b7a..faef096792 100644
--- a/spec/arel/attributes/attribute_spec.rb
+++ b/spec/arel/attributes/attribute_spec.rb
@@ -94,6 +94,13 @@ module Arel
         end
       end
 
+      describe '#minimum' do
+        it 'should create a Min node' do
+          relation = Table.new(:users)
+          relation[:id].minimum.should be_kind_of Nodes::Min
+        end
+      end
+
       describe '#sum' do
         it 'should create a SUM node' do
           relation = Table.new(:users)
-- 
cgit v1.2.3