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

Intersect() public method

public Intersect ( SqlExpressionType op, Field value ) : IndexRangeSet
op SqlExpressionType
value Field
return IndexRangeSet
        public IndexRangeSet Intersect(SqlExpressionType op, Field value)
        {
            lock (this) {
                int sz = ranges.Count;
                var list = ranges.GetRange(0, sz);

                if (op == SqlExpressionType.NotEqual ||
                    op == SqlExpressionType.IsNot) {
                    bool nullCheck = op == SqlExpressionType.NotEqual;
                    int j = 0;
                    while (j < sz) {
                        var range = list[j];
                        var leftRange = IntersectOn(range, SqlExpressionType.SmallerThan, value, nullCheck);
                        var rightRange = IntersectOn(range, SqlExpressionType.GreaterThan, value, nullCheck);
                        list.RemoveAt(j);
                        if (leftRange != IndexRange.Null) {
                            list.Add(leftRange);
                        }
                        if (rightRange != IndexRange.Null) {
                            list.Add(rightRange);
                        }
                        j++;
                    }

                    return new IndexRangeSet(list);
                } else {
                    bool nullCheck = op != SqlExpressionType.Is;
                    int j = 0;
                    while (j < sz) {
                        var range = list[j];
                        range = IntersectOn(range, op, value, nullCheck);
                        if (range == IndexRange.Null) {
                            list.RemoveAt(j);
                        } else {
                            list[j] = range;
                        }
                        j++;
                    }

                    return new IndexRangeSet(list);
                }
            }
        }

Usage Example

        public static IEnumerable<int> SelectRows(this ITable table, int column, SqlExpressionType op, DataObject value)
        {
            // If the cell is of an incompatible type, return no results,
            var colType = table.TableInfo[column].ColumnType;
            if (!value.Type.IsComparable(colType)) {
                // Types not comparable, so return 0
                return new List<int>(0);
            }

            // Get the selectable scheme for this column
            var index = table.GetIndex(column);

            // If the operator is a standard operator, use the interned SelectableScheme
            // methods.
            if (op == SqlExpressionType.Equal)
                return index.SelectEqual(value);
            if (op == SqlExpressionType.NotEqual)
                return index.SelectNotEqual(value);
            if (op == SqlExpressionType.GreaterThan)
                return index.SelectGreater(value);
            if (op == SqlExpressionType.SmallerThan)
                return index.SelectLess(value);
            if (op == SqlExpressionType.GreaterOrEqualThan)
                return index.SelectGreaterOrEqual(value);
            if (op == SqlExpressionType.SmallerOrEqualThan)
                return index.SelectLessOrEqual(value);

            // If it's not a standard operator (such as IS, NOT IS, etc) we generate the
            // range set especially.
            var rangeSet = new IndexRangeSet();
            rangeSet = rangeSet.Intersect(op, value);
            return index.SelectRange(rangeSet.ToArray());
        }