Skip to content

Commit c473cfa

Browse files
committed
Make #table_from_select_statement go thru a matrix of most to least important routes.
1 parent 70f06d2 commit c473cfa

File tree

2 files changed

+22
-29
lines changed

2 files changed

+22
-29
lines changed

lib/arel/visitors/sqlserver.rb

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,15 @@ def visit_Arel_Nodes_SelectStatementForComplexCount(o)
189189

190190
# SQLServer Helpers
191191

192-
def table_name_from_select_statement(o)
193-
o.cores.first.source.left.name
192+
def table_from_select_statement(o)
193+
core = o.cores.first
194+
if Arel::Table === core.from
195+
core.from
196+
elsif Arel::Nodes::SqlLiteral === core.from
197+
Arel::Table.new(core.from, @engine)
198+
elsif Arel::Nodes::JoinSource === core.source
199+
Arel::Nodes::SqlLiteral === core.source.left ? Arel::Table.new(core.source.left, @engine) : core.source.left
200+
end
194201
end
195202

196203
def single_distinct_select_statement?(o)
@@ -247,7 +254,7 @@ def find_and_fix_uncorrelated_joins_in_select_statement(o)
247254
def rowtable_projections(o)
248255
core = o.cores.first
249256
if single_distinct_select_statement?(o)
250-
tn = table_name_from_select_statement(o)
257+
tn = table_from_select_statement(o).name
251258
core.projections.map do |x|
252259
x.dup.tap do |p|
253260
p.sub! 'DISTINCT', "DISTINCT #{visit(o.limit)}".strip if o.limit
@@ -262,7 +269,7 @@ def rowtable_projections(o)
262269
elsif function_select_statement?(o)
263270
[Arel.star]
264271
else
265-
tn = table_name_from_select_statement(o)
272+
tn = table_from_select_statement(o).name
266273
core.projections.map { |x| x.gsub /\[#{tn}\]\./, '[__rnt].' }
267274
end
268275
end
@@ -274,7 +281,7 @@ def rowtable_orders(o)
274281
elsif join_in_select_statement?(o)
275282
[core.from.primary_key.asc]
276283
else
277-
[core.from.primary_key.asc]
284+
[table_from_select_statement(o).primary_key.asc]
278285
end.reverse.uniq.reverse
279286
end
280287

test/cases/scratch_test_sqlserver.rb

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,20 @@
11
require 'cases/sqlserver_helper'
2-
require 'models/post'
3-
require 'models/tagging'
4-
require 'models/tag'
5-
require 'models/comment'
6-
require 'models/author'
7-
require 'models/category'
82
require 'models/company'
9-
require 'models/person'
10-
require 'models/reader'
11-
require 'models/owner'
12-
require 'models/pet'
13-
require 'models/reference'
14-
require 'models/job'
15-
require 'models/subscriber'
16-
require 'models/subscription'
17-
require 'models/book'
18-
require 'models/developer'
19-
require 'models/project'
3+
require 'models/topic'
4+
require 'models/edge'
5+
require 'models/club'
6+
require 'models/organization'
207

218
class ScratchTestSqlserver < ActiveRecord::TestCase
229

23-
fixtures :posts, :comments, :authors, :author_addresses, :categories, :categories_posts,
24-
:companies, :accounts, :tags, :taggings, :people, :readers,
25-
:owners, :pets, :author_favorites, :jobs, :references, :subscribers, :subscriptions, :books,
26-
:developers, :projects, :developers_projects
10+
fixtures :companies, :accounts, :topics
2711

2812
should 'pass' do
29-
comments = Comment.find(:all, :include => :post, :limit => 3, :offset => 2, :order => 'comments.id')
30-
assert_equal 3, comments.length
31-
assert_equal [3,5,6], comments.collect { |c| c.id }
13+
assert_equal Company.count(:all), Company.count(:all, :from => 'companies')
14+
assert_equal Account.count(:all, :conditions => "credit_limit = 50"),
15+
Account.count(:all, :from => 'accounts', :conditions => "credit_limit = 50")
16+
assert_equal Company.count(:type, :conditions => {:type => "Firm"}),
17+
Company.count(:type, :conditions => {:type => "Firm"}, :from => 'companies')
3218
end
3319

3420

0 commit comments

Comments
 (0)