use memcache to store the top_downloads for a while
[opensuse:software-o-o.git] / app / helpers / search_helper.rb
1 module SearchHelper
2   def shorten_description(text, chars)
3     text.sub /^(.{0,#{chars}}\b).*/m, '\1'
4   end
5
6   def prepare_desc(desc)
7     desc.gsub(/([\w.]+)@([\w.]+)/,'\1 [at] xxx').gsub(/\n/, "<br/>")
8   end
9
10   # returns an array of tokens: :prev, :next, :dots or 
11   # actual page
12   def paginator_list(page_count, current_page)
13     range = 3 #show 4 pages around current page
14     list = Array.new
15     return list if page_count == 1
16     
17     list << :prev unless current_page == 1
18
19     # add start block unless midrange includes first page
20     if current_page > range+1
21       1.upto current_page-range-1 do |page|
22         if page == range+2
23           list << :dots
24           break
25         end
26         list << page
27       end
28     end
29
30     midstart = current_page-range < 1 ? 1 : current_page-range
31     midend = page_count-range < current_page ? page_count : current_page+range
32     midstart.upto midend do |page|
33       list << page
34     end
35
36     list << :dots if midend < page_count-range-1
37
38     if page_count > current_page+range
39       (page_count-range).upto page_count do |page|
40         next if page <= midend
41         list << page
42       end
43     end
44
45     list << :next if current_page != page_count
46     return list
47   end
48
49   def default_baseproject
50     'openSUSE:11.2'
51   end
52
53
54   def baseproject_list_for_select
55     [
56       ['openSUSE Factory','openSUSE:Factory'],
57       ['openSUSE 11.2','openSUSE:11.2'],
58       ['openSUSE 11.1','openSUSE:11.1'],
59       ['openSUSE 11.0','openSUSE:11.0'],
60       ['SLES/SLED 11','SUSE:SLE-11'],
61       ['SLES/SLED 10','SUSE:SLE-10'],
62       ['SLES 9','SUSE:SLES-9'],
63       ['Fedora 13','Fedora:13'],
64       ['Fedora 12','Fedora:12'],
65       ['Fedora 11','Fedora:11'],
66       ['Fedora 10','Fedora:10'],
67       ['RHEL 5','RedHat:RHEL-5'],
68       ['RHEL 4','RedHat:RHEL-4'],
69       ['CentOS 5','CentOS:CentOS-5'],
70       ['Mandriva 2010','Mandriva:2010'],
71       ['Mandriva 2009.1','Mandriva:2009.1'],
72       ['Mandriva 2009','Mandriva:2009'],
73       ['Debian 5.0 (Lenny)','Debian:5.0'],
74       ['Debian 4.0 (Etch)','Debian:Etch'],
75       ['Ubuntu 10.04','Ubuntu:10.04'],
76       ['Ubuntu 9.10','Ubuntu:9.10'],
77       ['Ubuntu 9.04','Ubuntu:9.04'],
78       ['Ubuntu 8.04','Ubuntu:8.04'],
79       ['Ubuntu 6.06','Ubuntu:6.06'],
80       ['ALL','ALL']
81     ]
82   end
83
84   def top_downloads
85     Rails.cache.fetch('top_downloads', :expires_in => 12.hours) do
86       list=DownloadHistory.find :all, :conditions => "query IS NOT NULL"
87       queries=Hash.new
88       list.each do |s|
89         s = s.query.strip.downcase
90         queries[s] ||= 0
91         queries[s] += 1
92       end
93
94       queries = queries.to_a.sort { |x,y| y[1] <=> x[1] }
95       tops = Array.new
96       count = 0
97       queries.each do |q,c|
98         tops << { :query => q, :count => c}
99         break if count > 15
100         count += 1
101       end
102       tops
103     end
104   end
105 end