aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2010-08-13 15:30:22 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2010-08-13 15:30:22 -0700
commitb1e7bd7d026c888d4c406adc595577b7ebc84ed5 (patch)
tree48fac168dd38abfebff0650d2695cd51db490e21
parenta37bdba9be810fa5fc292175497ee614900c5043 (diff)
downloadrails-b1e7bd7d026c888d4c406adc595577b7ebc84ed5.tar.gz
rails-b1e7bd7d026c888d4c406adc595577b7ebc84ed5.tar.bz2
rails-b1e7bd7d026c888d4c406adc595577b7ebc84ed5.zip
insert manager is starting to take shape
-rw-r--r--lib/arel.rb2
-rw-r--r--lib/arel/insert_manager.rb13
-rw-r--r--lib/arel/nodes.rb1
-rw-r--r--lib/arel/nodes/insert_statement.rb13
-rw-r--r--lib/arel/select_manager.rb29
-rw-r--r--lib/arel/table.rb2
-rw-r--r--lib/arel/tree_manager.rb30
-rw-r--r--lib/arel/visitors/to_sql.rb4
-rw-r--r--spec/arel/insert_manager.rb29
-rw-r--r--spec/arel/select_manager.rb (renamed from spec/arel/tree_manager.rb)38
-rw-r--r--spec/arel/table_spec.rb8
-rw-r--r--spec/spec_helper.rb4
12 files changed, 121 insertions, 52 deletions
diff --git a/lib/arel.rb b/lib/arel.rb
index 1cca58f31b..8465d8e658 100644
--- a/lib/arel.rb
+++ b/lib/arel.rb
@@ -8,6 +8,8 @@ require 'arel/relation'
####
require 'arel/tree_manager'
+require 'arel/insert_manager'
+require 'arel/select_manager'
require 'arel/nodes'
#### these are deprecated
diff --git a/lib/arel/insert_manager.rb b/lib/arel/insert_manager.rb
new file mode 100644
index 0000000000..bfd3034df4
--- /dev/null
+++ b/lib/arel/insert_manager.rb
@@ -0,0 +1,13 @@
+module Arel
+ class InsertManager < Arel::TreeManager
+ def initialize engine
+ super
+ @head = Nodes::InsertStatement.new
+ end
+
+ def into table
+ @head.relation = table
+ self
+ end
+ end
+end
diff --git a/lib/arel/nodes.rb b/lib/arel/nodes.rb
index 5db177d53d..eed9641bbc 100644
--- a/lib/arel/nodes.rb
+++ b/lib/arel/nodes.rb
@@ -2,3 +2,4 @@ require 'arel/nodes/equality'
require 'arel/nodes/sql_literal'
require 'arel/nodes/select_core'
require 'arel/nodes/select_statement'
+require 'arel/nodes/insert_statement'
diff --git a/lib/arel/nodes/insert_statement.rb b/lib/arel/nodes/insert_statement.rb
new file mode 100644
index 0000000000..ed601aa841
--- /dev/null
+++ b/lib/arel/nodes/insert_statement.rb
@@ -0,0 +1,13 @@
+module Arel
+ module Nodes
+ class InsertStatement
+ attr_accessor :relation, :columns, :values
+
+ def initialize
+ @relation = nil
+ @columns = []
+ @values = []
+ end
+ end
+ end
+end
diff --git a/lib/arel/select_manager.rb b/lib/arel/select_manager.rb
new file mode 100644
index 0000000000..6420142fa0
--- /dev/null
+++ b/lib/arel/select_manager.rb
@@ -0,0 +1,29 @@
+module Arel
+ class SelectManager < Arel::TreeManager
+ def initialize engine
+ super
+ @head = Nodes::SelectStatement.new
+ @ctx = @head.cores.last
+ end
+
+ def from table
+ @ctx.froms << table
+ self
+ end
+
+ def project projection
+ @ctx.projections << projection
+ self
+ end
+
+ def where expr
+ @ctx.wheres << expr
+ self
+ end
+
+ def take limit
+ @head.limit = limit
+ self
+ end
+ end
+end
diff --git a/lib/arel/table.rb b/lib/arel/table.rb
index a189838c07..4269dfc62f 100644
--- a/lib/arel/table.rb
+++ b/lib/arel/table.rb
@@ -13,7 +13,7 @@ module Arel
end
def tm
- TreeManager.new(@engine).from(self)
+ SelectManager.new(@engine).from(self)
end
def where condition
diff --git a/lib/arel/tree_manager.rb b/lib/arel/tree_manager.rb
index 9de86e2add..9dd9f27858 100644
--- a/lib/arel/tree_manager.rb
+++ b/lib/arel/tree_manager.rb
@@ -4,38 +4,12 @@ module Arel
include Arel::Relation
def initialize engine
- @engine = engine
- @selects = []
-
- # default to Select
- @stmt = Nodes::SelectStatement.new
- @core = @stmt.cores.last
- @selects << @stmt
- end
-
- def from table
- @core.froms << table
- self
- end
-
- def project projection
- @core.projections << projection
- self
- end
-
- def where expr
- @core.wheres << expr
- self
- end
-
- def take limit
- @stmt.limit = limit
- self
+ @engine = engine
end
def to_sql
viz = Visitors::ToSql.new @engine
- viz.accept @stmt
+ viz.accept @head
end
end
end
diff --git a/lib/arel/visitors/to_sql.rb b/lib/arel/visitors/to_sql.rb
index 2b3216abd3..7a97b0d445 100644
--- a/lib/arel/visitors/to_sql.rb
+++ b/lib/arel/visitors/to_sql.rb
@@ -12,6 +12,10 @@ module Arel
end
private
+ def visit_Arel_Nodes_InsertStatement o
+ "INSERT INTO #{visit o.relation}"
+ end
+
def visit_Arel_Nodes_SelectStatement o
[
o.cores.map { |x| visit x }.join,
diff --git a/spec/arel/insert_manager.rb b/spec/arel/insert_manager.rb
new file mode 100644
index 0000000000..8d49556fa9
--- /dev/null
+++ b/spec/arel/insert_manager.rb
@@ -0,0 +1,29 @@
+require 'spec_helper'
+
+module Arel
+ describe 'insert manager' do
+ describe 'new' do
+ it 'takes an engine' do
+ Arel::InsertManager.new Table.engine
+ end
+ end
+
+ describe 'into' do
+ it 'takes an engine' do
+ manager = Arel::InsertManager.new Table.engine
+ manager.into(Table.new(:users)).should == manager
+ end
+ end
+
+ describe 'to_sql' do
+ it 'converts to sql' do
+ table = Table.new :users
+ manager = Arel::InsertManager.new Table.engine
+ manager.into table
+ manager.to_sql.should be_like %{
+ INSERT INTO "users"
+ }
+ end
+ end
+ end
+end
diff --git a/spec/arel/tree_manager.rb b/spec/arel/select_manager.rb
index 92af2f3dcd..928db49c52 100644
--- a/spec/arel/tree_manager.rb
+++ b/spec/arel/select_manager.rb
@@ -1,46 +1,46 @@
require 'spec_helper'
module Arel
- describe 'tree manager' do
+ describe 'select manager' do
describe 'project' do
it 'takes strings' do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.project '*'
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT *
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
it "takes sql literals" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.project Nodes::SqlLiteral.new '*'
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT *
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
end
describe 'take' do
it "knows take" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
manager.take 1
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
LIMIT 1
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
it "chains" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.take(1).should == manager
end
end
@@ -48,19 +48,19 @@ module Arel
describe 'where' do
it "knows where" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.from(table).project(table['id'])
manager.where(table['id'].eq(1))
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
it "chains" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.from(table)
manager.project(table['id']).where(table['id'].eq 1).should == manager
end
@@ -69,18 +69,18 @@ module Arel
describe 'from' do
it "makes sql" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.from table
manager.project table['id']
- manager.to_sql.should == 'SELECT "users"."id" FROM "users"'
+ manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
it "chains" do
table = Table.new :users
- manager = Arel::TreeManager.new Table.engine
+ manager = Arel::SelectManager.new Table.engine
manager.from(table).project(table['id']).should == manager
- manager.to_sql.should == 'SELECT "users"."id" FROM "users"'
+ manager.to_sql.should be_like 'SELECT "users"."id" FROM "users"'
end
end
end
diff --git a/spec/arel/table_spec.rb b/spec/arel/table_spec.rb
index cf309ca8ca..c2bcd3911a 100644
--- a/spec/arel/table_spec.rb
+++ b/spec/arel/table_spec.rb
@@ -21,10 +21,10 @@ module Arel
describe 'project' do
it 'can project' do
manager = @relation.project '*'
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT *
FROM "users"
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
end
@@ -33,11 +33,11 @@ module Arel
manager = @relation.where @relation[:id].eq 1
manager.project @relation[:id]
manager.should be_kind_of TreeManager
- manager.to_sql.should == %{
+ manager.to_sql.should be_like %{
SELECT "users"."id"
FROM "users"
WHERE "users"."id" = 1
- }.gsub("\n", '').gsub(/(^\s*|\s*$)/, '').squeeze(' ')
+ }
end
end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 5d3f5a2950..797fe0a028 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -3,11 +3,15 @@ require 'spec'
require 'fileutils'
require 'arel'
+require 'support/matchers/be_like'
+
if adapter = ENV['ADAPTER']
require "support/connections/#{adapter}_connection.rb"
end
Spec::Runner.configure do |config|
+ config.include Matchers
+
if defined?(ActiveRecord::Base)
tmp = File.expand_path('../../tmp', __FILE__)