]> git.ipfire.org Git - ipfire.org.git/commitdiff
planet: Introduce tags for searching.
authorMichael Tremer <michael.tremer@ipfire.org>
Sat, 4 May 2013 13:10:07 +0000 (15:10 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sat, 4 May 2013 13:10:07 +0000 (15:10 +0200)
static/js/site.js
templates/planet/index.html
webapp/__init__.py
webapp/backend/planet.py
webapp/handlers_planet.py

index f7ddd39b5803b5c608318c9aeb59a0dd05de6209..f8e535ccf98acc5a84b4a871d3a3381474a156fe 100644 (file)
@@ -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;
index 4c7382a18111aff5c546dcd60cf0078bc3db3b12..9b84ca5f4e83d3999527927158fbc5541c08decc 100644 (file)
@@ -14,7 +14,8 @@
                <div class="span4 offset4">
                        <form class="form-inline" action="/search" method="GET">
                                <div class="input-append">
-                                       <input type="text" class="input-medium" name="q" placeholder="{{ _("Search") }}">
+                                       <input type="text" class="input-medium planet-search-autocomplete" name="q"
+                                               placeholder="{{ _("Search") }}" autocomplete="off">
                                        <button type="submit" class="btn"><i class="icon-search"></i></button>
                                </div>
 
index bae754765f2adeff24e0ac2e48800fd113bb2099..03c7e26e2a90d0b9afa8790eeb5f376ff53905d0 100644 (file)
@@ -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),
index 7f6a988ca310f86cf26d211b394788fe785f3413..3bc5f846d1645dc283e8fc0d0be433c8b671b945 100644 (file)
@@ -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]
index be85fc36dad4e1da4f8a6c8086bd63417b9278fc..ec0d8d9bae9cf882d85a79023ad48d2533aa2b64 100644 (file)
@@ -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)