Was.OrcSearch – Rev 3

Subversion Repositories:
Rev:
using System;
using System.Collections.Generic;
using System.Linq;
using Lucene.Net.Analysis;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
using Was.OrcSearch.Extensions;
using Was.OrcSearch.Metadata;
using Was.OrcSearch.Metadata.Interfaces;
using Was.OrcSearch.Services.Interfaces;
using Version = Lucene.Net.Util.Version;

namespace Was.OrcSearch.Services
{
    public class SearchQueryService : ISearchQueryService, IDisposable
    {
        private readonly Analyzer _analyzer;
        private readonly Version _version = LuceneDefaults.Version;

        /// <summary>
        ///     Default constructor using a default whitespace analyzer.
        /// </summary>
        public SearchQueryService()
        {
            _analyzer = new WhitespaceAnalyzer();
        }

        /// <summary>
        ///     Instantiate an analyzer using a specific Lucene version.
        /// </summary>
        /// <param name="analyzer">The analyzer to use.</param>
        /// <param name="version">The lucene version.</param>
        public SearchQueryService(Analyzer analyzer, Version version)
        {
            _version = version;
        }

        /// <summary>
        ///     Instantiate a per-field analyzer.
        /// </summary>
        /// <param name="default">The default analyzer to use.</param>
        /// <param name="fieldAnalyzers">A collection of fields to analyzers.</param>
        public SearchQueryService(Analyzer @default, Dictionary<string, Analyzer> fieldAnalyzers)
        {
            _analyzer = new PerFieldAnalyzerWrapper(@default, fieldAnalyzers);
        }

        public void Dispose()
        {
            _analyzer?.Dispose();
        }

        public string GetSearchQuery(string filter, IEnumerable<ISearchableMetadata> searchableMetadatas)
        {
            if (filter.Contains(":"))
                return filter;

            filter = filter.PrepareOrcSearchFilter();

            return new MultiFieldQueryParser(
                    _version,
                    searchableMetadatas
                        .Select(searchableMetadata => searchableMetadata.SearchName).ToArray(),
                    _analyzer)
                .Parse(filter).ToString();
        }

        public string GetSearchQuery(params ISearchableMetadataValue[] searchableMetadataValues)
        {
            var query = new PhraseQuery();

            foreach (var searchableMetadataValue in searchableMetadataValues)
                query.Add(new Term(searchableMetadataValue.Metadata.SearchName, searchableMetadataValue.Value));

            var filter = query.ToString();

            return GetSearchQuery(filter, new SearchableMetadata[] { });
        }
    }
}

Generated by GNU Enscript 1.6.5.90.