/// <summary> /// Converte os dados de sort para serem usados pelo Lucene. /// </summary> /// <param name="sort"></param> /// <param name="sortFields">Campos de ordenação adicionais</param> /// <returns></returns> private global::Lucene.Net.Search.Sort Convert(Sort sort, global::Lucene.Net.Search.SortField[] sortFields) { global::Lucene.Net.Search.Sort luceneSort; var fields = new List <global::Lucene.Net.Search.SortField>(); if (sort == null && sortFields != null && sortFields.Length > 0) { fields.AddRange(sortFields); } if (sort != null && sort.Fields.Length > 0) { fields.AddRange(sort.Fields.Select(f => { SchemeField field = null; if (f.Name == "Rnd") { field = new SchemeField("Rnd", typeof(int), "Rnd", false, false); } else { field = _structRepository.GetSchemaField(f.Name); } Type fieldType = null; if (field == null) { if (f.Name.EndsWith("Ticks")) { var name = f.Name.Substring(0, f.Name.Length - "Ticks".Length); field = _structRepository.GetSchemaField(name); if (field == null) { return(null); } fieldType = typeof(long); } else { return(null); } } else { fieldType = field.Type; } return(new global::Lucene.Net.Search.SortField(f.Name, GetLuceneSortType(fieldType), f.Reverse)); }).Where(f => f != null)); } if (fields.Count > 0) { luceneSort = new global::Lucene.Net.Search.Sort(fields.ToArray()); } else { luceneSort = new global::Lucene.Net.Search.Sort(); } return(luceneSort); }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="query"></param> /// <param name="filter"></param> /// <param name="readerCreator"></param> /// <param name="sort"></param> /// <param name="options"></param> /// <param name="dataRepository"></param> /// <param name="structRepository"></param> /// <param name="loadedHandle"></param> internal SearchResult(global::Lucene.Net.Search.Query query, global::Lucene.Net.Search.Filter filter, Func <global::Lucene.Net.Index.IndexReader> readerCreator, global::Lucene.Net.Search.Sort sort, SearchOptions options, IDataRepository dataRepository, ISchemeRepository structRepository, EventHandler <SearchResultLoadEventArgs> loadedHandle) { _query = query; _filter = filter; _readerCreator = readerCreator; _sort = sort; _options = options; _dataRepository = dataRepository; _structRepository = structRepository; _loadedHandle = loadedHandle; }
/// <summary> /// Realiza uma pesquisa no sistema. /// </summary> /// <param name="text"></param> /// <param name="options"></param> /// <param name="filters"></param> /// <param name="sort"></param> /// <returns></returns> public ISearchResult Search(string text, FilterParameter[] filters, SearchOptions options, Sort sort) { Query query; Filter filter; global::Lucene.Net.Search.SortField[] sortFields; text = RemoveAcent(text); PrepareSearch(text, filters, options, out query, out filter, out sortFields); global::Lucene.Net.Search.Sort luceneSort = Convert(sort, sortFields); return(new SearchResult(query, filter, CreateReader, luceneSort, options, _dataRepository, _structRepository, (sender, e) => { IncrementCountWords(text, filters); })); }