Skip to content

Commit

Permalink
fix: fixed searching, added condition to OpenSearchSearcher
Browse files Browse the repository at this point in the history
Refs: SITKO-CORE-T-24
  • Loading branch information
IgorAlymov committed Aug 7, 2024
1 parent 077aa30 commit 4b4eecd
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 35 deletions.
13 changes: 10 additions & 3 deletions src/Sitko.Core.Search.OpenSearch/OpenSearchSearcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class OpenSearchSearcher<TSearchModel>(
IOptionsMonitor<OpenSearchModuleOptions> optionsMonitor,
ILogger<OpenSearchSearcher<TSearchModel>> logger)
: ISearcher<TSearchModel>
where TSearchModel : BaseSearchModel
where TSearchModel : BaseSearchModel, new()
{
private OpenSearchModuleOptions Options => optionsMonitor.CurrentValue;
private OpenSearchClient? client;
Expand Down Expand Up @@ -111,8 +111,15 @@ public async Task<TSearchModel[]> SearchAsync(string indexName, string term, int
}

var result = searchResponse.Hits.Select(h =>
(TSearchModel)new BaseSearchModel(h.Source.Id, h.Source.Title, h.Source.Content, h.Source.Url,
h.Source.Date, h.Highlight)).ToArray();
new TSearchModel
{
Id = h.Source.Id,
Content = h.Source.Content,
Date = h.Source.Date,
Title = h.Source.Title,
Url = h.Source.Url,
Highlight = h.Highlight
}).ToArray();
return result;
}

Expand Down
11 changes: 2 additions & 9 deletions src/Sitko.Core.Search/SearchModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,14 @@ namespace Sitko.Core.Search;

public class BaseSearchModel
{
public BaseSearchModel(string id, string title, string url, string content, DateTimeOffset date,
IReadOnlyDictionary<string, IReadOnlyCollection<string>>? highlight = null)
public BaseSearchModel()
{
Highlight = highlight;
Id = id;
Title = title;
Url = url;
Content = content;
Date = date;
}

public string Id { get; set; }
public string Title { get; set; }
public string Url { get; set; }
public DateTimeOffset Date { get; set; }
public string Content { get; set; }
public IReadOnlyDictionary<string, IReadOnlyCollection<string>>? Highlight { get; set; }
public IReadOnlyDictionary<string, IReadOnlyCollection<string>> Highlight { get; set; }
}
30 changes: 22 additions & 8 deletions tests/Sitko.Core.Search.ElasticSearch.Tests/ElasticSearchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ protected override IHostApplicationBuilder ConfigureApplication(IHostApplication
});

hostBuilder.Services.AddSingleton<TestModelProvider>();
hostBuilder.Services.RegisterSearchProvider<TestSearchProvider, TestModel, Guid, BaseSearchModel>();
hostBuilder.Services.RegisterSearchProvider<TestSearchProvider, TestModel, Guid, TestSearchModel>();
return hostBuilder;
}
}
Expand All @@ -75,28 +75,42 @@ public class TestModel
public DateTimeOffset Date { get; set; } = DateTimeOffset.UtcNow;
}

public class TestSearchProvider : BaseSearchProvider<TestModel, Guid, BaseSearchModel>
public class TestSearchModel : BaseSearchModel
{
public TestSearchModel()
{
}
}

public class TestSearchProvider : BaseSearchProvider<TestModel, Guid, TestSearchModel>
{
private readonly TestModelProvider testModelProvider;

public TestSearchProvider(ILogger<TestSearchProvider> logger,
TestModelProvider testModelProvider,
ISearcher<BaseSearchModel>? searcher = null) : base(logger, searcher) =>
ISearcher<TestSearchModel>? searcher = null) : base(logger, searcher) =>
this.testModelProvider = testModelProvider;

protected override Guid ParseId(string id) => Guid.Parse(id);

