Guest User

Untitled

a guest
Feb 19th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.11 KB | None | 0 0
  1. require File.join(File.dirname(__FILE__), '..', '..', '..', 'spec_helper')
  2.  
  3. module Arel
  4. describe Join do
  5. before do
  6. @relation1 = Arel(:users)
  7. @relation2 = Arel(:photos)
  8. @predicate = @relation1[:id].eq(@relation2[:user_id])
  9. end
  10.  
  11. describe 'when joining aggregated relations' do
  12. before do
  13. @aggregation = @relation2 \
  14. .group(@relation2[:user_id]) \
  15. .project(@relation2[:user_id], @relation2[:id].count.as(:cnt)) \
  16. end
  17.  
  18. describe '#to_sql' do
  19. # CLEANUP
  20. it '' do
  21. @relation1.join(@relation2.take(3)).on(@predicate).to_sql.should be_like("
  22. SELECT `users`.`id`, `users`.`name`, `photos_external`.`id`, `photos_external`.`user_id`, `photos_external`.`camera_id`
  23. FROM `users`
  24. INNER JOIN (SELECT `photos`.`id`, `photos`.`user_id`, `photos`.`camera_id` FROM `photos` LIMIT 3) AS `photos_external`
  25. ON `users`.`id` = `photos_external`.`user_id`
  26. ")
  27. end
  28.  
  29. describe 'with the aggregation on the right' do
  30. it 'manufactures sql joining the left table to a derived table' do
  31. @relation1.join(@aggregation).on(@predicate).to_sql.should be_like("
  32. SELECT `users`.`id`, `users`.`name`, `photos_external`.`user_id`, `photos_external`.`cnt`
  33. FROM `users`
  34. INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) AS `photos_external`
  35. ON `users`.`id` = `photos_external`.`user_id`
  36. ")
  37. end
  38. end
  39.  
  40. describe 'with the aggregation on the left' do
  41. it 'manufactures sql joining the right table to a derived table' do
  42. @aggregation.join(@relation1).on(@predicate).to_sql.should be_like("
  43. SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `users`.`id`, `users`.`name`
  44. FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) AS `photos_external`
  45. INNER JOIN `users`
  46. ON `users`.`id` = `photos_external`.`user_id`
  47. ")
  48. end
  49. end
  50.  
  51. describe 'with the aggregation on both sides' do
  52. it 'it properly aliases the aggregations' do
  53. aggregation2 = @aggregation.alias
  54. @aggregation.join(aggregation2).on(aggregation2[:user_id].eq(@aggregation[:user_id])).to_sql.should be_like("
  55. SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `photos_external_2`.`user_id`, `photos_external_2`.`cnt`
  56. FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) AS `photos_external`
  57. INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` GROUP BY `photos`.`user_id`) AS `photos_external_2`
  58. ON `photos_external_2`.`user_id` = `photos_external`.`user_id`
  59. ")
  60. end
  61. end
  62.  
  63. describe 'when the aggration has a where' do
  64. describe 'with the aggregation on the left' do
  65. it "manufactures sql keeping wheres on the aggregation within the derived table" do
  66. @relation1.join(@aggregation.where(@aggregation[:user_id].eq(1))).on(@predicate).to_sql.should be_like("
  67. SELECT `users`.`id`, `users`.`name`, `photos_external`.`user_id`, `photos_external`.`cnt`
  68. FROM `users`
  69. INNER JOIN (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` WHERE `photos`.`user_id` = 1 GROUP BY `photos`.`user_id`) AS `photos_external`
  70. ON `users`.`id` = `photos_external`.`user_id`
  71. ")
  72. end
  73. end
  74.  
  75. describe 'with the aggregation on the right' do
  76. it "manufactures sql keeping wheres on the aggregation within the derived table" do
  77. @aggregation.where(@aggregation[:user_id].eq(1)).join(@relation1).on(@predicate).to_sql.should be_like("
  78. SELECT `photos_external`.`user_id`, `photos_external`.`cnt`, `users`.`id`, `users`.`name`
  79. FROM (SELECT `photos`.`user_id`, COUNT(`photos`.`id`) AS `cnt` FROM `photos` WHERE `photos`.`user_id` = 1 GROUP BY `photos`.`user_id`) AS `photos_external`
  80. INNER JOIN `users`
  81. ON `users`.`id` = `photos_external`.`user_id`
  82. ")
  83. end
  84. end
  85. end
  86. end
  87. end
  88. end
  89. end
Add Comment
Please, Sign In to add comment