Skip to content

Commit

Permalink
fix query unification for free variable
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Dec 14, 2017
1 parent f19d061 commit 5c3d516
Show file tree
Hide file tree
Showing 7 changed files with 418 additions and 19 deletions.
Expand Up @@ -34,4 +34,6 @@ public interface IndexableConstraint extends Constraint {
FieldIndex getFieldIndex(); FieldIndex getFieldIndex();


InternalReadAccessor getFieldExtractor(); InternalReadAccessor getFieldExtractor();

default void unsetUnification() { }
} }
Expand Up @@ -26,7 +26,6 @@
import org.drools.core.base.ClassObjectType; import org.drools.core.base.ClassObjectType;
import org.drools.core.base.extractors.ArrayElementReader; import org.drools.core.base.extractors.ArrayElementReader;
import org.drools.core.base.extractors.SelfReferenceClassFieldReader; import org.drools.core.base.extractors.SelfReferenceClassFieldReader;
import org.drools.core.rule.constraint.MvelConstraint;
import org.drools.core.spi.Constraint; import org.drools.core.spi.Constraint;
import org.drools.core.spi.DataProvider; import org.drools.core.spi.DataProvider;
import org.drools.core.spi.DeclarationScopeResolver; import org.drools.core.spi.DeclarationScopeResolver;
Expand Down Expand Up @@ -266,7 +265,7 @@ private void replaceDeclarations( DeclarationScopeResolver resolver, Pattern pat
Declaration redeclaredDeclr = new Declaration( resolved.getIdentifier(), ( (IndexableConstraint) constraint ).getFieldExtractor(), pattern, false ); Declaration redeclaredDeclr = new Declaration( resolved.getIdentifier(), ( (IndexableConstraint) constraint ).getFieldExtractor(), pattern, false );
pattern.addDeclaration( redeclaredDeclr ); pattern.addDeclaration( redeclaredDeclr );
} else if ( resolved.getPattern() != pattern ) { } else if ( resolved.getPattern() != pattern ) {
( (MvelConstraint) constraint ).unsetUnification(); ( (IndexableConstraint ) constraint ).unsetUnification();
} }
} }


Expand Down
Expand Up @@ -32,7 +32,6 @@
import org.drools.core.base.ClassFieldReader; import org.drools.core.base.ClassFieldReader;
import org.drools.core.base.DroolsQuery; import org.drools.core.base.DroolsQuery;
import org.drools.core.base.EvaluatorWrapper; import org.drools.core.base.EvaluatorWrapper;
import org.drools.core.base.extractors.ArrayElementReader;
import org.drools.core.base.extractors.MVELObjectClassFieldReader; import org.drools.core.base.extractors.MVELObjectClassFieldReader;
import org.drools.core.base.mvel.MVELCompilationUnit; import org.drools.core.base.mvel.MVELCompilationUnit;
import org.drools.core.common.DroolsObjectInputStream; import org.drools.core.common.DroolsObjectInputStream;
Expand Down Expand Up @@ -60,6 +59,7 @@
import org.drools.core.spi.AcceptsReadAccessor; import org.drools.core.spi.AcceptsReadAccessor;
import org.drools.core.spi.FieldValue; import org.drools.core.spi.FieldValue;
import org.drools.core.spi.InternalReadAccessor; import org.drools.core.spi.InternalReadAccessor;
import org.drools.core.spi.ReadAccessor;
import org.drools.core.spi.Tuple; import org.drools.core.spi.Tuple;
import org.drools.core.util.AbstractHashTable.FieldIndex; import org.drools.core.util.AbstractHashTable.FieldIndex;
import org.drools.core.util.MemoryUtil; import org.drools.core.util.MemoryUtil;
Expand Down Expand Up @@ -197,6 +197,7 @@ public boolean isUnification() {
return isUnification; return isUnification;
} }


