public Query GenerateLuceneQuery(string query, ILocationGroupingStrategy groupingStrategy)
 {
     var parser = new MultiFieldQueryParser(Version.LUCENE_29,
      groupingStrategy.Fields.Select(f => f.Name).ToArray(),
      _analyzer);
     parser.DefaultOperator = QueryParser.Operator.AND;
     Query luceneQuery = parser.Parse(query);
     return luceneQuery;
 }
        public IEnumerable<LocationGroupModel> Search(string addressQuery, ILocationGroupingStrategy groupingStrategy)
        {
            ValidateAndThrow(addressQuery);
            var sanitisedQuery = _searchSanitiser.Sanitise(addressQuery);

            var results = _groupRepository.FindGroupedLocations(sanitisedQuery, groupingStrategy);

            var refinedResults = RequeryIfRequired(results.ToList(), sanitisedQuery, groupingStrategy);
            return refinedResults.Select(lg => new LocationGroupModel(lg.GroupDescription, lg.LocationsCount, BuildNextUri(lg)));
        }
 public IEnumerable<LocationGroup> FindGroupedLocations(string query, ILocationGroupingStrategy groupingStrategy)
 {
     var wildcardQuery = query.Trim() + "*";
     var queryFields = groupingStrategy.Fields;
     if (query.Any(c => Char.IsDigit(c)))
        queryFields = queryFields.Concat(new List<LocationQueryField>() {_queryFields.HouseNumber});
     var luceneQuery = GenerateLuceneQuery(wildcardQuery, queryFields);
     var collector = new GroupCollector(_locationGroupBuilder, groupingStrategy.Fields);
     _searcher.Search(luceneQuery, collector);
     return collector.Groups.OrderBy(g => g.GroupDescription, new AlphanumericComparerFast());
 }
        public IEnumerable<LocationGroup> FindLocations(string addressLookup, ILocationGroupingStrategy groupingStrategy)
        {
            var tokenizer = new fTSQueryTokenizer(addressLookup);

            var statement = new FtsQueryGenerator(groupingStrategy, tokenizer).Generate();

            List<LocationGroup> locations = new List<LocationGroup>();

            using (IManagedDataReader reader = _connectionManager.GetReader(statement, new StatementParamaters() { { "@addressSearch", "'" + addressLookup + "*'" } }))
            {
                while (reader.Read())
                {
                    locations.Add(_locationGroupBuilder.Build(reader.DataReader, groupingStrategy.Fields));
                }
            }
            return locations;
        }
        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;
        }
 public LocationGroupingStrategyBuilder(ILocationGroupingStrategy groupingStrategy) {
     _fields.AddRange(groupingStrategy.Fields);
 }
 public LocationGroupingStrategyBuilder ThenBy(ILocationGroupingStrategy groupingStrategy)
 {
     _fields.AddRange(groupingStrategy.Fields);
     return this;
 }