public override void ToPrecedenceFreeEPL(TextWriter writer) { if (_optionalMaxExpressions == null || _optionalMaxExpressions.IsEmpty()) { PatternExpressionUtil.ToPrecedenceFreeEPL(writer, "->", ChildNodes, Precedence); } else { ChildNodes[0].ToEPL(writer, PatternExpressionPrecedenceEnum.MINIMUM); for (int i = 1; i < ChildNodes.Count; i++) { ExprNode optionalMaxExpression = null; if (_optionalMaxExpressions.Count > (i - 1)) { optionalMaxExpression = _optionalMaxExpressions[i - 1]; } if (optionalMaxExpression == null) { writer.Write(" -> "); } else { writer.Write(" -["); writer.Write(ExprNodeUtility.ToExpressionStringMinPrecedenceSafe(optionalMaxExpression)); writer.Write("]> "); } ChildNodes[i].ToEPL(writer, PatternExpressionPrecedenceEnum.MINIMUM); } } }
public override void ToPrecedenceFreeEPL(TextWriter writer) { PatternExpressionUtil.ToPrecedenceFreeEPL(writer, "and", ChildNodes, Precedence); }
public void EvaluateTrue(MatchedEventMap matchEvent, EvalStateNode fromNode, bool isQuitted) { if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().QPatternEveryDistinctEvaluateTrue(EveryDistinctNode, matchEvent); } // determine if this evaluation has been seen before from the same node var matchEventKey = PatternExpressionUtil.GetKeys(matchEvent, EveryDistinctNode.FactoryNode.Convertor, EveryDistinctNode.FactoryNode.DistinctExpressionsArray, EveryDistinctNode.Context.AgentInstanceContext); var haveSeenThis = false; var keysFromNode = SpawnedNodes.Get(fromNode); if (keysFromNode != null) { if (keysFromNode.Contains(matchEventKey)) { haveSeenThis = true; } else { keysFromNode.Add(matchEventKey); } } if (isQuitted) { SpawnedNodes.Remove(fromNode); } // See explanation in EvalFilterStateNode for the type check if (fromNode.IsFilterStateNode) { // We do not need to newState new listeners here, since the filter state node below this node did not quit } else { // Spawn all nodes below this EVERY node // During the start of a child we need to use the temporary evaluator to catch any event created during a start // Such events can be raised when the "not" operator is used. var spawnEvaluator = new EvalEveryStateSpawnEvaluator(EveryDistinctNode.Context.PatternContext.StatementName); var spawned = EveryDistinctNode.ChildNode.NewState(spawnEvaluator, null, 0L); spawned.Start(BeginState); // If the whole spawned expression already turned true, quit it again if (spawnEvaluator.IsEvaluatedTrue) { spawned.Quit(); } else { var keyset = new HashSet <Object>(); if (keysFromNode != null) { keyset.AddAll(keysFromNode); } SpawnedNodes.Put(spawned, keyset); spawned.ParentEvaluator = this; } } if (!haveSeenThis) { ParentEvaluator.EvaluateTrue(matchEvent, this, false); } if (InstrumentationHelper.ENABLED) { InstrumentationHelper.Get().APatternEveryDistinctEvaluateTrue(keysFromNode, null, matchEventKey, haveSeenThis); } }