@Override
public void unsetUnification() { public void unsetUnification() {
isUnification = false; isUnification = false;
} }
Expand Down Expand Up @@ -776,22 +777,22 @@ public static class UnificationContextEntry implements ContextEntry {
private ContextEntry contextEntry; private ContextEntry contextEntry;
private Declaration declaration; private Declaration declaration;
private Variable variable; private Variable variable;
private ArrayElementReader reader; private ReadAccessor reader;


public UnificationContextEntry() { } public UnificationContextEntry() { }


public UnificationContextEntry(ContextEntry contextEntry, public UnificationContextEntry(ContextEntry contextEntry,
Declaration declaration) { Declaration declaration) {
this.contextEntry = contextEntry; this.contextEntry = contextEntry;
this.declaration = declaration; this.declaration = declaration;
reader = ( ArrayElementReader ) this.declaration.getExtractor(); reader = this.declaration.getExtractor();
} }


public ContextEntry getContextEntry() { public ContextEntry getContextEntry() {
return this.contextEntry; return this.contextEntry;
} }


public ArrayElementReader getReader() { public ReadAccessor getReader() {
return reader; return reader;
} }


Expand Down
Expand Up @@ -47,7 +47,6 @@
import org.drools.javaparser.ast.expr.NameExpr; import org.drools.javaparser.ast.expr.NameExpr;
import org.drools.javaparser.ast.expr.NullLiteralExpr; import org.drools.javaparser.ast.expr.NullLiteralExpr;
import org.drools.javaparser.ast.expr.SimpleName; import org.drools.javaparser.ast.expr.SimpleName;
import org.drools.javaparser.ast.expr.StringLiteralExpr;
import org.drools.javaparser.ast.expr.ThisExpr; import org.drools.javaparser.ast.expr.ThisExpr;
import org.drools.javaparser.ast.expr.UnaryExpr; import org.drools.javaparser.ast.expr.UnaryExpr;
import org.drools.javaparser.ast.nodeTypes.NodeWithOptionalScope; import org.drools.javaparser.ast.nodeTypes.NodeWithOptionalScope;
Expand All @@ -61,6 +60,7 @@
import org.drools.modelcompiler.builder.PackageModel; import org.drools.modelcompiler.builder.PackageModel;


import static org.drools.core.util.ClassUtils.getter2property; import static org.drools.core.util.ClassUtils.getter2property;
import static org.drools.modelcompiler.util.ClassUtil.findMethod;


public class DrlxParseUtil { public class DrlxParseUtil {


Expand Down Expand Up @@ -263,18 +263,15 @@ public static TypedExpression nameExprToMethodCallExpr(String name, Class<?> cla
} }


public static Class<?> returnTypeOfMethodCallExpr(MethodCallExpr methodCallExpr, Class<?> clazz) { public static Class<?> returnTypeOfMethodCallExpr(MethodCallExpr methodCallExpr, Class<?> clazz) {
// This currently works only if the arguments are strings
final Class[] argsType = methodCallExpr.getArguments().stream() final Class[] argsType = methodCallExpr.getArguments().stream()
.map((Expression e) -> ((StringLiteralExpr)e).getValue()) .map(DrlxParseUtil::getExpressionType)
.map(String::getClass).toArray(Class[]::new); .toArray(Class[]::new);
Method accessor; return findMethod(clazz, methodCallExpr.getNameAsString(), argsType).getReturnType();
try { }
String methodName = methodCallExpr.getName().asString();
accessor = clazz.getMethod(methodName, argsType); private static Class<?> getExpressionType(Expression expr) {
} catch (NoSuchMethodException e) { // TODO This currently works only if the arguments are strings
throw new UnsupportedOperationException("Method missing"); return String.class;
}
return accessor.getReturnType();
} }


public static Expression prepend(Expression scope, Expression expr) { public static Expression prepend(Expression scope, Expression expr) {
Expand Down
Expand Up @@ -39,6 +39,8 @@ public class UnificationConstraint extends MutableTypeConstraint implements Inde
private final InternalReadAccessor readAccessor; private final InternalReadAccessor readAccessor;
private final ConstraintEvaluator evaluator; private final ConstraintEvaluator evaluator;


private boolean unification = true;

public UnificationConstraint( Declaration declaration ) { public UnificationConstraint( Declaration declaration ) {
this(declaration, null); this(declaration, null);
} }
Expand All @@ -56,7 +58,12 @@ public UnificationConstraint( Declaration declaration, ConstraintEvaluator evalu


@Override @Override
public boolean isUnification() { public boolean isUnification() {
return true; return unification;
}

@Override
public void unsetUnification() {
unification = false;
} }


@Override @Override
Expand Down Expand Up @@ -124,6 +131,9 @@ public boolean isAllowedCachedRight( Tuple tuple, ContextEntry context ) {
} }


private boolean evaluateUnification( InternalFactHandle handle, Tuple tuple, InternalWorkingMemory workingMemory ) { private boolean evaluateUnification( InternalFactHandle handle, Tuple tuple, InternalWorkingMemory workingMemory ) {
if (!unification) {
return evaluator.evaluate(handle, tuple, workingMemory);
}
DroolsQuery query = ( DroolsQuery ) tuple.getObject( 0 ); DroolsQuery query = ( DroolsQuery ) tuple.getObject( 0 );
if (query.getVariables()[declaration.getExtractor().getIndex()] != null) { if (query.getVariables()[declaration.getExtractor().getIndex()] != null) {
return true; return true;
Expand Down

0 comments on commit 5c3d516

Please sign in to comment.