protected override Task<BaseSearchModel[]> GetSearchModelsAsync(TestModel[] entities,
protected override Task<TestSearchModel[]> GetSearchModelsAsync(TestModel[] entities,
CancellationToken cancellationToken = default) =>
Task.FromResult(entities
.Select(e => new BaseSearchModel(e.Id.ToString(), e.Title, e.Url, e.Description, e.Date)).ToArray());

protected override Task<(TestModel entity, BaseSearchModel searchResult)[]> GetEntitiesAsync(BaseSearchModel[] searchModels,
.Select(e => new TestSearchModel
{
Id = e.Id.ToString(),
Title = e.Title,
Url = e.Url,
Date = e.Date,
Content = e.Description
}).ToArray());

protected override Task<(TestModel entity, TestSearchModel searchResult)[]> GetEntitiesAsync(TestSearchModel[] searchModels,
CancellationToken cancellationToken = default)
{
var ids = searchModels.Select(m => Guid.Parse(m.Id));
var entities = testModelProvider.Models.Where(m => ids.Contains(m.Id));
List<(TestModel, BaseSearchModel)> result = [];
List<(TestModel, TestSearchModel)> result = [];
foreach (var entity in entities)
{
var searchModel = searchModels.ToList().FirstOrDefault(model => model.Id == entity.Id.ToString());
Expand Down
44 changes: 29 additions & 15 deletions tests/Sitko.Core.Search.OpenSearch.Tests/OpenSearchTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public async Task SearchAsync()
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand Down Expand Up @@ -52,7 +52,7 @@ public async Task MorphologyRusTestAsync(int foundDocs, string searchText)
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand All @@ -77,7 +77,7 @@ public async Task MorphologyEngTestAsync()
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand All @@ -104,7 +104,7 @@ public async Task PartialSearchEngTestAsync(int foundDocs, string searchText)
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand All @@ -131,7 +131,7 @@ public async Task PartialSearchRusTestAsync(int foundDocs, string searchText)
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand All @@ -156,7 +156,7 @@ public async Task SearchByNumbersTestAsync(int foundDocs, string searchText, Sea
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();
var firstGuid = Guid.Parse("dd134352-da92-4cd2-9c" + searchText + "-440be713aba5");
Expand All @@ -180,7 +180,7 @@ public async Task IncorrectLayoutKeyboardTestAsync()
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand All @@ -200,7 +200,7 @@ public async Task HighlightingTestAsync()
{
var scope = await GetScopeAsync();
var provider = scope.GetService<TestModelProvider>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, BaseSearchModel>>();
var searchProvider = scope.GetService<ISearchProvider<TestModel, Guid, TestSearchModel>>();
await searchProvider.DeleteIndexAsync();
await searchProvider.InitAsync();

Expand Down Expand Up @@ -241,7 +241,7 @@ protected override IHostApplicationBuilder ConfigureApplication(IHostApplication
});

hostBuilder.Services.AddSingleton<TestModelProvider>();
hostBuilder.Services.RegisterSearchProvider<TestSearchProvider, TestModel, Guid, BaseSearchModel>();
hostBuilder.Services.RegisterSearchProvider<TestSearchProvider, TestModel, Guid, TestSearchModel>();
return hostBuilder;
}
}
Expand All @@ -255,26 +255,40 @@ public class TestModel
public DateTimeOffset Date { get; set; } = DateTimeOffset.UtcNow;
}

public class TestSearchModel : BaseSearchModel
{
public TestSearchModel()
{
}
}

public class TestSearchProvider(
ILogger<TestSearchProvider> logger,
TestModelProvider testModelProvider,
ISearcher<BaseSearchModel>? searcher = null)
: BaseSearchProvider<TestModel, Guid, BaseSearchModel>(logger, searcher)
ISearcher<TestSearchModel>? searcher = null)
: BaseSearchProvider<TestModel, Guid, TestSearchModel>(logger, searcher)
{
protected override Guid ParseId(string id) => Guid.Parse(id);

protected override Task<BaseSearchModel[]> GetSearchModelsAsync(TestModel[] entities,
protected override Task<TestSearchModel[]> GetSearchModelsAsync(TestModel[] entities,
CancellationToken cancellationToken = default) =>
Task.FromResult(entities
.Select(e => new BaseSearchModel(e.Id.ToString(), e.Title, e.Url, e.Description, e.Date))
.Select(e => new TestSearchModel
{
Id = e.Id.ToString(),
Date = e.Date,
Url = e.Url,
Title = e.Title,
Content = e.Description
})
.ToArray());

protected override Task<(TestModel entity, BaseSearchModel searchResult)[]> GetEntitiesAsync(BaseSearchModel[] searchModels,
protected override Task<(TestModel entity, TestSearchModel searchResult)[]> GetEntitiesAsync(TestSearchModel[] searchModels,
CancellationToken cancellationToken = default)
{
var ids = searchModels.Select(m => Guid.Parse(m.Id));
var entities = testModelProvider.Models.Where(m => ids.Contains(m.Id));
List<(TestModel, BaseSearchModel)> result = [];
List<(TestModel, TestSearchModel)> result = [];
foreach (var entity in entities)
{
var searchModel = searchModels.ToList().FirstOrDefault(model => model.Id == entity.Id.ToString());
Expand Down

0 comments on commit 4b4eecd

Please sign in to comment.