Skip to content

Commit

Permalink
add support for expressions with 4 and 5 variables + fix forall in ex…
Browse files Browse the repository at this point in the history
…ecutable model
  • Loading branch information
mariofusco committed Jan 31, 2018
1 parent 3354409 commit c1ba8c3
Show file tree
Hide file tree
Showing 13 changed files with 247 additions and 33 deletions.
Expand Up @@ -26,7 +26,7 @@ public class ForallDescr extends BaseDescr

private static final long serialVersionUID = 510l;

private static final String BASE_IDENTIFIER = "$__forallBaseIdentifier";
public static final String BASE_IDENTIFIER = "$__forallBaseIdentifier";

private List<BaseDescr> patterns;

Expand Down
Expand Up @@ -2,8 +2,19 @@

import org.drools.model.constraints.AbstractSingleConstraint;
import org.drools.model.constraints.AndConstraints;
import org.drools.model.constraints.SingleConstraint1;
import org.drools.model.constraints.SingleConstraint2;
import org.drools.model.constraints.SingleConstraint3;
import org.drools.model.constraints.SingleConstraint4;
import org.drools.model.constraints.SingleConstraint5;
import org.drools.model.functions.PredicateN;
import org.drools.model.impl.ModelComponent;
import org.drools.model.view.Expr1ViewItemImpl;
import org.drools.model.view.Expr2ViewItemImpl;
import org.drools.model.view.Expr3ViewItemImpl;
import org.drools.model.view.Expr4ViewItemImpl;
import org.drools.model.view.Expr5ViewItemImpl;
import org.drools.model.view.ExprNViewItem;

public interface SingleConstraint extends Constraint {
Variable[] getVariables();
Expand Down Expand Up @@ -46,4 +57,23 @@ public boolean isEqualTo( ModelComponent other ) {
return this == other;
}
};

static SingleConstraint createConstraint(ExprNViewItem expr) {
if ( expr instanceof Expr1ViewItemImpl ) {
return new SingleConstraint1( ( Expr1ViewItemImpl ) expr );
}
if ( expr instanceof Expr2ViewItemImpl ) {
return new SingleConstraint2( ( Expr2ViewItemImpl ) expr );
}
if ( expr instanceof Expr3ViewItemImpl ) {
return new SingleConstraint3( ( Expr3ViewItemImpl ) expr );
}
if ( expr instanceof Expr4ViewItemImpl ) {
return new SingleConstraint4( ( Expr4ViewItemImpl ) expr );
}
if ( expr instanceof Expr5ViewItemImpl ) {
return new SingleConstraint5( ( Expr5ViewItemImpl ) expr );
}
throw new UnsupportedOperationException( "Unknow expr type: " + expr.getClass() );
}
}
@@ -0,0 +1,66 @@
package org.drools.model.constraints;

import org.drools.model.Variable;
import org.drools.model.functions.LambdaPrinter;
import org.drools.model.functions.Predicate4;
import org.drools.model.functions.PredicateN;
import org.drools.model.impl.ModelComponent;
import org.drools.model.view.Expr4ViewItemImpl;

public class SingleConstraint4<A, B, C, D> extends AbstractSingleConstraint {

private final Variable<A> var1;
private final Variable<B> var2;
private final Variable<C> var3;
private final Variable<D> var4;
private final Predicate4<A, B, C, D> predicate;

public SingleConstraint4( Variable<A> var1, Variable<B> var2, Variable<C> var3, Variable<D> var4, Predicate4<A, B, C, D> predicate) {
super( LambdaPrinter.print(predicate) );
this.var1 = var1;
this.var2 = var2;
this.var3 = var3;
this.var4 = var4;
this.predicate = predicate;
}

public SingleConstraint4( String exprId, Variable<A> var1, Variable<B> var2, Variable<C> var3, Variable<D> var4, Predicate4<A, B, C, D> predicate) {
super(exprId);
this.var1 = var1;
this.var2 = var2;
this.var3 = var3;
this.var4 = var4;
this.predicate = predicate;
}

public SingleConstraint4( Expr4ViewItemImpl<A, B, C, D> expr) {
this(expr.getExprId(), expr.getFirstVariable(), expr.getSecondVariable(), expr.getThirdVariable(), expr.getForthVariable(), expr.getPredicate());
setReactiveProps( expr.getReactiveProps() );
}

@Override
public Variable[] getVariables() {
return new Variable[]{var1, var2, var3};
}

@Override
public PredicateN getPredicate() {
return objs -> {
return predicate.test((A) objs[0], (B) objs[1], (C) objs[2], (D) objs[3]);
};
}

@Override
public boolean isEqualTo( ModelComponent o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;

SingleConstraint4<?, ?, ?, ?> that = ( SingleConstraint4<?, ?, ?, ?> ) o;

if ( !ModelComponent.areEqualInModel( var1, that.var1 ) ) return false;
if ( !ModelComponent.areEqualInModel( var2, that.var2 ) ) return false;
if ( !ModelComponent.areEqualInModel( var3, that.var3 ) ) return false;
if ( !ModelComponent.areEqualInModel( var4, that.var4 ) ) return false;
return predicate.equals( that.predicate );
}
}
@@ -0,0 +1,71 @@
package org.drools.model.constraints;

