def i_att_group_cardinality(ss: Substrate, ocard: Optional(cardinality), qore: Quads_or_Error) -> sctIdGroups_or_Error: if qore.inran('qerror'): return sctIdGroups_or_Error(error=qore.qerror) qv = quads_for(qore) rf = quad_direction(qore) == source_direction if ocard.is_empty: rval = qv.i_required_att_group_cardinality(N(1), many, rf) else: card = ocard.head if card.min_ > 0: rval = qv.i_required_att_group_cardinality(card.min_, card.max_, rf) else: rval = qv.i_optional_att_group_cardinality(ss, card.max_, rf) return sctIdGroups_or_Error(group_value=rval)
def i_groupAttribute(ss: Substrate, att: attribute) -> sctIdGroups_or_Error: att_sctids = i_attributeOperator(ss, att.attrOper, ss.i_attributeName(att.name)) if att_sctids.inran('error'): return sctIdGroups_or_Error(gerror=att_sctids.error) elif att.opValue.inran('attrib_expr'): expr_interp = i_expressionComparisonOperator(ss, att.rf, result_sctids(att_sctids), att.opValue.attrib_expr) return i_att_group_cardinality(ss, att.card, expr_interp) elif att.opValue.inran('attrib_num'): num_interp = i_numericComparsionOperator(ss, att.rf, result_sctids(att_sctids), att.opValue.attrib_num) return i_att_group_cardinality(ss, att.card, num_interp) else: str_interp = i_stringComparisonOperator(ss, att.rf, result_sctids(att_sctids), att.opValue.attrib_str) return i_att_group_cardinality(ss, att.card, str_interp)