@@ -617,25 +617,22 class Query < ActiveRecord::Base | |||||
617 | end |
|
617 | end | |
618 |
|
618 | |||
619 | def sql_for_assigned_to_role_field(field, operator, value) |
|
619 | def sql_for_assigned_to_role_field(field, operator, value) | |
620 | if operator == "*" # Any Role |
|
620 | case operator | |
621 | roles = Role.givable |
|
621 | when "*", "!*" # Member / Not member | |
622 | operator = '=' # Override the operator since we want to find by assigned_to |
|
622 | sw = operator == "!*" ? 'NOT' : '' | |
623 | elsif operator == "!*" # No role |
|
623 | nl = operator == "!*" ? "#{Issue.table_name}.assigned_to_id IS NULL OR" : '' | |
624 | roles = Role.givable |
|
624 | "(#{nl} #{Issue.table_name}.assigned_to_id #{sw} IN (SELECT DISTINCT #{Member.table_name}.user_id FROM #{Member.table_name}" + | |
625 | operator = '!' # Override the operator since we want to find by assigned_to |
|
625 | " WHERE #{Member.table_name}.project_id = #{Issue.table_name}.project_id))" | |
626 | else |
|
626 | when "=", "!" | |
627 | roles = Role.givable.find_all_by_id(value) |
|
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 | end |
|
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 | end |
|
636 | end | |
640 |
|
637 | |||
641 | private |
|
638 | private |
@@ -62,6 +62,13 class QueryTest < ActiveSupport::TestCase | |||||
62 | def assert_query_statement_includes(query, condition) |
|
62 | def assert_query_statement_includes(query, condition) | |
63 | assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}" |
|
63 | assert query.statement.include?(condition), "Query statement condition not found in: #{query.statement}" | |
64 | end |
|
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 | def test_query_should_allow_shared_versions_for_a_project_query |
|
73 | def test_query_should_allow_shared_versions_for_a_project_query | |
67 | subproject_version = Version.find(4) |
|
74 | subproject_version = Version.find(4) | |
@@ -723,61 +730,77 class QueryTest < ActiveSupport::TestCase | |||||
723 |
|
730 | |||
724 | context "with 'assigned_to_role' filter" do |
|
731 | context "with 'assigned_to_role' filter" do | |
725 | setup do |
|
732 | setup do | |
726 | # No fixtures |
|
733 | @manager_role = Role.find_by_name('Manager') | |
727 | MemberRole.delete_all |
|
734 | @developer_role = Role.find_by_name('Developer') | |
728 | Member.delete_all |
|
|||
729 | Role.delete_all |
|
|||
730 |
|
||||
731 | @manager_role = Role.generate!(:name => 'Manager') |
|
|||
732 | @developer_role = Role.generate!(:name => 'Developer') |
|
|||
733 |
|
735 | |||
734 | @project = Project.generate! |
|
736 | @project = Project.generate! | |
735 | @manager = User.generate! |
|
737 | @manager = User.generate! | |
736 | @developer = User.generate! |
|
738 | @developer = User.generate! | |
737 | @boss = User.generate! |
|
739 | @boss = User.generate! | |
|
740 | @guest = User.generate! | |||
738 | User.add_to_project(@manager, @project, @manager_role) |
|
741 | User.add_to_project(@manager, @project, @manager_role) | |
739 | User.add_to_project(@developer, @project, @developer_role) |
|
742 | User.add_to_project(@developer, @project, @developer_role) | |
740 | User.add_to_project(@boss, @project, [@manager_role, @developer_role]) |
|
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 | end |
|
750 | end | |
742 |
|
751 | |||
743 | should "search assigned to for users with the Role" do |
|
752 | should "search assigned to for users with the Role" do | |
744 | @query = Query.new(:name => '_') |
|
753 | @query = Query.new(:name => '_', :project => @project) | |
745 | @query.add_filter('assigned_to_role', '=', [@manager_role.id.to_s]) |
|
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}')" |
|
756 | assert_query_result [@issue1, @issue3], @query | |
748 | assert_find_issues_with_query_is_successful @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 | end |
|
782 | end | |
750 |
|
783 | |||
751 | should "search assigned to for users not assigned to any Role (none)" do |
|
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 | @query.add_filter('assigned_to_role', '!*', ['']) |
|
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}')" |
|
788 | assert_query_result [@issue4, @issue5], @query | |
756 | assert_find_issues_with_query_is_successful @query |
|
|||
757 | end |
|
789 | end | |
758 |
|
790 | |||
759 | should "search assigned to for users assigned to any Role (all)" do |
|
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 | @query.add_filter('assigned_to_role', '*', ['']) |
|
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}')" |
|
795 | assert_query_result [@issue1, @issue2, @issue3], @query | |
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) |
|
|||
773 | end |
|
796 | end | |
774 |
|
797 | |||
775 | should "return issues with ! empty role" do |
|
798 | should "return issues with ! empty role" do | |
776 | @empty_role = Role.generate! |
|
799 | @empty_role = Role.generate! | |
777 | @query = Query.new(:name => '_') |
|
800 | @query = Query.new(:name => '_', :project => @project) | |
778 |
@query.add_filter(' |
|
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 | end |
|
804 | end | |
782 | end |
|
805 | end | |
783 | end |
|
806 | end |
General Comments 0
You need to be logged in to leave comments.
Login now