Deveel.Data.Index.IndexRangeSet.Union C# (CSharp) Method

Union() public method

Unions the current range set with the given range set.
public Union ( IndexRangeSet unionTo ) : IndexRangeSet
unionTo IndexRangeSet
return IndexRangeSet
        public IndexRangeSet Union(IndexRangeSet unionTo)
        {
            lock (this) {
                var rangeSet = new List<IndexRange>(ranges);
                var inputSet = unionTo.ranges;

                int inSz = inputSet.Count;
                int n = 0;
                while (n < inSz) {
                    var inRange = inputSet[n];
                    int sz = rangeSet.Count;
                    var i = rangeSet.GetRange(0, sz);
                    int j = 0;
                    while (j < i.Count) {
                        var range = i[j];
                        if (IntersectedBy(inRange, range)) {
                            i.RemoveAt(j);
                            inRange = ChangeRangeSizeToEncompass(inRange, range);
                        }
                        j++;
                    }

                    // Insert into sorted position
                    var startPoint = inRange.StartOffset;
                    var start = inRange.StartValue;
                    var endPoint = inRange.EndOffset;
                    var end = inRange.EndValue;

                    if (start == IndexRange.FirstInSet) {
                        rangeSet.Insert(0, inRange);
                    } else {
                        var startCell = start;
                        i = rangeSet.GetRange(0, rangeSet.Count);
                        j = 0;
                        while (j < i.Count) {
                            var range = i[j];
                            var curStart = range.StartValue;
                            if (!curStart.Equals(IndexRange.FirstInSet)) {
                                if (curStart.CompareTo(startCell) > 0) {
                                    i[j] = i[j - 1];
                                    break;
                                }
                            }
                            j++;
                        }
                        i.Add(inRange);
                    }
                    n++;
                }

                return new IndexRangeSet(rangeSet);
            }
        }

Usage Example

コード例 #1
0
ファイル: RangeSelectNode.cs プロジェクト: prepare/deveeldb
            public override SqlExpression VisitBinary(SqlBinaryExpression binaryEpression)
            {
                if (binaryEpression.ExpressionType == SqlExpressionType.And) {
                    rangeSet = UpdateRange(binaryEpression.Left);
                    rangeSet = UpdateRange(binaryEpression.Right);
                } else if (binaryEpression.ExpressionType == SqlExpressionType.Or) {
                    var left = CalcExpression(binaryEpression.Left);
                    var right = CalcExpression(binaryEpression.Right);

                    rangeSet = rangeSet.Union(left);
                    rangeSet = rangeSet.Union(right);
                } else {
                    rangeSet = UpdateRange(binaryEpression);
                }

                return base.VisitBinary(binaryEpression);
            }