public void rowUpdated( final Rule rule, final LeftTuple resultLeftTuple, final PropagationContext context, final InternalWorkingMemory workingMemory) { RightTuple rightTuple = (RightTuple) resultLeftTuple.getObject(); if (rightTuple.getMemory() != null) { // Already sheduled as an insert return; } rightTuple.setLeftTuple(null); resultLeftTuple.setObject(null); // We need to recopy everything back again, as we don't know what has or hasn't changed QueryTerminalNode node = (QueryTerminalNode) resultLeftTuple.getLeftTupleSink(); Declaration[] decls = node.getDeclarations(); InternalFactHandle rootHandle = resultLeftTuple.get(0); DroolsQuery query = (DroolsQuery) rootHandle.getObject(); Object[] objects = new Object[query.getElements().length]; Declaration decl; for (int i = 0, length = this.variables.length; i < length; i++) { decl = decls[this.variables[i]]; objects[this.variables[i]] = decl.getValue(workingMemory, resultLeftTuple.get(decl).getObject()); } QueryElementFactHandle handle = (QueryElementFactHandle) rightTuple.getFactHandle(); handle.setRecency(workingMemory.getFactHandleFactory().getAtomicRecency().incrementAndGet()); handle.setObject(objects); if (query.isOpen()) { rightTuple.setLeftTuple(resultLeftTuple); resultLeftTuple.setObject(rightTuple); } // Don't need to recreate child links, as they will already be there form the first "add" RightTupleList rightTuples = query.getResultUpdateRightTupleList(); if (rightTuples == null) { rightTuples = new RightTupleList(); query.setResultUpdateRightTupleList(rightTuples); QueryResultUpdateAction updateAction = new QueryResultUpdateAction(context, this.factHandle, leftTuple, this.node); context.getQueue2().addFirst(updateAction); } rightTuples.add(rightTuple); }
public void rowAdded( final Rule rule, LeftTuple resultLeftTuple, PropagationContext context, InternalWorkingMemory workingMemory) { QueryTerminalNode node = (QueryTerminalNode) resultLeftTuple.getLeftTupleSink(); Declaration[] decls = node.getDeclarations(); DroolsQuery query = (DroolsQuery) this.factHandle.getObject(); Object[] objects = new Object[query.getElements().length]; Declaration decl; for (int i = 0, length = this.variables.length; i < length; i++) { decl = decls[this.variables[i]]; objects[this.variables[i]] = decl.getValue(workingMemory, resultLeftTuple.get(decl).getObject()); } QueryElementFactHandle resultHandle = createQueryResultHandle(context, workingMemory, objects); RightTuple rightTuple = new RightTuple(resultHandle); if (query.isOpen()) { rightTuple.setLeftTuple(resultLeftTuple); resultLeftTuple.setObject(rightTuple); } this.node .getSinkPropagator() .createChildLeftTuplesforQuery( this.leftTuple, rightTuple, true, // this must always be true, otherwise we can't // find the child tuples to iterate for evaluating the query results query.isOpen()); RightTupleList rightTuples = query.getResultInsertRightTupleList(); if (rightTuples == null) { rightTuples = new RightTupleList(); query.setResultInsertRightTupleList(rightTuples); QueryResultInsertAction evalAction = new QueryResultInsertAction(context, this.factHandle, leftTuple, this.node); context.getQueue2().addFirst(evalAction); } rightTuples.add(rightTuple); }