Was.OrcSearch

Subversion Repositories:
Compare Path: Rev
With Path: Rev
?path1? @ HEAD  →  ?path2? @ 1
/Was.OrcSearch/Metadata/AttributeMetadataCollection.cs
@@ -1,10 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Threading;
using Was.OrcSearch.Attributes;
using Was.OrcSearch.Models;
using Was.OrcSearch.Models.Interfaces;
@@ -13,7 +9,7 @@
{
public class AttributeMetadataCollection : ReflectionMetadataCollection
{
private static readonly Dictionary<Type, List<SearchableMetadata>> PropertiesCache =
private static readonly Dictionary<Type, List<SearchableMetadata>> _propertiesCache =
new Dictionary<Type, List<SearchableMetadata>>();
 
private readonly Type _targetType;
@@ -28,26 +24,30 @@
{
get
{
if (PropertiesCache.TryGetValue(_targetType, out var storedProperty))
if (_propertiesCache.TryGetValue(_targetType, out var storedProperty))
return storedProperty;
 
var searchableProperties = new List<SearchableMetadata>();
 
var properties = _targetType.GetProperties();
foreach (var property in properties)
{
if (!(property.GetCustomAttribute(typeof(SearchablePropertyAttribute), false) is
SearchablePropertyAttribute searchablePropertyAttribute)) continue;
var searchableProperty = new SearchableMetadata(property);
if (!string.IsNullOrWhiteSpace(searchablePropertyAttribute.SearchName))
searchableProperty.SearchName = searchablePropertyAttribute.SearchName;
var searchablePropertyAttribute =
property.GetCustomAttribute(typeof(SearchablePropertyAttribute), false) as
SearchablePropertyAttribute;
if (searchablePropertyAttribute != null)
{
var searchableProperty = new SearchableMetadata(property);
if (!string.IsNullOrWhiteSpace(searchablePropertyAttribute.SearchName))
searchableProperty.SearchName = searchablePropertyAttribute.SearchName;
 
searchableProperty.Analyze = searchablePropertyAttribute.Analyze;
searchableProperty.Analyze = searchablePropertyAttribute.Analyze;
 
searchableProperties.Add(searchableProperty);
searchableProperties.Add(searchableProperty);
}
}
 
PropertiesCache.Add(_targetType, searchableProperties);
_propertiesCache.Add(_targetType, searchableProperties);
return searchableProperties;
}
}
File deleted
\ No newline at end of file
/Was.OrcSearch/Services/Extensions/SearchServiceExtensions.cs
/Was.OrcSearch/Services/Extensions/ISearchServiceExtensions.cs
@@ -0,0 +1,6 @@
namespace Was.OrcSearch.Services.Extensions
{
public static class ISearchServiceExtensions
{
}
}
/Was.OrcSearch/Services/SearchQueryService.cs
@@ -1,7 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Lucene.Net.Analysis;
using System.Collections.Generic;
using Lucene.Net.Analysis.Standard;
using Lucene.Net.Index;
using Lucene.Net.QueryParsers;
using Lucene.Net.Search;
@@ -9,63 +7,31 @@
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
public class SearchQueryService : ISearchQueryService
{
private readonly Analyzer _analyzer;
private readonly Version _version = LuceneDefaults.Version;
 
/// <summary>
/// Default constructor using a default whitespace analyzer.
/// </summary>
public SearchQueryService()
public string GetSearchQuery(string filter, IEnumerable<ISearchableMetadata> searchableMetadatas)
{
_analyzer = new WhitespaceAnalyzer();
}
if (!filter.Contains(":"))
{
filter = filter.PrepareOrcSearchFilter();
 
/// <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;
}
using (var analyzer = new StandardAnalyzer(LuceneDefaults.Version))
{
var fields = new List<string>();
foreach (var searchableMetadata in searchableMetadatas) fields.Add(searchableMetadata.SearchName);
 
/// <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);
}
var parser = new MultiFieldQueryParser(LuceneDefaults.Version, fields.ToArray(), analyzer);
var query = parser.Parse(filter);
filter = query.ToString();
}
}
 
public void Dispose()
{
_analyzer?.Dispose();
return filter;
}
 
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();
/Was.OrcSearch/Services/SearchServiceBase.cs
@@ -10,7 +10,6 @@
using Was.OrcSearch.EventArgs;
using Was.OrcSearch.Extensions;
using Was.OrcSearch.Metadata.Interfaces;
using Was.OrcSearch.Services.Extensions;
using Was.OrcSearch.Services.Interfaces;
 
namespace Was.OrcSearch.Services
@@ -118,15 +117,10 @@
foreach (var searchableMetadata in searchableMetadatas)
{
var searchableMetadataValue = searchableMetadata.GetValue(searchable.Instance);
 
// DEBUG
//Console.WriteLine("Stringifying: " + searchableMetadataValue);
// TODO implement object to string helper.
var searchableMetadataValueAsString =
string.Join(" ", searchableMetadataValue.Stringify());
// DEBUG
//Console.WriteLine("String metadata: " + string.Join(" ", searchableMetadataValue.Stringify()));
searchableMetadataValue
.ToString(); //ObjectToStringHelper.ToString(searchableMetadataValue);
 
var field = new Field(searchableMetadata.SearchName, searchableMetadataValueAsString,
Field.Store.YES,
@@ -166,7 +160,8 @@
{
foreach (var searchable in searchables)
{
if (!_searchableIndexes.TryGetValue(searchable, out var index)) continue;
int index;
if (!_searchableIndexes.TryGetValue(searchable, out index)) continue;
 
var queryAsText = $"{IndexId}:{index}";
var parser = new QueryParser(LuceneDefaults.Version, string.Empty, analyzer);
@@ -278,15 +273,15 @@
}
}
}
catch (ParseException)
catch (ParseException ex)
{
//Log.Warning(ex, "Failed to parse search pattern");
throw;
throw ex;
}
catch (Exception)
catch (Exception ex)
{
//Log.Error(ex, "An error occurred while searching, returning default results");
throw;
throw ex;
}
finally
{
/Was.OrcSearch/Was.OrcSearch.csproj
@@ -35,11 +35,11 @@
<RootNamespace>Was.OrcSearch</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73">
<HintPath>..\..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
<Reference Include="ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73, processorArchitecture=MSIL">
<HintPath>..\packages\SharpZipLib.0.86.0\lib\20\ICSharpCode.SharpZipLib.dll</HintPath>
</Reference>
<Reference Include="Lucene.Net, Version=3.0.3.0, Culture=neutral, PublicKeyToken=85089178b9ac3181">
<HintPath>..\..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll</HintPath>
<Reference Include="Lucene.Net, Version=3.0.3.0, Culture=neutral, PublicKeyToken=85089178b9ac3181, processorArchitecture=MSIL">
<HintPath>..\packages\Lucene.Net.3.0.3\lib\NET40\Lucene.Net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
@@ -77,7 +77,7 @@
<Compile Include="Models\ReflectionObjectWithMetadata.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Services\DummySearchNavigationService.cs" />
<Compile Include="Services\Extensions\SearchServiceExtensions.cs" />
<Compile Include="Services\Extensions\ISearchServiceExtensions.cs" />
<Compile Include="Services\InMemorySearchService.cs" />
<Compile Include="Services\Interfaces\ISearchNavigationService.cs" />
<Compile Include="Services\Interfaces\ISearchQueryService.cs" />
/Was.OrcSearch/packages.config
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
 
<packages>
<package id="Lucene.Net" version="3.0.3" targetFramework="net452" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net452" />
<?xml version="1.0" encoding="utf-8"?>
 
<packages>
<package id="Lucene.Net" version="3.0.3" targetFramework="net452" />
<package id="SharpZipLib" version="0.86.0" targetFramework="net452" />
</packages>