From 16620f0d353f9bb40a449050ffe1f054e4ae2c40 Mon Sep 17 00:00:00 2001 From: sue445 Date: Wed, 20 Oct 2021 16:29:38 +0900 Subject: [PATCH] Fixed. NPlusOneQuery duplicate offense --- .../isucon/mysql2/n_plus_one_query_spec.rb | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/spec/rubocop/cop/isucon/mysql2/n_plus_one_query_spec.rb b/spec/rubocop/cop/isucon/mysql2/n_plus_one_query_spec.rb index 183c6e27..14ca05b7 100644 --- a/spec/rubocop/cop/isucon/mysql2/n_plus_one_query_spec.rb +++ b/spec/rubocop/cop/isucon/mysql2/n_plus_one_query_spec.rb @@ -25,6 +25,35 @@ end end + context "with single line SQL (2)" do + it "registers an offense" do + # c.f. https://github.com/isucon/isucon11-final/blob/667be3ec70c025eadde541e21d5ab1167efa1dd3/webapp/ruby/app.rb#L171-L190 + expect_offense(<<~RUBY) + courses = db.xquery( + "SELECT `courses`.*" \\ + " FROM `courses`" \\ + " JOIN `registrations` ON `courses`.`id` = `registrations`.`course_id`" \\ + " WHERE `courses`.`status` != ? AND `registrations`.`user_id` = ?", + STATUS_CLOSED, user_id, + ) + + courses.map do |course| + teacher = db.xquery('SELECT * FROM `users` WHERE `id` = ?', course[:teacher_id]).first + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This looks like N+1 query. + raise unless teacher + + { + id: course[:id], + name: course[:name], + teacher: teacher[:name], + period: course[:period], + day_of_week: course[:day_of_week], + } + end + RUBY + end + end + context "with multiple line SQL" do it "registers an offense" do expect_offense(<<~RUBY)