});
}
+$(".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;
<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>
(r"/search", PlanetSearchHandler),
(r"/year/(\d+)", PlanetYearHandler),
+ # API
+ (r"/api/search/autocomplete", PlanetAPISearchAutocomplete),
+
# RSS
(r"/rss", RSSPlanetAllHandler),
(r"/user/([a-z0-9_-]+)/rss", RSSPlanetUserHandler),
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]
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)