diff --git a/.github/configs/codeql.yml b/.github/configs/codeql.yml
new file mode 100644
index 0000000000..9c211adfac
--- /dev/null
+++ b/.github/configs/codeql.yml
@@ -0,0 +1,12 @@
+name: CodeQL Configuration
+
+paths-ignore:
+ - "**/*.md"
+ - "**/*.txt"
+ - "**/obj/**"
+ - "**/bin/**"
+ - "**/*.Designer.cs"
+
+query-filters:
+ - exclude:
+ id: cs/catch-of-all-exceptions
\ No newline at end of file
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000000..592920dbf8
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,24 @@
+## Proposed Change
+
+Summarise your proposed changes here, including any notes for reviewers.
+
+## Type of change
+
+What types of changes does your code introduce? Tick all that apply.
+
+- [ ] Bugfix (non-breaking change which fixes an issue)
+- [ ] New Feature (non-breaking change which adds functionality)
+- [ ] Breaking Change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] Documentation-Only Update
+- [ ] Other (if none of the other choices apply)
+
+## Checklist
+
+By opening this PR, I confirm that I have:
+
+- [ ] Ensured that the PR branch is in sync with the target branch (i.e. it is automatically merge-able)
+- [ ] Created or updated any tests if relevant
+- [ ] Have validated this change against the [Test Plan](https://github.com/HicServices/RDMP/blob/develop/Documentation/CodeTutorials/TestPlan.md)
+- [ ] Requested a review by one of the repository maintainers
+- [ ] Have written new documentation or updated existing documentation to detail any new or updated functionality and how to use it
+- [ ] Have added an entry into the changelog
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 17ae601489..533ecd6b08 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -66,7 +66,7 @@ jobs:
mv `find coverage -type f` db-ui.lcov
dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov
mv `find coverage -type f` db-core.lcov
- - uses: coverallsapp/github-action@v2.2.3
+ - uses: coverallsapp/github-action@v2.3.0
with:
github-token: ${{ secrets.github_token }}
files: ./db-ui.lcov ./db-core.lcov
@@ -128,7 +128,7 @@ jobs:
mv `find coverage -type f` fs-ui.lcov
dotnet test Rdmp.Core.Tests/Rdmp.Core.Tests.csproj --nologo --collect:"XPlat Code Coverage" --no-build --verbosity minimal -c Release --results-directory coverage -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=lcov
mv `find coverage -type f` fs-core.lcov
- - uses: coverallsapp/github-action@v2.2.3
+ - uses: coverallsapp/github-action@v2.3.0
with:
github-token: ${{ secrets.github_token }}
files: ./fs-ui.lcov ./fs-core.lcov
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index f1d1df2a90..3f3fa860d4 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -31,6 +31,7 @@ jobs:
with:
languages: ${{ matrix.language }}
queries: +security-and-quality
+ config-file: ./.github/configs/codeql.yml
- name: Build
run: dotnet build
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 24183a1ec9..a92cb4b639 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,25 @@
+
+
+
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [8.1.6] - 2024-05-27
+
+## Changed
+
+- Improve error messages for Multi-ExtractionIdentifier extractions
+- Add prompt to rename container when adding a cohort filter
+- Allow for column selection when using the RemoteTableAttacher
+- Fix to remove stack trace button from non error popups
+- Add ability to set Extraction Category as "Not Extractable"
+- Replace BadMedicine v1.2.1 with SynthEHR v2.0.0
+- Fix issue with RDMP being slow to load when having numerous Load Metadatas
+- Fix issue creating logging databases on PostgreSQL servers
+
## [8.1.5] - 2024-04-03
## Changed
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 4a768920e5..f112585108 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,26 +3,26 @@
-
-
-
-
+
+
+
+ allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
-
-
-
-
+
+
+
+
-
+
-
+
@@ -34,9 +34,9 @@
-
+
-
+
diff --git a/Documentation/CodeTutorials/Packages.md b/Documentation/CodeTutorials/Packages.md
index f5391fd72c..89579262da 100644
--- a/Documentation/CodeTutorials/Packages.md
+++ b/Documentation/CodeTutorials/Packages.md
@@ -25,7 +25,7 @@
| LibArchive.Net | [GitHub](https://github.com/jas88/libarchive.net) | [BSD](https://opensource.org/license/bsd-2-clause/) | Access archive formats without the LZMA bugs of SharpCompress | |
| [NLog](https://nlog-project.org/) | [GitHub](https://github.com/NLog/NLog) | [BSD 3-Clause](https://github.com/NLog/NLog/blob/dev/LICENSE.txt) | Flexible user configurable logging | |
| HIC.FAnsiSql |[GitHub](https://github.com/HicServices/FAnsiSql) | [GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.html) | [DBMS] abstraction layer |
-| HIC.BadMedicine | [GitHub](https://github.com/HicServices/BadMedicine) | [GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.html) | Generate Test Datasets for tests/exericses |
+| HIC.SynthEHR | [GitHub](https://github.com/HicServices/SynthEHR) | [GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.html) | Generate Test Datasets for tests/exericses |
| SSH.NET | [GitHub](https://github.com/sshnet/SSH.NET) | [MIT](https://github.com/sshnet/SSH.NET/blob/develop/LICENSE) | Enables fetching files from SFTP servers |
| Moq 4 | [GitHub](https://github.com/moq/moq4) |[BSD 3](https://github.com/moq/moq4/blob/master/License.txt) | Mock objects during unit testing |
| [Newtonsoft.Json](https://www.newtonsoft.com/json) | [GitHub](https://github.com/JamesNK/Newtonsoft.Json) | [MIT](https://opensource.org/licenses/MIT) | Serialization of objects for sharing/transmission |
diff --git a/Documentation/CodeTutorials/PluginWriting.md b/Documentation/CodeTutorials/PluginWriting.md
index de284ee2ab..1fe842faf2 100644
--- a/Documentation/CodeTutorials/PluginWriting.md
+++ b/Documentation/CodeTutorials/PluginWriting.md
@@ -1436,7 +1436,7 @@ When packaging `dotnet publish` results you can exclude dlls that already come w
```
```
diff --git a/Documentation/CodeTutorials/TestPlan.md b/Documentation/CodeTutorials/TestPlan.md
new file mode 100644
index 0000000000..5a5afe2cf5
--- /dev/null
+++ b/Documentation/CodeTutorials/TestPlan.md
@@ -0,0 +1,56 @@
+# RDMP Test Plan
+The RDMP test plan outlines the questions that should be asked of new changes to help ensure the correct changes are being made at the correct time.
+These questions are designed to help highlight any steps in the testing process that may have been missed.
+
+If you are looking to release a new version with this change, please look at the [Release Testing](#release_testing) section below.
+
+## Generating Test Data
+There is functionality to generate example data built into RDMP. This functionality has a 'nightmare' mode, which can generate large amounts of data for testing purposes.
+This mode can be enabled when creating platform databases by adding the 'Nightmare' flag to the example data settings during platform creation.
+Additional data can be used by using the 'Factor' flag to increase the amount of data, this will multiply the number of objects created by your specified Factor.
+
+## Questions To Ask
+### Does this change add a database migration?
+If the change adds a database migration, ask yourself the following questions:
+* Is the change backwards compatable?
+* Have I tested the change with a fresh install of RDMP?
+* Have I tested the change through the upgrade path with populated data that my change affects?
+* Should this change be included in a patch release? or be part of the next minor release? Or even a major release?
+ * Patch releases contain small improvements and should be usable interchangably with other versions within the same minor version e.g v8.1.4 and v8.1.5
+ * Minor released contain new functionality and should be backwards compatable with other versions in the same major version e.g. v8.1.0 and v8.2.0
+ * Major releases contain changes that are not backwards compatable
+
+### Does this change add new functionality?
+If the change adds new functionality, ask yourself the following questions:
+* Is the functionality usable via the GUI? If no ,why not?
+* Is the functionality usable via the CLI? If no, why not?
+* Has the functionalty been covered via unit tests?
+* Has the functionalty been manually tested?
+ * Has the happy path been tested?
+ * This is the expected path, where users are paying attention and are on their best behaviour
+ * Has the sad path been tested?
+ * This is where the user tries to be as obtuse as possible
+* Does this change do any data processing? If so, check the performance questions below
+
+### Does this change have any impact on performance?
+If the change adds or amends functionality that processes data
+* Is the functionality performant?
+ * Can the space/time complexity of the functions be reduced?
+* Does the functionality handle large datasets (>1GB) efficiently?
+
+
+### What assumptions have been made?
+* Have any assumptions about how this functionality will be used been made?
+* Have any assumptions about the input data been made? Can these assumptions be extracted out into configuration?
+
+## Release Testing
+The release testing process should be completed once the release is feature complete and no more code changes are due to take place.
+This testing is to ensure that all code changes made during this release play nicely together and have no unintended side effcts.
+It may be useful at this point to revisit each piece of functionality and ensure they work as expected and perform some user acceptance testing on them, in light with the questions above.
+### What's changed?
+* Does the changelog accuratly reflect the pull request changes made?
+* If there are database migrations, are they all correctly sequenced and not overlapping?
+* Does the release work as epxected with a fresh install and via the upgrade path?
+* Is all functionality documented?
+* Are all version numbers bumped correctly?
+* Do all of the managed plugins work with the new release without issues or warnings?
\ No newline at end of file
diff --git a/Documentation/CodeTutorials/UserManual.md b/Documentation/CodeTutorials/UserManual.md
index 224539fccc..dec9f2755c 100644
--- a/Documentation/CodeTutorials/UserManual.md
+++ b/Documentation/CodeTutorials/UserManual.md
@@ -129,7 +129,7 @@ _\* Unless using [file system backend](./YamlRepository.md)_
## Example Data
Example data can be setup on install by ticking the 'Example Datasets' checkbox during platform database setup.
-New example data can be generated through the `Diagnostics=>Generate Test Data` menu. Or with the [BadMedicine](https://github.com/HicServices/BadMedicine) command line tool.
+New example data can be generated through the `Diagnostics=>Generate Test Data` menu. Or with the [SynthEHR](https://github.com/HicServices/SynthEHR) command line tool.
## Importing a flat file as a new dataset
If you have some CSV files (or Excel/Fixed Width) that you want to load into your database, you can do so with the RDMP bulk import tool.
@@ -384,7 +384,7 @@ drop trigger Prescribing_OnUpdate;
Each data load in RDMP has a single [LoadMetadata] object which acts as the root for the configuration. A given configuration will load one or more tables (which must have primary keys). The tables loaded includes all the tables that underly the [Catalogues] which are associated with the [LoadMetadata]. For example if a Catalogue 'Biochemistry' includes a join on two tables 'Header' and 'Results' then a [LoadMetadata] which includes 'Biochemistry' would include both the 'Header' and 'Results' tables.
-Create a new Biochemistry CSV file with [BadMedicine] and add a primary key to the 'Biochemistry' table in your example data. The key should be a composite primary key of:
+Create a new Biochemistry CSV file with [SynthEHR] and add a primary key to the 'Biochemistry' table in your example data. The key should be a composite primary key of:
- chi
- SampleDate
@@ -458,7 +458,7 @@ Set the following properties:
### Running the load
-Place the Biochemistry.csv file generated by [BadMedicine] into the ForLoading directory of your load (e.g. `C:\temp\biochem\Data\ForLoading`).
+Place the Biochemistry.csv file generated by [SynthEHR] into the ForLoading directory of your load (e.g. `C:\temp\biochem\Data\ForLoading`).
Right click the [LoadMetadata] and select 'Check and Execute'
@@ -838,7 +838,7 @@ _The question mark after ExtractionConfiguration means match all where the Proje
[AggregateConfiguration]: ./Glossary.md#AggregateConfiguration
-[BadMedicine]: https://github.com/HicServices/BadMedicine
+[SynthEHR]: https://github.com/HicServices/SynthEHR
[Catalogue]: ./Glossary.md#Catalogue
[Catalogues]: ./Glossary.md#Catalogue
[CohortIdentificationConfiguration]: ./Glossary.md#CohortIdentificationConfiguration
diff --git a/Documentation/DataLoadEngine/RemoteAttachers.md b/Documentation/DataLoadEngine/RemoteAttachers.md
index a3ba7a784f..2026d3bb7a 100644
--- a/Documentation/DataLoadEngine/RemoteAttachers.md
+++ b/Documentation/DataLoadEngine/RemoteAttachers.md
@@ -48,7 +48,8 @@ The full configuration options are
| Delta Reading Look Forward Days | If using the Delta Reading fetch duration, this is how many days forward in time you wish to look each time |
| Set Delta Reading To Last Seen Date Post Load | Optional overwrite to the Delta Reading fetch option. Will use the most recently seen date in the fetched data rather than the adding the forward look days amount onto the stored minimum date |
| Culture | Optionally specify a custom date format |
-| Explicit Date Time Format | Optionally specify a specific datetime format
+| Explicit Date Time Format | Optionally specify a specific datetime format
+| Selected Columns | Optionally select which columns you wish to pull from the remote server (defaults to "*" )
## Configuring the Remote Database Attacher
The Remote Database Attacher has a number of configuration options the required fields are:
@@ -68,4 +69,11 @@ The Remote Database Attacher has a number of configuration options the required
| Delta Reading Look Forward Days | If using the Delta Reading fetch duration, this is how many days forward in time you wish to look each time |
| Set Delta Reading To Last Seen Date Post Load | Optional overwrite to the Delta Reading fetch option. Will use the most recently seen date in the fetched data rather than the adding the forward look days amount onto the stored minimum date |
| Culture | Optionally specify a custom date format |
-| Explicit Date Time Format | Optionally specify a specific datetime format
+| Explicit Date Time Format | Optionally specify a specific datetime format
+| Selected Columns | Optionally select which columns you wish to pull from the remote server (defaults to "*" )
+
+
+## Using Historical Loading with custom SQL
+By default, historical fetch configuration will be ignored in custome select SQL.
+To enable the use of hostorical fetching, include the string "$RDMPDefinedWhereClause" in the where clause of your query
+e.e. "Select * from Biochemistry Where $RDMPDefinedWhereClause"
diff --git a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs
index 2fb4d0a7b9..02848abedf 100644
--- a/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs
+++ b/Rdmp.Core.Tests/CommandExecution/ExecuteCommandLinkCoulmnInfoWithDatasetTests.cs
@@ -34,7 +34,6 @@ public void TestLinkColumnInfoToDataset()
var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset");
Assert.DoesNotThrow(() => cmd.Execute());
var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First();
- var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First();
var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset);
Assert.DoesNotThrow(() => linkCmd.Execute());
var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects();
@@ -69,7 +68,6 @@ public void TestLinkColumnInfoToDatasetNotAll()
var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset");
Assert.DoesNotThrow(() => cmd.Execute());
var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First();
- var foundCatalogue = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(c => c.Name == "Dataset1").First();
var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), _c1, founddataset, false);
Assert.DoesNotThrow(() => linkCmd.Execute());
var columInfo = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().Where(ci => _cata1.CatalogueItems.Contains(ci));
@@ -99,7 +97,6 @@ public void TestLinkColumInfoToDatasetBadDataset()
{
var cmd = new ExecuteCommandCreateDataset(GetMockActivator(), "dataset");
Assert.DoesNotThrow(() => cmd.Execute());
- var founddataset = GetMockActivator().RepositoryLocator.CatalogueRepository.GetAllObjects().First();
var linkCmd = new ExecuteCommandLinkColumnInfoToDataset(GetMockActivator(), new ColumnInfo(), null, false);
Assert.Throws(() => linkCmd.Execute());
}
diff --git a/Rdmp.Core.Tests/Curation/Integration/MetadataLoggingConfigurationChecksTests.cs b/Rdmp.Core.Tests/Curation/Integration/MetadataLoggingConfigurationChecksTests.cs
index e51660c7c5..c41141f7e2 100644
--- a/Rdmp.Core.Tests/Curation/Integration/MetadataLoggingConfigurationChecksTests.cs
+++ b/Rdmp.Core.Tests/Curation/Integration/MetadataLoggingConfigurationChecksTests.cs
@@ -21,9 +21,8 @@ public class MetadataLoggingConfigurationChecksTests : UnitTests
public void Test_NoLoggingTask()
{
var lmd = WhenIHaveA();
- var cata1 = lmd.GetAllCatalogues().Single();
- var cata2 = WhenIHaveA();
- lmd.LinkToCatalogue(cata2);
+ var cata = WhenIHaveA();
+ lmd.LinkToCatalogue(cata);
Assert.That(lmd.GetAllCatalogues().Count(), Is.EqualTo(2));
var checks = new MetadataLoggingConfigurationChecks(lmd);
diff --git a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestBiochemistryCreation.cs b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestBiochemistryCreation.cs
index fa7e8fd6b4..e0bc461d5e 100644
--- a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestBiochemistryCreation.cs
+++ b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestBiochemistryCreation.cs
@@ -6,8 +6,8 @@
using System;
using System.IO;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using NUnit.Framework;
namespace Rdmp.Core.Tests.Curation.Unit.ExerciseData;
diff --git a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestDemographyCreation.cs b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestDemographyCreation.cs
index 80990b790a..a66abbb6cd 100644
--- a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestDemographyCreation.cs
+++ b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestDemographyCreation.cs
@@ -6,8 +6,8 @@
using System;
using System.IO;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using NUnit.Framework;
namespace Rdmp.Core.Tests.Curation.Unit.ExerciseData;
diff --git a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestPrescribingCreation.cs b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestPrescribingCreation.cs
index 4b57512035..15bd4e42fe 100644
--- a/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestPrescribingCreation.cs
+++ b/Rdmp.Core.Tests/Curation/Unit/ExerciseData/TestPrescribingCreation.cs
@@ -7,8 +7,8 @@
using System;
using System.IO;
using System.Linq;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using NUnit.Framework;
namespace Rdmp.Core.Tests.Curation.Unit.ExerciseData;
diff --git a/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteFullExtractionToDatabaseMSSqlDestinationTest.cs b/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteFullExtractionToDatabaseMSSqlDestinationTest.cs
index 885aa46c65..31c934055f 100644
--- a/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteFullExtractionToDatabaseMSSqlDestinationTest.cs
+++ b/Rdmp.Core.Tests/DataExport/DataExtraction/ExecuteFullExtractionToDatabaseMSSqlDestinationTest.cs
@@ -8,7 +8,7 @@
using System.Data;
using System.IO;
using System.Linq;
-using BadMedicine.Datasets;
+using SynthEHR.Datasets;
using FAnsi.Discovery;
using NUnit.Framework;
using Rdmp.Core.Curation.Data;
diff --git a/Rdmp.Core.Tests/DataLoad/Engine/Integration/DataTableUploadDestinationTests.cs b/Rdmp.Core.Tests/DataLoad/Engine/Integration/DataTableUploadDestinationTests.cs
index 17a8f8d52c..758604e6c5 100644
--- a/Rdmp.Core.Tests/DataLoad/Engine/Integration/DataTableUploadDestinationTests.cs
+++ b/Rdmp.Core.Tests/DataLoad/Engine/Integration/DataTableUploadDestinationTests.cs
@@ -1251,7 +1251,9 @@ public void TwoBatch_BooleanResizingTest(DatabaseType dbType, bool giveNullValue
destination.ProcessPipelineData(dt1, toConsole, token);
- Assert.That(db.ExpectTable("DataTableUploadDestinationTests").DiscoverColumn("TestedCol").DataType.SQLType, Is.EqualTo("bit"));
+ // MS SQL is odd and uses "bit" as a boolean, MySQL has a boolean type but aliases it to tinyint(1)
+ Assert.That(db.ExpectTable("DataTableUploadDestinationTests").DiscoverColumn("TestedCol").DataType?.SQLType,
+ Is.EqualTo(dbType == DatabaseType.MicrosoftSQLServer ? "bit" : "tinyint(1)"));
destination.ProcessPipelineData(dt2, toMemory, token);
diff --git a/Rdmp.Core.Tests/QueryCaching/QueryCachingCrossServerTests.cs b/Rdmp.Core.Tests/QueryCaching/QueryCachingCrossServerTests.cs
index 8243b7c9e9..01ad053091 100644
--- a/Rdmp.Core.Tests/QueryCaching/QueryCachingCrossServerTests.cs
+++ b/Rdmp.Core.Tests/QueryCaching/QueryCachingCrossServerTests.cs
@@ -7,8 +7,8 @@
using System;
using System.Linq;
using System.Threading;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using FAnsi;
using FAnsi.Discovery;
using NUnit.Framework;
diff --git a/Rdmp.Core/CohortCreation/Execution/ExamplePluginCohortCompiler.cs b/Rdmp.Core/CohortCreation/Execution/ExamplePluginCohortCompiler.cs
index 0a4dfcd05e..9452966095 100644
--- a/Rdmp.Core/CohortCreation/Execution/ExamplePluginCohortCompiler.cs
+++ b/Rdmp.Core/CohortCreation/Execution/ExamplePluginCohortCompiler.cs
@@ -9,7 +9,7 @@
using System.Data;
using System.Linq;
using System.Threading;
-using BadMedicine;
+using SynthEHR;
using Rdmp.Core.Curation.Data;
using Rdmp.Core.Curation.Data.Aggregation;
using Rdmp.Core.QueryCaching.Aggregation;
diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandChangeExtractionCategory.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandChangeExtractionCategory.cs
index f8a80e4f55..0e71a835df 100644
--- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandChangeExtractionCategory.cs
+++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandChangeExtractionCategory.cs
@@ -69,17 +69,25 @@ public override void Execute()
Show("Cannot set the Extraction Category to 'Core' for a Project Specific Catalogue item. It will be saved as 'Project Specific'.");
}
- if (ExecuteWithCommit(() => ExecuteImpl(c.Value), $"Set ExtractionCategory to '{c}'", _extractionInformations))
+ if (ExecuteWithCommit(() => ExecuteImpl(c.Value), c == ExtractionCategory.NotExtractable ? "Make Not Extractable" : $"Set ExtractionCategory to '{c}'", _extractionInformations))
//publish the root Catalogue
Publish(_extractionInformations.First());
}
private void ExecuteImpl(ExtractionCategory category)
{
+
foreach (var ei in _extractionInformations)
{
- ei.ExtractionCategory = category;
- ei.SaveToDatabase();
+ if (category == ExtractionCategory.NotExtractable)
+ {
+ ei.DeleteInDatabase();
+ }
+ else
+ {
+ ei.ExtractionCategory = category;
+ ei.SaveToDatabase();
+ }
}
}
}
\ No newline at end of file
diff --git a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandGenerateTestData.cs b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandGenerateTestData.cs
index 6c06f5f793..6f242aa184 100644
--- a/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandGenerateTestData.cs
+++ b/Rdmp.Core/CommandExecution/AtomicCommands/ExecuteCommandGenerateTestData.cs
@@ -7,13 +7,13 @@
using System;
using System.IO;
using System.Linq;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
namespace Rdmp.Core.CommandExecution.AtomicCommands;
///
-/// Generates CSV files on disk for RDMP example datasets (based on BadMedicine library)
+/// Generates CSV files on disk for RDMP example datasets (based on SynthEHR library)
///
public class ExecuteCommandGenerateTestData : BasicCommandExecution
{
diff --git a/Rdmp.Core/CommandLine/DatabaseCreation/ExampleDatasetsCreation.cs b/Rdmp.Core/CommandLine/DatabaseCreation/ExampleDatasetsCreation.cs
index 720c1b5d31..65fb921237 100644
--- a/Rdmp.Core/CommandLine/DatabaseCreation/ExampleDatasetsCreation.cs
+++ b/Rdmp.Core/CommandLine/DatabaseCreation/ExampleDatasetsCreation.cs
@@ -9,8 +9,8 @@
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using FAnsi;
using FAnsi.Discovery;
using FAnsi.Discovery.ConnectionStringDefaults;
@@ -44,8 +44,8 @@ namespace Rdmp.Core.CommandLine.DatabaseCreation;
///
public partial class ExampleDatasetsCreation
{
- private IRDMPPlatformRepositoryServiceLocator _repos;
- private IBasicActivateItems _activator;
+ private readonly IRDMPPlatformRepositoryServiceLocator _repos;
+ private readonly IBasicActivateItems _activator;
public const int NumberOfPeople = 5000;
public const int NumberOfRowsPerDataset = 10000;
@@ -389,9 +389,6 @@ private ExtractableCohort CommitCohortToNewProject(CohortIdentificationConfigura
};
project.SaveToDatabase();
- //create a cohort
- var auditLogBuilder = new ExtractableCohortAuditLogBuilder();
-
var request = new CohortCreationRequest(project,
new CohortDefinition(null, cohortName, 1, projectNumber, externalCohortTable), _repos.DataExportRepository,
ExtractableCohortAuditLogBuilder.GetDescription(cic))
@@ -644,7 +641,7 @@ private ICatalogue ImportCatalogue(ITableInfo ti)
var forwardEngineer = new ForwardEngineerCatalogue(ti, ti.ColumnInfos);
forwardEngineer.ExecuteForwardEngineering(out var cata, out _, out var eis);
- //get descriptions of the columns from BadMedicine
+ //get descriptions of the columns from SynthEHR
cata.Description = Trim(Descriptions.Get(cata.Name));
if (cata.Description != null)
{
diff --git a/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs b/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs
index 1e334414b9..d540b5f4ee 100644
--- a/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs
+++ b/Rdmp.Core/CommandLine/DatabaseCreation/NightmareDatasets.cs
@@ -7,8 +7,8 @@
using System;
using System.Collections.Generic;
using System.IO;
-using BadMedicine;
-using BadMedicine.Datasets;
+using SynthEHR;
+using SynthEHR.Datasets;
using FAnsi.Discovery;
using Rdmp.Core.CohortCommitting.Pipeline;
using Rdmp.Core.Curation.Data;
diff --git a/Rdmp.Core/Curation/Data/ExtractionCategory.cs b/Rdmp.Core/Curation/Data/ExtractionCategory.cs
index a05045513e..bd1f215d61 100644
--- a/Rdmp.Core/Curation/Data/ExtractionCategory.cs
+++ b/Rdmp.Core/Curation/Data/ExtractionCategory.cs
@@ -45,5 +45,10 @@ public enum ExtractionCategory
///
/// Value can only be used for fetching ExtractionInformations. This means that all will be returned. You cannot set a column to have an ExtractionCategory of Any
///
- Any
+ Any,
+
+ ///
+ /// Value used for improved UI experience, will be set to null when executed
+ ///
+ NotExtractable
}
\ No newline at end of file
diff --git a/Rdmp.Core/Curation/Data/SafeDirectoryCatalog.cs b/Rdmp.Core/Curation/Data/SafeDirectoryCatalog.cs
index c740a32743..7f2d24a705 100644
--- a/Rdmp.Core/Curation/Data/SafeDirectoryCatalog.cs
+++ b/Rdmp.Core/Curation/Data/SafeDirectoryCatalog.cs
@@ -71,7 +71,7 @@ public static class SafeDirectoryCatalog
"autoupdater.net.resources.dll",
"azure.core.dll",
"azure.identity.dll",
- "badmedicine.core.dll",
+ "syntehr.core.dll",
"bouncycastle.crypto.dll",
"clretwrc.dll",
"clrjit.dll",
@@ -98,7 +98,6 @@ public static class SafeDirectoryCatalog
"libarchive.net.dll",
"mapsdirectlytodatabasetable.dll",
"mathnet.numerics.dll",
- "microsoft.bcl.asyncinterfaces.dll",
"microsoft.csharp.dll",
"microsoft.data.sqlclient.dll",
"microsoft.data.sqlclient.sni.dll",
@@ -404,4 +403,4 @@ public static class SafeDirectoryCatalog
"wpfgfx_cor3.dll",
"yamldotnet.dll"
};
-}
\ No newline at end of file
+}
diff --git a/Rdmp.Core/DataExport/Checks/SelectedDataSetsChecker.cs b/Rdmp.Core/DataExport/Checks/SelectedDataSetsChecker.cs
index fa3baf87bf..b26bc58b24 100644
--- a/Rdmp.Core/DataExport/Checks/SelectedDataSetsChecker.cs
+++ b/Rdmp.Core/DataExport/Checks/SelectedDataSetsChecker.cs
@@ -137,7 +137,7 @@ public void Check(ICheckNotifier notifier)
{
notifier.OnCheckPerformed(
new CheckEventArgs(
- $"Could not generate valid extraction SQL for dataset {ds} in configuration {config}",
+ $"Could not generate valid extraction SQL for dataset {ds} in configuration {config}. {e.Message}",
CheckResult.Fail, e));
return;
}
diff --git a/Rdmp.Core/DataLoad/Modules/Attachers/RemoteTableAttacher.cs b/Rdmp.Core/DataLoad/Modules/Attachers/RemoteTableAttacher.cs
index 953a7e9db9..96878f4dc8 100644
--- a/Rdmp.Core/DataLoad/Modules/Attachers/RemoteTableAttacher.cs
+++ b/Rdmp.Core/DataLoad/Modules/Attachers/RemoteTableAttacher.cs
@@ -1,4 +1,4 @@
-// Copyright (c) The University of Dundee 2018-2019
+// Copyright (c) The University of Dundee 2018-2024
// This file is part of the Research Data Management Platform (RDMP).
// RDMP is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
// RDMP is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
@@ -6,6 +6,7 @@
using System;
using System.Data;
+using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using FAnsi;
@@ -15,7 +16,6 @@
using Rdmp.Core.Curation.Data.DataLoad;
using Rdmp.Core.DataFlowPipeline;
using Rdmp.Core.DataFlowPipeline.Requirements;
-using Rdmp.Core.DataLoad.Engine.Attachers;
using Rdmp.Core.DataLoad.Engine.Job;
using Rdmp.Core.DataLoad.Engine.Job.Scheduling;
using Rdmp.Core.DataLoad.Engine.Pipeline.Destinations;
@@ -27,6 +27,7 @@
using Rdmp.Core.ReusableLibraryCode.DataAccess;
using Rdmp.Core.ReusableLibraryCode.Progress;
using TypeGuesser;
+using static NPOI.HSSF.Util.HSSFColor;
namespace Rdmp.Core.DataLoad.Modules.Attachers;
@@ -94,6 +95,9 @@ public RemoteTableAttacher() : base()
DefaultValue = DatabaseType.MicrosoftSQLServer)]
public DatabaseType DatabaseType { get; set; }
+ [DemandsInitialization("The Columns you wish to pull from the remote table", DefaultValue = "*")]
+ public string SelectedColumns { get; set; } = "*";
+
private const string StartDateParameter = "@startDate";
private const string EndDateParameter = "@endDate";
@@ -359,9 +363,16 @@ public override ExitCodeType Attach(IDataLoadJob job, GracefulCancellationToken
var syntax = _remoteDatabase.Server.GetQuerySyntaxHelper();
- var sql = !string.IsNullOrWhiteSpace(RemoteSelectSQL)
- ? RemoteSelectSQL
- : $"Select * from {syntax.EnsureWrapped(RemoteTableName)} {SqlHistoricalDataFilter(job.LoadMetadata,DatabaseType)}";
+ string sql;
+ if (!string.IsNullOrWhiteSpace(RemoteSelectSQL))
+ {
+ var injectedWhereClause = SqlHistoricalDataFilter(job.LoadMetadata, DatabaseType).Replace(" WHERE", "");
+ sql = Regex.Replace(RemoteSelectSQL, "\\$RDMPDefinedWhereClause", injectedWhereClause);
+ }
+ else
+ {
+ sql = $"Select {SelectedColumns} from {syntax.EnsureWrapped(RemoteTableName)} {SqlHistoricalDataFilter(job.LoadMetadata, DatabaseType)}";
+ }
var scheduleMismatch = false;
//if there is a load progress
@@ -457,7 +468,7 @@ public override ExitCodeType Attach(IDataLoadJob job, GracefulCancellationToken
if (SetDeltaReadingToLatestSeenDatePostLoad)
{
- FindMostRecentDateInLoadedData(rawSyntax, _dbInfo.Server.DatabaseType ,rawTableName, job);
+ FindMostRecentDateInLoadedData(rawSyntax, _dbInfo.Server.DatabaseType, rawTableName, job);
}
diff --git a/Rdmp.Core/Databases/LoggingDatabasePatcher.cs b/Rdmp.Core/Databases/LoggingDatabasePatcher.cs
index b51c2af37e..83fc914f4a 100644
--- a/Rdmp.Core/Databases/LoggingDatabasePatcher.cs
+++ b/Rdmp.Core/Databases/LoggingDatabasePatcher.cs
@@ -81,29 +81,30 @@ public override Patch GetInitialCreateScriptContents(DiscoveredDatabase db)
sql.AppendLine(
$"{db.Helper.GetCreateTableSql(db, "z_RowErrorType", new[] { new DatabaseColumnRequest("ID", new DatabaseTypeRequest(typeof(int))) { AllowNulls = false, IsPrimaryKey = true }, new DatabaseColumnRequest("type", new DatabaseTypeRequest(typeof(string), 20) { Unicode = true }) }, null, true).TrimEnd()};");
-
- sql.AppendLine(@"
-
-INSERT INTO z_DataLoadTaskStatus(ID, status, description) VALUES(1, 'Open', NULL);
-INSERT INTO z_DataLoadTaskStatus (ID, status, description) VALUES(2, 'Ready', NULL);
-INSERT INTO z_DataLoadTaskStatus (ID, status, description) VALUES(3, 'Committed', NULL);
-INSERT INTO z_FatalErrorStatus(ID, status) VALUES(1, 'Outstanding');
-INSERT INTO z_FatalErrorStatus (ID, status) VALUES(2, 'Resolved');
-INSERT INTO z_FatalErrorStatus (ID, status) VALUES(3, 'Blocked');
-INSERT INTO z_RowErrorType(ID, type) VALUES(1, 'LoadRow');
-INSERT INTO z_RowErrorType (ID, type) VALUES(2, 'Duplication');
-INSERT INTO z_RowErrorType (ID, type) VALUES(3, 'Validation');
-INSERT INTO z_RowErrorType (ID, type) VALUES(4, 'DatabaseOperation');
-INSERT INTO z_RowErrorType (ID, type) VALUES(5, 'Unknown');
-
-/*create datasets*/
-INSERT INTO DataSet (dataSetID, name, description, time_period, SLA_required, supplier_name, supplier_tel_no, supplier_email, contact_name, contact_position, currentContactInstitutions, contact_tel_no, contact_email, frequency, method) VALUES(N'DataExtraction', 'DataExtraction', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-INSERT INTO DataSet (dataSetID, name, description, time_period, SLA_required, supplier_name, supplier_tel_no, supplier_email, contact_name, contact_position, currentContactInstitutions, contact_tel_no, contact_email, frequency, method) VALUES(N'Internal', 'Internal', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
-
-/*create tasks*/
-INSERT INTO DataLoadTask(ID, description, name, userAccount, statusID, isTest, dataSetID) VALUES(1, 'Internal', 'Internal', 'Thomas', 1, 0, 'Internal');
-INSERT INTO DataLoadTask (ID, description, name, userAccount, statusID, isTest, dataSetID) VALUES(2, 'DataExtraction', 'DataExtraction', 'Thomas', 1, 0, 'DataExtraction');
-");
+ var sh = db.Server.GetQuerySyntaxHelper();
+ sql.AppendLine($"""
+
+ INSERT INTO {db.ExpectTable("z_DataLoadTaskStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}, {sh.EnsureWrapped("description")}) VALUES(1, 'Open', NULL);
+ INSERT INTO {db.ExpectTable("z_DataLoadTaskStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}, {sh.EnsureWrapped("description")}) VALUES(2, 'Ready', NULL);
+ INSERT INTO {db.ExpectTable("z_DataLoadTaskStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}, {sh.EnsureWrapped("description")}) VALUES(3, 'Committed', NULL);
+ INSERT INTO {db.ExpectTable("z_FatalErrorStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}) VALUES(1, 'Outstanding');
+ INSERT INTO {db.ExpectTable("z_FatalErrorStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}) VALUES(2, 'Resolved');
+ INSERT INTO {db.ExpectTable("z_FatalErrorStatus").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("status")}) VALUES(3, 'Blocked');
+ INSERT INTO {db.ExpectTable("z_RowErrorType").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("type")}) VALUES(1, 'LoadRow');
+ INSERT INTO {db.ExpectTable("z_RowErrorType").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("type")}) VALUES(2, 'Duplication');
+ INSERT INTO {db.ExpectTable("z_RowErrorType").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("type")}) VALUES(3, 'Validation');
+ INSERT INTO {db.ExpectTable("z_RowErrorType").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("type")}) VALUES(4, 'DatabaseOperation');
+ INSERT INTO {db.ExpectTable("z_RowErrorType").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("type")}) VALUES(5, 'Unknown');
+
+ /*create datasets*/
+ INSERT INTO {db.ExpectTable("DataSet").GetWrappedName()} ({sh.EnsureWrapped("dataSetID")}, {sh.EnsureWrapped("name")}, {sh.EnsureWrapped("description")}, {sh.EnsureWrapped("time_period")}, {sh.EnsureWrapped("SLA_required")}, {sh.EnsureWrapped("supplier_name")}, {sh.EnsureWrapped("supplier_tel_no")}, {sh.EnsureWrapped("supplier_email")}, {sh.EnsureWrapped("contact_name")}, {sh.EnsureWrapped("contact_position")}, {sh.EnsureWrapped("currentContactInstitutions")}, {sh.EnsureWrapped("contact_tel_no")}, {sh.EnsureWrapped("contact_email")}, {sh.EnsureWrapped("frequency")}, {sh.EnsureWrapped("method")}) VALUES(N'DataExtraction', 'DataExtraction', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+ INSERT INTO {db.ExpectTable("DataSet").GetWrappedName()} ({sh.EnsureWrapped("dataSetID")}, {sh.EnsureWrapped("name")}, {sh.EnsureWrapped("description")}, {sh.EnsureWrapped("time_period")}, {sh.EnsureWrapped("SLA_required")}, {sh.EnsureWrapped("supplier_name")}, {sh.EnsureWrapped("supplier_tel_no")}, {sh.EnsureWrapped("supplier_email")}, {sh.EnsureWrapped("contact_name")}, {sh.EnsureWrapped("contact_position")}, {sh.EnsureWrapped("currentContactInstitutions")}, {sh.EnsureWrapped("contact_tel_no")}, {sh.EnsureWrapped("contact_email")}, {sh.EnsureWrapped("frequency")}, {sh.EnsureWrapped("method")}) VALUES(N'Internal', 'Internal', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+
+ /*create tasks*/
+ INSERT INTO {db.ExpectTable("DataLoadTask").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("description")}, {sh.EnsureWrapped("name")}, {sh.EnsureWrapped("userAccount")}, {sh.EnsureWrapped("statusID")}, {sh.EnsureWrapped("isTest")}, {sh.EnsureWrapped("dataSetID")}) VALUES(1, 'Internal', 'Internal', 'Thomas', 1, 0, 'Internal');
+ INSERT INTO {db.ExpectTable("DataLoadTask").GetWrappedName()} ({sh.EnsureWrapped("ID")}, {sh.EnsureWrapped("description")}, {sh.EnsureWrapped("name")}, {sh.EnsureWrapped("userAccount")}, {sh.EnsureWrapped("statusID")}, {sh.EnsureWrapped("isTest")}, {sh.EnsureWrapped("dataSetID")}) VALUES(2, 'DataExtraction', 'DataExtraction', 'Thomas', 1, 0, 'DataExtraction');
+
+ """);
return new Patch(InitialScriptName, header + sql);
diff --git a/Rdmp.Core/Icons/IconProvision/StateBasedIconProviders/ExtractionInformationStateBasedIconProvider.cs b/Rdmp.Core/Icons/IconProvision/StateBasedIconProviders/ExtractionInformationStateBasedIconProvider.cs
index 24ca4a6d46..ebb4089aba 100644
--- a/Rdmp.Core/Icons/IconProvision/StateBasedIconProviders/ExtractionInformationStateBasedIconProvider.cs
+++ b/Rdmp.Core/Icons/IconProvision/StateBasedIconProviders/ExtractionInformationStateBasedIconProvider.cs
@@ -35,6 +35,8 @@ internal sealed class ExtractionInformationStateBasedIconProvider : IObjectState
private static readonly Image NoIconAvailable = Image.Load(CatalogueIcons.NoIconAvailable);
+ private static readonly Image ExtractionInformationNotExtractable = IconOverlayProvider.GetOverlayNoCache(ExtractionInformationCore, OverlayKind.Delete);
+
public Image GetImageIfSupportedObject(object o)
{
if (o is ExtractionCategory cat)
@@ -67,6 +69,7 @@ private static Image GetImage(ExtractionCategory category)
ExtractionCategory.Deprecated => ExtractionInformationDeprecated,
ExtractionCategory.ProjectSpecific => ExtractionInformationProjectSpecific,
ExtractionCategory.Any => NoIconAvailable,
+ ExtractionCategory.NotExtractable => ExtractionInformationNotExtractable,
_ => throw new ArgumentOutOfRangeException(nameof(category))
};
}
diff --git a/Rdmp.Core/Logging/TableLoadInfo.cs b/Rdmp.Core/Logging/TableLoadInfo.cs
index 4cc6485969..a80491cebf 100644
--- a/Rdmp.Core/Logging/TableLoadInfo.cs
+++ b/Rdmp.Core/Logging/TableLoadInfo.cs
@@ -8,7 +8,7 @@
using System.Data;
using System.Threading;
using Amazon.Auth.AccessControlPolicy;
-using BadMedicine;
+using SynthEHR;
using FAnsi.Connections;
using FAnsi.Discovery;
using Rdmp.Core.ReusableLibraryCode.Settings;
diff --git a/Rdmp.Core/Providers/CatalogueChildProvider.cs b/Rdmp.Core/Providers/CatalogueChildProvider.cs
index 20901ecf65..daf3321216 100644
--- a/Rdmp.Core/Providers/CatalogueChildProvider.cs
+++ b/Rdmp.Core/Providers/CatalogueChildProvider.cs
@@ -54,6 +54,8 @@ public class CatalogueChildProvider : ICoreChildProvider
{
//Load System
public LoadMetadata[] AllLoadMetadatas { get; set; }
+
+ private LoadMetadataCatalogueLinkage[] AllLoadMetadataLinkage { get; set; }
public ProcessTask[] AllProcessTasks { get; set; }
public ProcessTaskArgument[] AllProcessTasksArguments { get; set; }
@@ -247,6 +249,7 @@ public CatalogueChildProvider(ICatalogueRepository repository, IChildProvider[]
AllDatasets = GetAllObjects(repository);
AllLoadMetadatas = GetAllObjects(repository);
+ AllLoadMetadataLinkage = GetAllObjects(repository);
AllProcessTasks = GetAllObjects(repository);
AllProcessTasksArguments = GetAllObjects(repository);
AllLoadProgresses = GetAllObjects(repository);
@@ -390,12 +393,10 @@ public CatalogueChildProvider(ICatalogueRepository repository, IChildProvider[]
LoadMetadataRootFolder = FolderHelper.BuildFolderTree(AllLoadMetadatas);
AddChildren(LoadMetadataRootFolder, new DescendancyList(LoadMetadataRootFolder));
-
CohortIdentificationConfigurationRootFolder =
FolderHelper.BuildFolderTree(AllCohortIdentificationConfigurations);
AddChildren(CohortIdentificationConfigurationRootFolder,
new DescendancyList(CohortIdentificationConfigurationRootFolder));
-
var templateAggregateConfigurationIds =
new HashSet(
repository.GetExtendedProperties(ExtendedProperty.IsTemplate)
@@ -413,7 +414,6 @@ public CatalogueChildProvider(ICatalogueRepository repository, IChildProvider[]
dec.SetBetterRouteExists();
AddToDictionaries(new HashSet