Navigation Menu

Skip to content

Commit

Permalink
[DROOLS-2284] Refactor of toTypedExpression (apache#1759)
Browse files Browse the repository at this point in the history
* [DROOLS-2284] Refactor of toTypedExpression

Moved ToTypedExpression in a separated class

Removed RuleContext, PackageModel from all method of ConstraintParser.java

Introduced new method call that instantiate the context

Introduced TypedExpression context

Removed parentExpression

Partial application of  patternType, bindingId, isPositional

Removed all 9 parameters to ExpressionTyper method

Removed type resolver dependency

* Removed parameter to RuleContext.java constructor

* Removed useless constructor
  • Loading branch information
lucamolteni authored and mariofusco committed Feb 9, 2018
1 parent 874cab8 commit b773742
Show file tree
Hide file tree
Showing 10 changed files with 546 additions and 407 deletions.

Large diffs are not rendered by default.

Expand Up @@ -197,7 +197,7 @@ public static void generateModel( KnowledgeBuilderImpl kbuilder, InternalKnowled


private static void processRule( KnowledgeBuilderImpl kbuilder, TypeResolver typeResolver, PackageModel packageModel, PackageDescr packageDescr, RuleDescr ruleDescr) {
RuleContext context = new RuleContext(kbuilder, typeResolver, packageModel, ruleDescr);
RuleContext context = new RuleContext(kbuilder,packageModel, ruleDescr, typeResolver);

for(Entry<String, Object> kv : ruleDescr.getNamedConsequences().entrySet()) {
context.addNamedConsequence(kv.getKey(), kv.getValue().toString());
Expand Down
Expand Up @@ -36,7 +36,7 @@ public class QueryGenerator {
public static final String QUERY_CALL = "query";

public static void processQueryDef( KnowledgeBuilderImpl kbuilder, TypeResolver typeResolver, PackageModel packageModel, QueryDescr queryDescr ) {
RuleContext context = new RuleContext(kbuilder, typeResolver, packageModel, queryDescr);
RuleContext context = new RuleContext(kbuilder, packageModel, queryDescr, typeResolver);
String queryName = queryDescr.getName();
final String queryDefVariableName = toQueryDef(queryName);
context.setQueryName(Optional.of(queryDefVariableName));
Expand Down
Expand Up @@ -16,6 +16,7 @@
import org.drools.compiler.lang.descr.AnnotationDescr;
import org.drools.compiler.lang.descr.BaseDescr;
import org.drools.compiler.lang.descr.RuleDescr;
import org.drools.core.definitions.InternalKnowledgePackage;
import org.drools.core.ruleunit.RuleUnitDescr;
import org.drools.javaparser.ast.expr.Expression;
import org.drools.modelcompiler.builder.PackageModel;
Expand All @@ -31,8 +32,8 @@ public class RuleContext {
private static final Map<Class<? extends RuleUnit>, RuleUnitDescr> ruleUnitDescrCache = new HashMap<>();

private final KnowledgeBuilderImpl kbuilder;
private final TypeResolver typeResolver;
private final PackageModel packageModel;
private final TypeResolver typeResolver;
private DRLIdGenerator idGenerator;
private final RuleDescr descr;

Expand All @@ -49,6 +50,7 @@ public class RuleContext {

private Map<String, String> aggregatePatternMap = new HashMap<>();


private RuleDialect ruleDialect = RuleDialect.JAVA; // assumed is java by default as per Drools manual.
public static enum RuleDialect {
JAVA,
Expand All @@ -57,13 +59,13 @@ public static enum RuleDialect {

public BaseDescr parentDesc = null;

public RuleContext( KnowledgeBuilderImpl kbuilder, TypeResolver typeResolver, PackageModel packageModel, RuleDescr ruleDescr) {
public RuleContext(KnowledgeBuilderImpl kbuilder, PackageModel packageModel, RuleDescr ruleDescr, TypeResolver typeResolver) {
this.kbuilder = kbuilder;
this.typeResolver = typeResolver;
this.packageModel = packageModel;
this.idGenerator = packageModel.getExprIdGenerator();
this.descr = ruleDescr;
exprPointer.push( this.expressions::add );
this.typeResolver = typeResolver;
findUnitClass();
}

Expand All @@ -83,7 +85,7 @@ private void findUnitClass() {

if (unitName != null) {
try {
Class<? extends RuleUnit> unitClass = ( Class<? extends RuleUnit> ) typeResolver.resolveType( unitName );
Class<? extends RuleUnit> unitClass = ( Class<? extends RuleUnit> ) getTypeResolver().resolveType( unitName );
ruleUnitDescr = ruleUnitDescrCache.computeIfAbsent( unitClass, RuleUnitDescr::new );
} catch (ClassNotFoundException e) {
throw new RuntimeException( e );
Expand Down Expand Up @@ -178,11 +180,7 @@ public int getExprPointerLevel() {
return exprPointer.size();
}

public TypeResolver getTypeResolver() {
return typeResolver;
}

public String getExprId( Class<?> patternType, String drlConstraint) {
public String getExprId(Class<?> patternType, String drlConstraint) {
return idGenerator.getExprId(patternType, drlConstraint);
}

Expand Down Expand Up @@ -249,5 +247,9 @@ public Map<String, String> getAggregatePatternMap() {
public PackageModel getPackageModel() {
return packageModel;
}

public TypeResolver getTypeResolver() {
return typeResolver;
}
}

Expand Up @@ -106,7 +106,7 @@ private List<Expression> parseConditions( KnowledgeBuilderImpl kbuilder, Package
return descrs.stream()
.map( descr -> {
String expression = descr.toString();
RuleContext context = new RuleContext(kbuilder, typeResolver, packageModel, null);
RuleContext context = new RuleContext(kbuilder, packageModel, null, typeResolver);
DrlxParseResult drlxParseResult = new ConstraintParser(context, packageModel).drlxParse(patternType, pattern.getIdentifier(), expression);
return drlxParseResult.acceptWithReturnValue(new ParseResultVisitor<Optional<Expression>>() {
@Override
Expand Down
Expand Up @@ -2,10 +2,8 @@

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import org.drools.core.util.index.IndexUtil;
Expand Down Expand Up @@ -34,6 +32,9 @@
import org.drools.modelcompiler.builder.generator.DrlxParseUtil;
import org.drools.modelcompiler.builder.generator.RuleContext;
import org.drools.modelcompiler.builder.generator.TypedExpression;
import org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyper;
import org.drools.modelcompiler.builder.generator.expressiontyper.ExpressionTyperContext;
import org.drools.modelcompiler.builder.generator.expressiontyper.TypedExpressionResult;

import static org.drools.javaparser.ast.expr.BinaryExpr.Operator.GREATER;
import static org.drools.javaparser.ast.expr.BinaryExpr.Operator.GREATER_EQUALS;
Expand All @@ -42,7 +43,6 @@
import static org.drools.javaparser.printer.PrintUtil.toDrlx;
import static org.drools.modelcompiler.builder.generator.DrlxParseUtil.getLiteralExpressionType;
import static org.drools.modelcompiler.builder.generator.DrlxParseUtil.isPrimitiveExpression;
import static org.drools.modelcompiler.builder.generator.DrlxParseUtil.toTypedExpression;

public class ConstraintParser {

Expand Down Expand Up @@ -94,16 +94,18 @@ private DrlxParseResult getDrlxParseResult(Class<?> patternType,
BinaryExpr.Operator operator = binaryExpr.getOperator();

IndexUtil.ConstraintType decodeConstraintType = DrlxParseUtil.toConstraintType(operator );
List<String> usedDeclarations = new ArrayList<>();
Set<String> reactOnProperties = new HashSet<>();

final ArrayList<Expression> prefixExpressions = new ArrayList<>();
Optional<TypedExpression> optLeft = DrlxParseUtil.toTypedExpression(context, packageModel, patternType, binaryExpr.getLeft(), bindingId, usedDeclarations, reactOnProperties, binaryExpr, isPositional, prefixExpressions);
final ExpressionTyperContext expressionTyperContext = new ExpressionTyperContext();
final ExpressionTyper expressionTyper = new ExpressionTyper(context, patternType, bindingId, isPositional, expressionTyperContext);

TypedExpressionResult leftTypedExpressionResult = expressionTyper.toTypedExpression(binaryExpr.getLeft());
Optional<TypedExpression> optLeft = leftTypedExpressionResult.getTypedExpression();
if ( !optLeft.isPresent() ) {
return new DrlxParseFail();
}

Optional<TypedExpression> optRight = DrlxParseUtil.toTypedExpression(context, packageModel, patternType, binaryExpr.getRight(), bindingId, usedDeclarations, reactOnProperties, binaryExpr, isPositional, new ArrayList<>());
TypedExpressionResult rightExpressionResult = expressionTyper.toTypedExpression(binaryExpr.getRight());
Optional<TypedExpression> optRight = rightExpressionResult.getTypedExpression();
if( !optRight.isPresent()) {
context.addCompilationError( new ParseExpressionErrorResult(drlxExpr) );
return new DrlxParseFail();
Expand Down Expand Up @@ -138,26 +140,23 @@ private DrlxParseResult getDrlxParseResult(Class<?> patternType,
}
}

for(Expression e : prefixExpressions) {
for(Expression e : leftTypedExpressionResult.getPrefixExpressions()) {
combo = new BinaryExpr(e, combo, BinaryExpr.Operator.AND );
}

return new DrlxParseSuccess(patternType, exprId, bindingId, combo, left.getType())
.setDecodeConstraintType( decodeConstraintType ).setUsedDeclarations( usedDeclarations )
.setReactOnProperties( reactOnProperties ).setLeft( left ).setRight( right );
.setDecodeConstraintType( decodeConstraintType ).setUsedDeclarations( expressionTyperContext.getUsedDeclarations() )
.setReactOnProperties( expressionTyperContext.getReactOnProperties() ).setLeft( left ).setRight( right );
}

if ( drlxExpr instanceof UnaryExpr ) {
UnaryExpr unaryExpr = (UnaryExpr) drlxExpr;

List<String> usedDeclarations = new ArrayList<>();
Set<String> reactOnProperties = new HashSet<>();
Optional<TypedExpression> optLeft = DrlxParseUtil.toTypedExpression(context, packageModel, patternType, unaryExpr, bindingId, usedDeclarations, reactOnProperties, unaryExpr, isPositional, new ArrayList<>());

TypedExpressionResult typedExpressionResult = new ExpressionTyper(context, patternType, bindingId, isPositional).toTypedExpression(unaryExpr);

return optLeft.<DrlxParseResult>map(left -> {
return typedExpressionResult.getTypedExpression().<DrlxParseResult>map(left -> {
return new DrlxParseSuccess(patternType, exprId, bindingId, left.getExpression(), left.getType())
.setUsedDeclarations( usedDeclarations ).setReactOnProperties( reactOnProperties ).setLeft( left );
.setUsedDeclarations( typedExpressionResult.getUsedDeclarations() ).setReactOnProperties( typedExpressionResult.getReactOnProperties() ).setLeft( left );
}).orElse(new DrlxParseFail());


Expand All @@ -166,18 +165,16 @@ private DrlxParseResult getDrlxParseResult(Class<?> patternType,
if ( drlxExpr instanceof PointFreeExpr ) {
PointFreeExpr pointFreeExpr = (PointFreeExpr) drlxExpr;

List<String> usedDeclarations = new ArrayList<>();
Set<String> reactOnProperties = new HashSet<>();

final Optional<TypedExpression> optTypedExpression = toTypedExpression(context, packageModel, patternType, pointFreeExpr, bindingId, usedDeclarations, reactOnProperties, null, isPositional, new ArrayList<>());
TypedExpressionResult typedExpressionResult = new ExpressionTyper(context, patternType, bindingId, isPositional).toTypedExpression(pointFreeExpr);
final Optional<TypedExpression> optTypedExpression =typedExpressionResult.getTypedExpression();

return optTypedExpression.<DrlxParseResult>map(typedExpression -> {
final Expression returnExpression = typedExpression.getExpression();
final Class<?> returnType = typedExpression.getType();

return new DrlxParseSuccess(patternType, exprId, bindingId, returnExpression, returnType)
.setUsedDeclarations(usedDeclarations)
.setReactOnProperties(reactOnProperties)
.setUsedDeclarations(typedExpressionResult.getUsedDeclarations())
.setReactOnProperties(typedExpressionResult.getReactOnProperties())
.setLeft(typedExpression.getLeft())
.setStatic(typedExpression.isStatic())
.setValidExpression(true);
Expand Down Expand Up @@ -206,18 +203,21 @@ private DrlxParseResult getDrlxParseResult(Class<?> patternType,
if (arg instanceof NameExpr && !arg.toString().equals("_this")) {
usedDeclarations.add(arg.toString());
} else if (arg instanceof MethodCallExpr) {
DrlxParseUtil.toTypedExpressionFromMethodCallOrField(context, null, ( MethodCallExpr ) arg, bindingId, usedDeclarations, new HashSet<>(), context.getTypeResolver(), new ArrayList<>());
TypedExpressionResult typedExpressionResult = new ExpressionTyper(context, null, bindingId, isPositional)
.toTypedExpression(arg);
usedDeclarations.addAll(typedExpressionResult.getUsedDeclarations());
}
}
return new DrlxParseSuccess(patternType, exprId, bindingId, methodCallExpr, returnType).setUsedDeclarations(usedDeclarations);
} else if (methodCallExpr.getScope().isPresent() && methodCallExpr.getScope().get() instanceof StringLiteralExpr) {
List<String> usedDeclarations = new ArrayList<>();
Optional<TypedExpression> optConverted = DrlxParseUtil.toTypedExpressionFromMethodCallOrField(context, String.class, methodCallExpr, bindingId, usedDeclarations, new HashSet<>(), context.getTypeResolver(), new ArrayList<>());
TypedExpressionResult typedExpressionResult = new ExpressionTyper(context, String.class, bindingId, isPositional)
.toTypedExpression(methodCallExpr);
Optional<TypedExpression> optConverted = typedExpressionResult.getTypedExpression();

return optConverted.<DrlxParseResult>map(converted -> {
return new DrlxParseSuccess(String.class, exprId, bindingId, converted.getExpression(), converted.getType())
.setLeft(converted )
.setUsedDeclarations(usedDeclarations );
.setUsedDeclarations(typedExpressionResult.getUsedDeclarations() );
}).orElse(new DrlxParseFail());


Expand Down

0 comments on commit b773742

Please sign in to comment.