private static void AnalyzeRelationalOpNode( ExprRelationalOpNode relNode, QueryGraphForge queryGraph) { if (relNode.ChildNodes[0] is ExprIdentNode && relNode.ChildNodes[1] is ExprIdentNode) { var identNodeLeft = (ExprIdentNode) relNode.ChildNodes[0]; var identNodeRight = (ExprIdentNode) relNode.ChildNodes[1]; if (identNodeLeft.StreamId != identNodeRight.StreamId) { queryGraph.AddRelationalOpStrict( identNodeLeft.StreamId, identNodeLeft, identNodeRight.StreamId, identNodeRight, relNode.RelationalOpEnum); } return; } var indexedStream = -1; ExprIdentNode indexedPropExpr = null; ExprNode exprNodeNoIdent = null; var relop = relNode.RelationalOpEnum; if (relNode.ChildNodes[0] is ExprIdentNode) { indexedPropExpr = (ExprIdentNode) relNode.ChildNodes[0]; indexedStream = indexedPropExpr.StreamId; exprNodeNoIdent = relNode.ChildNodes[1]; } else if (relNode.ChildNodes[1] is ExprIdentNode) { indexedPropExpr = (ExprIdentNode) relNode.ChildNodes[1]; indexedStream = indexedPropExpr.StreamId; exprNodeNoIdent = relNode.ChildNodes[0]; relop = relop.Reversed(); } if (indexedStream == -1) { return; // require property of right/left side of equals } var eligibility = EligibilityUtil.VerifyInputStream(exprNodeNoIdent, indexedStream); if (!eligibility.Eligibility.IsEligible()) { return; } queryGraph.AddRelationalOp(indexedStream, indexedPropExpr, eligibility.StreamNum, exprNodeNoIdent, relop); }
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); } }