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