Search in sources :

Example 16 with KnowledgeHelper

use of org.drools.core.spi.KnowledgeHelper in project drools by kiegroup.

the class BaseMannersTest method getAssignFirstSeatRule.

/**
 * <pre>
 *    rule assignFirstSeat() {
 *        Context context;
 *        Guest guest;
 *        Count count;
 *        when {
 *            context : Context( state == Context.START_UP )
 *            guest : Guest()
 *            count : Count()
 *        } then {
 *            String guestName = guest.getName();
 *            drools.assert( new Seating( count.getValue(), 1, true, 1, guestName, 1, guestName) );
 *            drools.assert( new Path( count.getValue(), 1, guestName ) );
 *            count.setCount(  count.getValue() + 1 );
 *
 *            System.err.println( &quot;seat 1 &quot; + guest.getName() + &quot; );
 *
 *            context.setPath( Context.ASSIGN_SEATS );
 *        }
 *    }
 * </pre>
 *
 * @return
 * @throws InvalidRuleException
 */
private RuleImpl getAssignFirstSeatRule() throws InvalidRuleException {
    final RuleImpl rule = new RuleImpl("assignFirstSeat");
    // -----------
    // context : Context( state == Context.START_UP )
    // -----------
    final Pattern contextPattern = new Pattern(0, this.contextType, "context");
    contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.START_UP));
    rule.addPattern(contextPattern);
    final Declaration contextDeclaration = rule.getDeclaration("context");
    // -----------
    // guest: Guest()
    // -----------
    final Pattern guestPattern = new Pattern(1, this.guestType, "guest");
    rule.addPattern(guestPattern);
    final Declaration guestDeclaration = rule.getDeclaration("guest");
    // ------------
    // count : Count()
    // ------------
    final Pattern countPattern = new Pattern(2, this.countType, "count");
    rule.addPattern(countPattern);
    final Declaration countDeclaration = rule.getDeclaration("count");
    final Consequence consequence = new Consequence() {

        public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
            try {
                RuleImpl rule = drools.getRule();
                LeftTuple tuple = (LeftTuple) drools.getTuple();
                Guest guest = (Guest) drools.get(guestDeclaration);
                Context context = (Context) drools.get(contextDeclaration);
                Count count = (Count) drools.get(countDeclaration);
                String guestName = guest.getName();
                Seating seating = new Seating(count.getValue(), 0, true, 1, guestName, 1, guestName);
                drools.insert(seating);
                Path path = new Path(count.getValue(), 1, guestName);
                drools.insert(path);
                count.setValue(count.getValue());
                drools.update(tuple.get(countDeclaration), count);
                context.setState(Context.ASSIGN_SEATS);
                // drools.update( tuple.get( contextDeclaration ),
                // context );
                drools.update(tuple.get(contextDeclaration));
            // System.err.println( "assign first seat :  " + seating + " : " + path );
            } catch (Exception e) {
                e.printStackTrace();
                throw new ConsequenceException(e);
            }
        }

        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        }

        public void writeExternal(ObjectOutput out) throws IOException {
        }

        public String getName() {
            return "default";
        }
    };
    rule.setConsequence(consequence);
    return rule;
}
Also used : Pattern(org.drools.core.rule.Pattern) ObjectOutput(java.io.ObjectOutput) WorkingMemory(org.drools.core.WorkingMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) Consequence(org.drools.core.spi.Consequence) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) LeftTuple(org.drools.core.reteoo.LeftTuple) InvalidRuleException(org.drools.core.rule.InvalidRuleException) IOException(java.io.IOException) ConsequenceException(org.drools.core.spi.ConsequenceException) IntrospectionException(java.beans.IntrospectionException) KnowledgeHelper(org.drools.core.spi.KnowledgeHelper) Declaration(org.drools.core.rule.Declaration) ObjectInput(java.io.ObjectInput) ConsequenceException(org.drools.core.spi.ConsequenceException)

Example 17 with KnowledgeHelper

use of org.drools.core.spi.KnowledgeHelper in project drools by kiegroup.

