From 32f068be1df3519963777279bce7f39c5466701e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Sa=CC=88rkikoski?= Date: Wed, 23 Oct 2024 14:35:42 +0300 Subject: [PATCH] CSCTTV-4013 co-publication handling fixes --- .../Repositories/Maps/PublicationProfile.cs | 24 +++++++++++-- .../PublicationIndexRepository.cs | 36 ++++++++++++++++--- ...PublicationArtPublicatonTypeCategoryDTO.cs | 9 +++++ ... OrgPublicationDatabaseContributionDTO.cs} | 2 +- .../OrgPublicationFieldsOfArtDTO.cs | 9 +++++ .../OrgPublicationFieldsOfScienceDTO copy.cs | 9 +++++ .../Publication/OrgPublicationKeywordDTO.cs | 9 +++++ .../Service.Models/Publication/Publication.cs | 14 +++++++- .../Maps/PublicationProfileTest.cs | 8 +++-- 9 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 aspnetcore/src/Service.Models/Publication/OrgPublicationArtPublicatonTypeCategoryDTO.cs rename aspnetcore/src/Service.Models/Publication/{OrgPublicationDTO.cs => OrgPublicationDatabaseContributionDTO.cs} (83%) create mode 100644 aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfArtDTO.cs create mode 100644 aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfScienceDTO copy.cs create mode 100644 aspnetcore/src/Service.Models/Publication/OrgPublicationKeywordDTO.cs diff --git a/aspnetcore/src/Repositories/Maps/PublicationProfile.cs b/aspnetcore/src/Repositories/Maps/PublicationProfile.cs index b850908..7826bbc 100644 --- a/aspnetcore/src/Repositories/Maps/PublicationProfile.cs +++ b/aspnetcore/src/Repositories/Maps/PublicationProfile.cs @@ -28,7 +28,7 @@ public PublicationProfile() .ForMember(dst => dst.ApcPaymentYear, opt =>opt.MapFrom(src => (DateTime?)(src.ApcPaymentYear.HasValue ? new DateTime(src.ApcPaymentYear.Value,1,1,0,0,0,DateTimeKind.Utc) : null))) .ForMember(dst => dst.AuthorsText, opt => opt.MapFrom(src => src.AuthorsText)) .ForMember(dst => dst.DatabaseContributions, opt => opt.MapFrom(src => src.FactContributions)) - .ForMember(dst => dst.orgPublicationDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) + .ForMember(dst => dst.OrgPublicationDatabaseContributionDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) .ForMember(dst => dst.Format, opt => opt.MapFrom(src => src.PublicationTypeCode2Navigation)) .ForMember(dst => dst.ParentPublicationType, opt => opt.MapFrom(src => src.ParentPublicationTypeCodeNavigation)) .ForMember(dst => dst.DatabasePeerReviewed, opt => opt.MapFrom(src => src.PeerReviewed)) @@ -56,8 +56,11 @@ public PublicationProfile() .ForMember(dst => dst.Doi, opt => opt.MapFrom(src => src.Doi)) .ForMember(dst => dst.DoiHandle, opt => opt.MapFrom(src => src.DoiHandle)) .ForMember(dst => dst.FieldsOfScience, opt => opt.MapFrom(src => src.FactDimReferencedataFieldOfSciences.Select(f => f.DimReferencedata))) + .ForMember(dst => dst.OrgPublicationFieldsOfScienceDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) .ForMember(dst => dst.FieldsOfArt, opt => opt.MapFrom(src => src.DimReferencedataNavigation)) + .ForMember(dst => dst.OrgPublicationFieldsOfArtDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) .ForMember(dst => dst.Keywords, opt => opt.MapFrom(src => src.DimKeywords)) + .ForMember(dst => dst.OrgPublicationKeywordDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) .ForMember(dst => dst.InternationalPublication, opt => opt.MapFrom(src => src.InternationalPublication != 9 ? src.InternationalPublication == 1 : (bool?)null)) // 0 = kotim. 1 ulkom. 9 = ei tietoa. .ForMember(dst => dst.Country, opt => opt.MapFrom(src => src.PublicationCountryCodeNavigation)) .ForMember(dst => dst.Language, opt => opt.MapFrom(src => src.LanguageCodeNavigation)) @@ -70,6 +73,7 @@ public PublicationProfile() .ForMember(dst => dst.Preprint, opt => opt.MapFrom(src => src.DimLocallyReportedPubInfos.Where(i => i.SelfArchivedType == PreprintType))) .ForMember(dst => dst.SelfArchived, opt => opt.MapFrom(src => src.DimLocallyReportedPubInfos.Where(i => i.SelfArchivedType == SelfArchivedType))) .ForMember(dst => dst.ArtPublicationTypeCategory, opt => opt.MapFrom(src => src.DimReferencedata)) + .ForMember(dst => dst.OrgPublicationArtPublicatonTypeCategoryDTOs, opt => opt.MapFrom(src => src.InverseDimPublicationNavigation)) .ForMember(dst => dst.Abstract, opt => opt.MapFrom(src => src.Abstract)) .ForMember(dst => dst.Created, opt => opt.MapFrom(src => src.Created)) .ForMember(dst => dst.Modified, opt => opt.MapFrom(src => src.Modified)) @@ -137,10 +141,26 @@ public PublicationProfile() .ForMember(dst => dst.ArtPublicationRole, opt => opt.MapFrom(src => src.DimReferencedataActorRole)) .ForMember(dst => dst.ContributionType, opt => opt.MapFrom(src => src.ContributionType)); - CreateProjection() + CreateProjection() .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id)) .ForMember(dst => dst.DatabaseContributions, opt => opt.MapFrom(src => src.FactContributions)); + CreateProjection() + .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dst => dst.Keywords, opt => opt.MapFrom(src => src.DimKeywords)); + + CreateProjection() + .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dst => dst.ArtPublicationTypeCategories, opt => opt.MapFrom(src => src.DimReferencedata)); + + CreateProjection() + .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dst => dst.FieldsOfScience, opt => opt.MapFrom(src => src.FactDimReferencedataFieldOfSciences.Select(f => f.DimReferencedata))); + + CreateProjection() + .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Id)) + .ForMember(dst => dst.FieldsOfArt, opt => opt.MapFrom(src => src.DimReferencedataNavigation)); + CreateProjection() .AddTransform(s => string.IsNullOrWhiteSpace(s) ? null : s) .ForMember(dst => dst.NameId, opt => opt.MapFrom(src => src.Id)) diff --git a/aspnetcore/src/Repositories/PublicationIndexRepository.cs b/aspnetcore/src/Repositories/PublicationIndexRepository.cs index f345bcb..6ff027c 100644 --- a/aspnetcore/src/Repositories/PublicationIndexRepository.cs +++ b/aspnetcore/src/Repositories/PublicationIndexRepository.cs @@ -3,7 +3,6 @@ using CSC.PublicApi.DatabaseContext; using CSC.PublicApi.Service.Models; using CSC.PublicApi.Service.Models.Publication; -using Elasticsearch.Net; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Publication = CSC.PublicApi.Service.Models.Publication.Publication; @@ -82,14 +81,43 @@ public override object PerformInMemoryOperation(object entity) { Publication publication = (Publication)entity; - if (publication.orgPublicationDTOs != null && publication.orgPublicationDTOs.Count > 0) + // Add data from OrgPublication DTOs, which hold data collected from publications related to a co-publication (yhteisjulkaisu/osajulkaisu) + if (publication.OrgPublicationDatabaseContributionDTOs != null && publication.OrgPublicationDatabaseContributionDTOs.Count > 0) { - foreach (OrgPublicationDTO op in publication.orgPublicationDTOs.AsEnumerable().ToList()) + foreach (OrgPublicationDatabaseContributionDTO op in publication.OrgPublicationDatabaseContributionDTOs.AsEnumerable().ToList()) { publication.DatabaseContributions.AddRange(op.DatabaseContributions); } } - + if (publication.OrgPublicationKeywordDTOs != null && publication.OrgPublicationKeywordDTOs.Count > 0) + { + foreach (OrgPublicationKeywordDTO kw in publication.OrgPublicationKeywordDTOs.AsEnumerable().ToList()) + { + publication.Keywords.AddRange(kw.Keywords); + } + } + if (publication.OrgPublicationArtPublicatonTypeCategoryDTOs != null && publication.OrgPublicationArtPublicatonTypeCategoryDTOs.Count > 0) + { + foreach (OrgPublicationArtPublicatonTypeCategoryDTO ap in publication.OrgPublicationArtPublicatonTypeCategoryDTOs.AsEnumerable().ToList()) + { + publication.ArtPublicationTypeCategory.AddRange(ap.ArtPublicationTypeCategories); + } + } + if (publication.OrgPublicationFieldsOfScienceDTOs != null && publication.OrgPublicationFieldsOfScienceDTOs.Count > 0) + { + foreach (OrgPublicationFieldsOfScienceDTO fs in publication.OrgPublicationFieldsOfScienceDTOs.AsEnumerable().ToList()) + { + publication.FieldsOfScience.AddRange(fs.FieldsOfScience); + } + } + if (publication.OrgPublicationFieldsOfArtDTOs != null && publication.OrgPublicationFieldsOfArtDTOs.Count > 0) + { + foreach (OrgPublicationFieldsOfArtDTO fa in publication.OrgPublicationFieldsOfArtDTOs.AsEnumerable().ToList()) + { + publication.FieldsOfArt.AddRange(fa.FieldsOfArt); + } + } + HandleIssnAndIsbn(publication); HandleEmptyCollections(publication); HandleOrganizations(publication); diff --git a/aspnetcore/src/Service.Models/Publication/OrgPublicationArtPublicatonTypeCategoryDTO.cs b/aspnetcore/src/Service.Models/Publication/OrgPublicationArtPublicatonTypeCategoryDTO.cs new file mode 100644 index 0000000..5aaecb5 --- /dev/null +++ b/aspnetcore/src/Service.Models/Publication/OrgPublicationArtPublicatonTypeCategoryDTO.cs @@ -0,0 +1,9 @@ +namespace CSC.PublicApi.Service.Models.Publication; + +// DTO used when collecting ArtPublicationTypeCategories from OrgPublications (yhteisjulkaisu/osajulkaisu). +public class OrgPublicationArtPublicatonTypeCategoryDTO +{ + public string? Id { get; set; } + + public List? ArtPublicationTypeCategories { get; set; } +} \ No newline at end of file diff --git a/aspnetcore/src/Service.Models/Publication/OrgPublicationDTO.cs b/aspnetcore/src/Service.Models/Publication/OrgPublicationDatabaseContributionDTO.cs similarity index 83% rename from aspnetcore/src/Service.Models/Publication/OrgPublicationDTO.cs rename to aspnetcore/src/Service.Models/Publication/OrgPublicationDatabaseContributionDTO.cs index cb8abb8..c789b7a 100644 --- a/aspnetcore/src/Service.Models/Publication/OrgPublicationDTO.cs +++ b/aspnetcore/src/Service.Models/Publication/OrgPublicationDatabaseContributionDTO.cs @@ -1,7 +1,7 @@ namespace CSC.PublicApi.Service.Models.Publication; // DTO used when collecting DatabaseContributions from OrgPublications (yhteisjulkaisu/osajulkaisu). -public class OrgPublicationDTO +public class OrgPublicationDatabaseContributionDTO { public string? Id { get; set; } diff --git a/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfArtDTO.cs b/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfArtDTO.cs new file mode 100644 index 0000000..bc77b0e --- /dev/null +++ b/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfArtDTO.cs @@ -0,0 +1,9 @@ +namespace CSC.PublicApi.Service.Models.Publication; + +// DTO used when collecting fields of art from OrgPublications (yhteisjulkaisu/osajulkaisu). +public class OrgPublicationFieldsOfArtDTO +{ + public string? Id { get; set; } + + public List? FieldsOfArt { get; set; } +} \ No newline at end of file diff --git a/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfScienceDTO copy.cs b/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfScienceDTO copy.cs new file mode 100644 index 0000000..c7f96ef --- /dev/null +++ b/aspnetcore/src/Service.Models/Publication/OrgPublicationFieldsOfScienceDTO copy.cs @@ -0,0 +1,9 @@ +namespace CSC.PublicApi.Service.Models.Publication; + +// DTO used when collecting fields of science from OrgPublications (yhteisjulkaisu/osajulkaisu). +public class OrgPublicationFieldsOfScienceDTO +{ + public string? Id { get; set; } + + public List? FieldsOfScience { get; set; } +} \ No newline at end of file diff --git a/aspnetcore/src/Service.Models/Publication/OrgPublicationKeywordDTO.cs b/aspnetcore/src/Service.Models/Publication/OrgPublicationKeywordDTO.cs new file mode 100644 index 0000000..fbfaeb6 --- /dev/null +++ b/aspnetcore/src/Service.Models/Publication/OrgPublicationKeywordDTO.cs @@ -0,0 +1,9 @@ +namespace CSC.PublicApi.Service.Models.Publication; + +// DTO used when collecting Keywords from OrgPublications (yhteisjulkaisu/osajulkaisu). +public class OrgPublicationKeywordDTO +{ + public string? Id { get; set; } + + public List? Keywords { get; set; } +} \ No newline at end of file diff --git a/aspnetcore/src/Service.Models/Publication/Publication.cs b/aspnetcore/src/Service.Models/Publication/Publication.cs index b80d89b..890c141 100644 --- a/aspnetcore/src/Service.Models/Publication/Publication.cs +++ b/aspnetcore/src/Service.Models/Publication/Publication.cs @@ -295,7 +295,19 @@ public class Publication public List? DatabaseContributions { get; set; } [Ignore] - public List? orgPublicationDTOs { get; set; } + public List? OrgPublicationDatabaseContributionDTOs { get; set; } + + [Ignore] + public List? OrgPublicationKeywordDTOs { get; set; } + + [Ignore] + public List? OrgPublicationArtPublicatonTypeCategoryDTOs { get; set; } + + [Ignore] + public List? OrgPublicationFieldsOfScienceDTOs { get; set; } + + [Ignore] + public List? OrgPublicationFieldsOfArtDTOs { get; set; } [Ignore] public bool? DatabasePeerReviewed { get; set; } diff --git a/aspnetcore/test/Indexer.Tests/Maps/PublicationProfileTest.cs b/aspnetcore/test/Indexer.Tests/Maps/PublicationProfileTest.cs index ea7ddfb..5fb7b97 100644 --- a/aspnetcore/test/Indexer.Tests/Maps/PublicationProfileTest.cs +++ b/aspnetcore/test/Indexer.Tests/Maps/PublicationProfileTest.cs @@ -92,7 +92,7 @@ public void ProjectTo_DimPublication_ShouldBeMappedToPublication_IsOrgPublicatio model_coPublication.IsCoPublication = true; model_coPublication.IsOrgPublication = false; model_coPublication.OrgPublicationIDs = new List { "org publication id" }; - model_coPublication.orgPublicationDTOs = new List { + model_coPublication.OrgPublicationDTOs = new List { new OrgPublicationDTO { Id = "org publication id", DatabaseContributions = new () { @@ -651,7 +651,11 @@ private Publication GetModel() OrgPublicationIDs = new List {}, Created = new DateTime(2023, 3, 10, 10, 43, 00), Modified = new DateTime(2023, 3, 10, 10, 44, 00), - orgPublicationDTOs = new() + OrgPublicationDatabaseContributionDTOs = new(), + OrgPublicationArtPublicatonTypeCategoryDTOs = new(), + OrgPublicationFieldsOfArtDTOs = new(), + OrgPublicationFieldsOfScienceDTOs = new(), + OrgPublicationKeywordDTOs = new() }; } } \ No newline at end of file