def add_criterion(self, criterion): def add_nonempty(s, item): if item: s.add(item) find_modifier = _QUERY_FIND_MODIFIERS.get(criterion) if find_modifier: self.find = find_modifier return rating_modifier = _QUERY_RATING_MODIFIERS.get(criterion) if rating_modifier: self.ratings.add(rating_modifier) return if criterion.startswith(("user:"******"+user:"******":", 1)[1]) add_nonempty(self.required_user_includes, user) elif criterion.startswith("-user:"******":", 1)[1]) add_nonempty(self.required_user_excludes, user) elif criterion.startswith("+"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.required_includes, tag) elif criterion.startswith("-"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.required_excludes, tag) elif criterion.startswith("|"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.possible_includes, tag) else: tag = d.get_search_tag(criterion) add_nonempty(self.required_includes, tag)
def add_criterion(self, criterion): def add_nonempty(s, item): if item: s.add(item) find_modifier = _QUERY_FIND_MODIFIERS.get(criterion) if find_modifier: self.find = find_modifier return rating_modifier = _QUERY_RATING_MODIFIERS.get(criterion) if rating_modifier: self.ratings.add(rating_modifier) return if criterion.startswith(("user:"******"+user:"******":", 1)[1]) add_nonempty(self.required_user_includes, user) elif criterion.startswith("-user:"******":", 1)[1]) add_nonempty(self.required_user_excludes, user) elif criterion.startswith("+"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.required_includes, tag) elif criterion.startswith("-"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.required_excludes, tag) elif criterion.startswith("|"): tag = d.get_search_tag(criterion[1:]) add_nonempty(self.possible_includes, tag) else: tag = d.get_search_tag(criterion) add_nonempty(self.required_includes, tag)
def suggest(userid, target): if not target: return [] if userid: block = d.execute("SELECT tagid FROM blocktag WHERE userid = %i", [userid], options="within") query = list() target = d.get_search_tag(target) statement = ["SELECT title FROM searchtag WHERE title LIKE '%s%%'"] if userid and block: statement.append(" AND tagid NOT IN %s" % (d.sql_number_list(block),)) for i in d.execute("".join(statement + [" ORDER BY title LIMIT 10"]), [target], options="within"): query.append(i) statement = ["SELECT title FROM searchtag WHERE title LIKE '%%%s%%' AND title NOT LIKE '%s%%'"] if userid and block: statement.append(" AND tagid NOT IN %s" % (d.sql_number_list(block),)) for i in d.execute("".join(statement + [" ORDER BY title LIMIT 5"]), [target, target], options="within"): query.append(i) return query
def suggest(userid, target): if not target: return [] if userid: block = d.execute("SELECT tagid FROM blocktag WHERE userid = %i", [userid], options="within") query = list() target = d.get_search_tag(target) statement = ["SELECT title FROM searchtag WHERE title LIKE '%s%%'"] if userid and block: statement.append(" AND tagid NOT IN %s" % (d.sql_number_list(block),)) for i in d.execute("".join(statement + [" ORDER BY title LIMIT 10"]), [target], options="within"): query.append(i) statement = ["SELECT title FROM searchtag WHERE title LIKE '%%%s%%' AND title NOT LIKE '%s%%'"] if userid and block: statement.append(" AND tagid NOT IN %s" % (d.sql_number_list(block),)) for i in d.execute("".join(statement + [" ORDER BY title LIMIT 5"]), [target, target], options="within"): query.append(i) return query
def remove(userid, tagid=None, title=None): if tagid: d.execute("DELETE FROM blocktag WHERE (userid, tagid) = (%i, %i)", [userid, tagid]) elif title: d.execute("DELETE FROM blocktag WHERE (userid, tagid) = (%i, (SELECT tagid FROM searchtag WHERE title = '%s'))", [userid, d.get_search_tag(title)]) select_ids.invalidate(userid)
def parse_tags(text): tags = set() for i in _TAG_DELIMITER.split(text): tag = d.get_search_tag(i) if tag: tags.add(tag) return tags
def parse_tags(text): tags = set() for i in _TAG_DELIMITER.split(text): tag = d.get_search_tag(i) if tag: tags.add(tag) return tags
def remove(userid, tagid=None, title=None): if tagid: d.execute("DELETE FROM blocktag WHERE (userid, tagid) = (%i, %i)", [userid, tagid]) elif title: d.execute( "DELETE FROM blocktag WHERE (userid, tagid) = (%i, (SELECT tagid FROM searchtag WHERE title = '%s'))", [userid, d.get_search_tag(title)]) select_ids.invalidate(userid)
def get_or_create(name): name = d.get_search_tag(name) tag = d.engine.scalar( 'INSERT INTO searchtag (title) VALUES (%(name)s) ON CONFLICT (title) DO NOTHING RETURNING tagid', name=name) if tag is not None: return tag return d.engine.scalar( 'SELECT tagid FROM searchtag WHERE title = %(name)s', name=name)
def remove(userid, title): d.engine.execute( "DELETE FROM blocktag WHERE (userid, tagid) = (%(user)s, (SELECT tagid FROM searchtag WHERE title = %(tag)s))", user=userid, tag=d.get_search_tag(title), ) select_ids.invalidate(userid) from weasyl import index index.template_fields.invalidate(userid)
def get_or_create(name): name = d.get_search_tag(name) tag = d.engine.scalar( 'INSERT INTO searchtag (title) VALUES (%(name)s) ON CONFLICT (title) DO NOTHING RETURNING tagid', name=name) if tag is not None: return tag return d.engine.scalar( 'SELECT tagid FROM searchtag WHERE title = %(name)s', name=name)
def create(title): return d.engine.execute( "INSERT INTO searchtag (title) VALUES (%(tag_name)s) RETURNING tagid", tag_name=d.get_search_tag(title) ).scalar()
def get_or_create(name): return _get_or_create(d.get_search_tag(name))