the class BaseMannersTest method getPathDone.

/**
 * <pre>
 * rule pathDone() {
 *     Context context; Seating seating;
 *     when {
 *         context : Context( state == Context.MAKE_PATH )
 *         seating : Seating( pathDone == false )
 *     } then {
 *         seating.setPathDone( true );
 *         context.setName( Context.CHECK_DONE );
 *     }
 * }
 * </pre>
 *
 * @return
 * @throws InvalidRuleException
 */
private RuleImpl getPathDone() throws InvalidRuleException {
    final RuleImpl rule = new RuleImpl("pathDone");
    // -----------
    // context : Context( state == Context.MAKE_PATH )
    // -----------
    final Pattern contextPattern = new Pattern(0, this.contextType, "context");
    contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.MAKE_PATH));
    rule.addPattern(contextPattern);
    final Declaration contextDeclaration = rule.getDeclaration("context");
    // ---------------
    // seating : Seating( pathDone == false )
    // ---------------
    final Pattern seatingPattern = new Pattern(1, this.seatingType, "seating");
    seatingPattern.addConstraint(getLiteralConstraint(seatingPattern, "pathDone", false));
    rule.addPattern(seatingPattern);
    final Declaration seatingDeclaration = rule.getDeclaration("seating");
    // ------------
    // context.setName( Context.CHECK_DONE );
    // seating.setPathDone( true );
    // ------------
    final Consequence consequence = new Consequence() {

        public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
            try {
                RuleImpl rule = drools.getRule();
                LeftTuple tuple = (LeftTuple) drools.getTuple();
                Context context = (Context) drools.get(contextDeclaration);
                Seating seating = (Seating) drools.get(seatingDeclaration);
                seating.setPathDone(true);
                // if ( seating.getId() == 6 ) {
                // System.err.println( "pause" );
                // }
                drools.update(tuple.get(seatingDeclaration));
                context.setState(Context.CHECK_DONE);
                drools.update(tuple.get(contextDeclaration), context);
            // System.err.println( "path done" + seating );
            } catch (Exception e) {
                e.printStackTrace();
                throw new ConsequenceException(e);
            }
        }

        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        }

        public void writeExternal(ObjectOutput out) throws IOException {
        }

        public String getName() {
            return "default";
        }
    };
    rule.setConsequence(consequence);
    return rule;
}
Also used : Pattern(org.drools.core.rule.Pattern) ObjectOutput(java.io.ObjectOutput) WorkingMemory(org.drools.core.WorkingMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) Consequence(org.drools.core.spi.Consequence) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) LeftTuple(org.drools.core.reteoo.LeftTuple) InvalidRuleException(org.drools.core.rule.InvalidRuleException) IOException(java.io.IOException) ConsequenceException(org.drools.core.spi.ConsequenceException) IntrospectionException(java.beans.IntrospectionException) KnowledgeHelper(org.drools.core.spi.KnowledgeHelper) Declaration(org.drools.core.rule.Declaration) ObjectInput(java.io.ObjectInput) ConsequenceException(org.drools.core.spi.ConsequenceException)

Example 18 with KnowledgeHelper

use of org.drools.core.spi.KnowledgeHelper in project drools by kiegroup.

the class BaseMannersTest method getFindSeating.