import org.drools.model.Variable;
import org.drools.model.functions.LambdaPrinter;
import org.drools.model.functions.Predicate5;
import org.drools.model.functions.PredicateN;
import org.drools.model.impl.ModelComponent;
import org.drools.model.view.Expr5ViewItemImpl;

public class SingleConstraint5<A, B, C, D, E> extends AbstractSingleConstraint {

private final Variable<A> var1;
private final Variable<B> var2;
private final Variable<C> var3;
private final Variable<D> var4;
private final Variable<E> var5;
private final Predicate5<A, B, C, D, E> predicate;

public SingleConstraint5( Variable<A> var1, Variable<B> var2, Variable<C> var3, Variable<D> var4, Variable<E> var5, Predicate5<A, B, C, D, E> predicate) {
super( LambdaPrinter.print(predicate) );
this.var1 = var1;
this.var2 = var2;
this.var3 = var3;
this.var4 = var4;
this.var5 = var5;
this.predicate = predicate;
}

public SingleConstraint5( String exprId, Variable<A> var1, Variable<B> var2, Variable<C> var3, Variable<D> var4, Variable<E> var5, Predicate5<A, B, C, D, E> predicate) {
super(exprId);
this.var1 = var1;
this.var2 = var2;
this.var3 = var3;
this.var4 = var4;
this.var5 = var5;
this.predicate = predicate;
}

public SingleConstraint5( Expr5ViewItemImpl<A, B, C, D, E> expr) {
this(expr.getExprId(), expr.getFirstVariable(), expr.getSecondVariable(), expr.getThirdVariable(), expr.getForthVariable(), expr.getFifthVariable(), expr.getPredicate());
setReactiveProps( expr.getReactiveProps() );
}

@Override
public Variable[] getVariables() {
return new Variable[]{var1, var2, var3};
}

@Override
public PredicateN getPredicate() {
return objs -> {
return predicate.test((A) objs[0], (B) objs[1], (C) objs[2], (D) objs[3], (E) objs[4]);
};
}

@Override
public boolean isEqualTo( ModelComponent o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;

SingleConstraint5<?, ?, ?, ?, ?> that = ( SingleConstraint5<?, ?, ?, ?, ?> ) o;

if ( !ModelComponent.areEqualInModel( var1, that.var1 ) ) return false;
if ( !ModelComponent.areEqualInModel( var2, that.var2 ) ) return false;
if ( !ModelComponent.areEqualInModel( var3, that.var3 ) ) return false;
if ( !ModelComponent.areEqualInModel( var4, that.var4 ) ) return false;
if ( !ModelComponent.areEqualInModel( var4, that.var4 ) ) return false;
if ( !ModelComponent.areEqualInModel( var5, that.var5 ) ) return false;
return predicate.equals( that.predicate );
}
}
Expand Up @@ -49,6 +49,7 @@
import org.drools.model.view.Expr1ViewItemImpl;
import org.drools.model.view.Expr2ViewItemImpl;
import org.drools.model.view.Expr3ViewItemImpl;
import org.drools.model.view.ExprNViewItem;
import org.drools.model.view.ExprViewItem;
import org.drools.model.view.InputViewItemImpl;
import org.drools.model.view.QueryCallViewItem;
Expand Down Expand Up @@ -170,7 +171,7 @@ private static CompositePatterns viewItems2Condition(BuildContext ctx, Condition

if ( viewItem instanceof ExistentialExprViewItem ) {
ExistentialExprViewItem existential = ( (ExistentialExprViewItem) viewItem );
if (patterVariable != null) {
if (patterVariable != null && !existential.isQueryExpression()) {
registerInputsFromViewItem( existential.getExpression(), conditionMap, scopedInputs, patterVariable );
}
Condition condition = new PatternImpl( patterVariable, SingleConstraint.EMPTY, ctx.bindings.get(patterVariable) );
Expand Down Expand Up @@ -331,15 +332,8 @@ private static Condition viewItem2Condition( ViewItem viewItem, Condition condit
return condition;
}

if ( viewItem instanceof Expr2ViewItemImpl ) {
Expr2ViewItemImpl expr = (Expr2ViewItemImpl)viewItem;
( (PatternImpl) condition ).addConstraint( new SingleConstraint2( expr ) );
return condition;
}

if (viewItem instanceof Expr3ViewItemImpl) {
Expr3ViewItemImpl expr = (Expr3ViewItemImpl) viewItem;
((PatternImpl) condition).addConstraint(new SingleConstraint3(expr));
if ( viewItem instanceof ExprNViewItem ) {
( (PatternImpl) condition ).addConstraint( SingleConstraint.createConstraint( ( ExprNViewItem ) viewItem ) );
return condition;
}

Expand Down
Expand Up @@ -19,6 +19,6 @@
import org.drools.model.Index;
import org.drools.model.functions.Function1;

public interface Expr1ViewItem<T> extends ExprViewItem<T> {
public interface Expr1ViewItem<T> extends ExprNViewItem<T> {
<U> Expr1ViewItem<T> indexedBy( Class<?> indexedClass, Index.ConstraintType constraintType, int indexId, Function1<T, U> leftOperandExtractor, U rightValue );
}
Expand Up @@ -19,7 +19,7 @@
import org.drools.model.Index;
import org.drools.model.functions.Function1;

public interface Expr2ViewItem<T, U> extends ExprViewItem<T> {
public interface Expr2ViewItem<T, U> extends ExprNViewItem<T> {

<V> Expr2ViewItem<T, U> indexedBy( Class<?> indexedClass, Index.ConstraintType constraintType, int indexId, Function1<T, V> leftOperandExtractor, Function1<U, V> rightOperandExtractor );
}
Expand Up @@ -5,7 +5,7 @@
import org.drools.model.Variable;
import org.drools.model.functions.Predicate3;

public class Expr3ViewItemImpl<A, B, C> extends AbstractExprViewItem<A> implements ExprViewItem<A> {
public class Expr3ViewItemImpl<A, B, C> extends AbstractExprViewItem<A> implements ExprNViewItem<A> {

private final Variable<B> var2;
private final Variable<C> var3;
Expand Down
Expand Up @@ -4,7 +4,7 @@
import org.drools.model.Variable;
import org.drools.model.functions.Predicate4;

public class Expr4ViewItemImpl<A, B, C, D> extends AbstractExprViewItem<A> implements ExprViewItem<A> {
public class Expr4ViewItemImpl<A, B, C, D> extends AbstractExprViewItem<A> implements ExprNViewItem<A> {

private final Variable<B> var2;
private final Variable<C> var3;
Expand Down
Expand Up @@ -4,7 +4,7 @@
import org.drools.model.Variable;
import org.drools.model.functions.Predicate5;

public class Expr5ViewItemImpl<A, B, C, D, E> extends AbstractExprViewItem<A> implements ExprViewItem<A> {
public class Expr5ViewItemImpl<A, B, C, D, E> extends AbstractExprViewItem<A> implements ExprNViewItem<A> {

private final Variable<B> var2;
private final Variable<C> var3;
Expand Down
@@ -0,0 +1,20 @@
/*
* Copyright 2005 JBoss Inc
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package org.drools.model.view;

public interface ExprNViewItem<T> extends ExprViewItem<T> {
}
Expand Up @@ -112,6 +112,7 @@
import org.kie.soup.project.datamodel.commons.types.ClassTypeResolver;
import org.kie.soup.project.datamodel.commons.types.TypeResolver;

import static org.drools.compiler.lang.descr.ForallDescr.BASE_IDENTIFIER;
import static org.drools.core.rule.GroupElement.AND;
import static org.drools.core.rule.Pattern.getReadAcessor;
import static org.drools.model.DSL.declarationOf;
Expand Down Expand Up @@ -402,10 +403,20 @@ private RuleConditionElement conditionToElement( RuleContext ctx, GroupElement g
}
case FORALL: {
Condition innerCondition = condition.getSubConditions().get(0);
Pattern basePattern = (Pattern) conditionToElement( ctx, group, innerCondition.getSubConditions().get(0) );
Pattern basePattern;
List<Pattern> remainingPatterns = new ArrayList<>();
for (int i = 1; i < innerCondition.getSubConditions().size(); i++) {
remainingPatterns.add( (Pattern) conditionToElement( ctx, group, innerCondition.getSubConditions().get(i) ) );
if (innerCondition instanceof PatternImpl) {
basePattern = new Pattern( ctx.getNextPatternIndex(),
0, // offset will be set by ReteooBuilder
getObjectType( (( PatternImpl ) innerCondition).getPatternVariable().getType().asClass() ),
BASE_IDENTIFIER,
true );
remainingPatterns.add( (Pattern) conditionToElement( ctx, group, innerCondition ) );
} else {
basePattern = ( Pattern ) conditionToElement( ctx, group, innerCondition.getSubConditions().get( 0 ) );
for (int i = 1; i < innerCondition.getSubConditions().size(); i++) {
remainingPatterns.add( ( Pattern ) conditionToElement( ctx, group, innerCondition.getSubConditions().get( i ) ) );
}
}
return new Forall(basePattern, remainingPatterns);
}
Expand Down Expand Up @@ -696,7 +707,7 @@ Collection<KiePackage> getKiePackages() {
ClassObjectType getObjectType( Class<?> patternClass ) {
return objectTypeCache.computeIfAbsent( patternClass, c -> {
boolean isEvent = false;
if (!patternClass.getName().startsWith( "java." )) {
if (!patternClass.getName().startsWith( "java." ) && !patternClass.isPrimitive()) {
KnowledgePackageImpl pkg = (KnowledgePackageImpl) packages.computeIfAbsent( patternClass.getPackage().getName(), this::createKiePackage );
TypeDeclaration typeDeclaration = pkg.getTypeDeclaration( patternClass );
if ( typeDeclaration == null ) {
Expand Down

0 comments on commit c1ba8c3

Please sign in to comment.