/** * Check the consistency of the node. */ public boolean checkNodeConsistency(ReteMemory mem) { boolean consistent = true; Collection tuples = getNodeMemory(mem); Collection objects = getObjectSource().getNodeMemory(mem); if(tuples!=null) { for(Iterator it=tuples.iterator(); consistent && it.hasNext(); ) { Tuple tuple = (Tuple)it.next(); consistent = objects.contains(tuple.getObject()); } } Object node = this; while(node instanceof IObjectConsumerNode) node = ((IObjectConsumerNode)node).getObjectSource(); ((ReteNode)node).checked.add(this); return consistent; } }
/** * Modify a tuple in this node. * @param left The tuple. */ public void modifyTuple(Tuple left, int tupleindex, OAVAttributeType type, Object oldvalue, Object newvalue, IOAVState state, ReteMemory mem, AbstractAgenda agenda) { if(!getRelevantAttributes().contains(type)) return; super.modifyTuple(left, tupleindex, type, oldvalue, newvalue, state, mem, agenda); if(!isAffected(type)) { Collection omem = fetchObjectMemory(state, left, mem); if(omem!=null) { for(Iterator it=omem.iterator(); it.hasNext(); ) { Object right = it.next(); boolean contains = isMatchContained(state, left, right, mem); // Tuple changed in memory -> propagate modification if(contains) propagateModification(left, right, tupleindex, type, oldvalue, newvalue, state, mem, agenda); } } } }
/** * Propagate an object change to this node. * @param right The new object. */ public void modifyObject(Object right, OAVAttributeType type, Object oldvalue, Object newvalue, IOAVState state, ReteMemory mem, AbstractAgenda agenda) { if(!getRelevantAttributes().contains(type)) return; super.modifyObject(right, type, oldvalue, newvalue, state, mem, agenda); if(!isAffected(type)) { Collection tmem = fetchTupleMemory(state, right, mem); if(tmem!=null) { for(Iterator it=tmem.iterator(); it.hasNext(); ) { Tuple left = (Tuple)it.next(); boolean contains = isMatchContained(state, left, right, mem); // Tuple changed in memory -> propagate modification if(contains) propagateModification(left, right, left.size(), type, oldvalue, newvalue, state, mem, agenda); } } } }
&& ((ITupleSourceNode)context.getLastBetaNode()).getTupleConsumers()==null &&!(context.getLastBetaNode() instanceof NotNode) && (((BetaNode)context.getLastBetaNode()).getTupleSource()==leftnode || ((BetaNode)context.getLastBetaNode()).getTupleSource() instanceof LeftInputAdapterNode && ((LeftInputAdapterNode)((BetaNode)context.getLastBetaNode()).getTupleSource()).getObjectSource()==leftnode)) beta.getTupleSource().removeTupleConsumer(beta); IObjectSourceNode osource = beta.getObjectSource(); osource.removeObjectConsumer(beta); context.setLastBetaNode(beta.getTupleSource()); context.setLastAlphaNode(osource); addNotNode(beta.getConstraintEvaluators(), beta.getConstraintIndexers(), tuplecnt, context);
if(bnode.getObjectSource()==context.getLastAlphaNode() && Arrays.equals(evas, bnode.getConstraintEvaluators()) && Arrays.equals(ids, bnode.getConstraintIndexers())) node = new BetaNode(context.getRootNode().getNextNodeId(), evas, ids); connectLeft(context.getLastBetaNode(), node, context); connectRight(context.getLastAlphaNode(), node, context);
INode left = ((BetaNode)nodes[n]).getTupleSource(); INode right = ((BetaNode)nodes[n]).getObjectSource(); if(left!=null && right!=null)
&& ((ITupleSourceNode)context.getLastBetaNode()).getTupleConsumers()==null &&!(context.getLastBetaNode() instanceof NotNode) && (((BetaNode)context.getLastBetaNode()).getTupleSource()==leftnode || ((BetaNode)context.getLastBetaNode()).getTupleSource() instanceof LeftInputAdapterNode && ((LeftInputAdapterNode)((BetaNode)context.getLastBetaNode()).getTupleSource()).getObjectSource()==leftnode)) beta.getTupleSource().removeTupleConsumer(beta); IObjectSourceNode osource = beta.getObjectSource(); osource.removeObjectConsumer(beta); context.setLastBetaNode(beta.getTupleSource()); context.setLastAlphaNode(osource); addNotNode(beta.getConstraintEvaluators(), beta.getConstraintIndexers(), tuplecnt, context);
if(bnode.getObjectSource()==context.getLastAlphaNode() && Arrays.equals(evas, bnode.getConstraintEvaluators()) && Arrays.equals(ids, bnode.getConstraintIndexers())) node = new BetaNode(context.getRootNode().getNextNodeId(), evas, ids); connectLeft(context.getLastBetaNode(), node, context); connectRight(context.getLastAlphaNode(), node, context);
/** * Propagate an object change to this node. * @param right The new object. */ public void modifyObject(Object right, OAVAttributeType type, Object oldvalue, Object newvalue, IOAVState state, ReteMemory mem, AbstractAgenda agenda) { if(!getRelevantAttributes().contains(type)) return; super.modifyObject(right, type, oldvalue, newvalue, state, mem, agenda); if(!isAffected(type)) { Collection tmem = fetchTupleMemory(state, right, mem); if(tmem!=null) { for(Iterator it=tmem.iterator(); it.hasNext(); ) { Tuple left = (Tuple)it.next(); boolean contains = isMatchContained(state, left, right, mem); // Tuple changed in memory -> propagate modification if(contains) propagateModification(left, right, left.size(), type, oldvalue, newvalue, state, mem, agenda); } } } }
/** * Modify a tuple in this node. * @param left The tuple. */ public void modifyTuple(Tuple left, int tupleindex, OAVAttributeType type, Object oldvalue, Object newvalue, IOAVState state, ReteMemory mem, AbstractAgenda agenda) { if(!getRelevantAttributes().contains(type)) return; super.modifyTuple(left, tupleindex, type, oldvalue, newvalue, state, mem, agenda); if(!isAffected(type)) { Collection omem = fetchObjectMemory(state, left, mem); if(omem!=null) { for(Iterator it=omem.iterator(); it.hasNext(); ) { Object right = it.next(); boolean contains = isMatchContained(state, left, right, mem); // Tuple changed in memory -> propagate modification if(contains) propagateModification(left, right, tupleindex, type, oldvalue, newvalue, state, mem, agenda); } } } }
/** * Check the consistency of the node. */ public boolean checkNodeConsistency(ReteMemory mem) { boolean consistent = true; Collection tuples = getNodeMemory(mem); Collection objects = getObjectSource().getNodeMemory(mem); if(tuples!=null) { for(Iterator it=tuples.iterator(); consistent && it.hasNext(); ) { Tuple tuple = (Tuple)it.next(); consistent = objects.contains(tuple.getObject()); } } Object node = this; while(node instanceof IObjectConsumerNode) node = ((IObjectConsumerNode)node).getObjectSource(); ((ReteNode)node).checked.add(this); return consistent; } }