/**
 * <pre>
 *    rule findSeating() {
 *       Context context;
 *       int seatingId, seatingPid;
 *       String seatingRightGuestName, leftGuestName;
 *       Sex rightGuestSex;
 *       Hobby rightGuestHobby;
 *       Count count;
 *
 *       when {
 *           context : Context( state == Context.ASSIGN_SEATS )
 *           Seating( seatingId:id, seatingPid:pid, pathDone == true
 *                    seatingRightSeat:rightSeat seatingRightGuestName:rightGuestName )
 *           Guest( name == seatingRightGuestName, rightGuestSex:sex, rightGuestHobby:hobby )
 *           Guest( leftGuestName:name , sex != rightGuestSex, hobby == rightGuestHobby )
 *
 *           count : Count()
 *
 *           not ( Path( id == seatingId, guestName == leftGuestName) )
 *           not ( Chosen( id == seatingId, guestName == leftGuestName, hobby == rightGuestHobby) )
 *       } then {
 *           int newSeat = rightSeat + 1;
 *           drools.assert( new Seating( coung.getValue(), rightSeat, rightSeatName, leftGuestName, newSeat, countValue, id, false );
 *           drools.assert( new Path( countValue, leftGuestName, newSeat );
 *           drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );
 *
 *           System.err.println( &quot;seat &quot; + rightSeat + &quot; &quot; + rightSeatName + &quot; &quot; + leftGuestName );
 *
 *           count.setCount(  countValue + 1 );
 *           context.setPath( Context.MAKE_PATH );
 *       }
 *    }
 * </pre>
 *
 * @return
 * @throws InvalidRuleException
 */
