public void modifyLeftTuple( LeftTuple leftTuple, PropagationContext context, InternalWorkingMemory workingMemory) { boolean executeAsOpenQuery = openQuery; if (executeAsOpenQuery) { // There is no point in doing an open query if the caller is a non-open query. Object object = ((InternalFactHandle) leftTuple.get(0)).getObject(); if (object instanceof DroolsQuery && !((DroolsQuery) object).isOpen()) { executeAsOpenQuery = false; } } if (!executeAsOpenQuery) { // Was never open so execute as a retract + assert if (leftTuple.getFirstChild() != null) { this.sink.propagateRetractLeftTuple(leftTuple, context, workingMemory); } assertLeftTuple(leftTuple, context, workingMemory); return; } InternalFactHandle handle = (InternalFactHandle) leftTuple.getObject(); DroolsQuery queryObject = (DroolsQuery) handle.getObject(); if (queryObject.getAction() != null) { // we already have an insert scheduled for this query, but have re-entered it // do nothing return; } Object[] argTemplate = this.queryElement.getArgTemplate(); // an array of declr, variable and literals Object[] args = new Object[argTemplate.length]; // the actual args, to be created from the template // first copy everything, so that we get the literals. We will rewrite the declarations and // variables next System.arraycopy(argTemplate, 0, args, 0, args.length); int[] declIndexes = this.queryElement.getDeclIndexes(); for (int i = 0, length = declIndexes.length; i < length; i++) { Declaration declr = (Declaration) argTemplate[declIndexes[i]]; Object tupleObject = leftTuple.get(declr).getObject(); Object o; if (tupleObject instanceof DroolsQuery) { // If the query passed in a Variable, we need to use it ArrayElementReader arrayReader = (ArrayElementReader) declr.getExtractor(); if (((DroolsQuery) tupleObject).getVariables()[arrayReader.getIndex()] != null) { o = Variable.v; } else { o = declr.getValue(workingMemory, tupleObject); } } else { o = declr.getValue(workingMemory, tupleObject); } args[declIndexes[i]] = o; } int[] varIndexes = this.queryElement.getVariableIndexes(); for (int i = 0, length = varIndexes.length; i < length; i++) { if (argTemplate[varIndexes[i]] == Variable.v) { // Need to check against the arg template, as the varIndexes also includes re-declared // declarations args[varIndexes[i]] = Variable.v; } } queryObject.setParameters(args); ((UnificationNodeViewChangedEventListener) queryObject.getQueryResultCollector()) .setVariables(varIndexes); QueryUpdateAction action = new QueryUpdateAction(context, handle, leftTuple, this); context.getQueue1().addFirst(action); }
public DroolsQuery createDroolsQuery( LeftTuple leftTuple, InternalFactHandle handle, InternalWorkingMemory workingMemory) { Object[] argTemplate = this.queryElement.getArgTemplate(); // an array of declr, variable and literals Object[] args = new Object[argTemplate.length]; // the actual args, to be created from the template // first copy everything, so that we get the literals. We will rewrite the declarations and // variables next System.arraycopy(argTemplate, 0, args, 0, args.length); int[] declIndexes = this.queryElement.getDeclIndexes(); for (int i = 0, length = declIndexes.length; i < length; i++) { Declaration declr = (Declaration) argTemplate[declIndexes[i]]; Object tupleObject = leftTuple.get(declr).getObject(); Object o; if (tupleObject instanceof DroolsQuery) { // If the query passed in a Variable, we need to use it ArrayElementReader arrayReader = (ArrayElementReader) declr.getExtractor(); if (((DroolsQuery) tupleObject).getVariables()[arrayReader.getIndex()] != null) { o = Variable.v; } else { o = declr.getValue(workingMemory, tupleObject); } } else { o = declr.getValue(workingMemory, tupleObject); } args[declIndexes[i]] = o; } int[] varIndexes = this.queryElement.getVariableIndexes(); for (int i = 0, length = varIndexes.length; i < length; i++) { if (argTemplate[varIndexes[i]] == Variable.v) { // Need to check against the arg template, as the varIndexes also includes re-declared // declarations args[varIndexes[i]] = Variable.v; } } UnificationNodeViewChangedEventListener collector = new UnificationNodeViewChangedEventListener( leftTuple, varIndexes, this, this.tupleMemoryEnabled); boolean executeAsOpenQuery = openQuery; if (executeAsOpenQuery) { // There is no point in doing an open query if the caller is a non-open query. Object object = ((InternalFactHandle) leftTuple.get(0)).getObject(); if (object instanceof DroolsQuery && !((DroolsQuery) object).isOpen()) { executeAsOpenQuery = false; } } DroolsQuery queryObject = new DroolsQuery(this.queryElement.getQueryName(), args, collector, executeAsOpenQuery); collector.setFactHandle(handle); handle.setObject(queryObject); leftTuple.setObject(handle); // so it can be retracted later and destroyed return queryObject; }