Sort search results by download counts.

This commit is contained in:
Eitaro Fukamachi 2015-07-18 17:35:46 +09:00
parent b358f02f48
commit 18ca4eb67b
3 changed files with 31 additions and 8 deletions

View file

@ -11,18 +11,36 @@
(syntax:use-syntax :annot)
(defvar *ql-download-stats* nil)
@export
(defun download-stats ()
(or *ql-download-stats*
(loop with hash = (make-hash-table :test 'equal)
for row in (retrieve-all
(select :*
(from :quicklisp_download_stats)))
do (setf (gethash (getf row :project-name) hash)
(getf row :download-count))
finally
(return (setf *ql-download-stats* hash)))))
(defun sort-by-download-count (a b)
(let ((stats (download-stats)))
(> (gethash (project-name a) stats 0)
(gethash (project-name b) stats 0 ))))
@export
(defun search-projects (query &optional (ql-dist-version
(preference "ql-dist-version")))
;; TODO: sort
(if (and query
(/= 0 (length query)))
(remove-duplicates
(append
(ensure-list (search-exact-project query ql-dist-version))
(search-by-categories query ql-dist-version)
(search-by-name query ql-dist-version)
(search-by-description query ql-dist-version))
(sort (search-by-categories query ql-dist-version) #'sort-by-download-count)
(sort (search-by-name query ql-dist-version) #'sort-by-download-count)
(sort (search-by-description query ql-dist-version) #'sort-by-download-count))
:test #'eql
:key #'project-id
:from-end t)
@ -46,8 +64,7 @@
(rows (retrieve-all
(select (:project_name :category)
(from :cliki_project_category)
(where (:like :category (format nil "%~(~A~)%" query)))
(group-by :category))))
(where (:like (:lower :category) (format nil "%~(~A~)%" query))))))
(rows (remove-if-not
(lambda (row)
(ppcre:scan scanner (getf row :category)))

View file

@ -9,7 +9,8 @@
:sxql
:quickdocs-database)
(:import-from :quickdocs-server.search
:search-projects)
:search-projects
:download-stats)
(:import-from :lack.component
:call)
(:import-from :datafly
@ -113,7 +114,9 @@
:projects (mapcar (lambda (project)
(list :name (project-name project)
:release-version (project-release-version project)
:description (project-description project)))
:description (project-description project)
:download-count (gethash (project-name project)
(quickdocs-server.search:download-stats))))
projects)
:query |q|))))

View file

@ -29,6 +29,9 @@
{{ project.release-version }}
</span>
<p class="description">{{ project.description }}</p>
{% if project.download-count %}
<div class="download-count"><span class="lsf">download</span>&nbsp;{{ project.download-count }}</div>
{% endif %}
</li>
{% endfor %}
</ul>