// 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;
     }
 }
Exemple #3
0
        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);
        }
Exemple #4
0
 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;
     }
 }
Exemple #6
0
        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);
        }