public void Apply(QueryGraph queryGraph)
        {
            if (_targetStreamNum == _parameterStreamNum)
            {
                return;
            }

            ExprIdentNode targetStartExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _targetStreamNum, _targetStartProp);
            ExprIdentNode targetEndExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _targetStreamNum, _targetEndProp);
            ExprIdentNode parameterStartExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _parameterStreamNum, _parameterStartProp);
            ExprIdentNode parameterEndExpr = ExprNodeUtility.GetExprIdentNode(
                _typesPerStream, _parameterStreamNum, _parameterEndProp);

            if (targetStartExpr.ExprEvaluator.ReturnType != parameterStartExpr.ExprEvaluator.ReturnType)
            {
                return;
            }

            if (_currentMethod == DatetimeMethodEnum.BEFORE)
            {
                // a.end < b.start
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterStartExpr,
                    RelationalOpEnum.LT);
            }
            else if (_currentMethod == DatetimeMethodEnum.AFTER)
            {
                // a.start > b.end
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetStartExpr,
                    _parameterStreamNum, parameterEndExpr,
                    RelationalOpEnum.GT);
            }
            else if (_currentMethod == DatetimeMethodEnum.COINCIDES)
            {
                // a.startTimestamp = b.startTimestamp and a.endTimestamp = b.endTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetStartProp, targetStartExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);

                var noDuration = _parameterEndProp.Equals(_parameterStartProp) &&
                                 _targetEndProp.Equals(_targetStartProp);
                if (!noDuration)
                {
                    ExprIdentNode leftEndExpr = ExprNodeUtility.GetExprIdentNode(
                        _typesPerStream, _targetStreamNum, _targetEndProp);
                    ExprIdentNode rightEndExpr = ExprNodeUtility.GetExprIdentNode(
                        _typesPerStream, _parameterStreamNum, _parameterEndProp);
                    queryGraph.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
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.DURING
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _parameterStreamNum, parameterStartExpr,
                    _targetStreamNum, targetStartExpr, relop);

                queryGraph.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
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.FINISHES
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _parameterStreamNum, parameterStartExpr,
                    _targetStreamNum, targetStartExpr, relop);

                queryGraph.AddStrictEquals(
                    _targetStreamNum, _targetEndProp, targetEndExpr,
                    _parameterStreamNum, _parameterEndProp, parameterEndExpr);
            }
            else if (_currentMethod == DatetimeMethodEnum.MEETS)
            {
                // a.endTimestamp = b.startTimestamp
                queryGraph.AddStrictEquals(_targetStreamNum, _targetEndProp, targetEndExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);
            }
            else if (_currentMethod == DatetimeMethodEnum.METBY)
            {
                // a.startTimestamp = b.endTimestamp
                queryGraph.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
                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.OVERLAPS
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetStartExpr,
                    _parameterStreamNum, parameterStartExpr, relop);

                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterEndExpr, relop);

                if (_currentMethod == DatetimeMethodEnum.OVERLAPS)
                {
                    queryGraph.AddRelationalOpStrict(
                        _parameterStreamNum, parameterStartExpr,
                        _targetStreamNum, targetEndExpr, RelationalOpEnum.LT);
                }
                else
                {
                    queryGraph.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
                queryGraph.AddStrictEquals(_targetStreamNum, _targetStartProp, targetStartExpr,
                                           _parameterStreamNum, _parameterStartProp, parameterStartExpr);

                RelationalOpEnum relop = _currentMethod == DatetimeMethodEnum.STARTS
                                             ? RelationalOpEnum.LT
                                             : RelationalOpEnum.GT;
                queryGraph.AddRelationalOpStrict(
                    _targetStreamNum, targetEndExpr,
                    _parameterStreamNum, parameterEndExpr, relop);
            }
        }