private RuleImpl getFindSeating() throws InvalidRuleException {
    final RuleImpl rule = new RuleImpl("findSeating");
    // ---------------
    // context : Context( state == Context.ASSIGN_SEATS )
    // ---------------
    final Pattern contextPattern = new Pattern(0, this.contextType, "context");
    contextPattern.addConstraint(getLiteralConstraint(contextPattern, "state", Context.ASSIGN_SEATS));
    rule.addPattern(contextPattern);
    final Declaration contextDeclaration = rule.getDeclaration("context");
    // -------------------------------
    // Seating( seatingId:id, seatingPid:pid, pathDone == true
    // seatingRightSeat:rightSeat seatingRightGuestName:rightGuestName )
    // -------------------------------
    final Pattern seatingPattern = new Pattern(1, this.seatingType);
    setFieldDeclaration(seatingPattern, "id", "seatingId");
    setFieldDeclaration(seatingPattern, "pid", "seatingPid");
    seatingPattern.addConstraint(getLiteralConstraint(seatingPattern, "pathDone", true));
    setFieldDeclaration(seatingPattern, "rightSeat", "seatingRightSeat");
    setFieldDeclaration(seatingPattern, "rightGuestName", "seatingRightGuestName");
    rule.addPattern(seatingPattern);
    final Declaration seatingIdDeclaration = rule.getDeclaration("seatingId");
    final Declaration seatingPidDeclaration = rule.getDeclaration("seatingPid");
    final Declaration seatingRightGuestNameDeclaration = rule.getDeclaration("seatingRightGuestName");
    final Declaration seatingRightSeatDeclaration = rule.getDeclaration("seatingRightSeat");
    // --------------
    // Guest( name == seatingRightGuestName, rightGuestSex:sex,
    // rightGuestHobby:hobby )
    // ---------------
    final Pattern rightGuestPattern = new Pattern(2, this.guestType);
    rightGuestPattern.addConstraint(getBoundVariableConstraint(rightGuestPattern, "name", seatingRightGuestNameDeclaration, "=="));
    setFieldDeclaration(rightGuestPattern, "sex", "rightGuestSex");
    setFieldDeclaration(rightGuestPattern, "hobby", "rightGuestHobby");
    rule.addPattern(rightGuestPattern);
    final Declaration rightGuestSexDeclaration = rule.getDeclaration("rightGuestSex");
    final Declaration rightGuestHobbyDeclaration = rule.getDeclaration("rightGuestHobby");
    // ----------------
    // Guest( leftGuestName:name , sex != rightGuestSex, hobby ==
    // rightGuestHobby )
    // ----------------
    final Pattern leftGuestPattern = new Pattern(3, this.guestType);
    setFieldDeclaration(leftGuestPattern, "name", "leftGuestName");
    leftGuestPattern.addConstraint(getBoundVariableConstraint(rightGuestPattern, "hobby", rightGuestHobbyDeclaration, "=="));
    leftGuestPattern.addConstraint(getBoundVariableConstraint(leftGuestPattern, "sex", rightGuestSexDeclaration, "!="));
    rule.addPattern(leftGuestPattern);
    final Declaration leftGuestNameDeclaration = rule.getDeclaration("leftGuestName");
    // ---------------
    // count : Count()
    // ---------------
    final Pattern count = new Pattern(4, this.countType, "count");
    rule.addPattern(count);
    final Declaration countDeclaration = rule.getDeclaration("count");
    // --------------
    // not ( Path( id == seatingId, guestName == leftGuestName) )
    // --------------
    final Pattern notPathPattern = new Pattern(5, this.pathType);
    notPathPattern.addConstraint(getBoundVariableConstraint(notPathPattern, "id", seatingIdDeclaration, "=="));
    notPathPattern.addConstraint(getBoundVariableConstraint(notPathPattern, "guestName", leftGuestNameDeclaration, "=="));
    final GroupElement notPath = GroupElementFactory.newNotInstance();
    notPath.addChild(notPathPattern);
    rule.addPattern(notPath);
    // ------------
    // not ( Chosen( id == seatingId, guestName == leftGuestName, hobby ==
    // rightGuestHobby ) )
    // ------------
    final Pattern notChosenPattern = new Pattern(6, this.chosenType);
    notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "id", seatingIdDeclaration, "=="));
    notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "guestName", leftGuestNameDeclaration, "=="));
    notChosenPattern.addConstraint(getBoundVariableConstraint(notChosenPattern, "hobby", rightGuestHobbyDeclaration, "=="));
    final GroupElement notChosen = GroupElementFactory.newNotInstance();
    notChosen.addChild(notChosenPattern);
    rule.addPattern(notChosen);
    // ------------
    // int newSeat = rightSeat + 1;
    // drools.assert( new Seating( coung.getValue(), rightSeat,
    // rightSeatName, leftGuestName, newSeat, countValue, id, false );
    // drools.assert( new Path( countValue, leftGuestName, newSeat );
    // drools.assert( new Chosen( id, leftGuestName, rightGuestHobby ) );
    // 
    // System.err.println( "seat " + rightSeat + " " + rightSeatName + " " +
    // leftGuestName );
    // 
    // count.setCount( countValue + 1 );
    // context.setPath( Context.MAKE_PATH );
    // ------------
    final Consequence consequence = new Consequence() {

        public void evaluate(KnowledgeHelper drools, WorkingMemory workingMemory) throws ConsequenceException {
            try {
                // MemoryVisitor visitor = new MemoryVisitor( ( InternalWorkingMemory ) workingMemory );
                // visitor.visit( workingMemory.getRuleBase() );
                RuleImpl rule = drools.getRule();
                LeftTuple tuple = (LeftTuple) drools.getTuple();
                Context context = (Context) drools.get(contextDeclaration);
                Count count = (Count) drools.get(countDeclaration);
                int seatId = seatingIdDeclaration.getExtractor().getIntValue((InternalWorkingMemory) workingMemory, tuple.get(seatingIdDeclaration).getObject());
                int seatingRightSeat = seatingRightSeatDeclaration.getExtractor().getIntValue((InternalWorkingMemory) workingMemory, tuple.get(seatingRightSeatDeclaration).getObject());
                String leftGuestName = (String) drools.get(leftGuestNameDeclaration);
                String rightGuestName = (String) drools.get(seatingRightGuestNameDeclaration);
                Hobby rightGuestHobby = (Hobby) drools.get(rightGuestHobbyDeclaration);
                Seating seating = new Seating(count.getValue(), seatId, false, seatingRightSeat, rightGuestName, seatingRightSeat + 1, leftGuestName);
                drools.insert(seating);
                Path path = new Path(count.getValue(), seatingRightSeat + 1, leftGuestName);
                drools.insert(path);
                Chosen chosen = new Chosen(seatId, leftGuestName, rightGuestHobby);
                drools.insert(chosen);
                count.setValue(count.getValue() + 1);
                // if ( count.getValue() == 5 ) {
                // drools.retractObject( tuple.getFactHandleForDeclaration( countDeclaration ) );
                // } else {
                // drools.update( tuple.getFactHandleForDeclaration( countDeclaration ),
                // count );
                // }
                drools.update(tuple.get(countDeclaration), count);
                context.setState(Context.MAKE_PATH);
                drools.update(tuple.get(contextDeclaration), context);
                System.err.println("find seating : " + seating + " : " + path + " : " + chosen);
            } catch (Exception e) {
                e.printStackTrace();
                throw new ConsequenceException(e);
            }
        }

        public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        }

        public void writeExternal(ObjectOutput out) throws IOException {
        }

        public String getName() {
            return "default";
        }
    };
    rule.setConsequence(consequence);
    return rule;
}
Also used : Pattern(org.drools.core.rule.Pattern) ObjectOutput(java.io.ObjectOutput) WorkingMemory(org.drools.core.WorkingMemory) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) GroupElement(org.drools.core.rule.GroupElement) Consequence(org.drools.core.spi.Consequence) RuleImpl(org.drools.core.definitions.rule.impl.RuleImpl) LeftTuple(org.drools.core.reteoo.LeftTuple) BetaNodeFieldConstraint(org.drools.core.spi.BetaNodeFieldConstraint) AlphaNodeFieldConstraint(org.drools.core.spi.AlphaNodeFieldConstraint) InvalidRuleException(org.drools.core.rule.InvalidRuleException) IOException(java.io.IOException) ConsequenceException(org.drools.core.spi.ConsequenceException) IntrospectionException(java.beans.IntrospectionException) KnowledgeHelper(org.drools.core.spi.KnowledgeHelper) Declaration(org.drools.core.rule.Declaration) ObjectInput(java.io.ObjectInput) ConsequenceException(org.drools.core.spi.ConsequenceException)

