public void build(final BuildContext context,
final BuildUtils utils,
final RuleConditionElement rce) {
boolean existSubNetwort = false;
final Collect collect = (Collect) rce;
context.pushRuleComponent( collect );
final List resultBetaConstraints = context.getBetaconstraints();
final List resultAlphaConstraints = context.getAlphaConstraints();
final List resultBehaviors = context.getBehaviors();
final Pattern sourcePattern = collect.getSourcePattern();
final Pattern resultPattern = collect.getResultPattern();
// get builder for the pattern
final ReteooComponentBuilder builder = utils.getBuilderFor( sourcePattern );
// save tuple source and pattern offset for later if needed
final LeftTupleSource tupleSource = context.getTupleSource();
final int currentPatternIndex = context.getCurrentPatternOffset();
// builds the source pattern
builder.build( context,
utils,
sourcePattern );
// if object source is null, then we need to adapt tuple source into a subnetwork
if ( context.getObjectSource() == null ) {
// attach right input adapter node to convert tuple source into an object source
context.setObjectSource( (ObjectSource) utils.attachNode( context,
new RightInputAdapterNode( context.getNextId(),
context.getTupleSource(),
context ) ) );
// restore tuple source from before the start of the sub network
context.setTupleSource( tupleSource );
// create a tuple start equals constraint and set it in the context
final TupleStartEqualsConstraint constraint = TupleStartEqualsConstraint.getInstance();
final List betaConstraints = new ArrayList();
betaConstraints.add( constraint );
context.setBetaconstraints( betaConstraints );
existSubNetwort = true;
}
BetaConstraints binder = utils.createBetaNodeConstraint( context,
context.getBetaconstraints(),
false );
// indexing for the results should be always disabled
BetaConstraints resultBinder = utils.createBetaNodeConstraint( context,
resultBetaConstraints,
true );
Behavior[] behaviors = Behavior.EMPTY_BEHAVIOR_LIST;
if ( !context.getBehaviors().isEmpty() ) {
behaviors = (Behavior[]) context.getBehaviors().toArray( new Behavior[context.getBehaviors().size()] );
}
CollectAccumulator accumulator = new CollectAccumulator( collect );
Accumulate accumulate = new Accumulate( sourcePattern,
sourcePattern.getRequiredDeclarations(),
(Declaration[]) collect.getInnerDeclarations().values().toArray( new Declaration[0] ),
new Accumulator[] { accumulator },
false );
context.setTupleSource( (LeftTupleSource) utils.attachNode( context,
new AccumulateNode( context.getNextId(),
context.getTupleSource(),