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); }
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); }
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); } } }