Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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)
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
def get_or_create(name):
    return _get_or_create(d.get_search_tag(name))