##// END OF EJS Templates
Refactor: extract specific filter statements to methods....
Jean-Philippe Lang -
r6181:18103cafbc38
parent child
Show More
@@ -482,68 +482,16 class Query < ActiveRecord::Base
482 v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
482 v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me")
483 end
483 end
484
484
485 sql = ''
486 if field =~ /^cf_(\d+)$/
485 if field =~ /^cf_(\d+)$/
487 # custom field
486 # custom field
488 db_table = CustomValue.table_name
487 filters_clauses << sql_for_custom_field(field, operator, v, $1)
489 db_field = 'value'
488 elsif respond_to?("sql_for_#{field}_field")
490 is_custom_filter = true
489 # specific statement
491 sql << "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{$1} WHERE "
490 filters_clauses << send("sql_for_#{field}_field", field, operator, v)
492 sql << sql_for_field(field, operator, v, db_table, db_field, true) + ')'
493 elsif field == 'watcher_id'
494 db_table = Watcher.table_name
495 db_field = 'user_id'
496 sql << "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND "
497 sql << sql_for_field(field, '=', v, db_table, db_field) + ')'
498 elsif field == "member_of_group" # named field
499 if operator == '*' # Any group
500 groups = Group.all
501 operator = '=' # Override the operator since we want to find by assigned_to
502 elsif operator == "!*"
503 groups = Group.all
504 operator = '!' # Override the operator since we want to find by assigned_to
505 else
506 groups = Group.find_all_by_id(v)
507 end
508 groups ||= []
509
510 members_of_groups = groups.inject([]) {|user_ids, group|
511 if group && group.user_ids.present?
512 user_ids << group.user_ids
513 end
514 user_ids.flatten.uniq.compact
515 }.sort.collect(&:to_s)
516
517 sql << '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
518
519 elsif field == "assigned_to_role" # named field
520 if operator == "*" # Any Role
521 roles = Role.givable
522 operator = '=' # Override the operator since we want to find by assigned_to
523 elsif operator == "!*" # No role
524 roles = Role.givable
525 operator = '!' # Override the operator since we want to find by assigned_to
526 else
527 roles = Role.givable.find_all_by_id(v)
528 end
529 roles ||= []
530
531 members_of_roles = roles.inject([]) {|user_ids, role|
532 if role && role.members
533 user_ids << role.members.collect(&:user_id)
534 end
535 user_ids.flatten.uniq.compact
536 }.sort.collect(&:to_s)
537
538 sql << '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
539 else
491 else
540 # regular field
492 # regular field
541 db_table = Issue.table_name
493 filters_clauses << '(' + sql_for_field(field, operator, v, Issue.table_name, field) + ')'
542 db_field = field
543 sql << '(' + sql_for_field(field, operator, v, db_table, db_field) + ')'
544 end
494 end
545 filters_clauses << sql
546
547 end if filters and valid?
495 end if filters and valid?
548
496
549 filters_clauses << project_statement
497 filters_clauses << project_statement
@@ -614,9 +562,66 class Query < ActiveRecord::Base
614 rescue ::ActiveRecord::StatementInvalid => e
562 rescue ::ActiveRecord::StatementInvalid => e
615 raise StatementInvalid.new(e.message)
563 raise StatementInvalid.new(e.message)
616 end
564 end
565
566 def sql_for_watcher_id_field(field, operator, value)
567 db_table = Watcher.table_name
568 "#{Issue.table_name}.id #{ operator == '=' ? 'IN' : 'NOT IN' } (SELECT #{db_table}.watchable_id FROM #{db_table} WHERE #{db_table}.watchable_type='Issue' AND " +
569 sql_for_field(field, '=', value, db_table, 'user_id') + ')'
570 end
571
572 def sql_for_member_of_group_field(field, operator, value)
573 if operator == '*' # Any group
574 groups = Group.all
575 operator = '=' # Override the operator since we want to find by assigned_to
576 elsif operator == "!*"
577 groups = Group.all
578 operator = '!' # Override the operator since we want to find by assigned_to
579 else
580 groups = Group.find_all_by_id(value)
581 end
582 groups ||= []
583
584 members_of_groups = groups.inject([]) {|user_ids, group|
585 if group && group.user_ids.present?
586 user_ids << group.user_ids
587 end
588 user_ids.flatten.uniq.compact
589 }.sort.collect(&:to_s)
590
591 '(' + sql_for_field("assigned_to_id", operator, members_of_groups, Issue.table_name, "assigned_to_id", false) + ')'
592 end
593
594 def sql_for_assigned_to_role_field(field, operator, value)
595 if operator == "*" # Any Role
596 roles = Role.givable
597 operator = '=' # Override the operator since we want to find by assigned_to
598 elsif operator == "!*" # No role
599 roles = Role.givable
600 operator = '!' # Override the operator since we want to find by assigned_to
601 else
602 roles = Role.givable.find_all_by_id(value)
603 end
604 roles ||= []
617
605
618 private
606 members_of_roles = roles.inject([]) {|user_ids, role|
607 if role && role.members
608 user_ids << role.members.collect(&:user_id)
609 end
610 user_ids.flatten.uniq.compact
611 }.sort.collect(&:to_s)
612
613 '(' + sql_for_field("assigned_to_id", operator, members_of_roles, Issue.table_name, "assigned_to_id", false) + ')'
614 end
619
615
616 private
617
618 def sql_for_custom_field(field, operator, value, custom_field_id)
619 db_table = CustomValue.table_name
620 db_field = 'value'
621 "#{Issue.table_name}.id IN (SELECT #{Issue.table_name}.id FROM #{Issue.table_name} LEFT OUTER JOIN #{db_table} ON #{db_table}.customized_type='Issue' AND #{db_table}.customized_id=#{Issue.table_name}.id AND #{db_table}.custom_field_id=#{custom_field_id} WHERE " +
622 sql_for_field(field, operator, value, db_table, db_field, true) + ')'
623 end
624
620 # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
625 # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+
621 def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
626 def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false)
622 sql = ''
627 sql = ''
General Comments 0
You need to be logged in to leave comments. Login now