diff --git a/src/Db/Diff/PKSimDB_diff.txt b/src/Db/Diff/PKSimDB_diff.txt index 89183c141..d3f5a12fa 100644 --- a/src/Db/Diff/PKSimDB_diff.txt +++ b/src/Db/Diff/PKSimDB_diff.txt @@ -1 +1 @@ -UPDATE tab_container_parameter_values SET default_value=124000.0 WHERE parameter_value_version='InVitroClearance_PKSim' AND species='Cattle' AND container_id=159 AND container_type='ORGAN' AND container_name='Liver' AND parameter_name='Number of cells/g tissue'; + diff --git a/src/Db/Dump/PKSimDB_dump.txt b/src/Db/Dump/PKSimDB_dump.txt index 6724b0702..f729b58d5 100644 --- a/src/Db/Dump/PKSimDB_dump.txt +++ b/src/Db/Dump/PKSimDB_dump.txt @@ -91937,4 +91937,62 @@ CREATE VIEW VIEW_KNOWN_TRANSPORTER_CONTAINERS AS SELECT t.CONTAINER_NAME AS ContainerName, t.MEMBRANE AS MembraneLocation FROM tab_known_transporters_containers t; +CREATE VIEW [ContainerParameters_Species] +AS +SELECT DISTINCT + [cpc].[container_id], + [cpc].[container_type], + [cpc].[container_name], + [cpc].[parameter_name], + [species] +FROM [tab_container_parameter_curves] AS [cpc], + [tab_container_parameters] AS [cp] +WHERE [cpc].[container_id] = [cp].[container_id] + AND [cpc].[parameter_name] = [cp].[parameter_name] + AND [building_block_type] = "INDIVIDUAL" +UNION +SELECT DISTINCT + [cpv].[container_id], + [cpv].[container_type], + [cpv].[container_name], + [cpv].[parameter_name], + [species] +FROM [tab_container_parameter_values] AS [cpv], + [tab_container_parameters] AS [cp] +WHERE [cpv].[container_id] = [cp].[container_id] + AND [cpv].[parameter_name] = [cp].[parameter_name] + AND [building_block_type] = "INDIVIDUAL" +UNION +SELECT DISTINCT + [cpr].[container_id], + [cpr].[container_type], + [cpr].[container_name], + [cpr].[parameter_name], + [species] +FROM [tab_container_parameter_rates] AS [cpr], + [tab_species_calculation_methods] AS [scm], + [tab_container_parameters] AS [cp] +WHERE [cpr].[calculation_method] = [scm].[calculation_method] + AND [cpr].[container_id] = [cp].[container_id] + AND [cpr].[parameter_name] = [cp].[parameter_name] + AND [building_block_type] = "INDIVIDUAL"; +CREATE VIEW [VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES] +AS +SELECT DISTINCT + [ContainerParameters_Species].[container_id] AS [ContainerId], + [ContainerParameters_Species].[container_type] AS [ContainerType], + [ContainerParameters_Species].[container_name] AS [ContainerName], + [ContainerParameters_Species].[parameter_name] AS [ParameterName], + COUNT ([ContainerParameters_Species].[species]) AS [SpeciesCount] +FROM [ContainerParameters_Species] +GROUP BY + [container_id], + [container_type], + [container_name], + [parameter_name] +HAVING COUNT ([species]) < (SELECT COUNT ([species]) + FROM [tab_species]) +ORDER BY + [container_id], + [parameter_name]; COMMIT; diff --git a/src/Db/PKSimDB.sqlite b/src/Db/PKSimDB.sqlite index c93c3f961..5bd12ff35 100644 Binary files a/src/Db/PKSimDB.sqlite and b/src/Db/PKSimDB.sqlite differ diff --git a/src/PKSim.Core/CoreConstants.cs b/src/PKSim.Core/CoreConstants.cs index e81415936..54971207b 100644 --- a/src/PKSim.Core/CoreConstants.cs +++ b/src/PKSim.Core/CoreConstants.cs @@ -776,6 +776,7 @@ public static class ORM public const string VIEW_DISEASE_STATES = "VIEW_DISEASE_STATES"; public const string VIEW_POPULATION_DISEASE_STATES = "VIEW_POPULATION_DISEASE_STATES"; public const string VIEW_CONTAINER_PARAMETER_DESCRIPTOR_CONDITIONS = "VIEW_CONTAINER_PARAMETER_DESCRIPTOR_CONDITIONS"; + public const string VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES = "VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES"; } public static class Organ diff --git a/src/PKSim.Core/Model/ContainerParameterBySpecies.cs b/src/PKSim.Core/Model/ContainerParameterBySpecies.cs new file mode 100644 index 000000000..4d419dcf9 --- /dev/null +++ b/src/PKSim.Core/Model/ContainerParameterBySpecies.cs @@ -0,0 +1,9 @@ +namespace PKSim.Core.Model +{ + public class ContainerParameterBySpecies + { + public string ContainerPath { get; set; } + public string ParameterName { get; set; } + public int SpeciesCount { get; set; } + } +} \ No newline at end of file diff --git a/src/PKSim.Core/Repositories/IContainerParametersNotCommonForAllSpeciesRepository.cs b/src/PKSim.Core/Repositories/IContainerParametersNotCommonForAllSpeciesRepository.cs new file mode 100644 index 000000000..e2c02d6c1 --- /dev/null +++ b/src/PKSim.Core/Repositories/IContainerParametersNotCommonForAllSpeciesRepository.cs @@ -0,0 +1,13 @@ +using System; +using OSPSuite.Utility.Collections; +using PKSim.Core.Model; + +namespace PKSim.Core.Repositories +{ + public interface IContainerParametersNotCommonForAllSpeciesRepository : IStartableRepository + { + bool UsedForAllSpecies(string containerPath, string parameterName); + + bool UsedForAllSpecies(string parameterFullPath); + } +} \ No newline at end of file diff --git a/src/PKSim.Infrastructure/ORM/FlatObjects/FlatContainerParametersNotCommonForAllSpecies.cs b/src/PKSim.Infrastructure/ORM/FlatObjects/FlatContainerParametersNotCommonForAllSpecies.cs new file mode 100644 index 000000000..8da79ec68 --- /dev/null +++ b/src/PKSim.Infrastructure/ORM/FlatObjects/FlatContainerParametersNotCommonForAllSpecies.cs @@ -0,0 +1,11 @@ +namespace PKSim.Infrastructure.ORM.FlatObjects +{ + public class FlatContainerParametersNotCommonForAllSpecies + { + public int ContainerId { get; set; } + public string ContainerType { get; set; } + public string ContainerName { get; set; } + public string ParameterName { get; set; } + public int SpeciesCount { get; set; } + } +} \ No newline at end of file diff --git a/src/PKSim.Infrastructure/ORM/Repositories/ContainerParametersNotCommonForAllSpeciesRepository.cs b/src/PKSim.Infrastructure/ORM/Repositories/ContainerParametersNotCommonForAllSpeciesRepository.cs new file mode 100644 index 000000000..1685b7db9 --- /dev/null +++ b/src/PKSim.Infrastructure/ORM/Repositories/ContainerParametersNotCommonForAllSpeciesRepository.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using System.Linq; +using OSPSuite.Core.Domain; +using OSPSuite.Utility.Collections; +using PKSim.Core.Model; +using PKSim.Core.Repositories; + +namespace PKSim.Infrastructure.ORM.Repositories +{ + public class ContainerParametersNotCommonForAllSpeciesRepository: StartableRepository, IContainerParametersNotCommonForAllSpeciesRepository + { + private readonly IFlatContainerRepository _flatContainerRepository; + private readonly IFlatContainerParametersNotCommonForAllSpeciesRepository _flatContainerParametersNotCommonForAllSpeciesRepository; + + private readonly List _containerParametersNotCommonForAllSpecies; + private readonly ICache> _parametersNotCommonForAllSpeciesByContainer; + private readonly ICache _parametersNotCommonForAllSpeciesByFullPath; + + public ContainerParametersNotCommonForAllSpeciesRepository( + IFlatContainerRepository flatContainerRepository, + IFlatContainerParametersNotCommonForAllSpeciesRepository flatContainerParametersNotCommonForAllSpeciesRepository) + { + _flatContainerRepository = flatContainerRepository; + _flatContainerParametersNotCommonForAllSpeciesRepository = flatContainerParametersNotCommonForAllSpeciesRepository; + + _containerParametersNotCommonForAllSpecies = new List(); + _parametersNotCommonForAllSpeciesByContainer = new Cache>(); + _parametersNotCommonForAllSpeciesByFullPath = new Cache(); + } + + protected override void DoStart() + { + var flatContainerParametersNotCommonForAllSpecies = _flatContainerParametersNotCommonForAllSpeciesRepository.All().ToList(); + + foreach(var containerParameter in flatContainerParametersNotCommonForAllSpecies) + { + var containerPath = _flatContainerRepository.ContainerPathFrom(containerParameter.ContainerId).ToString(); + var containerParameterBySpecies = new ContainerParameterBySpecies() + { + ContainerPath = containerPath, + ParameterName = containerParameter.ParameterName, + SpeciesCount = containerParameter.SpeciesCount + }; + _containerParametersNotCommonForAllSpecies.Add(containerParameterBySpecies); + + //cache by full path + var fullPath = $"{containerPath}{ObjectPath.PATH_DELIMITER}{containerParameter.ParameterName}"; + _parametersNotCommonForAllSpeciesByFullPath.Add(fullPath, fullPath); + } + + //cache the parameters by container path + foreach (var containerParametersInContainer in _containerParametersNotCommonForAllSpecies.GroupBy(x => x.ContainerPath)) + { + _parametersNotCommonForAllSpeciesByContainer.Add(containerParametersInContainer.Key, containerParametersInContainer.Select(cp=>cp.ParameterName).ToList()); + } + } + + public override IEnumerable All() + { + Start(); + return _containerParametersNotCommonForAllSpecies; + } + + public bool UsedForAllSpecies(string containerPath, string parameterName) + { + Start(); + var parametersUsedNotForAllSpeciesInContainer = _parametersNotCommonForAllSpeciesByContainer[containerPath]; + + return parametersUsedNotForAllSpeciesInContainer == null || !parametersUsedNotForAllSpeciesInContainer.Contains(parameterName); + } + + public bool UsedForAllSpecies(string parameterFullPath) + { + Start(); + return !_parametersNotCommonForAllSpeciesByFullPath.Contains(parameterFullPath); + } + } +} \ No newline at end of file diff --git a/src/PKSim.Infrastructure/ORM/Repositories/FlatContainerParametersNotCommonForAllSpeciesRepository.cs b/src/PKSim.Infrastructure/ORM/Repositories/FlatContainerParametersNotCommonForAllSpeciesRepository.cs new file mode 100644 index 000000000..f6889896c --- /dev/null +++ b/src/PKSim.Infrastructure/ORM/Repositories/FlatContainerParametersNotCommonForAllSpeciesRepository.cs @@ -0,0 +1,19 @@ +using PKSim.Core; +using PKSim.Infrastructure.ORM.Core; +using PKSim.Infrastructure.ORM.FlatObjects; +using PKSim.Infrastructure.ORM.Mappers; + +namespace PKSim.Infrastructure.ORM.Repositories +{ + public interface IFlatContainerParametersNotCommonForAllSpeciesRepository : IMetaDataRepository + { + } + + public class FlatContainerParametersNotCommonForAllSpeciesRepository : MetaDataRepository, IFlatContainerParametersNotCommonForAllSpeciesRepository + { + public FlatContainerParametersNotCommonForAllSpeciesRepository(IDbGateway dbGateway, IDataTableToMetaDataMapper mapper) + : base(dbGateway, mapper, CoreConstants.ORM.VIEW_CONTAINER_PARAMETER_NOT_FOR_ALL_SPECIES) + { + } + } +} \ No newline at end of file diff --git a/src/PKSim.Infrastructure/Serialization/Xml/Serializers/ContainerParameterBySpeciesSerializer.cs b/src/PKSim.Infrastructure/Serialization/Xml/Serializers/ContainerParameterBySpeciesSerializer.cs new file mode 100644 index 000000000..9f7ba9f9e --- /dev/null +++ b/src/PKSim.Infrastructure/Serialization/Xml/Serializers/ContainerParameterBySpeciesSerializer.cs @@ -0,0 +1,14 @@ +using PKSim.Core.Model; + +namespace PKSim.Infrastructure.Serialization.Xml.Serializers +{ + public class ContainerParameterBySpeciesSerializer : BaseXmlSerializer + { + public override void PerformMapping() + { + Map(x => x.ContainerPath); + Map(x => x.ParameterName); + Map(x => x.SpeciesCount); + } + } +} \ No newline at end of file diff --git a/tests/PKSim.Tests/IntegrationTests/ContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs b/tests/PKSim.Tests/IntegrationTests/ContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs new file mode 100644 index 000000000..aa37cf1c2 --- /dev/null +++ b/tests/PKSim.Tests/IntegrationTests/ContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using System.Linq; +using FluentNHibernate.Utils; +using OSPSuite.BDDHelper; +using OSPSuite.BDDHelper.Extensions; +using PKSim.Core.Model; +using PKSim.Core.Repositories; + +namespace PKSim.IntegrationTests +{ + public abstract class concern_for_ContainerParametersNotCommonForAllSpeciesRepository : ContextForIntegration + { + } + + public class When_retrieving_parameters_not_common_for_all_species_from_the_repository : concern_for_ContainerParametersNotCommonForAllSpeciesRepository + { + private IEnumerable _result; + + protected override void Because() + { + _result = sut.All(); + } + + [Observation] + public void should_return_at_least_one_parameter() + { + _result.Count().ShouldBeGreaterThan(0); + } + + [Observation] + public void all_parameter_paths_should_start_with_organism_or_neighborhoods() + { + //because we deal here with individual parameters only: only parameters with path "Organism|..." or "Neighborhoods|..." may appear in the list + _result.Each(p=> + { + var containerPath = p.ContainerPath; + (containerPath.StartsWith("Organism")|| containerPath.StartsWith("Neighborhoods")).ShouldBeTrue($"{p.ContainerPath}|{p.ParameterName}"); + }); + } + } + + public class When_testing_if_a_parameter_is_common_for_all_species : concern_for_ContainerParametersNotCommonForAllSpeciesRepository + { + [Observation] + public void age_parameter_should_be_defined_not_for_all_species() + { + sut.UsedForAllSpecies("Organism","Age").ShouldBeFalse(); + } + + [Observation] + public void weight_parameter_should_be_defined_for_all_species() + { + sut.UsedForAllSpecies("Organism", "Weight").ShouldBeTrue(); + } + + [Observation] + public void age_parameter_should_be_defined_not_for_all_species_when_queried_by_full_path() + { + sut.UsedForAllSpecies("Organism|Age").ShouldBeFalse(); + } + + [Observation] + public void weight_parameter_should_be_defined_for_all_species_when_queried_by_full_path() + { + sut.UsedForAllSpecies("Organism|Weight").ShouldBeTrue(); + } + } +} \ No newline at end of file diff --git a/tests/PKSim.Tests/IntegrationTests/FlatContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs b/tests/PKSim.Tests/IntegrationTests/FlatContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs new file mode 100644 index 000000000..2bdd5486d --- /dev/null +++ b/tests/PKSim.Tests/IntegrationTests/FlatContainerParametersNotCommonForAllSpeciesRepositorySpecs.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +using System.Linq; +using OSPSuite.BDDHelper; +using OSPSuite.BDDHelper.Extensions; +using PKSim.Infrastructure.ORM.FlatObjects; +using PKSim.Infrastructure.ORM.Repositories; + +namespace PKSim.IntegrationTests +{ + public abstract class concern_for_FlatContainerParametersNotCommonForAllSpeciesRepository : ContextForIntegration + { + } + + public class When_resolving_all_parameters_not_common_for_all_species_as_a_flat_table : concern_for_FlatContainerParametersNotCommonForAllSpeciesRepository + { + private IEnumerable _result; + + protected override void Because() + { + _result = sut.All(); + } + + [Observation] + public void should_retrieve_some_object_from_the_underlying_database() + { + _result.Count().ShouldBeGreaterThan(0); + } + } +} \ No newline at end of file