Example 19 with KnowledgeHelper

use of org.drools.core.spi.KnowledgeHelper in project drools by kiegroup.

the class RuleExecutor method innerFireActivation.

private void innerFireActivation(InternalWorkingMemory wm, InternalAgenda agenda, Activation activation, Consequence consequence) {
    try {
        KnowledgeHelper knowledgeHelper = agenda.getKnowledgeHelper();
        knowledgeHelper.setActivation(activation);
        if (log.isTraceEnabled()) {
            log.trace("Fire event {} for rule \"{}\" \n{}", consequence.getName(), activation.getRule().getName(), activation.getTuple());
        }
        wm.getRuleEventSupport().onBeforeMatchFire(activation);
        consequence.evaluate(knowledgeHelper, wm);
        wm.getRuleEventSupport().onAfterMatchFire(activation);
        activation.setActive(false);
        knowledgeHelper.cancelRemainingPreviousLogicalDependencies();
        knowledgeHelper.reset();
    } catch (final Exception e) {
        agenda.handleException(wm, activation, e);
    } finally {
        if (activation.getActivationFactHandle() != null) {
            // update the Activation in the WM
            InternalFactHandle factHandle = activation.getActivationFactHandle();
            wm.getEntryPointNode().modifyActivation(factHandle, activation.getPropagationContext(), wm);
        }
    }
}
Also used : KnowledgeHelper(org.drools.core.spi.KnowledgeHelper) InternalFactHandle(org.drools.core.common.InternalFactHandle) ConsequenceException(org.drools.core.spi.ConsequenceException)

Example 20 with KnowledgeHelper

use of org.drools.core.spi.KnowledgeHelper in project drools by kiegroup.

the class ConsequenceGenerator method generate.

