@@ -482,68 +482,16 class Query < ActiveRecord::Base | |||
|
482 | 482 | v.push(User.current.logged? ? User.current.id.to_s : "0") if v.delete("me") |
|
483 | 483 | end |
|
484 | 484 | |
|
485 | sql = '' | |
|
486 | 485 | if field =~ /^cf_(\d+)$/ |
|
487 | 486 | # custom field |
|
488 | db_table = CustomValue.table_name | |
|
489 | db_field = 'value' | |
|
490 | is_custom_filter = true | |
|
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 " | |
|
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) + ')' | |
|
487 | filters_clauses << sql_for_custom_field(field, operator, v, $1) | |
|
488 | elsif respond_to?("sql_for_#{field}_field") | |
|
489 | # specific statement | |
|
490 | filters_clauses << send("sql_for_#{field}_field", field, operator, v) | |
|
539 | 491 | else |
|
540 | 492 | # regular field |
|
541 | db_table = Issue.table_name | |
|
542 | db_field = field | |
|
543 | sql << '(' + sql_for_field(field, operator, v, db_table, db_field) + ')' | |
|
493 | filters_clauses << '(' + sql_for_field(field, operator, v, Issue.table_name, field) + ')' | |
|
544 | 494 | end |
|
545 | filters_clauses << sql | |
|
546 | ||
|
547 | 495 | end if filters and valid? |
|
548 | 496 | |
|
549 | 497 | filters_clauses << project_statement |
@@ -614,9 +562,66 class Query < ActiveRecord::Base | |||
|
614 | 562 | rescue ::ActiveRecord::StatementInvalid => e |
|
615 | 563 | raise StatementInvalid.new(e.message) |
|
616 | 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 | 625 | # Helper method to generate the WHERE sql for a +field+, +operator+ and a +value+ |
|
621 | 626 | def sql_for_field(field, operator, value, db_table, db_field, is_custom_filter=false) |
|
622 | 627 | sql = '' |
General Comments 0
You need to be logged in to leave comments.
Login now