Search in sources :

Example 56 with Pattern

use of org.drools.core.rule.Pattern in project drools by kiegroup.

the class FromNode method initDeclaredMask.

@Override
protected void initDeclaredMask(BuildContext context, LeftTupleSource leftInput) {
    super.initDeclaredMask(context, leftInput);
    if (leftDeclaredMask.isAllSet()) {
        return;
    }
    if (context == null || context.getLastBuiltPatterns() == null) {
        // only happens during unit tests
        leftDeclaredMask = AllSetBitMask.get();
        return;
    }
    Pattern pattern = context.getLastBuiltPatterns()[1];
    if (pattern == null) {
        return;
    }
    ObjectType objectType = pattern.getObjectType();
    // if pattern is null (e.g. for eval or query nodes) we cannot calculate the mask, so we set it all
    if (isPropertyReactive(context, objectType)) {
        Collection<String> leftListenedProperties = pattern.getListenedProperties();
        List<String> accessibleProperties = getAccessibleProperties(context.getRuleBase(), objectType);
        leftDeclaredMask = leftDeclaredMask.setAll(calculatePositiveMask(objectType, leftListenedProperties, accessibleProperties));
        leftNegativeMask = leftNegativeMask.setAll(calculateNegativeMask(objectType, leftListenedProperties, accessibleProperties));
    }
}
Also used : Pattern(org.drools.core.rule.Pattern) ObjectType(org.drools.core.spi.ObjectType)

Example 57 with Pattern

use of org.drools.core.rule.Pattern in project drools by kiegroup.

the class LeftTupleSource method initDeclaredMask.

protected void initDeclaredMask(BuildContext context, LeftTupleSource leftInput) {
    if (context == null || context.getLastBuiltPatterns() == null) {
        // only happens during unit tests
        leftDeclaredMask = AllSetBitMask.get();
        return;
    }
    if (leftInput.getType() != NodeTypeEnums.LeftInputAdapterNode) {
        // BetaNode's not after LIANode are not relevant for left mask property specific, so don't block anything.
        leftDeclaredMask = AllSetBitMask.get();
        return;
    }
    // left input pattern
    Pattern pattern = getLeftInputPattern(context);
    ObjectType objectType = getObjectTypeForPropertyReactivity((LeftInputAdapterNode) leftInput, pattern);
    if (!(objectType instanceof ClassObjectType)) {
        // Only ClassObjectType can use property specific
        leftDeclaredMask = AllSetBitMask.get();
        return;
    }
    if (pattern != null && isPropertyReactive(context, objectType)) {
        Collection<String> leftListenedProperties = pattern.getListenedProperties();
        List<String> accessibleProperties = getAccessibleProperties(context.getRuleBase(), objectType);
        leftDeclaredMask = calculatePositiveMask(objectType, leftListenedProperties, accessibleProperties);
        leftDeclaredMask = setNodeConstraintsPropertyReactiveMask(leftDeclaredMask, objectType, accessibleProperties);
        leftNegativeMask = calculateNegativeMask(objectType, leftListenedProperties, accessibleProperties);
        setLeftListenedProperties(leftListenedProperties);
    } else {
        // if property specific is not on, then accept all modification propagations
        leftDeclaredMask = AllSetBitMask.get();
    }
}
Also used : Pattern(org.drools.core.rule.Pattern) ClassObjectType(org.drools.core.base.ClassObjectType) ObjectType(org.drools.core.spi.ObjectType) ClassObjectType(org.drools.core.base.ClassObjectType)

Example 58 with Pattern

use of org.drools.core.rule.Pattern in project drools by kiegroup.

the class RuleContext method getDeclaration.

