public void LocationGroupBy_Single_Fields_Test()
        {
            var result = new LocationGroupingStrategyBuilder(_locationQueryFields.HouseNumber)
                .Build();

            Assert.NotNull(result.Fields);
            Assert.Equal(1, result.Fields.Count());
            Assert.Equal("PAO_START_NUMBER", result.Fields.First().Name);
        }
        public void LocationGroupBy_AndBy_Fields_Test()
        {
            var result = new LocationGroupingStrategyBuilder(_locationQueryFields.HouseNumber)
                            .ThenBy(_locationQueryFields.Street)
                            .Build();

            Assert.NotNull(result.Fields);
            Assert.Equal(2, result.Fields.Count());
            Assert.True(result.Fields.Any(f => f.Name == "PAO_START_NUMBER"));
            Assert.True(result.Fields.Any(f => f.Name == "STREET_DESCRIPTION"));
        }
        public void LocationGroupBy_Returns_Grouped_Fields_Correct_Order()
        {
            var result = new LocationGroupingStrategyBuilder(_locationQueryFields.HouseNumber)
                .ThenBy(_locationQueryFields.Street)
                .ThenBy(_locationQueryFields.Town)
                .Build();

            Assert.NotNull(result.Fields);
            Assert.Equal(result.Fields.Count(), 3);
            Assert.Equal(_locationQueryFields.HouseNumber.Key, result.Fields.ElementAt(0).Key);
            Assert.Equal(_locationQueryFields.Street.Key, result.Fields.ElementAt(1).Key);
            Assert.Equal(_locationQueryFields.Town.Key, result.Fields.ElementAt(2).Key);
        }
        public void LocationGroupBy_Returns_Grouped_Fields()
        {
            var result = new LocationGroupingStrategyBuilder(_locationQueryFields.HouseNumber)
                .ThenBy(_locationQueryFields.Street)
                .ThenBy(_locationQueryFields.Town)
                .Build();

            Assert.NotNull(result.Fields);
            Assert.Equal(result.Fields.Count(), 3);
            Assert.True(result.Fields.Any(f => f.Name == "PAO_START_NUMBER"));
            Assert.True(result.Fields.Any(f => f.Name == "STREET_DESCRIPTION"));
            Assert.True(result.Fields.Any(f => f.Name == "TOWN_NAME"));
        }
        private IEnumerable<LocationGroup> RequeryIfRequired(ICollection<LocationGroup> results, string addressQuery, ILocationGroupingStrategy groupingStrategy)
        {
            var locationsSum = results.Sum(g => g.LocationsCount);

            if (!results.Any() || locationsSum == 0)
                return results;

            if (results.HasSingleGroup() || locationsSum < GROUPING_THRESHOLD) {
                var groupingStrategyBuilder = new LocationGroupingStrategyBuilder(_locationQueryFields.PrimaryText)
                    .ThenBy(_locationQueryFields.SecondaryText)
                    .ThenBy(_locationQueryFields.HouseNumber)
                    .ThenBy(groupingStrategy);

                return _groupRepository.FindGroupedLocations(addressQuery, groupingStrategyBuilder.Build());
            }

            return results;
        }