public static CodegenExpression Codegen(
                IntervalComputerOverlapsAndByThreshold forge,
                CodegenExpression leftStart,
                CodegenExpression leftEnd,
                CodegenExpression rightStart,
                CodegenExpression rightEnd,
                CodegenMethodScope codegenMethodScope,
                ExprForgeCodegenSymbol exprSymbol,
                CodegenClassScope codegenClassScope)
            {
                var methodNode = codegenMethodScope.MakeChild(
                    typeof(bool),
                    typeof(IntervalComputerOverlapsAndByThresholdEval),
                    codegenClassScope)
                                 .AddParam(IntervalForgeCodegenNames.PARAMS);

                var block = methodNode.Block
                            .DeclareVar <long>(
                    "threshold",
                    forge.thresholdExpr.Codegen(
                        forge.overlaps
                                ? IntervalForgeCodegenNames.REF_LEFTSTART
                                : IntervalForgeCodegenNames.REF_RIGHTSTART,
                        methodNode,
                        exprSymbol,
                        codegenClassScope));

                if (forge.overlaps)
                {
                    block.MethodReturn(
                        CodegenExpressionBuilder.StaticMethod(
                            typeof(IntervalComputerOverlapsAndByThresholdEval),
                            "ComputeIntervalOverlaps",
                            IntervalForgeCodegenNames.REF_LEFTSTART,
                            IntervalForgeCodegenNames.REF_LEFTEND,
                            IntervalForgeCodegenNames.REF_RIGHTSTART,
                            IntervalForgeCodegenNames.REF_RIGHTEND,
                            CodegenExpressionBuilder.Constant(0),
                            CodegenExpressionBuilder.Ref("threshold")));
                }
                else
                {
                    block.MethodReturn(
                        CodegenExpressionBuilder.StaticMethod(
                            typeof(IntervalComputerOverlapsAndByThresholdEval),
                            "ComputeIntervalOverlaps",
                            IntervalForgeCodegenNames.REF_RIGHTSTART,
                            IntervalForgeCodegenNames.REF_RIGHTEND,
                            IntervalForgeCodegenNames.REF_LEFTSTART,
                            IntervalForgeCodegenNames.REF_LEFTEND,
                            CodegenExpressionBuilder.Constant(0),
                            CodegenExpressionBuilder.Ref("threshold")));
                }

                return(CodegenExpressionBuilder.LocalMethod(methodNode, leftStart, leftEnd, rightStart, rightEnd));
            }
Beispiel #2
0
 public bool?Compute(
     long leftStart,
     long leftEnd,
     long rightStart,
     long rightEnd,
     EventBean[] eventsPerStream,
     bool newData,
     ExprEvaluatorContext context)
 {
     if (_overlaps)
     {
         var minThreshold = _minEval.Evaluate(leftStart, eventsPerStream, newData, context);
         var maxThreshold = _maxEval.Evaluate(leftEnd, eventsPerStream, newData, context);
         return(IntervalComputerOverlapsAndByThreshold.ComputeInternalOverlaps(
                    leftStart, leftEnd, rightStart, rightEnd, minThreshold, maxThreshold));
     }
     else
     {
         var minThreshold = _minEval.Evaluate(rightStart, eventsPerStream, newData, context);
         var maxThreshold = _maxEval.Evaluate(rightEnd, eventsPerStream, newData, context);
         return(IntervalComputerOverlapsAndByThreshold.ComputeInternalOverlaps(
                    rightStart, rightEnd, leftStart, leftEnd, minThreshold, maxThreshold));
     }
 }