Beispiel #1
0
 public void AddRelationalOpStrict(int streamIdLeft, ExprIdentNode propertyLeftExpr,
                                   int streamIdRight, ExprIdentNode propertyRightExpr,
                                   RelationalOpEnum relationalOpEnum)
 {
     Check(streamIdLeft, streamIdRight);
     InternalAddRelOp(streamIdLeft, streamIdRight, propertyLeftExpr, QueryGraphRangeEnumExtensions.MapFrom(relationalOpEnum.Reversed()), propertyRightExpr, false);
     InternalAddRelOp(streamIdRight, streamIdLeft, propertyRightExpr, QueryGraphRangeEnumExtensions.MapFrom(relationalOpEnum), propertyLeftExpr, false);
 }
Beispiel #2
0
        public void AddRelationalOp(int indexedStream, ExprIdentNode indexedProp, int? keyStreamNum, ExprNode exprNodeNoIdent, RelationalOpEnum relationalOpEnum)
        {
            if (keyStreamNum == null)
            {
                for (var i = 0; i < _numStreams; i++)
                {
                    if (i == indexedStream)
                    {
                        continue;
                    }
                    InternalAddRelOp(i, indexedStream, exprNodeNoIdent, QueryGraphRangeEnumExtensions.MapFrom(relationalOpEnum), indexedProp, false);
                }
                return;
            }

            // add for a specific stream only
            InternalAddRelOp(keyStreamNum.Value, indexedStream, exprNodeNoIdent, QueryGraphRangeEnumExtensions.MapFrom(relationalOpEnum), indexedProp, false);
        }
Beispiel #3
0
        public void AddRangeStrict(int streamNumStart, ExprIdentNode propertyStartExpr,
                               int streamNumEnd, ExprIdentNode propertyEndExpr,
                               int streamNumValue, ExprIdentNode propertyValueExpr,
                               bool includeStart, bool includeEnd, bool isInverted)
        {
            Check(streamNumStart, streamNumValue);
            Check(streamNumEnd, streamNumValue);

            // add as a range if the endpoints are from the same stream
            if (streamNumStart == streamNumEnd && streamNumStart != streamNumValue)
            {
                var rangeOp = QueryGraphRangeEnumExtensions.GetRangeOp(includeStart, includeEnd, isInverted);
                InternalAddRange(streamNumStart, streamNumValue, rangeOp, propertyStartExpr, propertyEndExpr, propertyValueExpr);
                InternalAddRelOp(streamNumValue, streamNumStart, propertyValueExpr, QueryGraphRangeEnum.GREATER_OR_EQUAL, propertyEndExpr, false);
                InternalAddRelOp(streamNumValue, streamNumStart, propertyValueExpr, QueryGraphRangeEnum.LESS_OR_EQUAL, propertyStartExpr, false);
            }
            else
            {
                // endpoints from a different stream, add individually
                if (streamNumValue != streamNumStart)
                {
                    // read propertyValue >= propertyStart
                    InternalAddRelOp(streamNumStart, streamNumValue, propertyStartExpr, QueryGraphRangeEnum.GREATER_OR_EQUAL, propertyValueExpr, true);
                    // read propertyStart <= propertyValue
                    InternalAddRelOp(streamNumValue, streamNumStart, propertyValueExpr, QueryGraphRangeEnum.LESS_OR_EQUAL, propertyStartExpr, true);
                }

                if (streamNumValue != streamNumEnd)
                {
                    // read propertyValue <= propertyEnd
                    InternalAddRelOp(streamNumEnd, streamNumValue, propertyEndExpr, QueryGraphRangeEnum.LESS_OR_EQUAL, propertyValueExpr, true);
                    // read propertyEnd >= propertyValue
                    InternalAddRelOp(streamNumValue, streamNumEnd, propertyValueExpr, QueryGraphRangeEnum.GREATER_OR_EQUAL, propertyEndExpr, true);
                }
            }
        }