<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gyu9</id>
	<title>Expertiza_Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.expertiza.ncsu.edu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gyu9"/>
	<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=Special:Contributions/Gyu9"/>
	<updated>2026-07-04T17:09:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106027</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106027"/>
		<updated>2016-12-02T03:53:16Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Test Plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction''' ==&lt;br /&gt;
&lt;br /&gt;
=== Expertiza ===&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza] is an open-source project on GitHub used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations.&lt;br /&gt;
&lt;br /&gt;
=== Travis CI ===&lt;br /&gt;
[https://travis-ci.org Travis CI] is a hosted, distributed continuous integration service used to build and test software projects hosted at GitHub. &lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
Travis CI is configured by adding a file named .travis.yml, which is a YAML format text file, to the root directory of the repository. This file specifies the programming language used, the desired building and testing environment (including dependencies which must be installed before the software can be built and tested), and various other parameters.&lt;br /&gt;
&lt;br /&gt;
'''Operation:'''&lt;br /&gt;
When Travis CI has been activated for a given repository, GitHub will notify it whenever new commits are pushed to that repository or a pull request is submitted. It can also be configured to only run for specific branches, or branches whose names match a specific pattern. Travis CI will then check out the relevant branch and run the commands specified in .travis.yml, which usually build the software and run any automated tests. When that process has completed, Travis notifies the developer(s) in the way it has been configured to do so—for example, by sending an email containing the test results (showing success or failure), or by posting a message on an IRC channel. In the case of pull requests, the pull request will be annotated with the outcome and a link to the build log, using a GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=== Capybara ===&lt;br /&gt;
[https://github.com/jnicklas/capybara Capybara] supports selenium-webdriver, which is mostly used in web-based automation frameworks. It supports JavaScript, can access HTTP resources outside the application, and can also be setup for testing in headless mode which is especially useful for CI scenarios.&lt;br /&gt;
&lt;br /&gt;
'''Using Capybara with [http://rspec.info/ RSpec]:'''&lt;br /&gt;
Load RSpec 2.x support by adding the following line(typically to the spec_helper.rb file):&lt;br /&gt;
 ''require 'capybara/rspec' &lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the assignment is created by the instructor the only call to action for the student is assignment submission. The purpose of this project is to test whether the submission function could work properly under different scenarios. We will design multiple test cases to simulate different scenarios which the system could encounter. For example, how system respond when a user uploads an invalid URL. The following part will provide more and detailed information on test cases.&lt;br /&gt;
&lt;br /&gt;
== '''Test Plan''' ==&lt;br /&gt;
&lt;br /&gt;
When a user is attempting to submit an assignment, there are some possible cases need to be considered.&lt;br /&gt;
&lt;br /&gt;
1. Upload single valid link: upload a valid link, the system should properly render the page and add this link into the database. We will use the following statements to simulate the submit action.&lt;br /&gt;
&lt;br /&gt;
'' &lt;br /&gt;
     fill_in 'submission', with: &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
     click_on 'Upload link'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
2. Upload invalid link: upload an invalid link (e.g. a non-existing link), the system should detect the invalid link, reject the submission and cast corresponding error message.&lt;br /&gt;
&lt;br /&gt;
3. Upload multiple links: upload multiple links, the system should properly render the page and add the new link into the database. We will use the following statement to check if the current page has the uploaded URL.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     expect(page).to have_content &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
4. Upload duplicated links: upload an link which has already been uploaded before, the system should detect this duplicated link, reject the submission and cast error message.&lt;br /&gt;
&lt;br /&gt;
5. Upload empty link: upload an empty link, the system should reject the submission and cast corresponding error message.&lt;br /&gt;
&lt;br /&gt;
6. Upload a valid file: upload a valid file, the system should properly render the page and add this file into the directory. We will use the following statements to simulation the submit action.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     attach_file('uploaded_file', file_path)&lt;br /&gt;
     click_on 'Upload file'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
7. Upload multiple files: upload multiple files, the system should properly render the page and add the new file into the directory.&lt;br /&gt;
&lt;br /&gt;
8. Upload duplicated files: upload a file which has already been uploaded before, the system should update the existed file with new one. The test code will check whether the content of this specific file was successfully updated.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
1. First, using [https://github.com/expertiza/expertiza/blob/master/spec/factories/factories.rb factories] to create test data: create assignment, create topic, create participant. &lt;br /&gt;
 ''before(:each) do&lt;br /&gt;
       create(:assignment, name: &amp;quot;Assignment1684&amp;quot;, directory_path: &amp;quot;Assignment1684&amp;quot;)&lt;br /&gt;
       create_list(:participant, 3)&lt;br /&gt;
       create(:topic, topic_name: &amp;quot;Topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
       create(:deadline_right)&lt;br /&gt;
       create(:deadline_right, name: 'Late')&lt;br /&gt;
       create(:deadline_right, name: 'OK')&lt;br /&gt;
       create(:assignment_due_date, deadline_type: DeadlineType.where(name: &amp;quot;submission&amp;quot;).first, due_at: DateTime.now + 1)&lt;br /&gt;
   end''&lt;br /&gt;
2. Mock the workflow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
[[File:Work flow.png]]&lt;br /&gt;
&lt;br /&gt;
3. Check the result of the submission from both web page and database. &lt;br /&gt;
&lt;br /&gt;
In database level, the submission results are stored in the table: TEAMS.&lt;br /&gt;
&lt;br /&gt;
[[File:Teams.jpg]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106026</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106026"/>
		<updated>2016-12-02T03:52:24Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Test Plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction''' ==&lt;br /&gt;
&lt;br /&gt;
=== Expertiza ===&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza] is an open-source project on GitHub used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations.&lt;br /&gt;
&lt;br /&gt;
=== Travis CI ===&lt;br /&gt;
[https://travis-ci.org Travis CI] is a hosted, distributed continuous integration service used to build and test software projects hosted at GitHub. &lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
Travis CI is configured by adding a file named .travis.yml, which is a YAML format text file, to the root directory of the repository. This file specifies the programming language used, the desired building and testing environment (including dependencies which must be installed before the software can be built and tested), and various other parameters.&lt;br /&gt;
&lt;br /&gt;
'''Operation:'''&lt;br /&gt;
When Travis CI has been activated for a given repository, GitHub will notify it whenever new commits are pushed to that repository or a pull request is submitted. It can also be configured to only run for specific branches, or branches whose names match a specific pattern. Travis CI will then check out the relevant branch and run the commands specified in .travis.yml, which usually build the software and run any automated tests. When that process has completed, Travis notifies the developer(s) in the way it has been configured to do so—for example, by sending an email containing the test results (showing success or failure), or by posting a message on an IRC channel. In the case of pull requests, the pull request will be annotated with the outcome and a link to the build log, using a GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=== Capybara ===&lt;br /&gt;
[https://github.com/jnicklas/capybara Capybara] supports selenium-webdriver, which is mostly used in web-based automation frameworks. It supports JavaScript, can access HTTP resources outside the application, and can also be setup for testing in headless mode which is especially useful for CI scenarios.&lt;br /&gt;
&lt;br /&gt;
'''Using Capybara with [http://rspec.info/ RSpec]:'''&lt;br /&gt;
Load RSpec 2.x support by adding the following line(typically to the spec_helper.rb file):&lt;br /&gt;
 ''require 'capybara/rspec' &lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the assignment is created by the instructor the only call to action for the student is assignment submission. The purpose of this project is to test whether the submission function could work properly under different scenarios. We will design multiple test cases to simulate different scenarios which the system could encounter. For example, how system respond when a user uploads an invalid URL. The following part will provide more and detailed information on test cases.&lt;br /&gt;
&lt;br /&gt;
== '''Test Plan''' ==&lt;br /&gt;
&lt;br /&gt;
When a user is attempting to submit an assignment, there are some possible cases need to be considered.&lt;br /&gt;
&lt;br /&gt;
1. Upload single valid link: upload a valid link, the system should properly render the page and add this link into the database. We will use the following statements to simulate the submit action.&lt;br /&gt;
&lt;br /&gt;
'' &lt;br /&gt;
     fill_in 'submission', with: &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
     click_on 'Upload link'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
2. Upload invalid link: upload an invalid link (e.g. a non-existing link), the system should detect the invalid link, reject the submission and cast corresponding error message.&lt;br /&gt;
3. Upload multiple links: upload multiple links, the system should properly render the page and add the new link into the database. We will use the following statement to check if the current page has the uploaded URL.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     expect(page).to have_content &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
4. Upload duplicated links: upload an link which has already been uploaded before, the system should detect this duplicated link, reject the submission and cast error message.&lt;br /&gt;
5. Upload empty link: upload an empty link, the system should reject the submission and cast corresponding error message.&lt;br /&gt;
6. Upload a valid file: upload a valid file, the system should properly render the page and add this file into the directory. We will use the following statements to simulation the submit action.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     attach_file('uploaded_file', file_path)&lt;br /&gt;
     click_on 'Upload file'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
7. Upload multiple files: upload multiple files, the system should properly render the page and add the new file into the directory.&lt;br /&gt;
8. Upload duplicated files: upload a file which has already been uploaded before, the system should update the existed file with new one. The test code will check whether the content of this specific file was successfully updated.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
1. First, using [https://github.com/expertiza/expertiza/blob/master/spec/factories/factories.rb factories] to create test data: create assignment, create topic, create participant. &lt;br /&gt;
 ''before(:each) do&lt;br /&gt;
       create(:assignment, name: &amp;quot;Assignment1684&amp;quot;, directory_path: &amp;quot;Assignment1684&amp;quot;)&lt;br /&gt;
       create_list(:participant, 3)&lt;br /&gt;
       create(:topic, topic_name: &amp;quot;Topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
       create(:deadline_right)&lt;br /&gt;
       create(:deadline_right, name: 'Late')&lt;br /&gt;
       create(:deadline_right, name: 'OK')&lt;br /&gt;
       create(:assignment_due_date, deadline_type: DeadlineType.where(name: &amp;quot;submission&amp;quot;).first, due_at: DateTime.now + 1)&lt;br /&gt;
   end''&lt;br /&gt;
2. Mock the workflow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
[[File:Work flow.png]]&lt;br /&gt;
&lt;br /&gt;
3. Check the result of the submission from both web page and database. &lt;br /&gt;
&lt;br /&gt;
In database level, the submission results are stored in the table: TEAMS.&lt;br /&gt;
&lt;br /&gt;
[[File:Teams.jpg]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106025</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=106025"/>
		<updated>2016-12-02T03:51:46Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Test Plan */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction''' ==&lt;br /&gt;
&lt;br /&gt;
=== Expertiza ===&lt;br /&gt;
[https://github.com/expertiza/expertiza Expertiza] is an open-source project on GitHub used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations.&lt;br /&gt;
&lt;br /&gt;
=== Travis CI ===&lt;br /&gt;
[https://travis-ci.org Travis CI] is a hosted, distributed continuous integration service used to build and test software projects hosted at GitHub. &lt;br /&gt;
&lt;br /&gt;
'''Configuration:'''&lt;br /&gt;
Travis CI is configured by adding a file named .travis.yml, which is a YAML format text file, to the root directory of the repository. This file specifies the programming language used, the desired building and testing environment (including dependencies which must be installed before the software can be built and tested), and various other parameters.&lt;br /&gt;
&lt;br /&gt;
'''Operation:'''&lt;br /&gt;
When Travis CI has been activated for a given repository, GitHub will notify it whenever new commits are pushed to that repository or a pull request is submitted. It can also be configured to only run for specific branches, or branches whose names match a specific pattern. Travis CI will then check out the relevant branch and run the commands specified in .travis.yml, which usually build the software and run any automated tests. When that process has completed, Travis notifies the developer(s) in the way it has been configured to do so—for example, by sending an email containing the test results (showing success or failure), or by posting a message on an IRC channel. In the case of pull requests, the pull request will be annotated with the outcome and a link to the build log, using a GitHub integration.&lt;br /&gt;
&lt;br /&gt;
=== Capybara ===&lt;br /&gt;
[https://github.com/jnicklas/capybara Capybara] supports selenium-webdriver, which is mostly used in web-based automation frameworks. It supports JavaScript, can access HTTP resources outside the application, and can also be setup for testing in headless mode which is especially useful for CI scenarios.&lt;br /&gt;
&lt;br /&gt;
'''Using Capybara with [http://rspec.info/ RSpec]:'''&lt;br /&gt;
Load RSpec 2.x support by adding the following line(typically to the spec_helper.rb file):&lt;br /&gt;
 ''require 'capybara/rspec' &lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the assignment is created by the instructor the only call to action for the student is assignment submission. The purpose of this project is to test whether the submission function could work properly under different scenarios. We will design multiple test cases to simulate different scenarios which the system could encounter. For example, how system respond when a user uploads an invalid URL. The following part will provide more and detailed information on test cases.&lt;br /&gt;
&lt;br /&gt;
== '''Test Plan''' ==&lt;br /&gt;
&lt;br /&gt;
When a user is attempting to submit an assignment, there are some possible cases need to be considered.&lt;br /&gt;
&lt;br /&gt;
1. Upload single valid link: upload a valid link, the system should properly render the page and add this link into the database. We will use the following statements to simulate the submit action.&lt;br /&gt;
&lt;br /&gt;
'' &lt;br /&gt;
     fill_in 'submission', with: &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
     click_on 'Upload link'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
# Upload invalid link: upload an invalid link (e.g. a non-existing link), the system should detect the invalid link, reject the submission and cast corresponding error message.&lt;br /&gt;
# Upload multiple links: upload multiple links, the system should properly render the page and add the new link into the database. We will use the following statement to check if the current page has the uploaded URL.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     expect(page).to have_content &amp;quot;https://www.google.com&amp;quot;&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
# Upload duplicated links: upload an link which has already been uploaded before, the system should detect this duplicated link, reject the submission and cast error message.&lt;br /&gt;
# Upload empty link: upload an empty link, the system should reject the submission and cast corresponding error message.&lt;br /&gt;
# Upload a valid file: upload a valid file, the system should properly render the page and add this file into the directory. We will use the following statements to simulation the submit action.&lt;br /&gt;
&lt;br /&gt;
''&lt;br /&gt;
     attach_file('uploaded_file', file_path)&lt;br /&gt;
     click_on 'Upload file'&lt;br /&gt;
''&lt;br /&gt;
&lt;br /&gt;
# Upload multiple files: upload multiple files, the system should properly render the page and add the new file into the directory.&lt;br /&gt;
# Upload duplicated files: upload a file which has already been uploaded before, the system should update the existed file with new one. The test code will check whether the content of this specific file was successfully updated.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
1. First, using [https://github.com/expertiza/expertiza/blob/master/spec/factories/factories.rb factories] to create test data: create assignment, create topic, create participant. &lt;br /&gt;
 ''before(:each) do&lt;br /&gt;
       create(:assignment, name: &amp;quot;Assignment1684&amp;quot;, directory_path: &amp;quot;Assignment1684&amp;quot;)&lt;br /&gt;
       create_list(:participant, 3)&lt;br /&gt;
       create(:topic, topic_name: &amp;quot;Topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;submission&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;review&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;metareview&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;drop_topic&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;signup&amp;quot;)&lt;br /&gt;
       create(:deadline_type, name: &amp;quot;team_formation&amp;quot;)&lt;br /&gt;
       create(:deadline_right)&lt;br /&gt;
       create(:deadline_right, name: 'Late')&lt;br /&gt;
       create(:deadline_right, name: 'OK')&lt;br /&gt;
       create(:assignment_due_date, deadline_type: DeadlineType.where(name: &amp;quot;submission&amp;quot;).first, due_at: DateTime.now + 1)&lt;br /&gt;
   end''&lt;br /&gt;
2. Mock the workflow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
[[File:Work flow.png]]&lt;br /&gt;
&lt;br /&gt;
3. Check the result of the submission from both web page and database. &lt;br /&gt;
&lt;br /&gt;
In database level, the submission results are stored in the table: TEAMS.&lt;br /&gt;
&lt;br /&gt;
[[File:Teams.jpg]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105092</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105092"/>
		<updated>2016-11-09T23:47:21Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Approach */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the Assignment is created by the instructor the only Call to action for the student is assignment submission.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
&lt;br /&gt;
Mock the flow of Assignment submission using Capybara and check the result of the submission.&lt;br /&gt;
&lt;br /&gt;
===Workflow===&lt;br /&gt;
&lt;br /&gt;
Student login -&amp;gt; click on the assignment -&amp;gt; add details in text field -&amp;gt; upload zip file -&amp;gt; click submit button.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios ===&lt;br /&gt;
&lt;br /&gt;
# Submit hyperlink → click hyperlink → have content.&lt;br /&gt;
# Submit file → download file → have content.&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105091</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105091"/>
		<updated>2016-11-09T23:41:12Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Approach */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the Assignment is created by the instructor the only Call to action for the student is assignment submission.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
&lt;br /&gt;
Mock the flow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
===Workflow===&lt;br /&gt;
&lt;br /&gt;
Student login -&amp;gt; click on the assignment -&amp;gt; add details in text field -&amp;gt; upload zip file -&amp;gt; click submit button.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios ===&lt;br /&gt;
&lt;br /&gt;
# Submit hyperlink → click hyperlink → have content.&lt;br /&gt;
# Submit file → download file → have content.&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105089</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105089"/>
		<updated>2016-11-09T23:38:37Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Workflow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the Assignment is created by the instructor the only Call to action for the student is assignment submission.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
&lt;br /&gt;
Mock the flow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
===Workflow===&lt;br /&gt;
&lt;br /&gt;
Student login -&amp;gt; click on the assignment -&amp;gt; add details in text field -&amp;gt; upload zip file -&amp;gt; click submit button.&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105088</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105088"/>
		<updated>2016-11-09T23:36:29Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Project Requirement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the Assignment is created by the instructor the only Call to action for the student is assignment submission.&lt;br /&gt;
&lt;br /&gt;
== '''Approach''' ==&lt;br /&gt;
&lt;br /&gt;
Mock the flow of Assignment submission using Capybara.&lt;br /&gt;
&lt;br /&gt;
===Workflow===&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105081</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105081"/>
		<updated>2016-11-09T23:29:12Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Project Requirement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;br /&gt;
&lt;br /&gt;
There should be a feature test for submission of the assignment by the student. Once the Assignment is created by the instructor the only Call to action for the student is assignment submission.&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105074</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105074"/>
		<updated>2016-11-09T23:22:24Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Requirement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Project Requirement''' ==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105073</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105073"/>
		<updated>2016-11-09T23:22:00Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Introduction to Expertiza */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;br /&gt;
&lt;br /&gt;
== '''Requirement''' ==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105002</id>
		<title>CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016_E1684:_Feature_Test_for_Assignment_Submission&amp;diff=105002"/>
		<updated>2016-11-09T21:12:17Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: Created page with &amp;quot;== '''Introduction to Expertiza''' == Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== '''Introduction to Expertiza''' ==&lt;br /&gt;
Expertiza is an online system that is used by students to view/submit assignments and review others' work. Expertiza also provides tools to visualize the scores and gauge the improvements made during the course semester. It also facilitates and monitors team projects. It is targeted at educational and non-profit organizations. &lt;br /&gt;
&lt;br /&gt;
Expertiza is an open-source project with the source code available as a public repository on GitHub. It is developed using Ruby on Rails and is increasingly becoming robust thanks to the innumerable bugs being fixed by the community. The project has a micro-blog on SourceForge where the developer community report bugs and document updates.&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=105000</id>
		<title>CSC/ECE 517 Fall 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=105000"/>
		<updated>2016-11-09T21:07:48Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Final Project Design Document */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.example.com link title]==Calibration Assignment Submissions==&lt;br /&gt;
*[[Calibration Assignment Submission (Firebrick JS)]]&lt;br /&gt;
*[[Calibration Assignment Submission (Active Job)]]&lt;br /&gt;
==Writing Assignments 2==&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1643. Refactor Suggestion controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1631. Refactoring Bidding Interface]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1674.Refactor leaderboard.rb and write unit tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1671. Unit Tests for participants.rb Hierarchy]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1668.Test e-mailing functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1658. Refractor lottery_controller.rb and write integration tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1660. Review requirements and thresholds]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1650. Sort instructor views alphabetically by default]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1644. Refactor and test Teams Controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1645. Refactoring Tree Display Controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1659. Refactor on_the_fly_calc.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1657. Introduce a Student View for instructors]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1653. Fix and improve rubric criteria]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1642. Refactor review_response_map.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1633. Refactor different question types from quiz feature]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1664:_Feature_Test_Assignment_Creation]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1654. Improve_date-picker_and_deadlines]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1652 Fix teammate advertisements and requests to join a team ]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1662. UI issues/fixes]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1673. Refactor question_type.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1675. Timestamp for student file &amp;amp; hyperlink submissions]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1640. Refactor response.rb and response_helper.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1634. Refactor and write unit test of due_date.rb and deadline_helper.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/M1654._Improve_network_security_features]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1670._Unit_tests_for_answers.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1641. Refactor review_mapping_controller.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/M1652_Implement_ImageMap_Support_Servo]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1648/Add_past_due_assignment]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1656. Improve imports]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/M1653_Implement_HTML_form_validation]]&lt;br /&gt;
==Final Project Design Document==&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1696  Improve Self-Review]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1676  Role-based reviewing]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1680. Improve survey functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1693. Drag-and-drop interface for creating rubrics]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1701. Accelerate RSpec testing]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1705. Tracking the time students look at the others' submissions]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1688. Send feedback to support + tree display improvement]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1707: Top trading cycles to exclude previous teammates]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1678: Review configuration options]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1682: Improve score calculation]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016 E1684: Feature Test for Assignment Submission]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104672</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104672"/>
		<updated>2016-11-05T07:20:45Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Refactor delete_all_reviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor add_reviewer ==&lt;br /&gt;
 def add_reviewer&lt;br /&gt;
    msg = ''&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      topic_id = params[:topic_id]&lt;br /&gt;
      user_id = User.where(name: params[:user][:name]).first.id&lt;br /&gt;
      # If instructor want to assign one student to review his/her own artifact,&lt;br /&gt;
      # it should be counted as “self-review” and we need to make /app/views/submitted_content/_selfreview.html.erb work.&lt;br /&gt;
      if TeamsUser.exists?(team_id: params[:contributor_id], user_id: user_id)&lt;br /&gt;
        flash[:error] = &amp;quot;You cannot assign this student to review his/her own artifact.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        # Team lazy initialization&lt;br /&gt;
        assignment = Assignment.find(params[:id])&lt;br /&gt;
        assignment_id = assignment.id&lt;br /&gt;
        SignUpSheet.signup_team(assignment.id, user_id, topic_id)&lt;br /&gt;
        create_reviewer(assignment)&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = ResponseMap.find(params[:id])&lt;br /&gt;
      assignment_id = mapping.assignment.id&lt;br /&gt;
      create_reviewer(mapping)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id, msg: msg&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create_reviewer(object)&lt;br /&gt;
  begin&lt;br /&gt;
    user = User.from_params(params)&lt;br /&gt;
    # contributor_id is team_id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      assignment = object # assignment&lt;br /&gt;
      reviewee_id = params[:contributor_id]&lt;br /&gt;
      reviewed_object_id = assignment.id&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
      id_symbol = :reviewee_id&lt;br /&gt;
      id = reviewee_id&lt;br /&gt;
      assignment = assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: assignment.id,&lt;br /&gt;
                       user_id: user.id,&lt;br /&gt;
                       contributor_id: params[:contributor_id]&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = object # mapping&lt;br /&gt;
      reviewee_id = mapping.reviewer.id&lt;br /&gt;
      reviewed_object_id = mapping.map_id&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = reviewed_object_id&lt;br /&gt;
      assignment = mapping.assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: mapping.map_id,&lt;br /&gt;
                       user_id: user.id&lt;br /&gt;
    end&lt;br /&gt;
    # Get the assignment's participant corresponding to the user&lt;br /&gt;
    reviewer = get_reviewer(user, assignment, regurl)&lt;br /&gt;
    # ACS Removed the if condition(and corressponding else) which differentiate&lt;br /&gt;
    # assignments as team and individual assignments&lt;br /&gt;
    # to treat all assignments as team assignments&lt;br /&gt;
    if  response_map.where(id_symbol =&amp;gt; id,reviewer_id: reviewer.id).first.nil?&lt;br /&gt;
      response_map.create(reviewee_id: reviewee_id,&lt;br /&gt;
                          reviewer_id: reviewer.id,&lt;br /&gt;
                          reviewed_object_id: reviewed_object_id)&lt;br /&gt;
    else&lt;br /&gt;
      case params[:object]&lt;br /&gt;
      when 'reviewer'&lt;br /&gt;
        raise &amp;quot;The reviewer, \&amp;quot;&amp;quot; + reviewer.name + &amp;quot;\&amp;quot;, is already assigned to this contributor.&amp;quot;&lt;br /&gt;
      when 'metareviewer'&lt;br /&gt;
        raise &amp;quot;The metareviewer \&amp;quot;&amp;quot; + reviewer.user.name + &amp;quot;\&amp;quot; is already assigned to this reviewer.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  rescue&lt;br /&gt;
    msg = $ERROR_INFO&lt;br /&gt;
  end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_reviewer&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
    end&lt;br /&gt;
    # duplicate code&lt;br /&gt;
    mapping = response_map.find(params[:id])&lt;br /&gt;
    assignment_id = mapping.assignment.id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      if !Response.exists?(map_id: mapping.id)&lt;br /&gt;
        mapping.destroy&lt;br /&gt;
        flash[:success] = &amp;quot;The review mapping for \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        flash[:error] = &amp;quot;This review has already been done. It cannot been deleted.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      flash[:note] = &amp;quot;The metareview mapping for &amp;quot; + mapping.reviewee.name + &amp;quot; and &amp;quot; + mapping.reviewer.name + &amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      begin&lt;br /&gt;
        mapping.delete&lt;br /&gt;
      rescue&lt;br /&gt;
        flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
        + $ERROR_INFO + &amp;quot;&amp;lt;a href='/review_mapping/delete_metareview/&amp;quot;&lt;br /&gt;
        + mapping.map_id.to_s + &amp;quot;'&amp;gt;Delete this mapping anyway&amp;gt;?&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_all_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_all_reviewers&lt;br /&gt;
    mapping = ResponseMap.find(params[:id])&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'all_metareviewers'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = mapping.map_id&lt;br /&gt;
    end&lt;br /&gt;
    mmappings = response_map.where(id_symbol =&amp;gt; id)&lt;br /&gt;
    failedCount = ResponseMap.delete_mappings(mmappings, params[:force])&lt;br /&gt;
    if failedCount &amp;gt; 0&lt;br /&gt;
      url_yes = url_for action: 'delete_all_reviewers', id: mapping.map_id, force: 1&lt;br /&gt;
      url_no = url_for action: 'delete_all_reviewers', id: mapping.map_id&lt;br /&gt;
      flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;#{failedCount} metareviews exist for these mappings. Delete these mappings anyway?&amp;amp;nbsp;&amp;lt;a href='#{url_yes}'&amp;gt;Yes&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href='#{url_no}'&amp;gt;No&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      flash[:note] = &amp;quot;All metareview mappings for contributor \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and reviewer \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; have been deleted.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: mapping.assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104671</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104671"/>
		<updated>2016-11-05T07:20:23Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Refactor add_reviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor add_reviewer ==&lt;br /&gt;
 def add_reviewer&lt;br /&gt;
    msg = ''&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      topic_id = params[:topic_id]&lt;br /&gt;
      user_id = User.where(name: params[:user][:name]).first.id&lt;br /&gt;
      # If instructor want to assign one student to review his/her own artifact,&lt;br /&gt;
      # it should be counted as “self-review” and we need to make /app/views/submitted_content/_selfreview.html.erb work.&lt;br /&gt;
      if TeamsUser.exists?(team_id: params[:contributor_id], user_id: user_id)&lt;br /&gt;
        flash[:error] = &amp;quot;You cannot assign this student to review his/her own artifact.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        # Team lazy initialization&lt;br /&gt;
        assignment = Assignment.find(params[:id])&lt;br /&gt;
        assignment_id = assignment.id&lt;br /&gt;
        SignUpSheet.signup_team(assignment.id, user_id, topic_id)&lt;br /&gt;
        create_reviewer(assignment)&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = ResponseMap.find(params[:id])&lt;br /&gt;
      assignment_id = mapping.assignment.id&lt;br /&gt;
      create_reviewer(mapping)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id, msg: msg&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create_reviewer(object)&lt;br /&gt;
  begin&lt;br /&gt;
    user = User.from_params(params)&lt;br /&gt;
    # contributor_id is team_id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      assignment = object # assignment&lt;br /&gt;
      reviewee_id = params[:contributor_id]&lt;br /&gt;
      reviewed_object_id = assignment.id&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
      id_symbol = :reviewee_id&lt;br /&gt;
      id = reviewee_id&lt;br /&gt;
      assignment = assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: assignment.id,&lt;br /&gt;
                       user_id: user.id,&lt;br /&gt;
                       contributor_id: params[:contributor_id]&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = object # mapping&lt;br /&gt;
      reviewee_id = mapping.reviewer.id&lt;br /&gt;
      reviewed_object_id = mapping.map_id&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = reviewed_object_id&lt;br /&gt;
      assignment = mapping.assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: mapping.map_id,&lt;br /&gt;
                       user_id: user.id&lt;br /&gt;
    end&lt;br /&gt;
    # Get the assignment's participant corresponding to the user&lt;br /&gt;
    reviewer = get_reviewer(user, assignment, regurl)&lt;br /&gt;
    # ACS Removed the if condition(and corressponding else) which differentiate&lt;br /&gt;
    # assignments as team and individual assignments&lt;br /&gt;
    # to treat all assignments as team assignments&lt;br /&gt;
    if  response_map.where(id_symbol =&amp;gt; id,reviewer_id: reviewer.id).first.nil?&lt;br /&gt;
      response_map.create(reviewee_id: reviewee_id,&lt;br /&gt;
                          reviewer_id: reviewer.id,&lt;br /&gt;
                          reviewed_object_id: reviewed_object_id)&lt;br /&gt;
    else&lt;br /&gt;
      case params[:object]&lt;br /&gt;
      when 'reviewer'&lt;br /&gt;
        raise &amp;quot;The reviewer, \&amp;quot;&amp;quot; + reviewer.name + &amp;quot;\&amp;quot;, is already assigned to this contributor.&amp;quot;&lt;br /&gt;
      when 'metareviewer'&lt;br /&gt;
        raise &amp;quot;The metareviewer \&amp;quot;&amp;quot; + reviewer.user.name + &amp;quot;\&amp;quot; is already assigned to this reviewer.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  rescue&lt;br /&gt;
    msg = $ERROR_INFO&lt;br /&gt;
  end&lt;br /&gt;
 end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_reviewer&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
    end&lt;br /&gt;
    # duplicate code&lt;br /&gt;
    mapping = response_map.find(params[:id])&lt;br /&gt;
    assignment_id = mapping.assignment.id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      if !Response.exists?(map_id: mapping.id)&lt;br /&gt;
        mapping.destroy&lt;br /&gt;
        flash[:success] = &amp;quot;The review mapping for \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        flash[:error] = &amp;quot;This review has already been done. It cannot been deleted.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      flash[:note] = &amp;quot;The metareview mapping for &amp;quot; + mapping.reviewee.name + &amp;quot; and &amp;quot; + mapping.reviewer.name + &amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      begin&lt;br /&gt;
        mapping.delete&lt;br /&gt;
      rescue&lt;br /&gt;
        flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
        + $ERROR_INFO + &amp;quot;&amp;lt;a href='/review_mapping/delete_metareview/&amp;quot;&lt;br /&gt;
        + mapping.map_id.to_s + &amp;quot;'&amp;gt;Delete this mapping anyway&amp;gt;?&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_all_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_all_reviewers&lt;br /&gt;
    mapping = ResponseMap.find(params[:id])&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'all_metareviewers'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = mapping.map_id&lt;br /&gt;
    end&lt;br /&gt;
    mmappings = response_map.where(id_symbol =&amp;gt; id)&lt;br /&gt;
&lt;br /&gt;
    failedCount = ResponseMap.delete_mappings(mmappings, params[:force])&lt;br /&gt;
    if failedCount &amp;gt; 0&lt;br /&gt;
      url_yes = url_for action: 'delete_all_reviewers', id: mapping.map_id, force: 1&lt;br /&gt;
      url_no = url_for action: 'delete_all_reviewers', id: mapping.map_id&lt;br /&gt;
      flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;#{failedCount} metareviews exist for these mappings. Delete these mappings anyway?&amp;amp;nbsp;&amp;lt;a href='#{url_yes}'&amp;gt;Yes&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href='#{url_no}'&amp;gt;No&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      flash[:note] = &amp;quot;All metareview mappings for contributor \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and reviewer \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; have been deleted.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: mapping.assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104670</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104670"/>
		<updated>2016-11-05T07:20:05Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Refactor add_reviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor add_reviewer ==&lt;br /&gt;
 def add_reviewer&lt;br /&gt;
    msg = ''&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      topic_id = params[:topic_id]&lt;br /&gt;
      user_id = User.where(name: params[:user][:name]).first.id&lt;br /&gt;
      # If instructor want to assign one student to review his/her own artifact,&lt;br /&gt;
      # it should be counted as “self-review” and we need to make /app/views/submitted_content/_selfreview.html.erb work.&lt;br /&gt;
      if TeamsUser.exists?(team_id: params[:contributor_id], user_id: user_id)&lt;br /&gt;
        flash[:error] = &amp;quot;You cannot assign this student to review his/her own artifact.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        # Team lazy initialization&lt;br /&gt;
        assignment = Assignment.find(params[:id])&lt;br /&gt;
        assignment_id = assignment.id&lt;br /&gt;
        SignUpSheet.signup_team(assignment.id, user_id, topic_id)&lt;br /&gt;
        create_reviewer(assignment)&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = ResponseMap.find(params[:id])&lt;br /&gt;
      assignment_id = mapping.assignment.id&lt;br /&gt;
      create_reviewer(mapping)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id, msg: msg&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
 def create_reviewer(object)&lt;br /&gt;
  begin&lt;br /&gt;
    user = User.from_params(params)&lt;br /&gt;
    # contributor_id is team_id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      assignment = object # assignment&lt;br /&gt;
      reviewee_id = params[:contributor_id]&lt;br /&gt;
      reviewed_object_id = assignment.id&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
      id_symbol = :reviewee_id&lt;br /&gt;
      id = reviewee_id&lt;br /&gt;
      assignment = assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: assignment.id,&lt;br /&gt;
                       user_id: user.id,&lt;br /&gt;
                       contributor_id: params[:contributor_id]&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = object # mapping&lt;br /&gt;
      reviewee_id = mapping.reviewer.id&lt;br /&gt;
      reviewed_object_id = mapping.map_id&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = reviewed_object_id&lt;br /&gt;
      assignment = mapping.assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: mapping.map_id,&lt;br /&gt;
                       user_id: user.id&lt;br /&gt;
    end&lt;br /&gt;
    # Get the assignment's participant corresponding to the user&lt;br /&gt;
    reviewer = get_reviewer(user, assignment, regurl)&lt;br /&gt;
    # ACS Removed the if condition(and corressponding else) which differentiate&lt;br /&gt;
    # assignments as team and individual assignments&lt;br /&gt;
    # to treat all assignments as team assignments&lt;br /&gt;
    if  response_map.where(id_symbol =&amp;gt; id,reviewer_id: reviewer.id).first.nil?&lt;br /&gt;
      response_map.create(reviewee_id: reviewee_id,&lt;br /&gt;
                          reviewer_id: reviewer.id,&lt;br /&gt;
                          reviewed_object_id: reviewed_object_id)&lt;br /&gt;
    else&lt;br /&gt;
      case params[:object]&lt;br /&gt;
      when 'reviewer'&lt;br /&gt;
        raise &amp;quot;The reviewer, \&amp;quot;&amp;quot; + reviewer.name + &amp;quot;\&amp;quot;, is already assigned to this contributor.&amp;quot;&lt;br /&gt;
      when 'metareviewer'&lt;br /&gt;
        raise &amp;quot;The metareviewer \&amp;quot;&amp;quot; + reviewer.user.name + &amp;quot;\&amp;quot; is already assigned to this reviewer.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  rescue&lt;br /&gt;
    msg = $ERROR_INFO&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_reviewer&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
    end&lt;br /&gt;
    # duplicate code&lt;br /&gt;
    mapping = response_map.find(params[:id])&lt;br /&gt;
    assignment_id = mapping.assignment.id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      if !Response.exists?(map_id: mapping.id)&lt;br /&gt;
        mapping.destroy&lt;br /&gt;
        flash[:success] = &amp;quot;The review mapping for \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        flash[:error] = &amp;quot;This review has already been done. It cannot been deleted.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      flash[:note] = &amp;quot;The metareview mapping for &amp;quot; + mapping.reviewee.name + &amp;quot; and &amp;quot; + mapping.reviewer.name + &amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      begin&lt;br /&gt;
        mapping.delete&lt;br /&gt;
      rescue&lt;br /&gt;
        flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
        + $ERROR_INFO + &amp;quot;&amp;lt;a href='/review_mapping/delete_metareview/&amp;quot;&lt;br /&gt;
        + mapping.map_id.to_s + &amp;quot;'&amp;gt;Delete this mapping anyway&amp;gt;?&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_all_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_all_reviewers&lt;br /&gt;
    mapping = ResponseMap.find(params[:id])&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'all_metareviewers'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = mapping.map_id&lt;br /&gt;
    end&lt;br /&gt;
    mmappings = response_map.where(id_symbol =&amp;gt; id)&lt;br /&gt;
&lt;br /&gt;
    failedCount = ResponseMap.delete_mappings(mmappings, params[:force])&lt;br /&gt;
    if failedCount &amp;gt; 0&lt;br /&gt;
      url_yes = url_for action: 'delete_all_reviewers', id: mapping.map_id, force: 1&lt;br /&gt;
      url_no = url_for action: 'delete_all_reviewers', id: mapping.map_id&lt;br /&gt;
      flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;#{failedCount} metareviews exist for these mappings. Delete these mappings anyway?&amp;amp;nbsp;&amp;lt;a href='#{url_yes}'&amp;gt;Yes&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href='#{url_no}'&amp;gt;No&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      flash[:note] = &amp;quot;All metareview mappings for contributor \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and reviewer \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; have been deleted.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: mapping.assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104669</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104669"/>
		<updated>2016-11-05T07:19:28Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Refactor add_reviewer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor add_reviewer ==&lt;br /&gt;
 def add_reviewer&lt;br /&gt;
    msg = ''&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      topic_id = params[:topic_id]&lt;br /&gt;
      user_id = User.where(name: params[:user][:name]).first.id&lt;br /&gt;
      # If instructor want to assign one student to review his/her own artifact,&lt;br /&gt;
      # it should be counted as “self-review” and we need to make /app/views/submitted_content/_selfreview.html.erb work.&lt;br /&gt;
      if TeamsUser.exists?(team_id: params[:contributor_id], user_id: user_id)&lt;br /&gt;
        flash[:error] = &amp;quot;You cannot assign this student to review his/her own artifact.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        # Team lazy initialization&lt;br /&gt;
        assignment = Assignment.find(params[:id])&lt;br /&gt;
        assignment_id = assignment.id&lt;br /&gt;
        SignUpSheet.signup_team(assignment.id, user_id, topic_id)&lt;br /&gt;
        create_reviewer(assignment)&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = ResponseMap.find(params[:id])&lt;br /&gt;
      assignment_id = mapping.assignment.id&lt;br /&gt;
      create_reviewer(mapping)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id, msg: msg&lt;br /&gt;
  end&lt;br /&gt;
 def create_reviewer(object)&lt;br /&gt;
  begin&lt;br /&gt;
    user = User.from_params(params)&lt;br /&gt;
    # contributor_id is team_id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      assignment = object # assignment&lt;br /&gt;
      reviewee_id = params[:contributor_id]&lt;br /&gt;
      reviewed_object_id = assignment.id&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
      id_symbol = :reviewee_id&lt;br /&gt;
      id = reviewee_id&lt;br /&gt;
      assignment = assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: assignment.id,&lt;br /&gt;
                       user_id: user.id,&lt;br /&gt;
                       contributor_id: params[:contributor_id]&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = object # mapping&lt;br /&gt;
      reviewee_id = mapping.reviewer.id&lt;br /&gt;
      reviewed_object_id = mapping.map_id&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = reviewed_object_id&lt;br /&gt;
      assignment = mapping.assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: mapping.map_id,&lt;br /&gt;
                       user_id: user.id&lt;br /&gt;
    end&lt;br /&gt;
    # Get the assignment's participant corresponding to the user&lt;br /&gt;
    reviewer = get_reviewer(user, assignment, regurl)&lt;br /&gt;
    # ACS Removed the if condition(and corressponding else) which differentiate&lt;br /&gt;
    # assignments as team and individual assignments&lt;br /&gt;
    # to treat all assignments as team assignments&lt;br /&gt;
    if  response_map.where(id_symbol =&amp;gt; id,reviewer_id: reviewer.id).first.nil?&lt;br /&gt;
      response_map.create(reviewee_id: reviewee_id,&lt;br /&gt;
                          reviewer_id: reviewer.id,&lt;br /&gt;
                          reviewed_object_id: reviewed_object_id)&lt;br /&gt;
    else&lt;br /&gt;
      case params[:object]&lt;br /&gt;
      when 'reviewer'&lt;br /&gt;
        raise &amp;quot;The reviewer, \&amp;quot;&amp;quot; + reviewer.name + &amp;quot;\&amp;quot;, is already assigned to this contributor.&amp;quot;&lt;br /&gt;
      when 'metareviewer'&lt;br /&gt;
        raise &amp;quot;The metareviewer \&amp;quot;&amp;quot; + reviewer.user.name + &amp;quot;\&amp;quot; is already assigned to this reviewer.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  rescue&lt;br /&gt;
    msg = $ERROR_INFO&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_reviewer&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
    end&lt;br /&gt;
    # duplicate code&lt;br /&gt;
    mapping = response_map.find(params[:id])&lt;br /&gt;
    assignment_id = mapping.assignment.id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      if !Response.exists?(map_id: mapping.id)&lt;br /&gt;
        mapping.destroy&lt;br /&gt;
        flash[:success] = &amp;quot;The review mapping for \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        flash[:error] = &amp;quot;This review has already been done. It cannot been deleted.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      flash[:note] = &amp;quot;The metareview mapping for &amp;quot; + mapping.reviewee.name + &amp;quot; and &amp;quot; + mapping.reviewer.name + &amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      begin&lt;br /&gt;
        mapping.delete&lt;br /&gt;
      rescue&lt;br /&gt;
        flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
        + $ERROR_INFO + &amp;quot;&amp;lt;a href='/review_mapping/delete_metareview/&amp;quot;&lt;br /&gt;
        + mapping.map_id.to_s + &amp;quot;'&amp;gt;Delete this mapping anyway&amp;gt;?&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_all_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_all_reviewers&lt;br /&gt;
    mapping = ResponseMap.find(params[:id])&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'all_metareviewers'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = mapping.map_id&lt;br /&gt;
    end&lt;br /&gt;
    mmappings = response_map.where(id_symbol =&amp;gt; id)&lt;br /&gt;
&lt;br /&gt;
    failedCount = ResponseMap.delete_mappings(mmappings, params[:force])&lt;br /&gt;
    if failedCount &amp;gt; 0&lt;br /&gt;
      url_yes = url_for action: 'delete_all_reviewers', id: mapping.map_id, force: 1&lt;br /&gt;
      url_no = url_for action: 'delete_all_reviewers', id: mapping.map_id&lt;br /&gt;
      flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;#{failedCount} metareviews exist for these mappings. Delete these mappings anyway?&amp;amp;nbsp;&amp;lt;a href='#{url_yes}'&amp;gt;Yes&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href='#{url_no}'&amp;gt;No&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      flash[:note] = &amp;quot;All metareview mappings for contributor \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and reviewer \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; have been deleted.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: mapping.assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104668</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104668"/>
		<updated>2016-11-05T07:18:21Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Refactor */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor add_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def add_reviewer&lt;br /&gt;
    msg = ''&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      topic_id = params[:topic_id]&lt;br /&gt;
      user_id = User.where(name: params[:user][:name]).first.id&lt;br /&gt;
      # If instructor want to assign one student to review his/her own artifact,&lt;br /&gt;
      # it should be counted as “self-review” and we need to make /app/views/submitted_content/_selfreview.html.erb work.&lt;br /&gt;
      if TeamsUser.exists?(team_id: params[:contributor_id], user_id: user_id)&lt;br /&gt;
        flash[:error] = &amp;quot;You cannot assign this student to review his/her own artifact.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        # Team lazy initialization&lt;br /&gt;
        assignment = Assignment.find(params[:id])&lt;br /&gt;
        assignment_id = assignment.id&lt;br /&gt;
        SignUpSheet.signup_team(assignment.id, user_id, topic_id)&lt;br /&gt;
&lt;br /&gt;
        create_reviewer(assignment)&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = ResponseMap.find(params[:id])&lt;br /&gt;
      assignment_id = mapping.assignment.id&lt;br /&gt;
      create_reviewer(mapping)&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id, msg: msg&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
def create_reviewer(object)&lt;br /&gt;
  begin&lt;br /&gt;
    user = User.from_params(params)&lt;br /&gt;
    # contributor_id is team_id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      assignment = object # assignment&lt;br /&gt;
      reviewee_id = params[:contributor_id]&lt;br /&gt;
      reviewed_object_id = assignment.id&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
      id_symbol = :reviewee_id&lt;br /&gt;
      id = reviewee_id&lt;br /&gt;
      assignment = assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: assignment.id,&lt;br /&gt;
                       user_id: user.id,&lt;br /&gt;
                       contributor_id: params[:contributor_id]&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      mapping = object # mapping&lt;br /&gt;
      reviewee_id = mapping.reviewer.id&lt;br /&gt;
      reviewed_object_id = mapping.map_id&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = reviewed_object_id&lt;br /&gt;
      assignment = mapping.assignment&lt;br /&gt;
      regurl = url_for action: 'add_user_to_assignment',&lt;br /&gt;
                       id: mapping.map_id,&lt;br /&gt;
                       user_id: user.id&lt;br /&gt;
    end&lt;br /&gt;
    # Get the assignment's participant corresponding to the user&lt;br /&gt;
    reviewer = get_reviewer(user, assignment, regurl)&lt;br /&gt;
    # ACS Removed the if condition(and corressponding else) which differentiate&lt;br /&gt;
    # assignments as team and individual assignments&lt;br /&gt;
    # to treat all assignments as team assignments&lt;br /&gt;
    if  response_map.where(id_symbol =&amp;gt; id,reviewer_id: reviewer.id).first.nil?&lt;br /&gt;
      response_map.create(reviewee_id: reviewee_id,&lt;br /&gt;
                          reviewer_id: reviewer.id,&lt;br /&gt;
                          reviewed_object_id: reviewed_object_id)&lt;br /&gt;
    else&lt;br /&gt;
      case params[:object]&lt;br /&gt;
      when 'reviewer'&lt;br /&gt;
        raise &amp;quot;The reviewer, \&amp;quot;&amp;quot; + reviewer.name + &amp;quot;\&amp;quot;, is already assigned to this contributor.&amp;quot;&lt;br /&gt;
      when 'metareviewer'&lt;br /&gt;
        raise &amp;quot;The metareviewer \&amp;quot;&amp;quot; + reviewer.user.name + &amp;quot;\&amp;quot; is already assigned to this reviewer.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  rescue&lt;br /&gt;
    msg = $ERROR_INFO&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_reviewer&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      response_map = ReviewResponseMap&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
    end&lt;br /&gt;
    # duplicate code&lt;br /&gt;
    mapping = response_map.find(params[:id])&lt;br /&gt;
    assignment_id = mapping.assignment.id&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'reviewer'&lt;br /&gt;
      if !Response.exists?(map_id: mapping.id)&lt;br /&gt;
        mapping.destroy&lt;br /&gt;
        flash[:success] = &amp;quot;The review mapping for \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      else&lt;br /&gt;
        flash[:error] = &amp;quot;This review has already been done. It cannot been deleted.&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    when 'metareviewer'&lt;br /&gt;
      flash[:note] = &amp;quot;The metareview mapping for &amp;quot; + mapping.reviewee.name + &amp;quot; and &amp;quot; + mapping.reviewer.name + &amp;quot; has been deleted.&amp;quot;&lt;br /&gt;
      begin&lt;br /&gt;
        mapping.delete&lt;br /&gt;
      rescue&lt;br /&gt;
        flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
        + $ERROR_INFO + &amp;quot;&amp;lt;a href='/review_mapping/delete_metareview/&amp;quot;&lt;br /&gt;
        + mapping.map_id.to_s + &amp;quot;'&amp;gt;Delete this mapping anyway&amp;gt;?&amp;quot;&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: assignment_id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor delete_all_reviewer ==&lt;br /&gt;
&lt;br /&gt;
def delete_all_reviewers&lt;br /&gt;
    mapping = ResponseMap.find(params[:id])&lt;br /&gt;
    case params[:object]&lt;br /&gt;
    when 'all_metareviewers'&lt;br /&gt;
      response_map = MetareviewResponseMap&lt;br /&gt;
      id_symbol = :reviewed_object_id&lt;br /&gt;
      id = mapping.map_id&lt;br /&gt;
    end&lt;br /&gt;
    mmappings = response_map.where(id_symbol =&amp;gt; id)&lt;br /&gt;
&lt;br /&gt;
    failedCount = ResponseMap.delete_mappings(mmappings, params[:force])&lt;br /&gt;
    if failedCount &amp;gt; 0&lt;br /&gt;
      url_yes = url_for action: 'delete_all_reviewers', id: mapping.map_id, force: 1&lt;br /&gt;
      url_no = url_for action: 'delete_all_reviewers', id: mapping.map_id&lt;br /&gt;
      flash[:error] = &amp;quot;A delete action failed:&amp;lt;br/&amp;gt;#{failedCount} metareviews exist for these mappings. Delete these mappings anyway?&amp;amp;nbsp;&amp;lt;a href='#{url_yes}'&amp;gt;Yes&amp;lt;/a&amp;gt;&amp;amp;nbsp;|&amp;amp;nbsp;&amp;lt;a href='#{url_no}'&amp;gt;No&amp;lt;/a&amp;gt;&amp;lt;BR/&amp;gt;&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
      flash[:note] = &amp;quot;All metareview mappings for contributor \&amp;quot;&amp;quot; + mapping.reviewee.name + &amp;quot;\&amp;quot; and reviewer \&amp;quot;&amp;quot; + mapping.reviewer.name + &amp;quot;\&amp;quot; have been deleted.&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    redirect_to action: 'list_mappings', id: mapping.assignment.id&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104667</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104667"/>
		<updated>2016-11-05T07:12:59Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
== Refactor==&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104666</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104666"/>
		<updated>2016-11-05T07:11:05Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer. Based on the TA's requirement, we implemented this part on the other GitHub pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104665</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104665"/>
		<updated>2016-11-05T07:08:19Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer.&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test Refactor of add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer and delete_all_reviewer both from UI and Rspec. Here is a link of the UI test.https://www.youtube.com/watch?v=c9UdTnwlyvM. Also, you can check the code of this pull request. https://github.com/expertiza/expertiza/pull/836&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104664</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104664"/>
		<updated>2016-11-05T07:01:39Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
# Merged add_reviewer and add_metareviewer to add_reviewer. Merged delete_reviewer and delete_metareviewer to delete_reviewer. Modified delete_all_metareviewer to delete_all_reviewer.&lt;br /&gt;
# Change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104663</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104663"/>
		<updated>2016-11-05T06:39:40Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Current Implementation and Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
The controller has many methods and involve with many other controllers and views, the code is long and complicated. Some of the methods in this controller have unreasonable name associated with their functions, some methods are too long, some methods haven't been used by any other methods or views. Our work is to refactor these problems and make the code more beautiful.&lt;br /&gt;
&lt;br /&gt;
The problems are:&lt;br /&gt;
# The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
&lt;br /&gt;
# change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
     if ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0)&lt;br /&gt;
             .where(&amp;quot;created_at &amp;gt; :time&amp;quot;,&lt;br /&gt;
          {time:@@time_create_last_review_mapping_record}).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
     ReviewResponseMap.where(reviewed_object_id:assignment_id,&lt;br /&gt;
                  calibrate_to:0).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
# We use some data to test the result of old query and new query in rails console&lt;br /&gt;
 &lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ‘,6050, 9])&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: 6050,reviewer_id: 9)&lt;br /&gt;
&lt;br /&gt;
  Assignment.where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, 2, ‘TestAssign2’]).order('name')&lt;br /&gt;
  Assignment .where(instructor_id:2).where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:’TestAssign2’}).order('name')&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, 13, nil, 0])&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:13,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:nil})&lt;br /&gt;
&lt;br /&gt;
# We write RSpec feature tests to prove that all changes are correct and the project performs well as before. All tests have passed.&lt;br /&gt;
Automatic_review_mapping method&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      .#create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
Refactoring add_reviewer, add_metareviewer, delete_reviewer, delete_metareviewer, delete_outstanding_reviewers and delete_all_metareviewers&lt;br /&gt;
Since we merge methods have similar functions, we need to test their functionality. Here is a feature test work flow include those refactored functions.&lt;br /&gt;
    it &amp;quot;can add reviewer then delete it&amp;quot; do&lt;br /&gt;
 &lt;br /&gt;
       @student_reviewer = create :student,name:'student_reviewer'&lt;br /&gt;
       @participant_reviewer = create :participant, assignment: @assignment, user: @student_reviewer&lt;br /&gt;
       @student_reviewer2 = create :student,name:'student_reviewer2'&lt;br /&gt;
       @participant_reviewer2 = create :participant, assignment: @assignment, user: @student_reviewer2&lt;br /&gt;
       login_and_assign_reviewer(&amp;quot;instructor6&amp;quot;,@assignment.id,0,0)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer.name&lt;br /&gt;
       click_link('delete')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The review mapping for \&amp;quot;#{@team1.name}\&amp;quot; and \&amp;quot;#{@student_reviewer.name}\&amp;quot; has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'add reviewer').click&lt;br /&gt;
       add_reviewer(@student_reviewer.name)&lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       expect(page).to have_content @student_reviewer2.name&lt;br /&gt;
       find(:xpath, &amp;quot;//a[@href='/review_mapping/delete_metareviewer?id=3']&amp;quot;).click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;The metareview mapping for #{@student_reviewer.name} and #{@student_reviewer2.name} has been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       click_link('add metareviewer')&lt;br /&gt;
       add_matareviewer(@student_reviewer2.name)&lt;br /&gt;
       click_link('delete all metareviewers')&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All metareview mappings for contributor \&amp;quot;#{@team1.name}\&amp;quot; and reviewer \&amp;quot;#{@student_reviewer.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
       first(:link,'delete outstanding reviewers').click&lt;br /&gt;
       expect(page).to have_content (&amp;quot;All review mappings for \&amp;quot;#{@team1.name}\&amp;quot; have been deleted&amp;quot;)&lt;br /&gt;
 &lt;br /&gt;
     end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104013</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=104013"/>
		<updated>2016-10-30T02:23:41Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Background=&lt;br /&gt;
&lt;br /&gt;
This controller sets up mappings between reviewer and reviewee. It handles all different types of response maps (review response map, author feedback response map, teammate review response map, meta review response map and quiz response map). The class has functionality for five different kinds of Responses: reviews, metareviews, teammate reviews, author feedback (“rejoinders”), and quizzes. &lt;br /&gt;
&lt;br /&gt;
=Current Implementation and Problems=&lt;br /&gt;
&lt;br /&gt;
# Method ''response_report'' has some SQL - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method ''add_user_to_assignment'' is used. There is no way that this method should be in ReviewMappingController. Please remove this method and caller.&lt;br /&gt;
# There was a ''self-review'' feature, the method ''add_self_reviewer'', ''get_team_from_submission'' are related to this. Two views calls ''add_self_reviewer'' are &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. The names of views are not related to ''self_review'' feature. Plus those two views are not called anywhere. Please verify this and if so, you should delete those two views, two method and also related records (e.g. in routes.rb).&lt;br /&gt;
# Method ''delete_all_reviewers'' actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named ''delete_outstanding_reviewers''. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method ''release_reservation'' should be renamed as'' release_mapping''. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method ''delete_mappings'' is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method'' automatic_review_mapping_strategy'' is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
=Changes Implemented=&lt;br /&gt;
&lt;br /&gt;
# change the rails query from sql like code, like ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) to more rails quey like ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
# We search the function name(''add_user_to_assignment'') in the whole files, and find that this method is invoked in &amp;quot;participants_helper.rb&amp;quot;, and also being invoked in the function of ''add_reviewer'' and ''add_metareviewer'' in the controller of ''review_mapping_controller'' &lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''add_self_reviewer'' and ''get_team_from_submission'' in this controller are not called by any other methods except for views &amp;quot;show_available_submissions_for_quizzes.html.erb&amp;quot; and &amp;quot;show_available_submissions.html.erb&amp;quot;. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method ''delete_all_reviewers'' to ''delete_outstanding_reviewers'' and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods'' release_reservation'' in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods ''delete_mappings'' in this controller are not used in anywhere.&lt;br /&gt;
# Method ''automatic_review_mapping_strategy'' have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
=Code=&lt;br /&gt;
&lt;br /&gt;
==Refactor SQL query code==&lt;br /&gt;
&lt;br /&gt;
The rails query we change in this controller:&lt;br /&gt;
&lt;br /&gt;
1. From &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ? ', params[:contributor_id], reviewer.id]) &lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewee_id: params[:contributor_id],reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
2. From&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(['reviewed_object_id = ? and reviewer_id = ?', mapping.map_id, reviewer.id])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
&lt;br /&gt;
  MetareviewResponseMap.where(reviewed_object_id: mapping.map_id, reviewer_id: reviewer.id)&lt;br /&gt;
&lt;br /&gt;
3. From&lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where([&amp;quot;instructor_id = ? and substring(name,1,1) = ?&amp;quot;, session[:user].id, letter])&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
                   @assignments = Assignment&lt;br /&gt;
                   .where(instructor_id:session[:user].id)&lt;br /&gt;
                   .where(&amp;quot;substring(name,1,1) = :letter&amp;quot;,{letter:letter})&lt;br /&gt;
                   .order('name')&lt;br /&gt;
                   .page(params[:page])&lt;br /&gt;
                   .per_page(10)&lt;br /&gt;
&lt;br /&gt;
4.  From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, assignment_id, 1])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id, calibrate_to: 1)&lt;br /&gt;
&lt;br /&gt;
5. From&lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, assignment_id, @@time_create_last_review_mapping_record, 0])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  ReviewResponseMap.where(reviewed_object_id:assignment_id,calibrate_to:0).where(&amp;quot;created_at &amp;gt; :time&amp;quot;,{time:@@time_create_last_review_mapping_record})&lt;br /&gt;
&lt;br /&gt;
6. From&lt;br /&gt;
&lt;br /&gt;
  AssignmentQuestionnaire.where([&amp;quot;assignment_id = ? and questionnaire_id IN (?)&amp;quot;, params[:id], @review_questionnaire_ids])&lt;br /&gt;
&lt;br /&gt;
To&lt;br /&gt;
 &lt;br /&gt;
  AssignmentQuestionnaire.where(assignment_id: params[:id],:questionnaire_id =&amp;gt; @review_questionnaire_ids)&lt;br /&gt;
&lt;br /&gt;
7. From&lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(['reviewee_id = ? and reviewer_id = ?', team_id[0].t_id, params[:reviewer_id]])&lt;br /&gt;
&lt;br /&gt;
To &lt;br /&gt;
&lt;br /&gt;
  SelfReviewResponseMap.where(reviewee_id:team_id[0].t_id,reviewer_id:params[:reviewer_id])&lt;br /&gt;
&lt;br /&gt;
==Refactor long line method==&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                                assignment_id, &lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
=Test=&lt;br /&gt;
# We test delete_outstanding_reviewers refactor from the UI. Here is a video for this test. https://youtu.be/MZxOaSsm58E&lt;br /&gt;
#We write RSpec feature tests to prove that all changes are correct and the project performs well as before.&lt;br /&gt;
&lt;br /&gt;
The function of  method automatic_review_mapping is to automatically assign reviews on students in teams when instructor set either student review number or submissions review number. There is constraint that only one of the two numbers must be set value other than 0 (that is, one is 0 and other is not 0). To test the correctness  of our refactoring, we design a scenario and 4 cases of assigning reviews to students:&lt;br /&gt;
&lt;br /&gt;
Case 1. Instructor has not set both students review number and submissions review number (They are both 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 2. Instructor set both numbers (They are both not 0). The page will show a notice.&lt;br /&gt;
&lt;br /&gt;
Case 3. Instructors set students review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign student review number to 2, and there will be 20 peer reviews in total and need to allocate to 3 teams. So each team get 7 reviews on average and 1 team’s artifact will be reviewed 6 times.&lt;br /&gt;
&lt;br /&gt;
Case 4. Instructors set submissions review number. The controller will change database: create new relationship in ReviewResponseMap. For example, if assign submission review number to 3, and there will be 21 peer reviews in total to allocate to 10 participants. So every participants get 2 reviews. 9 among 10 participants will review 2 teams’ artifacts and 1 participant will review 3 teams’ artifacts.&lt;br /&gt;
&lt;br /&gt;
require 'rails_helper'&lt;br /&gt;
  describe &amp;quot;review mapping&amp;quot;, js: true do&lt;br /&gt;
    before(:each) do&lt;br /&gt;
      #create test data&lt;br /&gt;
    end&lt;br /&gt;
 &lt;br /&gt;
    it &amp;quot;show error when assign both 0&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 0&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 0&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student)')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;show error when assign both numbers&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 1&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 1&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      expect(page).to have_content('Please choose either the number of reviews per student or the number of reviewers per team (student), not both')&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per student&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      fill_in 'num_reviews_per_student', with: 2&lt;br /&gt;
      click_button 'first_submit_tag'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewee_id: @team1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(7)&lt;br /&gt;
      num2 = ReviewResponseMap.where(reviewee_id: @team3.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num2).to eq(6)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    it &amp;quot;calculate reviewmapping from given review number per submission&amp;quot; do&lt;br /&gt;
      login_as(&amp;quot;instructor6&amp;quot;)&lt;br /&gt;
      visit '/assignments/1/edit'&lt;br /&gt;
      find_link('ReviewStrategy').click&lt;br /&gt;
      select &amp;quot;Instructor-Selected&amp;quot;, from: 'assignment_form_assignment_review_assignment_strategy'&lt;br /&gt;
      choose 'num_reviews_submission'&lt;br /&gt;
      fill_in 'num_reviews_per_submission', with: 7&lt;br /&gt;
      click_button 'second_submit_tag'&lt;br /&gt;
      #click_button 'Save'&lt;br /&gt;
      num = ReviewResponseMap.where(reviewer_id: @teamuser1.id, reviewed_object_id: @assignment.id).count&lt;br /&gt;
      expect(num).to eq(2)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103875</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103875"/>
		<updated>2016-10-29T04:14:41Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                                exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                                assignment_id, &lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103872</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103872"/>
		<updated>2016-10-29T04:11:40Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, &lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, &lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, &lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                                   student_review_num, num_reviews_per_team, &lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done &lt;br /&gt;
      by each student to be greater than or equal to total number of teams &lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, &lt;br /&gt;
                         student_review_num, num_reviews_per_team, &lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103781</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103781"/>
		<updated>2016-10-29T03:19:25Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def automatic_review_mapping_strategy(assignment_id,&lt;br /&gt;
                                        participants, teams, student_review_num = 0,&lt;br /&gt;
                                        submission_review_num = 0)&lt;br /&gt;
    participants_hash = {}&lt;br /&gt;
    participants.each {|participant| participants_hash[participant.id] = 0 }&lt;br /&gt;
    # calculate reviewers for each team&lt;br /&gt;
    num_participants = participants.size&lt;br /&gt;
    if student_review_num != 0 and submission_review_num == 0&lt;br /&gt;
      num_reviews_per_team = (participants.size * student_review_num * 1.0 / teams.size).round&lt;br /&gt;
      student_review_num = student_review_num&lt;br /&gt;
      exact_num_of_review_needed = participants.size * student_review_num&lt;br /&gt;
    elsif student_review_num == 0 and submission_review_num != 0&lt;br /&gt;
      num_reviews_per_team = submission_review_num&lt;br /&gt;
      student_review_num = (teams.size * submission_review_num * 1.0 / participants.size).round&lt;br /&gt;
      exact_num_of_review_needed = teams.size * submission_review_num&lt;br /&gt;
    end&lt;br /&gt;
    execute_peer_review_strategy(assignment_id, teams, num_participants,&lt;br /&gt;
                                     student_review_num, num_reviews_per_team,&lt;br /&gt;
                                     participants, participants_hash)&lt;br /&gt;
    # after assigning peer reviews for each team,&lt;br /&gt;
    # if there are still some peer reviewers not obtain enough peer review,&lt;br /&gt;
    # just assign them to valid teams&lt;br /&gt;
    assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,&lt;br /&gt;
                              exact_num_of_review_needed)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                                   student_review_num, num_reviews_per_team, \&lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done \&lt;br /&gt;
      by each student to be greater than or equal to total number of teams \&lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                         student_review_num, num_reviews_per_team, \&lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103774</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103774"/>
		<updated>2016-10-29T03:15:28Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                                   student_review_num, num_reviews_per_team, \&lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done \&lt;br /&gt;
      by each student to be greater than or equal to total number of teams \&lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                         student_review_num, num_reviews_per_team, \&lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103772</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103772"/>
		<updated>2016-10-29T03:15:02Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
&lt;br /&gt;
        if unsorted_teams_hash.key? response_map.reviewee_id&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] += 1&lt;br /&gt;
        else&lt;br /&gt;
          unsorted_teams_hash[response_map.reviewee_id] = 1&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                                   student_review_num, num_reviews_per_team, \&lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done \&lt;br /&gt;
      by each student to be greater than or equal to total number of teams \&lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                         student_review_num, num_reviews_per_team, \&lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103740</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103740"/>
		<updated>2016-10-29T02:59:08Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                                   student_review_num, num_reviews_per_team, \&lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done \&lt;br /&gt;
      by each student to be greater than or equal to total number of teams \&lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                         student_review_num, num_reviews_per_team, \&lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103739</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103739"/>
		<updated>2016-10-29T02:58:51Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  def execute_peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                                   student_review_num, num_reviews_per_team, \&lt;br /&gt;
                                   participants, participants_hash)&lt;br /&gt;
    # Exception detection: If instructor want to assign too many reviews done&lt;br /&gt;
    # by each student, there will be an error msg.&lt;br /&gt;
    if student_review_num &amp;gt;= teams.size&lt;br /&gt;
      flash[:error] = 'You cannot set the number of reviews done \&lt;br /&gt;
      by each student to be greater than or equal to total number of teams \&lt;br /&gt;
      [or &amp;quot;participants&amp;quot; if it is an individual assignment].'&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    peer_review_strategy(assignment_id, teams, num_participants, \&lt;br /&gt;
                         student_review_num, num_reviews_per_team, \&lt;br /&gt;
                         participants, participants_hash)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103702</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103702"/>
		<updated>2016-10-29T02:44:33Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
  def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103699</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103699"/>
		<updated>2016-10-29T02:42:04Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103697</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103697"/>
		<updated>2016-10-29T02:40:24Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103695</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103695"/>
		<updated>2016-10-29T02:39:05Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103694</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103694"/>
		<updated>2016-10-29T02:38:41Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103691</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103691"/>
		<updated>2016-10-29T02:37:16Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103687</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103687"/>
		<updated>2016-10-29T02:33:24Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&amp;lt;nowiki&amp;gt;&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103680</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103680"/>
		<updated>2016-10-29T02:31:18Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
def assign_reviewers_for_team(assignment_id,student_review_num,participants_hash,exact_num_of_review_needed)&lt;br /&gt;
    if ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and created_at &amp;gt; ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                                assignment_id, \&lt;br /&gt;
                                @@time_create_last_review_mapping_record, 0]).size &amp;lt; exact_num_of_review_needed&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num = []&lt;br /&gt;
      participants_hash.each do |participant_id, review_num|&lt;br /&gt;
        participants_with_insufficient_review_num &amp;lt;&amp;lt; participant_id if review_num &amp;lt; student_review_num&lt;br /&gt;
      end&lt;br /&gt;
      unsorted_teams_hash = {}&lt;br /&gt;
&lt;br /&gt;
      ReviewResponseMap.where([&amp;quot;reviewed_object_id = ? and calibrate_to = ?&amp;quot;, \&lt;br /&gt;
                               assignment_id, 0]).each do |response_map|&lt;br /&gt;
&lt;br /&gt;
        unsorted_teams_hash[response_map.reviewee_id] = \&lt;br /&gt;
          calculate_unsorted_teams_hash_reviewee_id(unsorted_teams_hash, response_map)&lt;br /&gt;
      end&lt;br /&gt;
      teams_hash = unsorted_teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
&lt;br /&gt;
      participants_with_insufficient_review_num.each do |participant_id|&lt;br /&gt;
        teams_hash.each do |team_id, _num_review_received|&lt;br /&gt;
          next if TeamsUser.exists?(team_id: team_id, \&lt;br /&gt;
                                    user_id: Participant.find(participant_id).user_id)&lt;br /&gt;
&lt;br /&gt;
          ReviewResponseMap.where(reviewee_id: team_id, reviewer_id: participant_id, \&lt;br /&gt;
                                  reviewed_object_id: assignment_id).first_or_create&lt;br /&gt;
&lt;br /&gt;
          teams_hash[team_id] += 1&lt;br /&gt;
          teams_hash = teams_hash.sort_by {|_, v| v }.to_h&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    @@time_create_last_review_mapping_record = ReviewResponseMap.\&lt;br /&gt;
                                               where(reviewed_object_id: assignment_id).\&lt;br /&gt;
                                               last.created_at&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103671</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103671"/>
		<updated>2016-10-29T02:24:47Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
# This function have many long lines. We already shorten each long line to multiple lines. And also, we split this long function into three different functions.&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103636</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103636"/>
		<updated>2016-10-29T02:04:11Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view (_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103635</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103635"/>
		<updated>2016-10-29T02:03:33Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
# We already renamed method delete_all_reviewers to delete_outstanding_reviewers and changed the corresponding button name at the corresponding view(_list_review_mappings.html.erb).&lt;br /&gt;
# By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
# By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103623</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103623"/>
		<updated>2016-10-29T01:55:40Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Changes Implemented */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# &lt;br /&gt;
# By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
#&lt;br /&gt;
#By searching the whole project and routes, we verify that methods release_reservation in this controller are not used in anywhere.&lt;br /&gt;
#By searching the whole project and routes, we verify that methods delete_mappings in this controller are not used in anywhere.&lt;br /&gt;
#&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103611</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103611"/>
		<updated>2016-10-29T01:48:46Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Current Implementation and Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
# Method names for dealing with the 5 different kinds of objects should be as similar as possible, and they should share helper functions when possible.&lt;br /&gt;
# Method response_report has some sql - like code.  Rewrite with Active Record.&lt;br /&gt;
# Test whether method add_user_to_assignment is used. There is no way that this method should be in ReviewMappingController.--plz remove this method and caller.&lt;br /&gt;
# There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
&lt;br /&gt;
4. By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103609</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103609"/>
		<updated>2016-10-29T01:47:46Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Current Implementation and Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
4. There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
# Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
# Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
# Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
# Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
&lt;br /&gt;
4. By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103594</id>
		<title>CSC/ECE 517 Fall 2016/E1641. Refactor review mapping controller.rb</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016/E1641._Refactor_review_mapping_controller.rb&amp;diff=103594"/>
		<updated>2016-10-29T01:44:04Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Current Implementation and Problems */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Background==&lt;br /&gt;
&lt;br /&gt;
==Current Implementation and Problems==&lt;br /&gt;
4. There was a self-review feature, the method add_self_reviewr, get_team_from_submission are related to this. Two views calls add_self_reviewer are ç. The names of views are not related to self_review feature. Plus those two views are not called anywhere.&lt;br /&gt;
5. Method delete_all_reviewers actually only deletes the outstanding review response maps (the ones which has been initiated, but there is no response yet). So it should better be named delete_outstanding_reviewers. You can try to test this method by clicking “Assign reviewers” icon on an assignment.&lt;br /&gt;
6. Method release_reservation should be renamed as release_mapping. In addition, delete it if you find this method is not called anywhere.&lt;br /&gt;
7. Method delete_mappings is problematic. It does not looks like a controller method. Please refactor it or delete it if you can validate that this method is not called anywhere.&lt;br /&gt;
8. Method automatic_review_mapping_strategy is too long. Please refactor and test it.&lt;br /&gt;
&lt;br /&gt;
==Changes Implemented==&lt;br /&gt;
&lt;br /&gt;
4. By searching the whole project and routes, we verify that methods add_self_reviewr and get_team_from_submission in this controller are not called by any other methods except for views add_self_reviewr, get_team_from_submission. And those two views are not linked to any other views. So they are deleted from the project.&lt;br /&gt;
==Test==&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=103563</id>
		<title>CSC/ECE 517 Fall 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=103563"/>
		<updated>2016-10-29T01:24:46Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Writing Assignments 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.example.com link title]==Calibration Assignment Submissions==&lt;br /&gt;
*[[Calibration Assignment Submission (Firebrick JS)]]&lt;br /&gt;
*[[Calibration Assignment Submission (Active Job)]]&lt;br /&gt;
==Writing Assignments 2==&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1643. Refactor Suggestion controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1631. Refactoring Bidding Interface]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1674.Refactor leaderboard.rb and write unit tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1671. Unit Tests for participants.rb Hierarchy]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1668.Test e-mailing functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1658. Refractor lottery_controller.rb and write integration tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1660. Review requirements and thresholds]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1650. Sort instructor views alphabetically by default]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1644. Refactor and test Teams Controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1659. Refactor on_the_fly_calc.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1657. Introduce a Student View for instructors]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1653. Fix and improve rubric criteria]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1642. Refactor review_response_map.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1664:_Feature_Test_Assignment_Creation]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1654. Improve_date-picker_and_deadlines]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1652 Fix teammate advertisements and requests to join a team ]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1662. UI issues/fixes]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1673. Refactor question_type.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1675. Timestamp for student file &amp;amp; hyperlink submissions]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1640. Refactor response.rb and response_helper.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1634. Refactor and write unit test of due_date.rb and deadline_helper.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/M1654._Improve_network_security_features]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1670._Unit_tests_for_answers.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1641. Refactor review_mapping_controller.rb]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
	<entry>
		<id>https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=103547</id>
		<title>CSC/ECE 517 Fall 2016</title>
		<link rel="alternate" type="text/html" href="https://wiki.expertiza.ncsu.edu/index.php?title=CSC/ECE_517_Fall_2016&amp;diff=103547"/>
		<updated>2016-10-29T01:18:03Z</updated>

		<summary type="html">&lt;p&gt;Gyu9: /* Writing Assignments 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.example.com link title]==Calibration Assignment Submissions==&lt;br /&gt;
*[[Calibration Assignment Submission (Firebrick JS)]]&lt;br /&gt;
*[[Calibration Assignment Submission (Active Job)]]&lt;br /&gt;
==Writing Assignments 2==&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1643. Refactor Suggestion controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1631. Refactoring Bidding Interface]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1674.Refactor leaderboard.rb and write unit tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1671. Unit Tests for participants.rb Hierarchy]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1668.Test e-mailing functionality]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1658. Refractor lottery_controller.rb and write integration tests]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1660. Review requirements and thresholds]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1650. Sort instructor views alphabetically by default]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1644. Refactor and test Teams Controller]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1659. Refactor on_the_fly_calc.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1657. Introduce a Student View for instructors]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1653. Fix and improve rubric criteria]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1642. Refactor review_response_map.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1664:_Feature_Test_Assignment_Creation]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1666. Test team functionality]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1654. Improve_date-picker_and_deadlines]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1652 Fix teammate advertisements and requests to join a team ]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1662. UI issues/fixes]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1673. Refactor question_type.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1675. Timestamp for student file &amp;amp; hyperlink submissions]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1640. Refactor response.rb and response_helper.rb]]&lt;br /&gt;
*[[CSC/ECE 517 Fall 2016/E1634. Refactor and write unit test of due_date.rb and deadline_helper.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/M1654._Improve_network_security_features]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1670._Unit_tests_for_answers.rb]]&lt;br /&gt;
*[[CSC/ECE_517_Fall_2016/E1670. Refactor review_mapping_controller.rb]]&lt;/div&gt;</summary>
		<author><name>Gyu9</name></author>
	</entry>
</feed>