public static void generate(final ConsequenceStub stub, KnowledgeHelper knowledgeHelper, WorkingMemory workingMemory) {
    RuleTerminalNode rtn = (RuleTerminalNode) knowledgeHelper.getMatch().getTuple().getTupleSink();
    final Declaration[] declarations = rtn.getRequiredDeclarations();
    final Tuple tuple = knowledgeHelper.getTuple();
    // Sort declarations based on their offset, so it can ascend the tuple's parents stack only once
    final List<DeclarationMatcher> declarationMatchers = matchDeclarationsToTuple(declarations);
    final ClassGenerator generator = createInvokerClassGenerator(stub, workingMemory).setInterfaces(Consequence.class, CompiledInvoker.class);
    generator.addMethod(ACC_PUBLIC, "getName", generator.methodDescr(String.class), new ClassGenerator.MethodBody() {

        public void body(MethodVisitor mv) {
            push(stub.getGeneratedInvokerClassName());
            mv.visitInsn(ARETURN);
        }
    }).addMethod(ACC_PUBLIC, "evaluate", generator.methodDescr(null, KnowledgeHelper.class, WorkingMemory.class), new String[] { "java/lang/Exception" }, new GeneratorHelper.EvaluateMethod() {

        public void body(MethodVisitor mv) {
            // Tuple tuple = knowledgeHelper.getTuple();
            mv.visitVarInsn(ALOAD, 1);
            invokeInterface(KnowledgeHelper.class, "getTuple", Tuple.class);
            cast(LeftTuple.class);
            // LeftTuple
            mv.visitVarInsn(ASTORE, 3);
            // Declaration[] declarations = ((RuleTerminalNode)knowledgeHelper.getMatch().getTuple().getTupleSink()).getDeclarations();
            mv.visitVarInsn(ALOAD, 1);
            invokeInterface(KnowledgeHelper.class, "getMatch", Activation.class);
            invokeInterface(Activation.class, "getTuple", Tuple.class);
            invokeInterface(Tuple.class, "getTupleSink", Sink.class);
            cast(RuleTerminalNode.class);
            invokeVirtual(RuleTerminalNode.class, "getRequiredDeclarations", Declaration[].class);
            mv.visitVarInsn(ASTORE, 4);
            Tuple currentTuple = tuple;
            // astore start position for objects to store in loop
            objAstorePos = 6;
            int[] paramsPos = new int[declarations.length];
            // declarationMatchers is already sorted by offset with tip declarations now first
            for (DeclarationMatcher matcher : declarationMatchers) {
                // original index refers to the array position with RuleTerminalNode.getDeclarations()
                int i = matcher.getOriginalIndex();
                int handlePos = objAstorePos;
                int objPos = ++objAstorePos;
                paramsPos[i] = handlePos;
                currentTuple = traverseTuplesUntilDeclaration(currentTuple, matcher.getRootDistance(), 3);
                // handle = tuple.getFactHandle()
                mv.visitVarInsn(ALOAD, 3);
                invokeInterface(Tuple.class, "getOriginalFactHandle", InternalFactHandle.class);
                mv.visitVarInsn(ASTORE, handlePos);
                String declarationType = declarations[i].getTypeName();
                if (stub.getNotPatterns()[i]) {
                    // notPattern indexes field declarations
                    // declarations[i].getValue((InternalWorkingMemory)workingMemory, fact[i].getObject());
                    // org.kie.rule.Declaration[]
                    mv.visitVarInsn(ALOAD, 4);
                    // i
                    push(i);
                    // declarations[i]
                    mv.visitInsn(AALOAD);
                    // WorkingMemory
                    mv.visitVarInsn(ALOAD, 2);
                    cast(InternalWorkingMemory.class);
                    // handle[i]
                    mv.visitVarInsn(ALOAD, handlePos);
                    invokeInterface(InternalFactHandle.class, "getObject", Object.class);
                    storeObjectFromDeclaration(declarations[i], declarationType);
                    // The facthandle should be set to that of the field, if it's an object, otherwise this will return null
                    // fact[i] = (InternalFactHandle)workingMemory.getFactHandle(obj);
                    mv.visitVarInsn(ALOAD, 2);
                    loadAsObject(objPos);
                    invokeInterface(WorkingMemory.class, "getFactHandle", FactHandle.class, Object.class);
                    cast(InternalFactHandle.class);
                    mv.visitVarInsn(ASTORE, handlePos);
                } else {
                    // handle[i]
                    mv.visitVarInsn(ALOAD, handlePos);
                    invokeInterface(InternalFactHandle.class, "getObject", Object.class);
                    mv.visitTypeInsn(CHECKCAST, internalName(declarationType));
                    // obj[i]
                    objAstorePos += store(objPos, declarationType);
                }
            }
            // @{ruleClassName}.@{methodName}(KnowledgeHelper, @foreach{declr : declarations} Object, FactHandle @end)
            StringBuilder consequenceMethodDescr = new StringBuilder("(L" + KnowledgeHelper.class.getName().replace('.', '/') + ";");
            // KnowledgeHelper
            mv.visitVarInsn(ALOAD, 1);
            for (int i = 0; i < declarations.length; i++) {
                // obj[i]
                load(paramsPos[i] + 1);
                // handle[i]
                mv.visitVarInsn(ALOAD, paramsPos[i]);
                consequenceMethodDescr.append(typeDescr(declarations[i].getTypeName())).append("L" + FactHandle.class.getName().replace('.', '/') + ";");
            }
            // @foreach{type : globalTypes, identifier : globals} @{type} @{identifier} = ( @{type} ) workingMemory.getGlobal( "@{identifier}" );
            parseGlobals(stub.getGlobals(), stub.getGlobalTypes(), 2, consequenceMethodDescr);
            consequenceMethodDescr.append(")V");
            mv.visitMethodInsn(INVOKESTATIC, stub.getInternalRuleClassName(), stub.getMethodName(), consequenceMethodDescr.toString());
            mv.visitInsn(RETURN);
        }
    });
    stub.setConsequence(generator.<Consequence>newInstance());
}
Also used : InternalFactHandle(org.drools.core.common.InternalFactHandle) FactHandle(org.kie.api.runtime.rule.FactHandle) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) WorkingMemory(org.drools.core.WorkingMemory) Activation(org.drools.core.spi.Activation) DeclarationMatcher(org.drools.core.rule.builder.dialect.asm.GeneratorHelper.DeclarationMatcher) LeftTuple(org.drools.core.reteoo.LeftTuple) MethodVisitor(org.mvel2.asm.MethodVisitor) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) GeneratorHelper.createInvokerClassGenerator(org.drools.core.rule.builder.dialect.asm.GeneratorHelper.createInvokerClassGenerator) Sink(org.drools.core.reteoo.Sink) KnowledgeHelper(org.drools.core.spi.KnowledgeHelper) Declaration(org.drools.core.rule.Declaration) InternalFactHandle(org.drools.core.common.InternalFactHandle) GeneratorHelper.matchDeclarationsToTuple(org.drools.core.rule.builder.dialect.asm.GeneratorHelper.matchDeclarationsToTuple) LeftTuple(org.drools.core.reteoo.LeftTuple) Tuple(org.drools.core.spi.Tuple) RuleTerminalNode(org.drools.core.reteoo.RuleTerminalNode)

