Adds source to the each item in the export concordances file.

This commit is contained in:
2023-01-16 12:55:38 +01:00
parent 075990cf8a
commit 2f8d5fa403
@@ -1,8 +1,11 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Rsdo.Concordancer.Core.Constants; using Rsdo.Concordancer.Core.Constants;
using Rsdo.Concordancer.Core.Interfaces; using Rsdo.Concordancer.Core.Interfaces;
using Rsdo.Concordancer.Core.Model; using Rsdo.Concordancer.Core.Model;
@@ -11,6 +14,7 @@ using Rsdo.Concordancer.Core.Search.Queries.Concordances;
using Rsdo.Concordancer.ServiceModel.Requests.Concordances; using Rsdo.Concordancer.ServiceModel.Requests.Concordances;
using Rsdo.Concordancer.ServiceModel.Shared; using Rsdo.Concordancer.ServiceModel.Shared;
using Rsdo.Concordancer.ServiceModel.Types; using Rsdo.Concordancer.ServiceModel.Types;
using Rsdo.Concordancer.Services.Framework.DbContext;
using Rsdo.Concordancer.Services.Search.QueryFactories; using Rsdo.Concordancer.Services.Search.QueryFactories;
using Rsdo.Concordancer.Services.Services.ParagraphService; using Rsdo.Concordancer.Services.Services.ParagraphService;
@@ -18,15 +22,18 @@ namespace Rsdo.Concordancer.Services.RequestHandlers.Concordances;
public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequestHandler<ExportConcordances, ExportConcordancesResponse> public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequestHandler<ExportConcordances, ExportConcordancesResponse>
{ {
private readonly CorpusDbContext dbContext;
private readonly IQueryFactory<ExportConcordances, ConcordancesQuery> queryFactory; private readonly IQueryFactory<ExportConcordances, ConcordancesQuery> queryFactory;
private readonly ISearchEngine searchEngine; private readonly ISearchEngine searchEngine;
public ExportConcordancesHandler( public ExportConcordancesHandler(
CorpusDbContext dbContext,
IParagraphService paragraphService, IParagraphService paragraphService,
IQueryFactory<ExportConcordances, ConcordancesQuery> queryFactory, IQueryFactory<ExportConcordances, ConcordancesQuery> queryFactory,
ISearchEngine searchEngine) ISearchEngine searchEngine)
: base(paragraphService) : base(paragraphService)
{ {
this.dbContext = dbContext;
this.queryFactory = queryFactory; this.queryFactory = queryFactory;
this.searchEngine = searchEngine; this.searchEngine = searchEngine;
} }
@@ -42,6 +49,9 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest
// Get search items // Get search items
var items = await GetItems(query, result.EntityIds); var items = await GetItems(query, result.EntityIds);
// Get sources
var sources = await GetSources(items);
// Export // Export
var stream = new MemoryStream(); var stream = new MemoryStream();
await using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true)) await using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
@@ -52,7 +62,7 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest
// Write items // Write items
foreach (var item in items) foreach (var item in items)
{ {
await WriteItem(writer, item); await WriteItem(writer, item, sources[item.ParagraphId]);
} }
} }
@@ -65,6 +75,21 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest
}; };
} }
private async Task<Dictionary<Guid, string>> GetSources(List<SearchConcordancesResponseItem> items)
{
var paragraphIds = items.Select(i => i.ParagraphId).ToList();
var sources = await dbContext.Paragraph.Include(p => p.Text)
.Where(p => paragraphIds.Contains(p.Id))
.Select(
p => new
{
p.Id,
p.Text.SourceFile,
})
.ToListAsync();
return sources.ToDictionary(x => x.Id, x => Path.GetFileNameWithoutExtension(x.SourceFile));
}
private static async Task WriteContext(StreamWriter writer, List<ConcordanceToken> tokens) private static async Task WriteContext(StreamWriter writer, List<ConcordanceToken> tokens)
{ {
if (tokens != null) if (tokens != null)
@@ -91,16 +116,20 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest
await writer.WriteAsync("Iskani niz"); await writer.WriteAsync("Iskani niz");
await writer.WriteAsync("\t"); await writer.WriteAsync("\t");
await writer.WriteAsync("Desno besedilo"); await writer.WriteAsync("Desno besedilo");
await writer.WriteAsync("\t");
await writer.WriteAsync("Vir");
await writer.WriteLineAsync(); await writer.WriteLineAsync();
} }
private static async Task WriteItem(StreamWriter writer, SearchConcordancesResponseItem item) private static async Task WriteItem(StreamWriter writer, SearchConcordancesResponseItem item, string source)
{ {
await WriteContext(writer, item.LeftContext); await WriteContext(writer, item.LeftContext);
await writer.WriteAsync("\t"); await writer.WriteAsync("\t");
await writer.WriteAsync(item.CenterContext.Form); await writer.WriteAsync(item.CenterContext.Form);
await writer.WriteAsync("\t"); await writer.WriteAsync("\t");
await WriteContext(writer, item.RightContext); await WriteContext(writer, item.RightContext);
await writer.WriteAsync("\t");
await writer.WriteAsync(source);
await writer.WriteLineAsync(); await writer.WriteLineAsync();
} }
} }