예제 #1
0
def i_optional_att_group_cardinality(ss: Substrate, max_: unlimitedNat, qore: Quads_or_Error) -> Set(sctIdGroup):
    if quad_direction(qore) == source_direction:
        return Set(sctIdGroup)(minus([sctIdGroup(rel.s, quadGroup(rel)) for rel in ss.relationships],
                                     union([sctIdGroup(q.s, quadGroup(q)) for q in quads_for(qore).v],
                                           i_required_att_group_cardinality(N(0), max_, qore))))
    else:
        return Set(sctIdGroup)(
            minus([sctIdGroup(rel.t.t_sctid, quadGroup(rel)) for rel in ss.relationships if rel.t.inran('t_sctid')],
                  union([sctIdGroup(q.t.t_sctid, quadGroup(q)) for q in quads_for(qore).v],
                        i_required_att_group_cardinality(N(0), max_, qore))))
예제 #2
0
def i_attributeSet(ss: Substrate, attset: attributeSet) -> Sctids_or_Error:
    lhs = i_subAttributeSet(ss, attset.first)
    rhs = attset.second
    if rhs.is_empty or lhs.inran('error'):
        return lhs
    elif rhs.head.inran('attset_conjattset'):
        return intersect(lhs, i_conjunctionAttributeSet(ss, rhs.head.attset_conjattset))
    else:
        return union(lhs, i_disjunctionAttributeSet(ss, rhs.head.attset_disjattset))
예제 #3
0
def i_refinement(ss: Substrate, rfnment: refinement) -> Sctids_or_Error:
    lhs = i_subRefinement(ss, rfnment.first)
    rhs = rfnment.second
    # TODO - the "or" below is a change to page 17 of the spec
    if rhs.is_empty or lhs.inran('error'):
        return lhs
    if rhs.head.inran('refine_conjset'):
        return intersect(lhs, i_conjunctionRefinementSet(ss, rhs.head.refine_conjset))
    else:
        return union(lhs, i_disjunctionRefinementSet(ss, rhs.head.refine_disjset))
예제 #4
0
def i_disjunctionAttributeSet(ss: Substrate, disjset: disjunctionAttributeSet) -> Sctids_or_Error:
    return i_subAttributeSet(ss, disjset.head) if disjset.tail.is_empty else \
           union(i_subAttributeSet(ss, disjset.head), i_disjunctionAttributeSet(ss, disjset.tail))
예제 #5
0
def i_disjunctionRefinementSet(ss: Substrate, disjset: disjunctionRefinementSet) -> Sctids_or_Error:
    return i_subRefinement(ss, disjset.head) if disjset.tail.is_empty else \
           union(i_subRefinement(ss, disjset.head), i_conjunctionRefinementSet(ss, disjset.tail))
예제 #6
0
 def test_empty_seq(self):
     x = Sctids_or_Error(ok=RF2_Substrate().refsets(16))
     print(union(x, x))