// this is really crappy, need to fix it private BrowseFacet[] FoldChoices(BrowseFacet[] choices, int max) { if (max == 0 || choices.Length <= max) return choices; List<RangeFacet> list = new List<RangeFacet>(); for (int i = 0; i < choices.Length; i += 2) { RangeFacet rangeChoice = new RangeFacet(); if ((i + 1) < choices.Length) { if (choices is RangeFacet[]) { RangeFacet[] rChoices = (RangeFacet[])choices; object val1 = rChoices[i].Lower; object val2 = rChoices[i + 1].Upper; rangeChoice.SetValues(val1, val2); rangeChoice.HitCount = choices[i].HitCount + choices[i + 1].HitCount; } else { rangeChoice.SetValues(choices[i].Value, choices[i + 1].Value); rangeChoice.HitCount = choices[i].HitCount + choices[i + 1].HitCount; } } else { if (choices is RangeFacet[]) { RangeFacet[] rChoices = (RangeFacet[])choices; rangeChoice.SetValues(rChoices[i].Lower, rChoices[i].Upper); } else { rangeChoice.SetValues(choices[i].Value, choices[i].Value); } rangeChoice.HitCount = choices[i].HitCount; } list.Add(rangeChoice); } RangeFacet[] result = list.ToArray(); return FoldChoices(result, max); }
internal virtual void ConvertFacets(BrowseFacet[] facets) { int i = 0; foreach (BrowseFacet facet in facets) { int hit = facet.HitCount; object val = facet.Value; RangeFacet rangeFacet = new RangeFacet(); rangeFacet.SetValues(val, val); rangeFacet.HitCount = hit; facets[i++] = rangeFacet; } }
public void CanReturnDescriptiveParsingErrors() { var invalidOperatorEx = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary == 5)); Assert.Equal("Cannot use Equal as facet range. Allowed operators: <, <=, >, >=.", invalidOperatorEx.Message); var invalidChaningEx = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary < 5 || x.Salary > 8)); Assert.Equal("Range can be only specified using: '&&'. Cannot use: 'OrElse'", invalidChaningEx.Message); var rangeFieldsEx = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary < 5 && x.Salary > 8 && x.Salary > 60)); Assert.Equal("Expressions on both sides of '&&' must point to range field. E.g. x => x.Age > 18 && x.Age < 99", rangeFieldsEx.Message); var differentFieldsEx = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary < 5 && x.Age > 15)); Assert.Equal("Different range fields were detected: 'Salary' and 'Age'", differentFieldsEx.Message); var invalidOperatorsInChainEx = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary == 5 && x.Salary == 9)); Assert.Equal("Members in sub-expression(s) are not the correct types (expected '<', '<=', '>' or '>=')", invalidOperatorsInChainEx.Message); var invalidRange1Ex = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary < 5 && x.Salary >= 15)); Assert.Equal("Invalid range: 15..5", invalidRange1Ex.Message); var parsedRange1 = RangeFacet <Employee> .Parse(x => x.Salary >= 5 && x.Salary <= 15); Assert.Equal("Salary BETWEEN 5 AND 15", parsedRange1); var invalidRange2Ex = Assert.Throws <InvalidOperationException>(() => RangeFacet <Employee> .Parse(x => x.Salary >= 15 && x.Salary <= 5)); Assert.Equal("Invalid range: 15..5", invalidRange2Ex.Message); var parsedRange2 = RangeFacet <Employee> .Parse(x => x.Salary <= 15 && x.Salary >= 5); Assert.Equal("Salary BETWEEN 5 AND 15", parsedRange2); var parsedRange3 = RangeFacet <Employee> .Parse(x => x.Salary >= 5.1m && x.Salary <= 5.1m); Assert.Equal("Salary BETWEEN 5.1 AND 5.1", parsedRange3); }
private RangeFacet TriggerConversion(RangeFacet <Test> facet) { //The conversion is done with an implicit cast, //so we remain compatible with the original facet API return((RangeFacet)facet); }
/// <summary> /// /// </summary> /// <remarks> /// This method was internal in the original design, but made it /// protected to make it easy to bring back the auto ranges feature if so desired. /// </remarks> /// <param name="facets"></param> protected virtual void ConvertFacets(BrowseFacet[] facets) { int i = 0; foreach (BrowseFacet facet in facets) { int hit = facet.FacetValueHitCount; string val = facet.Value; RangeFacet rangeFacet = new RangeFacet(); rangeFacet.SetValues(val, val); rangeFacet.FacetValueHitCount = hit; facets[i++] = rangeFacet; } }
public void IdeallyIWouldNotNeedAVariable() { var actual = RangeFacet <ClassWithDateTimeOffset> .Parse(c => c.DateTimeOffset > DateTimeOffset.MinValue && c.DateTimeOffset < new DateTimeOffset(2017, 1, 2, 0, 0, 0, TimeSpan.Zero)); Assert.Equal("DateTimeOffset > '0001-01-01T00:00:00.0000000Z' and DateTimeOffset < '2017-01-02T00:00:00.0000000Z'", actual); }