From a3e3c96dbed3ae13e8d5ca8e99377b6f58c03329 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sat, 4 May 2013 15:10:07 +0200 Subject: [PATCH] planet: Introduce tags for searching. --- static/js/site.js | 11 +++++++++++ templates/planet/index.html | 3 ++- webapp/__init__.py | 3 +++ webapp/backend/planet.py | 31 +++++++++++++++++++++++++++++-- webapp/handlers_planet.py | 15 +++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/static/js/site.js b/static/js/site.js index f7ddd39b..f8e535cc 100644 --- a/static/js/site.js +++ b/static/js/site.js @@ -46,6 +46,17 @@ if (/.*download-splash.*/i.test(window.location.href)) { }); } +$(".planet-search-autocomplete").typeahead({ + source: function(query, process) { + $.get("http://planet.ipfire.org/api/search/autocomplete", { q: query }, function(data) { + if (data.query == query) { + process(data.results); + } + }); + }, +}); + + function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; diff --git a/templates/planet/index.html b/templates/planet/index.html index 4c7382a1..9b84ca5f 100644 --- a/templates/planet/index.html +++ b/templates/planet/index.html @@ -14,7 +14,8 @@
- +
diff --git a/webapp/__init__.py b/webapp/__init__.py index bae75476..03c7e26e 100644 --- a/webapp/__init__.py +++ b/webapp/__init__.py @@ -128,6 +128,9 @@ class Application(tornado.web.Application): (r"/search", PlanetSearchHandler), (r"/year/(\d+)", PlanetYearHandler), + # API + (r"/api/search/autocomplete", PlanetAPISearchAutocomplete), + # RSS (r"/rss", RSSPlanetAllHandler), (r"/user/([a-z0-9_-]+)/rss", RSSPlanetUserHandler), diff --git a/webapp/backend/planet.py b/webapp/backend/planet.py index 7f6a988c..3bc5f846 100644 --- a/webapp/backend/planet.py +++ b/webapp/backend/planet.py @@ -181,7 +181,34 @@ class Planet(object): slug, entry.markdown) def search(self, what): - entries = self.db.query("SELECT *, MATCH(markdown, title) AGAINST(%s) AS score \ - FROM planet WHERE MATCH(markdown, title) AGAINST(%s) ORDER BY score DESC", what, what) + # Split tags. + tags = what.split() + + query = "SELECT * FROM planet WHERE id IN ( \ + SELECT DISTINCT post_id FROM planet_tags" + + clauses = [] + args = [] + + for tag in tags: + clauses.append("tag = %s") + args.append(tag) + + query += " WHERE %s" % " OR ".join(clauses) + query += " ORDER BY COUNT(*) DESC)" + + entries = self.db.query(query, *args) return [PlanetEntry(e) for e in entries] + + def search_autocomplete(self, what): + tags = what.split() + last_tag = tags.pop() + + res = self.db.query("SELECT tag, COUNT(tag) AS count FROM planet_tags \ + WHERE tag LIKE %s GROUP BY tag ORDER BY count DESC", "%s%%" % last_tag) + + if tags: + return ["%s %s" % (" ".join(tags), row.tag) for row in res] + + return [row.tag for row in res] diff --git a/webapp/handlers_planet.py b/webapp/handlers_planet.py index be85fc36..ec0d8d9b 100644 --- a/webapp/handlers_planet.py +++ b/webapp/handlers_planet.py @@ -86,3 +86,18 @@ class PlanetYearHandler(PlanetBaseHandler): months.sort(reverse=True) self.render("planet/year.html", months=months, year=year) + + +class PlanetAPISearchAutocomplete(PlanetBaseHandler): + def get(self): + query = self.get_argument("q") + if not query: + raise tornado.web.HTTPError(400) + + results = self.planet.search_autocomplete(query) + + res = { + "query" : query, + "results" : results, + } + self.write(res) -- 2.47.3