Declaration getDeclaration(Variable variable) {
    if (variable == null) {
        return null;
    }
    if (variable.isFact()) {
        Declaration declaration = declarations.get(variable);
        if (declaration == null) {
            declaration = getQueryDeclaration(variable);
        }
        return declaration;
    } else {
        Global global = ((Global) variable);
        ObjectType objectType = builder.getObjectType(global);
        InternalReadAccessor globalExtractor = new GlobalExtractor(global.getName(), objectType);
        return new Declaration(global.getName(), globalExtractor, new Pattern(0, objectType));
    }
}
Also used : ObjectType(org.drools.core.spi.ObjectType) GlobalExtractor(org.drools.core.spi.GlobalExtractor) Pattern(org.drools.core.rule.Pattern) InternalReadAccessor(org.drools.core.spi.InternalReadAccessor) Declaration(org.drools.core.rule.Declaration) Global(org.drools.model.Global)

Example 59 with Pattern

use of org.drools.core.rule.Pattern in project drools by kiegroup.

the class KiePackagesBuilder method getRequiredDeclarationsForAccumulate.

private Declaration[] getRequiredDeclarationsForAccumulate(RuleContext ctx, RuleConditionElement source, AccumulateFunction accFunction, Binding binding, BindingEvaluator bindingEvaluator) {
    Declaration[] requiredDeclarations = getRequiredDeclarationsForAccumulate(ctx, binding, accFunction);
    if (requiredDeclarations.length == 0 && source instanceof Pattern && bindingEvaluator != null && bindingEvaluator.getDeclarations() != null) {
        List<Declaration> previousDecl = new ArrayList<>();
        Pattern patternSource = (Pattern) source;
        patternSource.resetDeclarations();
        for (Declaration d : bindingEvaluator.getDeclarations()) {
            if (d.getIdentifier().equals(patternSource.getDeclaration().getIdentifier())) {
                patternSource.addDeclaration(d);
            } else {
                previousDecl.add(d);
            }
        }
        requiredDeclarations = previousDecl.toArray(new Declaration[previousDecl.size()]);
    }
    return requiredDeclarations;
}
Also used : QueryCallPattern(org.drools.model.patterns.QueryCallPattern) AccumulatePattern(org.drools.model.AccumulatePattern) Pattern(org.drools.core.rule.Pattern) GroupByPattern(org.drools.model.GroupByPattern) ArrayList(java.util.ArrayList) Declaration(org.drools.core.rule.Declaration) WindowDeclaration(org.drools.core.rule.WindowDeclaration) TypeDeclarationUtil.createTypeDeclaration(org.drools.modelcompiler.util.TypeDeclarationUtil.createTypeDeclaration) TypeDeclaration(org.drools.core.rule.TypeDeclaration)

Example 60 with Pattern

use of org.drools.core.rule.Pattern in project drools by kiegroup.

the class KiePackagesBuilder method buildAccumulate.

