def i_constraintOperator(ss: Substrate, oco: Optional(constraintOperator), input_: Sctids_or_Error) -> Sctids_or_Error:
    if input_.inran('error') or oco.is_empty:
        return input_
    input_ = input_.ok
    # TODO: Because we aren't doing equivalence, we can be sure (?) that the targets are always a singleton
    if oco.head == descendantOrSelfOf:
        rval = input_ | descendants_of(input_)
        # return Sctids_or_Error(ok=Set.SetInstance.bigcup(Set(sctId), [ss.descendants(id_) for id_ in
        #                                                               result_sctids(input_)]).union(result_sctids(input_)))
    elif oco.head == descendantOf:
        rval = descendants_of(input_)
        # return Sctids_or_Error(ok=Set.SetInstance.bigcup(Set(sctId), ss.descendants(result_sctids(input_))))
    elif oco.head == ancestorOrSelfOf:
        rval = input_ | ancestors_of(input_)
        # return Sctids_or_Error(ok=Set.SetInstance.bigcup(Set(sctId), [ss.ancestors(id_) for id_ in
        #                                                               result_sctids(input_)]).union(result_sctids(input_)))
    else:
        rval = ancestors_of(input_)
        # return Sctids_or_Error(ok=Set.SetInstance.bigcup(Set(sctId), [ss.ancestors(id_) for id_ in result_sctids(input_)]))
    return Sctids_or_Error(ok=rval)
 def test_attribute_and_attribute_group_cardinalities_1(self):
     # < 404684003 |clinical finding|:
     # [0..0] {[2..*] 363698007 |finding site| = < 91723000 |anatomical structure|}
     ai = Sctids(363698007)
     dos = descendants_of(Sctids(91723000))
     b = Quads(rf=False, atts=ai, eq=True, ecv=dos)
     bic = b.i_required_att_group_cardinality(2, many, False)
     self.assertEqual("SELECT DISTINCT idg.id, idg.gid FROM (SELECT DISTINCT rac_1.sourceId AS id, rac_1.gid FROM"
                      " (SELECT sourceId, gid, count(rid) AS cnt FROM (SELECT id AS rid, sourceId AS id, typeId, "
                      "destinationId, gid FROM relationship_ss_ext WHERE typeId IN (SELECT id FROM concept_ss WHERE"
                      " active=1  AND locked = 0 AND (id IN (363698007))) AND destinationId IN (SELECT DISTINCT "
                      "tt1.child AS id FROM transitive_ss AS tt1 JOIN (SELECT id FROM concept_ss WHERE active=1  AND"
                      " locked = 0 AND (id IN (91723000))) AS tt2 ON tt1.parent = tt2.id WHERE tt1.locked = 0) AND "
                      "active=1 AND locked=0) AS rac_2 GROUP BY sourceId, gid) AS rac_1 WHERE  rac_1.cnt >= 2 ) "
                      "AS idg", bic.as_sql())
    def test_opt_cardinality(self):
        #
        # [0..1] 127489000 |has active ingredient| = < 105590001 |substance|
        att_i = Sctids(127489000)               # active ingredient
        desc_of_subst = descendants_of(Sctids(105590001))   # substance
        ais_i = Quads(rf=False, atts=att_i, eq=True, ecv=desc_of_subst)     # has active ingredient desc substance

        universe = Sctids()                                         # all active concepts
        self.assertEqual(313015, len(universe))                     # as of 20150131
        self.assertEqual(15419, len(ais_i.to_sctids()))
        universe_minus_ais_i = universe - ais_i.to_sctids()         # all concepts w/o active ingredient of substance
        self.assertEqual(313015 - 15419, len(universe_minus_ais_i))

        all_ais_i_minus_passing = ais_i.to_sctids() - ais_i.i_required_cardinality(0, unlimitedNat(num=1), False)
        self.assertEqual(2302, len(ais_i.i_required_cardinality(2, many, False)))  # Concepts with 2 or more
        self.assertEqual(2302, len(all_ais_i_minus_passing))        # all concepts minus at most one

        bi_should_be = universe - all_ais_i_minus_passing           # everything except those with at most 1
        self.assertEqual(313015 - 2302, len(bi_should_be))
        bi = ais_i.i_optional_cardinality(None, unlimitedNat(num=1), False)
        self.assertEqual(313015 - 2302, len(bi))