public bool Equals(StringRange other) { if (ReferenceEquals(null, other)) { return(false); } if (ReferenceEquals(this, other)) { return(true); } return(Equals(other._min, _min) && Equals(other._max, _max)); }
public void TestComparator() { SortedSet <StringRange> sorted = new SortedSet <StringRange>( new StringRangeComparator()); String[][] TEST_SET = { new[] { "B", "G" }, new[] { "B", "F" }, new[] { null, "E" }, new[] { "A", "F" }, new[] { "A", "G" }, }; int[] EXPECTED_INDEX = { 2, 3, 4, 1, 0 }; // Sort var ranges = new StringRange[TEST_SET.Length]; for (int i = 0; i < TEST_SET.Length; i++) { ranges[i] = new StringRange(TEST_SET[i][0], TEST_SET[i][1]); sorted.Add(ranges[i]); } // Check results int count = 0; foreach (var range in sorted) { var indexExpected = EXPECTED_INDEX[count]; var expected = ranges[indexExpected]; Log.Debug(".testComparator count=" + count + " range=" + range + " expected=" + expected); Assert.AreEqual(range, expected, "failed at count " + count); count++; } Assert.AreEqual(count, TEST_SET.Length); }
public override void MatchEvent(EventBean theEvent, ICollection <FilterHandle> matches) { var objAttributeValue = Lookupable.Getter.Get(theEvent); var returnValue = new Mutable <bool?>(false); using (Instrument.With( i => i.QFilterReverseIndex(this, objAttributeValue), i => i.AFilterReverseIndex(returnValue.Value))) { if (objAttributeValue == null) { return; } var attributeValue = (String)objAttributeValue; var rangeStart = new StringRange(null, attributeValue); var rangeEnd = new StringRange(attributeValue, null); var subMap = Ranges.Between(rangeStart, true, rangeEnd, true); // For not including either endpoint // A bit awkward to duplicate the loop code, however better than checking the bool many times over // This may be a bit of an early performance optimization - the optimizer after all may do this better if (FilterOperator == FilterOperator.RANGE_OPEN) // include neither endpoint { foreach (var entry in subMap) { if (String.Compare(entry.Key.Min, attributeValue, StringComparison.Ordinal) < 0 && String.Compare(entry.Key.Max, attributeValue, StringComparison.Ordinal) > 0) { entry.Value.MatchEvent(theEvent, matches); } } } else if (FilterOperator == FilterOperator.RANGE_CLOSED) // include all endpoints { foreach (var entry in subMap) { if (String.Compare(entry.Key.Min, attributeValue, StringComparison.Ordinal) <= 0 && String.Compare(entry.Key.Max, attributeValue, StringComparison.Ordinal) >= 0) { entry.Value.MatchEvent(theEvent, matches); } } } else if (FilterOperator == FilterOperator.RANGE_HALF_CLOSED) // include high endpoint not low endpoint { foreach (var entry in subMap) { if (String.Compare(entry.Key.Min, attributeValue, StringComparison.Ordinal) < 0 && String.Compare(entry.Key.Max, attributeValue, StringComparison.Ordinal) >= 0) { entry.Value.MatchEvent(theEvent, matches); } } } else if (FilterOperator == FilterOperator.RANGE_HALF_OPEN) // include low endpoint not high endpoint { foreach (var entry in subMap) { if (String.Compare(entry.Key.Min, attributeValue, StringComparison.Ordinal) <= 0 && String.Compare(entry.Key.Max, attributeValue, StringComparison.Ordinal) > 0) { entry.Value.MatchEvent(theEvent, matches); } } } else { throw new IllegalStateException("Invalid filter operator " + FilterOperator); } returnValue.Value = null; } }