private RuleConditionElement buildAccumulate(RuleContext ctx, GroupElement group, AccumulatePattern accumulatePattern) {
    Pattern pattern = null;
    boolean isGroupBy = accumulatePattern instanceof GroupByPattern;
    if (accumulatePattern.getAccumulateFunctions() != null) {
        if (!isGroupBy && accumulatePattern.getAccumulateFunctions().length == 1) {
            // non groupby with single accumulates can be optimized to directly return the result, rather than place in an array of 1
            pattern = ctx.getPattern(accumulatePattern.getAccumulateFunctions()[0].getResult());
        } else if (accumulatePattern.getAccumulateFunctions().length > 0 && ctx.getPattern(accumulatePattern.getAccumulateFunctions()[0].getResult()) != null) {
            // Illegal executable model. Cannot have groupby or multi accumulate mapped to a single result object.
            throw new RuntimeException("Only single accumulate functions, with no group by can optimize the result pattern to be the function return value");
        }
    }
    boolean existingPattern = pattern != null;
    if (!existingPattern) {
        ObjectType type = !isGroupBy && accumulatePattern.getAccumulateFunctions().length == 1 ? new ClassObjectType(accumulatePattern.getAccumulateFunctions()[0].getResult().getType()) : // groupby or multi function accumulate
        JAVA_CLASS_ARRAY_TYPE;
        pattern = new Pattern(ctx.getNextPatternIndex(), type);
    }
    PatternImpl<?> sourcePattern = (PatternImpl<?>) accumulatePattern.getPattern();
    Set<String> usedVariableName = new LinkedHashSet<>();
    if (sourcePattern != null) {
        for (Variable v : sourcePattern.getInputVariables()) {
            usedVariableName.add(v.getName());
        }
    }
    RuleConditionElement source;
    if (accumulatePattern.isQuerySource()) {
        source = buildQueryPattern(ctx, ((QueryCallPattern) accumulatePattern.getCondition()));
    } else if (accumulatePattern.isCompositePatterns()) {
        CompositePatterns compositePatterns = (CompositePatterns) accumulatePattern.getCondition();
        GroupElement allSubConditions = new GroupElement(conditionToGroupElementType(compositePatterns.getType()));
        for (Condition c : compositePatterns.getSubConditions()) {
            recursivelyAddConditions(ctx, group, allSubConditions, c);
        }
        source = allSubConditions.getChildren().size() == 1 ? allSubConditions.getChildren().get(0) : allSubConditions;
    } else {
        source = buildPattern(ctx, group, accumulatePattern);
    }
    Collection<Binding> bindings = new ArrayList<>();
    if (sourcePattern != null) {
        bindings.addAll(sourcePattern.getBindings());
        bindings.add(new SelfPatternBiding<>(sourcePattern.getPatternVariable()));
    } else {
        // No pattern is associated. It likely uses inner bindings
        addInnerBindings(bindings, accumulatePattern.getAccumulateFunctions(), accumulatePattern.getCondition());
    }
    pattern.setSource(buildAccumulate(ctx, accumulatePattern, source, pattern, usedVariableName, bindings));
    return existingPattern ? null : pattern;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) EvalCondition(org.drools.core.rule.EvalCondition) Condition(org.drools.model.Condition) Binding(org.drools.model.Binding) QueryCallPattern(org.drools.model.patterns.QueryCallPattern) AccumulatePattern(org.drools.model.AccumulatePattern) Pattern(org.drools.core.rule.Pattern) GroupByPattern(org.drools.model.GroupByPattern) PrototypeVariable(org.drools.model.PrototypeVariable) Variable(org.drools.model.Variable) ClassObjectType(org.drools.core.base.ClassObjectType) GroupElement(org.drools.core.rule.GroupElement) ArrayList(java.util.ArrayList) RuleConditionElement(org.drools.core.rule.RuleConditionElement) FactTemplateObjectType(org.drools.core.facttemplates.FactTemplateObjectType) ObjectType(org.drools.core.spi.ObjectType) ClassObjectType(org.drools.core.base.ClassObjectType) CompositePatterns(org.drools.model.patterns.CompositePatterns) GroupByPattern(org.drools.model.GroupByPattern) GroupByPatternImpl(org.drools.model.patterns.GroupByPatternImpl) PatternImpl(org.drools.model.patterns.PatternImpl) ExistentialPatternImpl(org.drools.model.patterns.ExistentialPatternImpl)

Aggregations

Pattern (org.drools.core.rule.Pattern)190 ClassObjectType (org.drools.core.base.ClassObjectType)103 Test (org.junit.Test)98 Declaration (org.drools.core.rule.Declaration)79 RuleImpl (org.drools.core.definitions.rule.impl.RuleImpl)69 GroupElement (org.drools.core.rule.GroupElement)49 InternalReadAccessor (org.drools.core.spi.InternalReadAccessor)45 ArrayList (java.util.ArrayList)35 IOException (java.io.IOException)33 ObjectType (org.drools.core.spi.ObjectType)32 KnowledgeBuilderImpl (org.drools.compiler.builder.impl.KnowledgeBuilderImpl)28 Variable (org.drools.model.Variable)25 LambdaConstraint (org.drools.modelcompiler.constraints.LambdaConstraint)25 List (java.util.List)24 Accumulate (org.drools.core.rule.Accumulate)24 InternalKnowledgePackage (org.drools.core.definitions.InternalKnowledgePackage)23 KieBase (org.kie.api.KieBase)23 Collection (java.util.Collection)21 QueryImpl (org.drools.core.rule.QueryImpl)21 KieSession (org.kie.api.runtime.KieSession)21