Skip to content

Commit

Permalink
[api] re-implement the "search alls project or package container for …
Browse files Browse the repository at this point in the history
…a certain user/group". Speedup from timeout to less 1 second.
  • Loading branch information
adrianschroeter committed Feb 20, 2013
1 parent c5cdb4d commit 540e2f3
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 26 deletions.
1 change: 1 addition & 0 deletions docs/api/api/api.txt
Expand Up @@ -1310,6 +1310,7 @@ Parameters:

devel: true/false: include devel package definitions?
limit: limit the number of results. Default is "1" single result. Use 0 for all hits, -1 for deepest match.
This works only when used together with binary search otherwise always all items get returned.
project: specify project to search in
filter: Comma seperated list of role names to be taken into account
attribute: specify attribute which is marking the default project(s). Default is OBS:OwnerRootProject
Expand Down
2 changes: 1 addition & 1 deletion src/api/app/helpers/search_helper.rb
Expand Up @@ -53,7 +53,7 @@ def search_owner(params, obj)
elsif obj.class == String
owners += project.find_assignees(obj, limit.to_i, devel, filter, (true unless params[:webui_mode].blank?))
else
owners += project.find_containers(obj, limit.to_i, devel, filter)
owners += project.find_containers(obj, devel, filter)
end

end
Expand Down
64 changes: 39 additions & 25 deletions src/api/app/models/project.rb
Expand Up @@ -1307,8 +1307,8 @@ def lookup_package_owner(pkg, owner, limit, devel, filter, deepest, already_chec

already_checked[p.id] = 1

m = extract_maintainer(self, p.resolve_devel_package, filter) if devel == true
m = extract_maintainer(self, p, filter) unless m
m = extract_maintainer(self, p.resolve_devel_package, filter, owner) if devel == true
m = extract_maintainer(self, p, filter, owner) unless m
if m
break unless deepest
end
Expand Down Expand Up @@ -1367,35 +1367,49 @@ def find_containers_without_definition(devel=true, filter=["maintainer","bugowne
return maintainers
end

def find_containers(owner, limit=1, devel=true, filter=["maintainer","bugowner"] )
maintainers=[]
def find_containers(owner, devel=true, filter=["maintainer","bugowner"] )
projects=self.expand_all_projects

match_all = (limit == 0)

already_checked = {}
matched_packages = {}
deepest_match = nil
projects.each do |project| # project link order
next unless project.class == Project

project.packages.each do |pkg| # no order

next if matched_packages[pkg.name] # already found in upper project

m, limit, already_checked = lookup_package_owner(pkg, owner, limit, devel, filter, false, already_checked)

next unless m
roles=[]
filter.each do |f|
roles << Role.find_by_title!(f)
end

# add entry
matched_packages[pkg.name] = 1
maintainers << m
limit = limit - 1
return maintainers if limit < 1 and not match_all
found_packages = []
found_projects = []
# fast find packages with defintions
if owner.class == User
# user in package object
found_packages = PackageUserRoleRelationship.where(:role_id => roles, :bs_user_id => owner, :db_package_id => Package.where(:db_project_id => projects)).select(:db_package_id).map{ |p| p.db_package_id}
# user in project object
ProjectUserRoleRelationship.where(:role_id => roles, :bs_user_id => owner, :db_project_id => Project.where(:id => projects)).each do |prjrel|
found_projects << prjrel.db_project_id
end
elsif owner.class == Group
# group in package object
found_packages = PackageGroupRoleRelationship.where(:role_id => roles, :bs_group_id => owner, :db_package_id => Package.where(:db_project_id => projects)).select(:db_package_id).map{ |p| p.db_package_id}
# group in project object
ProjectGroupRoleRelationship.where(:role_id => roles, :bs_group_id => owner, :db_project_id => Project.where(:id => projects)).each do |prjrel|
found_projects << prjrel.db_project_id
end
else
raise "illegal object handed to find_containers"
end
if devel == true
#FIXME add devel packages, but how do recursive lookup fast in SQL?
end
found_packages.uniq!

maintainers << deepest_match if deepest_match
maintainers=[]

found_projects.each do |id|
prj = Project.find_by_id(id)
maintainers << { :rootproject => self.name, :project => prj.name }
end
found_packages.each do |id|
pkg = Package.find_by_id(id)
maintainers << { :rootproject => self.name, :project => pkg.project.name, :package => pkg.name }
end

return maintainers
end
Expand Down

0 comments on commit 540e2f3

Please sign in to comment.