tag: allow boolean intersection searches
This commit is contained in:
parent
cb514dfede
commit
e866c432c8
|
@ -63,10 +63,7 @@ def get_tag_counts_by_chan(db, chan):
|
||||||
if not tags:
|
if not tags:
|
||||||
return 'no tags in %s' % chan
|
return 'no tags in %s' % chan
|
||||||
ret = '%s tags: ' % chan
|
ret = '%s tags: ' % chan
|
||||||
ret += ', '.join('%s (%d)' % row for row in tags)
|
return winnow(['%s (%d)' % row for row in tags])
|
||||||
if len(ret) > 400:
|
|
||||||
ret = ret[:ret.rfind(' ', 0, 400)] + '...'
|
|
||||||
return ret
|
|
||||||
|
|
||||||
|
|
||||||
def get_tags_by_nick(db, chan, nick):
|
def get_tags_by_nick(db, chan, nick):
|
||||||
|
@ -75,20 +72,32 @@ def get_tags_by_nick(db, chan, nick):
|
||||||
" order by lower(subject)", (nick, chan)).fetchall()
|
" order by lower(subject)", (nick, chan)).fetchall()
|
||||||
|
|
||||||
|
|
||||||
def get_nicks_by_tag(db, chan, subject):
|
def get_nicks_by_tagset(db, chan, tagset):
|
||||||
nicks = db.execute("select nick from tag where lower(subject)=lower(?)"
|
nicks = None
|
||||||
" and chan=?"
|
for tag in tagset.split('&'):
|
||||||
" order by lower(nick)", (subject, chan)).fetchall()
|
tag = tag.strip()
|
||||||
|
|
||||||
nicks = [munge(x[0], 1) for x in nicks]
|
current_nicks = db.execute("select nick from tag where " +
|
||||||
|
"lower(subject)=lower(?)"
|
||||||
|
" and chan=?", (tag, chan)).fetchall()
|
||||||
|
|
||||||
|
if not current_nicks:
|
||||||
|
return "tag '%s' not found" % tag
|
||||||
|
|
||||||
|
if nicks is None:
|
||||||
|
nicks = set(current_nicks)
|
||||||
|
else:
|
||||||
|
nicks.intersection_update(current_nicks)
|
||||||
|
|
||||||
|
nicks = [munge(x[0], 1) for x in sorted(nicks)]
|
||||||
if not nicks:
|
if not nicks:
|
||||||
return 'tag not found'
|
return 'no tags found in intersection of "%s"' % tagset
|
||||||
return 'nicks tagged "%s": ' % subject + winnow(nicks)
|
return 'nicks tagged "%s": ' % tagset + winnow(nicks)
|
||||||
|
|
||||||
|
|
||||||
@hook.command
|
@hook.command
|
||||||
def tag(inp, chan='', db=None):
|
def tag(inp, chan='', db=None):
|
||||||
'.tag <nick>/[add|del] <nick> <tag>/list [tag] -- get list of tags on ' \
|
'.tag <nick>/[add|del] <nick> <tag>/list [tag] [& tag...] -- get list of tags on ' \
|
||||||
'<nick>/(un)marks <nick> as <tag>/gets list of tags/nicks marked as [tag]'
|
'<nick>/(un)marks <nick> as <tag>/gets list of tags/nicks marked as [tag]'
|
||||||
|
|
||||||
db.execute('create table if not exists tag(chan, subject, nick)')
|
db.execute('create table if not exists tag(chan, subject, nick)')
|
||||||
|
@ -100,7 +109,7 @@ def tag(inp, chan='', db=None):
|
||||||
if retrieve:
|
if retrieve:
|
||||||
search_tag = retrieve.group(1)
|
search_tag = retrieve.group(1)
|
||||||
if search_tag:
|
if search_tag:
|
||||||
return get_nicks_by_tag(db, chan, search_tag)
|
return get_nicks_by_tagset(db, chan, search_tag)
|
||||||
else:
|
else:
|
||||||
return get_tag_counts_by_chan(db, chan)
|
return get_tag_counts_by_chan(db, chan)
|
||||||
if delete:
|
if delete:
|
||||||
|
|
Loading…
Reference in New Issue