diff --git a/src/core/Rsdo.Concordancer.Services/RequestHandlers/Concordances/ExportConcordancesHandler.cs b/src/core/Rsdo.Concordancer.Services/RequestHandlers/Concordances/ExportConcordancesHandler.cs index 47ea3ec..f4e73aa 100644 --- a/src/core/Rsdo.Concordancer.Services/RequestHandlers/Concordances/ExportConcordancesHandler.cs +++ b/src/core/Rsdo.Concordancer.Services/RequestHandlers/Concordances/ExportConcordancesHandler.cs @@ -1,8 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; using Rsdo.Concordancer.Core.Constants; using Rsdo.Concordancer.Core.Interfaces; 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.Shared; using Rsdo.Concordancer.ServiceModel.Types; +using Rsdo.Concordancer.Services.Framework.DbContext; using Rsdo.Concordancer.Services.Search.QueryFactories; using Rsdo.Concordancer.Services.Services.ParagraphService; @@ -18,15 +22,18 @@ namespace Rsdo.Concordancer.Services.RequestHandlers.Concordances; public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequestHandler { + private readonly CorpusDbContext dbContext; private readonly IQueryFactory queryFactory; private readonly ISearchEngine searchEngine; public ExportConcordancesHandler( + CorpusDbContext dbContext, IParagraphService paragraphService, IQueryFactory queryFactory, ISearchEngine searchEngine) : base(paragraphService) { + this.dbContext = dbContext; this.queryFactory = queryFactory; this.searchEngine = searchEngine; } @@ -42,6 +49,9 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest // Get search items var items = await GetItems(query, result.EntityIds); + // Get sources + var sources = await GetSources(items); + // Export var stream = new MemoryStream(); await using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true)) @@ -52,7 +62,7 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest // Write 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> GetSources(List 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 tokens) { if (tokens != null) @@ -91,16 +116,20 @@ public class ExportConcordancesHandler : BaseSearchConcordancesHandler, IRequest await writer.WriteAsync("Iskani niz"); await writer.WriteAsync("\t"); await writer.WriteAsync("Desno besedilo"); + await writer.WriteAsync("\t"); + await writer.WriteAsync("Vir"); 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 writer.WriteAsync("\t"); await writer.WriteAsync(item.CenterContext.Form); await writer.WriteAsync("\t"); await WriteContext(writer, item.RightContext); + await writer.WriteAsync("\t"); + await writer.WriteAsync(source); await writer.WriteLineAsync(); } } \ No newline at end of file