Skip to content

Commit

Permalink
fix reactive properties on bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Dec 14, 2017
1 parent 9a26d19 commit d6ecde8
Show file tree
Hide file tree
Showing 12 changed files with 213 additions and 61 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* 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;

import org.drools.model.functions.Function1;

public interface Binding {
Variable getBoundVariable();
Function1 getBindingFunction();
Variable getInputVariable();
String getReactOn();
}
Original file line number Diff line number Diff line change
Expand Up @@ -232,15 +232,30 @@ public static <T> BindViewItemBuilder<T> bind( Variable<T> var) {
return new BindViewItemBuilder<T>(var);
}

public static class BindViewItemBuilder<T> {
private final Variable<T> var;
public static class BindViewItemBuilder<T> implements ViewItemBuilder<T> {
private final Variable<T> boundVariable;
private Function1 function;
private Variable inputVariable;
private String reactOn;

private BindViewItemBuilder( Variable<T> boundVariable) {
this.boundVariable = boundVariable;
}

public <A> BindViewItemBuilder<T> as( Variable<A> var1, Function1<A, T> f) {
this.function = f;
this.inputVariable = var1;
return this;
}

private BindViewItemBuilder( Variable<T> var) {
this.var = var;
public BindViewItemBuilder<T> reactOn( String reactOn ) {
this.reactOn = reactOn;
return this;
}

public <A> BindViewItem<T> as( Variable<A> var1, Function1<A, T> f) {
return new BindViewItem<T>(var, f, var1);
@Override
public ViewItem<T> get() {
return new BindViewItem<T>(boundVariable, function, inputVariable, reactOn);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package org.drools.model;

import org.drools.model.functions.Function1;

import java.util.Map;
import java.util.List;

public interface Pattern<T> extends Condition {

Expand All @@ -14,5 +12,5 @@ public interface Pattern<T> extends Condition {

Constraint getConstraint();

Map<Variable, Function1<T,?>> getBindings();
List<Binding> getBindings();
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ private static CompositePatterns viewItems2Condition(List<RuleItem> ruleItems, M
conditions.add( pattern );
conditionMap.put( bindViewItem.getInputVariable(), pattern );
}
pattern.addBinding( bindViewItem.getFirstVariable(), bindViewItem.getInvokedFunction() );
pattern.addBinding( bindViewItem );
usedVars.add( bindViewItem.getFirstVariable() );
continue;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package org.drools.model.patterns;

import org.drools.model.*;
import org.drools.model.functions.Function1;
import org.drools.model.AccumulateFunction;
import org.drools.model.AccumulatePattern;
import org.drools.model.Binding;
import org.drools.model.Constraint;
import org.drools.model.DataSourceDefinition;
import org.drools.model.Pattern;
import org.drools.model.Variable;

import java.util.Map;
import java.util.List;

public class AccumulatePatternImpl<T> extends AbstractSinglePattern implements AccumulatePattern<T> {

Expand Down Expand Up @@ -41,7 +46,7 @@ public Variable<T> getPatternVariable() {
}

@Override
public Map<Variable, Function1<T, ?>> getBindings() {
public List<Binding> getBindings() {
return pattern.getBindings();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,27 @@
package org.drools.model.patterns;

import org.drools.model.*;
import org.drools.model.Binding;
import org.drools.model.Constraint;
import org.drools.model.DataSourceDefinition;
import org.drools.model.Pattern;
import org.drools.model.SingleConstraint;
import org.drools.model.Variable;
import org.drools.model.constraints.AbstractConstraint;
import org.drools.model.functions.Function1;
import org.drools.model.impl.DataSourceDefinitionImpl;

import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class PatternImpl<T> extends AbstractSinglePattern implements Pattern<T> {

private final Variable<T> variable;
private Variable[] inputVariables;
private final DataSourceDefinition dataSourceDefinition;
private Constraint constraint;
private Map<Variable, Function1<T, ?>> bindings;
private List<Binding> bindings;

public PatternImpl(Variable<T> variable) {
this(variable, SingleConstraint.EMPTY, DataSourceDefinitionImpl.DEFAULT);
Expand Down Expand Up @@ -57,15 +65,15 @@ public void addConstraint( Constraint constraint ) {
this.constraint = ( (AbstractConstraint) this.constraint ).and( constraint );
}

public void addBinding(Variable boundVar, Function1<T, ?> func) {
public void addBinding(Binding binding) {
if (bindings == null) {
bindings = new HashMap<>();
bindings = new ArrayList<>();
}
bindings.put(boundVar, func);
bindings.add(binding);
}

public Map<Variable, Function1<T, ?>> getBindings() {
return bindings != null ? bindings : Collections.emptyMap();
public List<Binding> getBindings() {
return bindings != null ? bindings : Collections.emptyList();
}

private Variable[] collectInputVariables() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,35 +1,50 @@
package org.drools.model.view;

import org.drools.model.Binding;
import org.drools.model.Variable;
import org.drools.model.functions.Function1;

public class BindViewItem<T> implements ViewItem<T> {
public class BindViewItem<T> implements ViewItem<T>, Binding {

private final Function1 invokedFunction;
private final Variable<T> variable;
private final Variable<T> boundVariable;
private final Function1 bindingFunction;
private final Variable inputVariable;
private final String reactOn;

public BindViewItem( Variable<T> boundVariable, Function1 function, Variable inputVariable) {
this.invokedFunction = function;
this.variable = boundVariable;
public BindViewItem( Variable<T> boundVariable, Function1 bindingFunction, Variable inputVariable, String reactOn ) {
this.bindingFunction = bindingFunction;
this.boundVariable = boundVariable;
this.inputVariable = inputVariable;
this.reactOn = reactOn;
}

@Override
public Variable<T> getFirstVariable() {
return variable;
return boundVariable;
}

@Override
public Variable<?>[] getVariables() {
return new Variable[] { variable };
return new Variable[] { boundVariable };
}

public Function1 getInvokedFunction() {
return invokedFunction;
@Override
public Variable<T> getBoundVariable() {
return boundVariable;
}

@Override
public Function1 getBindingFunction() {
return bindingFunction;
}

@Override
public Variable getInputVariable() {
return inputVariable;
}

@Override
public String getReactOn() {
return reactOn;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,42 +17,93 @@
package org.drools.modelcompiler;

import org.drools.core.RuleBaseConfiguration;
import org.drools.core.base.*;
import org.drools.core.base.ClassFieldAccessorCache;
import org.drools.core.base.ClassObjectType;
import org.drools.core.base.DroolsQuery;
import org.drools.core.base.EnabledBoolean;
import org.drools.core.base.SalienceInteger;
import org.drools.core.base.extractors.ArrayElementReader;
import org.drools.core.base.extractors.SelfReferenceClassFieldReader;
import org.drools.core.definitions.impl.KnowledgePackageImpl;
import org.drools.core.definitions.rule.impl.RuleImpl;
import org.drools.core.rule.*;
import org.drools.core.rule.Accumulate;
import org.drools.core.rule.Behavior;
import org.drools.core.rule.ConditionalBranch;
import org.drools.core.rule.Declaration;
import org.drools.core.rule.EntryPointId;
import org.drools.core.rule.EvalCondition;
import org.drools.core.rule.Forall;
import org.drools.core.rule.GroupElement;
import org.drools.core.rule.MultiAccumulate;
import org.drools.core.rule.NamedConsequence;
import org.drools.core.rule.Pattern;
import org.drools.core.rule.QueryArgument;
import org.drools.core.rule.QueryElement;
import org.drools.core.rule.QueryImpl;
import org.drools.core.rule.RuleConditionElement;
import org.drools.core.rule.SingleAccumulate;
import org.drools.core.rule.SlidingLengthWindow;
import org.drools.core.rule.SlidingTimeWindow;
import org.drools.core.rule.WindowDeclaration;
import org.drools.core.rule.constraint.QueryNameConstraint;
import org.drools.core.ruleunit.RuleUnitUtil;
import org.drools.core.spi.Accumulator;
import org.drools.core.spi.DataProvider;
import org.drools.core.spi.EvalExpression;
import org.drools.core.spi.InternalReadAccessor;
import org.drools.model.*;
import org.drools.model.AccumulateFunction;
import org.drools.model.AccumulatePattern;
import org.drools.model.Argument;
import org.drools.model.Binding;
import org.drools.model.Condition;
import org.drools.model.Consequence;
import org.drools.model.Constraint;
import org.drools.model.EntryPoint;
import org.drools.model.From;
import org.drools.model.Global;
import org.drools.model.Model;
import org.drools.model.OOPath;
import org.drools.model.Query;
import org.drools.model.Rule;
import org.drools.model.SingleConstraint;
import org.drools.model.Value;
import org.drools.model.Variable;
import org.drools.model.View;
import org.drools.model.WindowDefinition;
import org.drools.model.WindowReference;
import org.drools.model.consequences.ConditionalNamedConsequenceImpl;
import org.drools.model.consequences.NamedConsequenceImpl;
import org.drools.model.constraints.SingleConstraint1;
import org.drools.model.functions.Function1;
import org.drools.model.functions.Predicate1;
import org.drools.model.impl.DeclarationImpl;
import org.drools.model.patterns.QueryCallPattern;
import org.drools.modelcompiler.consequence.LambdaConsequence;
import org.drools.modelcompiler.constraints.*;
import org.drools.modelcompiler.constraints.ConstraintEvaluator;
import org.drools.modelcompiler.constraints.LambdaAccumulator;
import org.drools.modelcompiler.constraints.LambdaConstraint;
import org.drools.modelcompiler.constraints.LambdaDataProvider;
import org.drools.modelcompiler.constraints.LambdaEvalExpression;
import org.drools.modelcompiler.constraints.LambdaReadAccessor;
import org.drools.modelcompiler.constraints.TemporalConstraintEvaluator;
import org.drools.modelcompiler.constraints.UnificationConstraint;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.definition.KiePackage;
import org.kie.soup.project.datamodel.commons.types.ClassTypeResolver;
import org.kie.soup.project.datamodel.commons.types.TypeResolver;

import java.util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

import static org.drools.core.rule.Pattern.getReadAcessor;
import static org.drools.model.DSL.*;
import static org.drools.model.DSL.declarationOf;
import static org.drools.model.DSL.entryPoint;
import static org.drools.model.DSL.type;
import static org.drools.model.impl.NamesGenerator.generateName;
import static org.drools.modelcompiler.ModelCompilerUtil.conditionToGroupElementType;

Expand Down Expand Up @@ -359,14 +410,17 @@ private Pattern buildPattern( RuleContext ctx, Condition condition ) {
org.drools.model.Pattern<Object> modelPattern = (org.drools.model.Pattern) condition;
Pattern pattern = addPatternForVariable( ctx, modelPattern.getPatternVariable() );

for (Map.Entry<Variable, Function1<Object,?>> entry : modelPattern.getBindings().entrySet()) {
Declaration declaration = new Declaration(entry.getKey().getName(),
new LambdaReadAccessor(0, entry.getKey().getType().asClass(),
entry.getValue()),
for (Binding binding : modelPattern.getBindings()) {
Declaration declaration = new Declaration(binding.getBoundVariable().getName(),
new LambdaReadAccessor(0, binding.getBoundVariable().getType().asClass(),
binding.getBindingFunction()),
pattern,
true);
pattern.addDeclaration( declaration );
ctx.addInnerDeclaration(entry.getKey(), declaration);
if (binding.getReactOn() != null) {
addFieldsToPatternWatchlist( pattern, binding.getReactOn() );
}
ctx.addInnerDeclaration(binding.getBoundVariable(), declaration);
}

Declaration queryArgDecl = ctx.getQueryDeclaration( modelPattern.getPatternVariable() );
Expand Down Expand Up @@ -484,14 +538,16 @@ private void addConstraintsToPattern( RuleContext ctx, Pattern pattern, org.droo
}
}

private void addFieldsToPatternWatchlist( Pattern pattern, String[] fields ) {
private void addFieldsToPatternWatchlist( Pattern pattern, String... fields ) {
if (fields != null && fields.length > 0) {
Collection<String> watchlist = pattern.getListenedProperties();
if ( watchlist == null ) {
watchlist = new HashSet<>( );
pattern.setListenedProperties( watchlist );
}
watchlist.addAll( Arrays.asList( fields ) );
for (String field : fields) {
watchlist.add( field );
}
}
}

Expand Down
Loading

0 comments on commit d6ecde8

Please sign in to comment.