Add ReactivateBlock in Rete Matcher to correctly handle reactivation. Fixes MPSCR-17
This commit is contained in:
parent
32a1ef77c9
commit
f96155496f
|
|
@ -291,6 +291,24 @@ internal class ReteRuleMatcherImpl(private var ruleLookup: RuleLookup,
|
||||||
occurrence !== occ && from.containsOccurrence(occ) // reference neq!
|
occurrence !== occ && from.containsOccurrence(occ) // reference neq!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inner class ReactivateBlock (occurrence: Occurrence, val from: Layer) : DelayedBlock(occurrence) {
|
||||||
|
|
||||||
|
override fun proto(): Layer? = null
|
||||||
|
|
||||||
|
override fun complete(droppedFootprint: Footprint?, sink: (ReteNode) -> Unit) {
|
||||||
|
if (droppedFootprint?.contains(occurrence.identity) ?: false) return
|
||||||
|
|
||||||
|
for (n in from.allNodes(droppedFootprint)) {
|
||||||
|
if (n.containsOccurrence(occurrence)) {
|
||||||
|
sink(n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun containsOccurrence(occ: Occurrence): Boolean =
|
||||||
|
occurrence === occ || from.containsOccurrence(occ) // reference eq!
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collection of [Layer] instances.
|
* Collection of [Layer] instances.
|
||||||
* The new layers are prepended to the [layers] list.
|
* The new layers are prepended to the [layers] list.
|
||||||
|
|
@ -315,14 +333,18 @@ internal class ReteRuleMatcherImpl(private var ruleLookup: RuleLookup,
|
||||||
|
|
||||||
var lastLayer: Layer? = null
|
var lastLayer: Layer? = null
|
||||||
for (currLayer in layers) {
|
for (currLayer in layers) {
|
||||||
if (!currLayer.final) {
|
// `!reactivated` is to avoid adding new IntroBlock for InitialNode-s on reactivated
|
||||||
|
if (!currLayer.final && !reactivated) {
|
||||||
newLayers.add(Layer(
|
newLayers.add(Layer(
|
||||||
currLayer.vacancies - 1,
|
currLayer.vacancies - 1,
|
||||||
IntroBlock(occurrence, headPosMask, currLayer),
|
IntroBlock(occurrence, headPosMask, currLayer),
|
||||||
lastLayer))
|
lastLayer))
|
||||||
|
|
||||||
} else if (reactivated) {
|
} else if (currLayer.final && reactivated) {
|
||||||
newLayers.add(currLayer)
|
newLayers.add(Layer(
|
||||||
|
currLayer.vacancies, // == 0
|
||||||
|
ReactivateBlock(occurrence, currLayer),
|
||||||
|
lastLayer))
|
||||||
}
|
}
|
||||||
|
|
||||||
lastLayer = currLayer
|
lastLayer = currLayer
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue