Пример #1
0
  private void checkDelaying(final BuildContext context, final Constraint constraint) {
    if (constraint instanceof VariableConstraint) {
      // variable constraints always require a single declaration
      Declaration target = constraint.getRequiredDeclarations()[0];
      if (target.isPatternDeclaration() && target.getPattern().getObjectType().isEvent()) {
        long uplimit = ((VariableConstraint) constraint).getInterval().getUpperBound();

        Timer timer = context.getRule().getTimer();
        DurationTimer durationTimer = new DurationTimer(uplimit);

        if (timer instanceof CompositeMaxDurationTimer) {
          // already a composite so just add
          ((CompositeMaxDurationTimer) timer).addDurationTimer(durationTimer);
        } else {
          if (timer == null) {
            // no timer exists, so ok on it's own
            timer = durationTimer;
          } else {
            // timer exists so we need to make a composite
            CompositeMaxDurationTimer temp = new CompositeMaxDurationTimer();
            if (timer instanceof DurationTimer) {
              // previous timer was a duration, so add another DurationTimer
              temp.addDurationTimer((DurationTimer) timer);
            } else {
              // previous timer was not a duration, so set it as the delegate Timer.
              temp.setTimer(context.getRule().getTimer());
            }
            // now add the new durationTimer
            temp.addDurationTimer(durationTimer);
            timer = temp;
          }
          // with the composite made, reset it on the Rule
          context.getRule().setTimer(timer);
        }
      }
    }
  }
Пример #2
0
  public void build(BuildContext context, BuildUtils utils, RuleConditionElement rce) {
    NamedConsequence namedConsequence = (NamedConsequence) rce;

    Timer timer = context.getRule().getTimer();
    if (timer != null) {
      ReteooComponentBuilder builder = utils.getBuilderFor(Timer.class);
      builder.build(context, utils, context.getRule().getTimer());
    }

    RuleTerminalNode terminalNode = buildTerminalNodeForNamedConsequence(context, namedConsequence);

    terminalNode.attach(context);

    terminalNode.networkUpdated(new UpdateContext());

    // adds the terminal node to the list of nodes created/added by this sub-rule
    context.getNodes().add(terminalNode);

    if (timer != null) {
      context.setTupleSource(context.getTupleSource().getLeftTupleSource());
    }

    context.setTerminated(namedConsequence.isTerminal());
  }
Пример #3
0
  static RuleTerminalNode buildTerminalNodeForNamedConsequence(
      BuildContext context, NamedConsequence namedConsequence) {
    RuleImpl rule = context.getRule();
    GroupElement subrule = (GroupElement) context.peek();

    ActivationListenerFactory factory =
        context
            .getKnowledgeBase()
            .getConfiguration()
            .getActivationListenerFactory(rule.getActivationListener());

    context.setConsequenceName(namedConsequence.getConsequenceName());
    TerminalNode terminal =
        factory.createActivationListener(
            context.getNextId(),
            context.getTupleSource(),
            rule,
            subrule,
            0, // subruleIndex,
            context);
    context.setConsequenceName(null);

    return (RuleTerminalNode) terminal;
  }