@@ -617,25 +617,22 class Query < ActiveRecord::Base | |||
|
617 | 617 | end |
|
618 | 618 | |
|
619 | 619 | def sql_for_assigned_to_role_field(field, operator, value) |
|
620 | if operator == "*" # Any Role | |
|
621 | roles = Role.givable | |
|
622 | operator = '=' # Override the operator since we want to find by assigned_to | |
|
623 | elsif operator == "!*" # No role | |
|
624 | roles = Role.givable | |
|
625 | operator = '!' # Override the operator since we want to find by assigned_to | |
|
626 | else | |
|
627 | roles = Role.givable.find_all_by_id(value) | |
|
620 | case operator | |
|
621 | when "*", "!*" # Member / Not member | |
|
622 | sw = operator == "!*" ? 'NOT' : '' | |
|
623 | nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : '' | |
|
624 | "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" + | |
|
625 | " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))" | |
|
626 | when "=", "!" | |
|
627 | role_cond = value.any? ? | |
|
628 | "#{MemberRole.table_name}.role_id IN (" + value.collect{|val| "'#{connection.quote_string(val)}'"}.join(",") + ")" : | |
|
629 | "1=0" | |
|
630 | ||
|
631 | sw = operator == "!" ? 'NOT' : '' | |
|
632 | nl = operator == "!" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : '' | |
|
633 | "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}, #{MemberRole.table_name}" + | |
|
634 | " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id AND #{Member.table_name}.id = #{MemberRole.table_name}.member_id AND #{role_cond}))" | |
|
628 | 635 | end |
|
629 | roles ||= [] | |
|
630 | ||
|
631 | members_of_roles = roles.inject([]) {|user_ids, role| | |
|
632 | if role && role.members | |
|
633 | user_ids << role.members.collect(&:user_id) | |
|
634 | end | |
|
635 | user_ids.flatten.uniq.compact | |
|
636 | }.sort.collect(&:to_s) | |
|
637 | ||
|
638 | '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')' | |
|
639 | 636 | end |
|
640 | 637 | |
|
641 | 638 | private |
@@ -62,6 +62,13 class QueryTest < ActiveSupport::TestCase | |||
|
62 | 62 | def assert_query_statement_includes(query, condition) |
|
63 | 63 | assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}" |
|
64 | 64 | end |
|
65 | ||
|
66 | def assert_query_result(expected, query) | |
|
67 | assert_nothing_raised do | |
|
68 | assert_equal expected.map(&:id).sort, query.issues.map(&:id).sort | |
|
69 | assert_equal expected.size, query.issue_count | |
|
70 | end | |
|
71 | end | |
|
65 | 72 | |
|
66 | 73 | def test_query_should_allow_shared_versions_for_a_project_query |
|
67 | 74 | subproject_version = Version.find(4) |
@@ -723,61 +730,77 class QueryTest < ActiveSupport::TestCase | |||
|
723 | 730 | |
|
724 | 731 | context "with 'assigned_to_role' filter" do |
|
725 | 732 | setup do |
|
726 | # No fixtures | |
|
727 | MemberRole.delete_all | |
|
728 | Member.delete_all | |
|
729 | Role.delete_all | |
|
730 | ||
|
731 | @manager_role = Role.generate!(:name => 'Manager') | |
|
732 | @developer_role = Role.generate!(:name => 'Developer') | |
|
733 | @manager_role = Role.find_by_name('Manager') | |
|
734 | @developer_role = Role.find_by_name('Developer') | |
|
733 | 735 | |
|
734 | 736 | @project = Project.generate! |
|
735 | 737 | @manager = User.generate! |
|
736 | 738 | @developer = User.generate! |
|
737 | 739 | @boss = User.generate! |
|
740 | @guest = User.generate! | |
|
738 | 741 | User.add_to_project(@manager, @project, @manager_role) |
|
739 | 742 | User.add_to_project(@developer, @project, @developer_role) |
|
740 | 743 | User.add_to_project(@boss, @project, [@manager_role, @developer_role]) |
|
744 | ||
|
745 | @issue1 = Issue.generate_for_project!(@project, :assigned_to_id => @manager.id) | |
|
746 | @issue2 = Issue.generate_for_project!(@project, :assigned_to_id => @developer.id) | |
|
747 | @issue3 = Issue.generate_for_project!(@project, :assigned_to_id => @boss.id) | |
|
748 | @issue4 = Issue.generate_for_project!(@project, :assigned_to_id => @guest.id) | |
|
749 | @issue5 = Issue.generate_for_project!(@project) | |
|
741 | 750 | end |
|
742 | 751 | |
|
743 | 752 | should "search assigned to for users with the Role" do |
|
744 | @query = Query.new(:name => '_') | |
|
753 | @query = Query.new(:name => '_', :project => @project) | |
|
745 | 754 | @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s]) |
|
746 | 755 | |
|
747 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@boss.id}')" | |
|
748 | assert_find_issues_with_query_is_successful @query | |
|
756 | assert_query_result [@issue1, @issue3], @query | |
|
757 | end | |
|
758 | ||
|
759 | should "search assigned to for users with the Role on the issue project" do | |
|
760 | other_project = Project.generate! | |
|
761 | User.add_to_project(@developer, other_project, @manager_role) | |
|
762 | ||
|
763 | @query = Query.new(:name => '_', :project => @project) | |
|
764 | @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s]) | |
|
765 | ||
|
766 | assert_query_result [@issue1, @issue3], @query | |
|
767 | end | |
|
768 | ||
|
769 | should "return an empty set with empty role" do | |
|
770 | @empty_role = Role.generate! | |
|
771 | @query = Query.new(:name => '_', :project => @project) | |
|
772 | @query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s]) | |
|
773 | ||
|
774 | assert_query_result [], @query | |
|
775 | end | |
|
776 | ||
|
777 | should "search assigned to for users without the Role" do | |
|
778 | @query = Query.new(:name => '_', :project => @project) | |
|
779 | @query.add_filter('assigned_to_role', '!', [@manager_role.id.to_s]) | |
|
780 | ||
|
781 | assert_query_result [@issue2, @issue4, @issue5], @query | |
|
749 | 782 | end |
|
750 | 783 | |
|
751 | 784 | should "search assigned to for users not assigned to any Role (none)" do |
|
752 | @query = Query.new(:name => '_') | |
|
785 | @query = Query.new(:name => '_', :project => @project) | |
|
753 | 786 | @query.add_filter('assigned_to_role', '!*', ['']) |
|
754 | 787 | |
|
755 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IS NULL OR #{Issue.table_name}.assigned_to_id NOT IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" | |
|
756 | assert_find_issues_with_query_is_successful @query | |
|
788 | assert_query_result [@issue4, @issue5], @query | |
|
757 | 789 | end |
|
758 | 790 | |
|
759 | 791 | should "search assigned to for users assigned to any Role (all)" do |
|
760 | @query = Query.new(:name => '_') | |
|
792 | @query = Query.new(:name => '_', :project => @project) | |
|
761 | 793 | @query.add_filter('assigned_to_role', '*', ['']) |
|
762 | 794 | |
|
763 | assert_query_statement_includes @query, "#{Issue.table_name}.assigned_to_id IN ('#{@manager.id}','#{@developer.id}','#{@boss.id}')" | |
|
764 | assert_find_issues_with_query_is_successful @query | |
|
765 | end | |
|
766 | ||
|
767 | should "return an empty set with empty role" do | |
|
768 | @empty_role = Role.generate! | |
|
769 | @query = Query.new(:name => '_') | |
|
770 | @query.add_filter('assigned_to_role', '=', [@empty_role.id.to_s]) | |
|
771 | ||
|
772 | assert_equal [], find_issues_with_query(@query) | |
|
795 | assert_query_result [@issue1, @issue2, @issue3], @query | |
|
773 | 796 | end |
|
774 | 797 | |
|
775 | 798 | should "return issues with ! empty role" do |
|
776 | 799 | @empty_role = Role.generate! |
|
777 | @query = Query.new(:name => '_') | |
|
778 |
@query.add_filter(' |
|
|
800 | @query = Query.new(:name => '_', :project => @project) | |
|
801 | @query.add_filter('assigned_to_role', '!', [@empty_role.id.to_s]) | |
|
779 | 802 | |
|
780 | assert_find_issues_with_query_is_successful @query | |
|
803 | assert_query_result [@issue1, @issue2, @issue3, @issue4, @issue5], @query | |
|
781 | 804 | end |
|
782 | 805 | end |
|
783 | 806 | end |
General Comments 0
You need to be logged in to leave comments.
Login now