Exemplo n.º 1
0
    def by_topic(self, query: Query, operand: str, maybe_negate: ConditionTransform) -> Query:
        if self.user_profile.realm.is_zephyr_mirror_realm:
            # MIT users expect narrowing to topic "foo" to also show messages to /^foo(.d)*$/
            # (foo, foo.d, foo.d.d, etc)
            m = re.search(r'^(.*?)(?:\.d)*$', operand, re.IGNORECASE)
            # Since the regex has a `.*` in it, this will always match
            assert(m is not None)
            base_topic = m.group(1)

            # Additionally, MIT users expect the empty instance and
            # instance "personal" to be the same.
            if base_topic in ('', 'personal', '(instance "")'):
                cond = or_(
                    topic_match_sa(""),
                    topic_match_sa(".d"),
                    topic_match_sa(".d.d"),
                    topic_match_sa(".d.d.d"),
                    topic_match_sa(".d.d.d.d"),
                    topic_match_sa("personal"),
                    topic_match_sa("personal.d"),
                    topic_match_sa("personal.d.d"),
                    topic_match_sa("personal.d.d.d"),
                    topic_match_sa("personal.d.d.d.d"),
                    topic_match_sa('(instance "")'),
                    topic_match_sa('(instance "").d'),
                    topic_match_sa('(instance "").d.d'),
                    topic_match_sa('(instance "").d.d.d'),
                    topic_match_sa('(instance "").d.d.d.d'),
                )
            else:
                # We limit `.d` counts, since postgres has much better
                # query planning for this than they do for a regular
                # expression (which would sometimes table scan).
                cond = or_(
                    topic_match_sa(base_topic),
                    topic_match_sa(base_topic + ".d"),
                    topic_match_sa(base_topic + ".d.d"),
                    topic_match_sa(base_topic + ".d.d.d"),
                    topic_match_sa(base_topic + ".d.d.d.d"),
                )
            return query.where(maybe_negate(cond))

        cond = topic_match_sa(operand)
        return query.where(maybe_negate(cond))
Exemplo n.º 2
0
 def mute_cond(row: Dict[str, Any]) -> ClauseElement:
     recipient_id = row["recipient_id"]
     topic_name = row["topic_name"]
     stream_cond = column("recipient_id") == recipient_id
     topic_cond = topic_match_sa(topic_name)
     return and_(stream_cond, topic_cond)
Exemplo n.º 3
0
 def mute_cond(row: RecipientTopicDict) -> ClauseElement:
     recipient_id = row["recipient_id"]
     topic_name = row["topic_name"]
     stream_cond = column("recipient_id", Integer) == recipient_id
     topic_cond = topic_match_sa(topic_name)
     return and_(stream_cond, topic_cond)
Exemplo n.º 4
0
 def mute_cond(row: Dict[str, Any]) -> Selectable:
     recipient_id = row['recipient_id']
     topic_name = row['topic_name']
     stream_cond = column("recipient_id") == recipient_id
     topic_cond = topic_match_sa(topic_name)
     return and_(stream_cond, topic_cond)
Exemplo n.º 5
0
 def mute_cond(row: Dict[str, Any]) -> Selectable:
     recipient_id = row['recipient_id']
     topic_name = row['topic_name']
     stream_cond = column("recipient_id") == recipient_id
     topic_cond = topic_match_sa(topic_name)
     return and_(stream_cond, topic_cond)