Ejemplo n.º 1
0
 private LeftTupleSource unwrapLeftInput(LeftTupleSource leftInput) {
   if (leftInput.getType() == NodeTypeEnums.FromNode
       || leftInput.getType() == NodeTypeEnums.ReactiveFromNode) {
     return leftInput.getLeftTupleSource();
   }
   return leftInput;
 }
Ejemplo n.º 2
0
 protected void initInferredMask(LeftTupleSource leftInput) {
   LeftTupleSource unwrappedLeft = unwrapLeftInput(leftInput);
   if (unwrappedLeft.getType() == NodeTypeEnums.LeftInputAdapterNode
       && ((LeftInputAdapterNode) unwrappedLeft).getParentObjectSource().getType()
           == NodeTypeEnums.AlphaNode) {
     AlphaNode alphaNode =
         (AlphaNode) ((LeftInputAdapterNode) unwrappedLeft).getParentObjectSource();
     leftInferredMask = alphaNode.updateMask(leftDeclaredMask);
   } else {
     leftInferredMask = leftDeclaredMask;
   }
   leftInferredMask = leftInferredMask.resetAll(leftNegativeMask);
 }
Ejemplo n.º 3
0
  protected void initDeclaredMask(BuildContext context, LeftTupleSource leftInput) {
    if (context == null || context.getLastBuiltPatterns() == null) {
      // only happens during unit tests
      leftDeclaredMask = AllSetBitMask.get();
      return;
    }

    if (leftInput.getType() != NodeTypeEnums.LeftInputAdapterNode) {
      // BetaNode's not after LIANode are not relevant for left mask property specific, so don't
      // block anything.
      leftDeclaredMask = AllSetBitMask.get();
      return;
    }

    Pattern pattern = context.getLastBuiltPatterns()[1]; // left input pattern

    ObjectType objectType =
        pattern == null || this.getType() == NodeTypeEnums.AccumulateNode
            ? ((LeftInputAdapterNode) leftInput)
                .getParentObjectSource()
                .getObjectTypeNode()
                .getObjectType()
            : pattern.getObjectType();

    if (!(objectType instanceof ClassObjectType)) {
      // Only ClassObjectType can use property specific
      leftDeclaredMask = AllSetBitMask.get();
      return;
    }

    Class objectClass = ((ClassWireable) objectType).getClassType();
    if (isPropertyReactive(context, objectClass)) {
      // TODO: at the moment if pattern is null (e.g. for eval node) we cannot calculate the mask,
      // so we leave it to 0
      if (pattern != null) {
        List<String> leftListenedProperties = pattern.getListenedProperties();
        List<String> settableProperties =
            getSettableProperties(context.getKnowledgeBase(), objectClass);
        leftDeclaredMask = calculatePositiveMask(leftListenedProperties, settableProperties);
        leftNegativeMask = calculateNegativeMask(leftListenedProperties, settableProperties);
        setLeftListenedProperties(leftListenedProperties);
      }
    } else {
      // if property specific is not on, then accept all modification propagations
      leftDeclaredMask = AllSetBitMask.get();
    }
  }
Ejemplo n.º 4
0
  public static int getOffset(NetworkNode node) {
    LeftTupleSource lt;
    int offset = 1;
    if (NodeTypeEnums.isTerminalNode(node)) {
      lt = ((TerminalNode) node).getLeftTupleSource();
      offset++;
    } else if (node.getType() == NodeTypeEnums.RightInputAdaterNode) {
      lt = ((RightInputAdapterNode) node).getLeftTupleSource();
    } else {
      lt = (LeftTupleSource) node;
    }
    while (lt.getType() != NodeTypeEnums.LeftInputAdapterNode) {
      offset++;
      lt = lt.getLeftTupleSource();
    }

    return offset;
  }
Ejemplo n.º 5
0
  private BaseNode[] evalQuery(
      String queryName,
      DroolsQuery queryObject,
      InternalFactHandle handle,
      PropagationContext pCtx) {
    BaseNode[] tnodes = (BaseNode[]) ruleBase.getReteooBuilder().getTerminalNodes(queryName);
    if (this.ruleBase.getConfiguration().isPhreakEnabled()) {
      if (tnodes == null) {
        throw new RuntimeException("Query '" + queryName + "' does not exist");
      }

      QueryTerminalNode tnode = (QueryTerminalNode) tnodes[0];
      LeftTupleSource lts = tnode.getLeftTupleSource();
      while (lts.getType() != NodeTypeEnums.LeftInputAdapterNode) {
        lts = lts.getLeftTupleSource();
      }
      LeftInputAdapterNode lian = (LeftInputAdapterNode) lts;
      LiaNodeMemory lmem = (LiaNodeMemory) getNodeMemory((MemoryFactory) lts);
      SegmentMemory lsmem = lmem.getSegmentMemory();
      if (lsmem == null) {
        lsmem = SegmentUtilities.createSegmentMemory(lts, this);
      }
      LeftInputAdapterNode.doInsertObject(
          handle, pCtx, lian, this, lmem, false, queryObject.isOpen());

      List<PathMemory> rmems = lmem.getSegmentMemory().getPathMemories();
      for (int i = 0, length = rmems.size(); i < length; i++) {
        PathMemory rm = rmems.get(i);

        RuleNetworkEvaluatorActivation evaluator =
            agenda.createRuleNetworkEvaluatorActivation(
                Integer.MAX_VALUE, rm, (TerminalNode) rm.getNetworkNode());
        evaluator.evaluateNetwork(this, 0, -1);
      }
    } else {
      // no need to call retract, as no leftmemory used.
      getEntryPointNode().assertQuery(handle, pCtx, this);

      pCtx.evaluateActionQueue(this);
    }
    return tnodes;
  }