@@ -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