Skip to content

Commit

Permalink
inner declarations binding
Browse files Browse the repository at this point in the history
  • Loading branch information
mariofusco committed Dec 14, 2017
1 parent b8f8db6 commit 63113cd
Show file tree
Hide file tree
Showing 15 changed files with 207 additions and 324 deletions.
Expand Up @@ -21,7 +21,6 @@
import java.io.Serializable;
import java.util.concurrent.TimeUnit;

import static org.drools.model.functions.FunctionUtils.toFunctionN;
import static org.drools.model.impl.ViewBuilder.viewItems2Patterns;

public class DSL {
Expand Down Expand Up @@ -229,39 +228,19 @@ private static ExprViewItem[] combineExprs( ExprViewItem expression, ExprViewIte
return andExprs;
}

public static <T> SetViewItemBuilder<T> set(Variable<T> var) {
return new SetViewItemBuilder<T>(var);
public static <T> BindViewItemBuilder<T> bind( Variable<T> var) {
return new BindViewItemBuilder<T>(var);
}

public static class SetViewItemBuilder<T> {
public static class BindViewItemBuilder<T> {
private final Variable<T> var;

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

public SetViewItem<T> invoking(Function0<T> f) {
return new SetViewItem<T>(toFunctionN(f), false, var);
}

public <A> SetViewItem<T> invoking(Variable<A> var1, Function1<A, T> f) {
return new SetViewItem<T>(toFunctionN(f), false, var, var1);
}

public <A, B> SetViewItem<T> invoking(Variable<A> var1, Variable<B> var2, Function2<A, B, T> f) {
return new SetViewItem<T>(toFunctionN(f), false, var, var1, var2);
}

public SetViewItem<T> in(Function0<Iterable<? extends T>> f) {
return new SetViewItem<T>(toFunctionN(f), true, var);
}

public <A> SetViewItem<T> in(Variable<A> var1, Function1<A, Iterable<? extends T>> f) {
return new SetViewItem<T>(toFunctionN(f), true, var, var1);
}

public <A, B> SetViewItem<T> in(Variable<A> var1, Variable<B> var2, Function2<A, B, Iterable<? extends T>> f) {
return new SetViewItem<T>(toFunctionN(f), true, var, var1, var2);
public <A> BindViewItem<T> as( Variable<A> var1, Function1<A, T> f) {
return new BindViewItem<T>(var, f, var1);
}
}

Expand Down
@@ -1,5 +1,9 @@
package org.drools.model;

import org.drools.model.functions.Function1;

import java.util.Map;

public interface Pattern<T> extends Condition {

DataSourceDefinition getDataSourceDefinition();
Expand All @@ -9,4 +13,6 @@ public interface Pattern<T> extends Condition {
Variable[] getInputVariables();

Constraint getConstraint();

Map<Variable, Function1<T,?>> getBindings();
}
Expand Up @@ -92,25 +92,21 @@ private static CompositePatterns viewItems2Condition(List<RuleItem> ruleItems, M
continue;
}

Variable<?> patterVariable = viewItem.getFirstVariable();
if ( viewItem instanceof InputViewItemImpl ) {
inputs.put( patterVariable, (InputViewItemImpl) viewItem );
if ( viewItem instanceof BindViewItem ) {
BindViewItem bindViewItem = (BindViewItem) viewItem;
PatternImpl pattern = (PatternImpl) conditionMap.get(bindViewItem.getInputVariable());
if (pattern != null) {
pattern.addBinding( bindViewItem.getFirstVariable(), bindViewItem.getInvokedFunction() );
usedVars.add( bindViewItem.getFirstVariable() );
} else {
throw new UnsupportedOperationException("TODO: binding without constraints not implemented");
}
continue;
}

if ( viewItem instanceof SetViewItem ) {
SetViewItem setViewItem = (SetViewItem) viewItem;
Pattern pattern = setViewItem.isMultivalue() ?
new InvokerMultiValuePatternImpl( DataSourceDefinitionImpl.DEFAULT,
setViewItem.getInvokedFunction(),
patterVariable,
setViewItem.getInputVariables() ) :
new InvokerSingleValuePatternImpl( DataSourceDefinitionImpl.DEFAULT,
setViewItem.getInvokedFunction(),
patterVariable,
setViewItem.getInputVariables() );
conditionMap.put( patterVariable, pattern );
conditions.add( pattern );
Variable<?> patterVariable = viewItem.getFirstVariable();
if ( viewItem instanceof InputViewItemImpl ) {
inputs.put( patterVariable, (InputViewItemImpl) viewItem );
continue;
}

Expand Down
@@ -1,11 +1,9 @@
package org.drools.model.patterns;

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

import java.util.Map;

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

Expand Down Expand Up @@ -42,6 +40,11 @@ public Variable<T> getPatternVariable() {
return pattern.getPatternVariable();
}

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

@Override
public Variable<?>[] getBoundVariables() {
return boundVariables;
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

@@ -1,28 +1,18 @@
package org.drools.model.patterns;

import org.drools.model.Constraint;
import org.drools.model.DataSourceDefinition;
import org.drools.model.Index;
import org.drools.model.Pattern;
import org.drools.model.SingleConstraint;
import org.drools.model.Type;
import org.drools.model.Variable;
import org.drools.model.*;
import org.drools.model.constraints.AbstractConstraint;
import org.drools.model.constraints.AbstractSingleConstraint;
import org.drools.model.constraints.SingleConstraint1;
import org.drools.model.constraints.SingleConstraint2;
import org.drools.model.functions.Function0;
import org.drools.model.functions.Function1;
import org.drools.model.functions.Function2;
import org.drools.model.functions.FunctionN;
import org.drools.model.functions.Predicate1;
import org.drools.model.functions.Predicate2;
import org.drools.model.impl.DataSourceDefinitionImpl;
import org.drools.model.index.AlphaIndexImpl;
import org.drools.model.index.BetaIndexImpl;

import static org.drools.model.DSL.declarationOf;
import static org.drools.model.functions.FunctionUtils.toFunctionN;

public class PatternBuilder {

Expand All @@ -42,79 +32,10 @@ public <T> BoundPatternBuilder<T> filter(Variable<T> var) {
return new BoundPatternBuilder<T>(var, dataSourceDefinition);
}

public <T> InvokerPatternBuilder<T> set(Variable<T> var) {
return new InvokerPatternBuilder<T>(var, dataSourceDefinition);
}

public interface ValidBuilder<T> {
Pattern<T> get();
}

public static class InvokerPatternBuilder<T> {
protected final Variable<T> variable;
protected DataSourceDefinition dataSourceDefinition;
protected Variable[] inputVariables;

private InvokerPatternBuilder(Variable<T> variable, DataSourceDefinition dataSourceDefinition) {
this.variable = variable;
this.dataSourceDefinition = dataSourceDefinition;
}

public <A> InvokerSingleValuePatternBuilder<T> invoking(Function0<T> f) {
return new InvokerSingleValuePatternBuilder(variable, dataSourceDefinition, new Variable[0], toFunctionN(f));
}

public <A> InvokerSingleValuePatternBuilder<T> invoking(Variable<A> var, Function1<A, T> f) {
return new InvokerSingleValuePatternBuilder(variable, dataSourceDefinition, new Variable[] { var }, toFunctionN(f));
}

public <A, B> InvokerSingleValuePatternBuilder<T> invoking(Variable<A> var1, Variable<B> var2, Function2<A, B, T> f) {
return new InvokerSingleValuePatternBuilder(variable, dataSourceDefinition, new Variable[] { var1, var2 }, toFunctionN(f));
}

public <A> InvokerMultiValuePatternBuilder<T> in(Function0<Iterable<? extends T>> f) {
return new InvokerMultiValuePatternBuilder(variable, dataSourceDefinition, new Variable[0], toFunctionN(f));
}

public <A> InvokerMultiValuePatternBuilder<T> in(Variable<A> var, Function1<A, Iterable<? extends T>> f) {
return new InvokerMultiValuePatternBuilder(variable, dataSourceDefinition, new Variable[] { var }, toFunctionN(f));
}

public <A, B> InvokerMultiValuePatternBuilder<T> in(Variable<A> var1, Variable<B> var2, Function2<A, B, Iterable<? extends T>> f) {
return new InvokerMultiValuePatternBuilder(variable, dataSourceDefinition, new Variable[] { var1, var2 }, toFunctionN(f));
}
}

public static class InvokerSingleValuePatternBuilder<T> extends InvokerPatternBuilder<T> implements ValidBuilder<T> {
private FunctionN<T> function;

public InvokerSingleValuePatternBuilder(Variable<T> variable, DataSourceDefinition dataSourceDefinition, Variable[] inputVariables, FunctionN<T> function) {
super(variable, dataSourceDefinition);
this.inputVariables = inputVariables;
this.function = function;
}

@Override
public Pattern<T> get() {
return new InvokerSingleValuePatternImpl<T>(dataSourceDefinition, function, variable, inputVariables);
}
}

public static class InvokerMultiValuePatternBuilder<T> extends InvokerPatternBuilder<T> implements ValidBuilder<T> {
private FunctionN<Iterable<? extends T>> function;

public InvokerMultiValuePatternBuilder(Variable<T> variable, DataSourceDefinition dataSourceDefinition, Variable[] inputVariables, FunctionN<Iterable<? extends T>> function) {
super(variable, dataSourceDefinition);
this.inputVariables = inputVariables;
this.function = function;
}

@Override
public Pattern<T> get() {
return new InvokerMultiValuePatternImpl<T>(dataSourceDefinition, function, variable, inputVariables);
}
}

public static class BoundPatternBuilder<T> implements ValidBuilder<T> {
private final Variable<T> variable;
private DataSourceDefinition dataSourceDefinition;
Expand Down
Expand Up @@ -2,17 +2,18 @@

import org.drools.model.*;
import org.drools.model.constraints.AbstractConstraint;
import org.drools.model.functions.Function1;
import org.drools.model.impl.DataSourceDefinitionImpl;

import java.util.HashSet;
import java.util.Set;
import java.util.*;

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;

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

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

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

private Variable[] collectInputVariables() {
Set<Variable> varSet = new HashSet<Variable>();
collectInputVariables(constraint, varSet);
Expand Down

0 comments on commit 63113cd

Please sign in to comment.