示例#1
0
        public void Apply(QueryGraphForge filterQueryGraph)
        {
            if (targetStreamNum == parameterStreamNum) {
                return;
            }

            var targetStartExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                targetStreamNum,
                targetStartProp);
            var targetEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(typesPerStream, targetStreamNum, targetEndProp);
            var parameterStartExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                parameterStreamNum,
                parameterStartProp);
            var parameterEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                typesPerStream,
                parameterStreamNum,
                parameterEndProp);

            if (targetStartExpr.Forge.EvaluationType != parameterStartExpr.Forge.EvaluationType) {
                return;
            }

            if (currentMethod == DateTimeMethodEnum.BEFORE) {
                // a.end < b.start
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterStartExpr,
                    RelationalOpEnum.LT);
            }
            else if (currentMethod == DateTimeMethodEnum.AFTER) {
                // a.start > b.end
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    RelationalOpEnum.GT);
            }
            else if (currentMethod == DateTimeMethodEnum.COINCIDES) {
                // a.startTimestamp = b.startTimestamp and a.endTimestamp = b.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);

                var noDuration = parameterEndProp.Equals(parameterStartProp) && targetEndProp.Equals(targetStartProp);
                if (!noDuration) {
                    var leftEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                        typesPerStream,
                        targetStreamNum,
                        targetEndProp);
                    var rightEndExpr = ExprNodeUtilityMake.MakeExprIdentNode(
                        typesPerStream,
                        parameterStreamNum,
                        parameterEndProp);
                    filterQueryGraph.AddStrictEquals(
                        targetStreamNum,
                        targetEndProp,
                        leftEndExpr,
                        parameterStreamNum,
                        parameterEndProp,
                        rightEndExpr);
                }
            }
            else if (currentMethod == DateTimeMethodEnum.DURING || currentMethod == DateTimeMethodEnum.INCLUDES) {
                // DURING:   b.startTimestamp < a.startTimestamp <= a.endTimestamp < b.endTimestamp
                // INCLUDES: a.startTimestamp < b.startTimestamp <= b.endTimestamp < a.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.DURING ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    parameterStreamNum,
                    parameterStartExpr,
                    targetStreamNum,
                    targetStartExpr,
                    relop);

                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);
            }
            else if (currentMethod == DateTimeMethodEnum.FINISHES || currentMethod == DateTimeMethodEnum.FINISHEDBY) {
                // FINISHES:   b.startTimestamp < a.startTimestamp and a.endTimestamp = b.endTimestamp
                // FINISHEDBY: a.startTimestamp < b.startTimestamp and a.endTimestamp = b.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.FINISHES ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    parameterStreamNum,
                    parameterStartExpr,
                    targetStreamNum,
                    targetStartExpr,
                    relop);

                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetEndProp,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndProp,
                    parameterEndExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.MEETS) {
                // a.endTimestamp = b.startTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetEndProp,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.METBY) {
                // a.startTimestamp = b.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterEndProp,
                    parameterEndExpr);
            }
            else if (currentMethod == DateTimeMethodEnum.OVERLAPS || currentMethod == DateTimeMethodEnum.OVERLAPPEDBY) {
                // OVERLAPS:     a.startTimestamp < b.startTimestamp < a.endTimestamp < b.endTimestamp
                // OVERLAPPEDBY: b.startTimestamp < a.startTimestamp < b.endTimestamp < a.endTimestamp
                var relop = currentMethod == DateTimeMethodEnum.OVERLAPS ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartExpr,
                    relop);

                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);

                if (currentMethod == DateTimeMethodEnum.OVERLAPS) {
                    filterQueryGraph.AddRelationalOpStrict(
                        parameterStreamNum,
                        parameterStartExpr,
                        targetStreamNum,
                        targetEndExpr,
                        RelationalOpEnum.LT);
                }
                else {
                    filterQueryGraph.AddRelationalOpStrict(
                        targetStreamNum,
                        targetStartExpr,
                        parameterStreamNum,
                        parameterEndExpr,
                        RelationalOpEnum.LT);
                }
            }
            else if (currentMethod == DateTimeMethodEnum.STARTS || currentMethod == DateTimeMethodEnum.STARTEDBY) {
                // STARTS:       a.startTimestamp = b.startTimestamp and a.endTimestamp < b.endTimestamp
                // STARTEDBY:    a.startTimestamp = b.startTimestamp and b.endTimestamp < a.endTimestamp
                filterQueryGraph.AddStrictEquals(
                    targetStreamNum,
                    targetStartProp,
                    targetStartExpr,
                    parameterStreamNum,
                    parameterStartProp,
                    parameterStartExpr);

                var relop = currentMethod == DateTimeMethodEnum.STARTS ? RelationalOpEnum.LT : RelationalOpEnum.GT;
                filterQueryGraph.AddRelationalOpStrict(
                    targetStreamNum,
                    targetEndExpr,
                    parameterStreamNum,
                    parameterEndExpr,
                    relop);
            }
        }
示例#2
0
 public void Apply(QueryGraphForge queryGraph)
 {
     var targetExpr = ExprNodeUtilityMake.MakeExprIdentNode(typesPerStream, targetStreamNum, targetPropertyName);
     RangeFilterAnalyzer.Apply(targetExpr, start, end, includeLow, includeHigh, false, queryGraph);
 }