Aggregations

KnowledgeHelper (org.drools.core.spi.KnowledgeHelper)22 WorkingMemory (org.drools.core.WorkingMemory)19 RuleImpl (org.drools.core.definitions.rule.impl.RuleImpl)17 Consequence (org.drools.core.spi.Consequence)16 IOException (java.io.IOException)12 ObjectInput (java.io.ObjectInput)12 ObjectOutput (java.io.ObjectOutput)12 InternalWorkingMemory (org.drools.core.common.InternalWorkingMemory)12 Declaration (org.drools.core.rule.Declaration)12 Pattern (org.drools.core.rule.Pattern)12 LeftTuple (org.drools.core.reteoo.LeftTuple)8 ConsequenceException (org.drools.core.spi.ConsequenceException)8 IntrospectionException (java.beans.IntrospectionException)7 InternalFactHandle (org.drools.core.common.InternalFactHandle)7 KnowledgePackageImpl (org.drools.core.definitions.impl.KnowledgePackageImpl)7 InvalidRuleException (org.drools.core.rule.InvalidRuleException)7 ClassFieldAccessorCache (org.drools.core.base.ClassFieldAccessorCache)5 ClassObjectType (org.drools.core.base.ClassObjectType)5 RuleTerminalNode (org.drools.core.reteoo.RuleTerminalNode)5 ArrayList (java.util.ArrayList)4