def _toAtomSequence(aSequence): prevMultifieldCount = 0 returnSequence = [] for fieldIndex, fieldContent in enumerate(aSequence): atomLocation = AtomLocation() isMultiField = _isMultifield(fieldContent) if prevMultifieldCount and isMultiField: raise MyClipsException("Two multifields in a single expression found!") # calculate position from the end if prevMultifieldCount == 0: atomLocation.beginIndex = fieldIndex atomLocation.fromBegin = True if prevMultifieldCount > 0 or isMultiField : atomLocation.endIndex = len(aSequence) - fieldIndex - 1 atomLocation.fromEnd = True if isMultiField: prevMultifieldCount += 1 atomLocation.isMultiField = True returnSequence.append((atomLocation, fieldContent)) return returnSequence
def _patternToAtomLocations(aPatternCE, patternIndex): if isinstance(aPatternCE, types.OrderedPatternCE): returnSequence = _toAtomSequence(aPatternCE.constraints) for atomLocation, _ in returnSequence: atomLocation.patternIndex = patternIndex return returnSequence elif isinstance(aPatternCE, types.TemplatePatternCE): returnSequence = [] for slot in aPatternCE.templateSlots: if isinstance(slot, types.SingleFieldLhsSlot): # easy to handle: convert the location to a atom location with a field element atomLocation = AtomLocation() atomLocation.slotName = slot.slotName atomLocation.fullSlot = True atomLocation.patternIndex = patternIndex returnSequence.append((atomLocation, slot.slotValue)) else: multifieldSequence = _toAtomSequence(slot.slotValue) for atomLocation, _ in multifieldSequence: atomLocation.patternIndex = patternIndex atomLocation.slotName = slot.slotName returnSequence += multifieldSequence return returnSequence else: raise ValueError("Invalid aPatternCE types: %s"%aPatternCE.__class__.__name__)