@@ 31,15 31,18 @@ class ObjectNotFound(Exception):
## models
-def _build_filter(day=None, room=None, track=None, event=None, **kwargs):
+def _build_filter(table="", day=None, room=None, track=None, event=None, **kwargs):
filterdata = []
wherestm = []
+ if table != "":
+ table = f"{table}."
+
def __f(col, value):
if value is None:
- wherestm.append("{} is null".format(col))
+ wherestm.append(f"{table}{col} is null")
else:
- wherestm.append("{} = ?".format(col))
+ wherestm.append(f"{table}{col} = ?")
filterdata.append(value)
if day is not None:
@@ 411,7 414,7 @@ class Event(GObject.GObject):
@classmethod
def filter(cls, day:Day = None, room:Room = None, track:Track = None, **kwargs):
- filterdata, wherestm = _build_filter(day=day, room=room, track=track, **kwargs)
+ filterdata, wherestm = _build_filter("events", day=day, room=room, track=track, **kwargs)
query = """SELECT * FROM events
WHERE {}
@@ 433,20 436,29 @@ class Event(GObject.GObject):
yield cls()._init(row)
@classmethod
- def search(cls, term, starred=False):
+ def search(cls, term, starred=False, order_by=None, **filters):
"""Search events for 'term'"""
-
- starfilter = ""
if starred:
- starfilter = "events.starred = 1 AND"
+ filters["starred"] = 1
+ filterdata, wherestm = _build_filter("events", **filters)
+
+ order = ['rank']
+ if order_by:
+ order = [order_by, 'rank']
+
+ wherestm.append("fts_event = ?")
+ filterdata.append(term)
query = """SELECT events.* FROM fts_event
JOIN events ON events.id = fts_event.event_id
- WHERE {} fts_event = ?
+ WHERE {}
GROUP BY events.id
- ORDER BY rank""".format(starfilter)
+ ORDER BY {}""".format(
+ " AND ".join(wherestm),
+ ", ".join(order)
+ )
- for row in local.getDb().execute(query, (term,)):
+ for row in local.getDb().execute(query, filterdata):
yield cls()._init(row)