From fb8d755488d717afcb33b61a0faa13741511045e Mon Sep 17 00:00:00 2001 From: Enola Knezevic Date: Wed, 20 Mar 2024 18:07:11 +0100 Subject: [PATCH] bbmri age stratifier increment 1 --- Cargo.toml | 1 + resources/body_bbmri.json | 172 ++++++++++++++++++++ resources/body_dktk.json | 286 ++++++++++++++++++++++++++++++++++ resources/body_gbn.json | 172 ++++++++++++++++++++ resources/query_bbmri.cql | 26 ++++ resources/query_bbmri.encoded | 1 - resources/query_dktk.cql | 27 ++++ resources/query_dktk.encoded | 1 - resources/query_gbn.cql | 26 ++++ resources/query_gbn.encoded | 1 - src/beam.rs | 10 +- src/config.rs | 29 +++- src/main.rs | 2 +- 13 files changed, 742 insertions(+), 12 deletions(-) create mode 100644 resources/body_bbmri.json create mode 100644 resources/body_dktk.json create mode 100644 resources/body_gbn.json create mode 100644 resources/query_bbmri.cql delete mode 100644 resources/query_bbmri.encoded create mode 100644 resources/query_dktk.cql delete mode 100644 resources/query_dktk.encoded create mode 100644 resources/query_gbn.cql delete mode 100644 resources/query_gbn.encoded diff --git a/Cargo.toml b/Cargo.toml index 397639a..62431ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,7 @@ once_cell = "1.18" # Command Line Interface clap = { version = "4.0", features = ["std", "env", "derive", "help"] } +uuid = "1.8.0" [dev-dependencies] pretty_assertions = "1.4.0" diff --git a/resources/body_bbmri.json b/resources/body_bbmri.json new file mode 100644 index 0000000..6ba91df --- /dev/null +++ b/resources/body_bbmri.json @@ -0,0 +1,172 @@ +{ + "lang": "cql", + "lib": { + "content": [ + { + "contentType": "text/cql", + "data": "{{LIBRARY_ENCODED}}" + } + ], + "resourceType": "Library", + "status": "active", + "type": { + "coding": [ + { + "code": "logic-library", + "system": "http://terminology.hl7.org/CodeSystem/library-type" + } + ] + }, + "url": "{{LIBRARY_UUID}}" + }, + "measure": { + "group": [ + { + "code": { + "text": "patients" + }, + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "InInitialPopulation", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "Gender" + }, + "criteria": { + "expression": "Gender", + "language": "text/cql" + } + }, + { + "code": { + "text": "Age" + }, + "criteria": { + "expression": "AgeClass", + "language": "text/cql" + } + }, + { + "code": { + "text": "Custodian" + }, + "criteria": { + "expression": "Custodian", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "diagnosis" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Condition" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Diagnosis", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "diagnosis" + }, + "criteria": { + "expression": "DiagnosisCode", + "language": "text/cql-identifier" + } + } + ] + }, + { + "code": { + "text": "specimen" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Specimen" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Specimen", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "sample_kind" + }, + "criteria": { + "expression": "SampleType", + "language": "text/cql" + } + } + ] + } + ], + "library": "{{LIBRARY_UUID}}", + "resourceType": "Measure", + "scoring": { + "coding": [ + { + "code": "cohort", + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring" + } + ] + }, + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "code": "Patient", + "system": "http://hl7.org/fhir/resource-types" + } + ] + }, + "url": "{{MEASURE_UUID}}" + } +} \ No newline at end of file diff --git a/resources/body_dktk.json b/resources/body_dktk.json new file mode 100644 index 0000000..6d636cd --- /dev/null +++ b/resources/body_dktk.json @@ -0,0 +1,286 @@ +{ + "lang": "cql", + "lib": { + "content": [ + { + "contentType": "text/cql", + "data": "{{LIBRARY_ENCODED}}" + } + ], + "resourceType": "Library", + "status": "active", + "type": { + "coding": [ + { + "code": "logic-library", + "system": "http://terminology.hl7.org/CodeSystem/library-type" + } + ] + }, + "url": "{{LIBRARY_UUID}}" + }, + "measure": { + "group": [ + { + "code": { + "text": "patients" + }, + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "InInitialPopulation", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "Gender" + }, + "criteria": { + "expression": "Gender", + "language": "text/cql" + } + }, + { + "code": { + "text": "75186-7" + }, + "criteria": { + "expression": "Deceased", + "language": "text/cql" + } + }, + { + "code": { + "text": "Age" + }, + "criteria": { + "expression": "AgeClass", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "diagnosis" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Condition" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Diagnosis", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "diagnosis" + }, + "criteria": { + "expression": "DiagnosisCode", + "language": "text/cql-identifier" + } + } + ] + }, + { + "code": { + "text": "specimen" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Specimen" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Specimen", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "sample_kind" + }, + "criteria": { + "expression": "SampleType", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "procedures" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Procedure" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Procedure", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "ProcedureType" + }, + "criteria": { + "expression": "ProcedureType", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "medicationStatements" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "MedicationStatement" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "MedicationStatement", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "MedicationType" + }, + "criteria": { + "expression": "ProcedureType", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "Histo" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Observation" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Histo", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "Histlogoies" + }, + "criteria": { + "expression": "Histlogoy", + "language": "text/cql-identifier" + } + } + ] + } + ], + "library": "{{LIBRARY_UUID}}", + "resourceType": "Measure", + "scoring": { + "coding": [ + { + "code": "cohort", + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring" + } + ] + }, + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "code": "Patient", + "system": "http://hl7.org/fhir/resource-types" + } + ] + }, + "url": "{{MEASURE_UUID}}" + } +} \ No newline at end of file diff --git a/resources/body_gbn.json b/resources/body_gbn.json new file mode 100644 index 0000000..6ba91df --- /dev/null +++ b/resources/body_gbn.json @@ -0,0 +1,172 @@ +{ + "lang": "cql", + "lib": { + "content": [ + { + "contentType": "text/cql", + "data": "{{LIBRARY_ENCODED}}" + } + ], + "resourceType": "Library", + "status": "active", + "type": { + "coding": [ + { + "code": "logic-library", + "system": "http://terminology.hl7.org/CodeSystem/library-type" + } + ] + }, + "url": "{{LIBRARY_UUID}}" + }, + "measure": { + "group": [ + { + "code": { + "text": "patients" + }, + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "InInitialPopulation", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "Gender" + }, + "criteria": { + "expression": "Gender", + "language": "text/cql" + } + }, + { + "code": { + "text": "Age" + }, + "criteria": { + "expression": "AgeClass", + "language": "text/cql" + } + }, + { + "code": { + "text": "Custodian" + }, + "criteria": { + "expression": "Custodian", + "language": "text/cql" + } + } + ] + }, + { + "code": { + "text": "diagnosis" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Condition" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Diagnosis", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "diagnosis" + }, + "criteria": { + "expression": "DiagnosisCode", + "language": "text/cql-identifier" + } + } + ] + }, + { + "code": { + "text": "specimen" + }, + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Specimen" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "code": "initial-population", + "system": "http://terminology.hl7.org/CodeSystem/measure-population" + } + ] + }, + "criteria": { + "expression": "Specimen", + "language": "text/cql-identifier" + } + } + ], + "stratifier": [ + { + "code": { + "text": "sample_kind" + }, + "criteria": { + "expression": "SampleType", + "language": "text/cql" + } + } + ] + } + ], + "library": "{{LIBRARY_UUID}}", + "resourceType": "Measure", + "scoring": { + "coding": [ + { + "code": "cohort", + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring" + } + ] + }, + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "code": "Patient", + "system": "http://hl7.org/fhir/resource-types" + } + ] + }, + "url": "{{MEASURE_UUID}}" + } +} \ No newline at end of file diff --git a/resources/query_bbmri.cql b/resources/query_bbmri.cql new file mode 100644 index 0000000..b18b894 --- /dev/null +++ b/resources/query_bbmri.cql @@ -0,0 +1,26 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' +codesystem icd10: 'http://hl7.org/fhir/sid/icd-10' +codesystem SampleMaterialType: 'https://fhir.bbmri.de/CodeSystem/SampleMaterialType' + + +context Patient + +BBMRI_STRAT_GENDER_STRATIFIER + +BBMRI_STRAT_DEF_SPECIMEN +if InInitialPopulation then [Specimen] else {} as List + +BBMRI_STRAT_SAMPLE_TYPE_STRATIFIER + +BBMRI_STRAT_CUSTODIAN_STRATIFIER + +BBMRI_STRAT_DIAGNOSIS_STRATIFIER + +PRISM_BBMRI_STRAT_AGE_STRATIFIER + +BBMRI_STRAT_DEF_IN_INITIAL_POPULATION +true \ No newline at end of file diff --git a/resources/query_bbmri.encoded b/resources/query_bbmri.encoded deleted file mode 100644 index a38bd76..0000000 --- a/resources/query_bbmri.encoded +++ /dev/null @@ -1 +0,0 @@ -ewoJImxhbmciOiAiY3FsIiwKCSJsaWIiOiB7CgkJImNvbnRlbnQiOiBbCgkJCXsKCQkJCSJjb250ZW50VHlwZSI6ICJ0ZXh0L2NxbCIsCgkJCQkiZGF0YSI6ICJiR2xpY21GeWVTQlNaWFJ5YVdWMlpRcDFjMmx1WnlCR1NFbFNJSFpsY25OcGIyNGdKelF1TUM0d0p3cHBibU5zZFdSbElFWklTVkpJWld4d1pYSnpJSFpsY25OcGIyNGdKelF1TUM0d0p3b0tZMjlrWlhONWMzUmxiU0JzYjJsdVl6b2dKMmgwZEhBNkx5OXNiMmx1WXk1dmNtY25DbU52WkdWemVYTjBaVzBnYVdOa01UQTZJQ2RvZEhSd09pOHZhR3czTG05eVp5OW1hR2x5TDNOcFpDOXBZMlF0TVRBbkNtTnZaR1Z6ZVhOMFpXMGdVMkZ0Y0d4bFRXRjBaWEpwWVd4VWVYQmxPaUFuYUhSMGNITTZMeTltYUdseUxtSmliWEpwTG1SbEwwTnZaR1ZUZVhOMFpXMHZVMkZ0Y0d4bFRXRjBaWEpwWVd4VWVYQmxKd29LQ21OdmJuUmxlSFFnVUdGMGFXVnVkQW9LUWtKTlVrbGZVMVJTUVZSZlIwVk9SRVZTWDFOVVVrRlVTVVpKUlZJS0NrSkNUVkpKWDFOVVVrRlVYMFJGUmw5VFVFVkRTVTFGVGdwcFppQkpia2x1YVhScFlXeFFiM0IxYkdGMGFXOXVJSFJvWlc0Z1cxTndaV05wYldWdVhTQmxiSE5sSUh0OUlHRnpJRXhwYzNROFUzQmxZMmx0Wlc0K0NncENRazFTU1Y5VFZGSkJWRjlUUVUxUVRFVmZWRmxRUlY5VFZGSkJWRWxHU1VWU0NncENRazFTU1Y5VFZGSkJWRjlEVlZOVVQwUkpRVTVmVTFSU1FWUkpSa2xGVWdvS1FrSk5Va2xmVTFSU1FWUmZSRWxCUjA1UFUwbFRYMU5VVWtGVVNVWkpSVklLQ2tKQ1RWSkpYMU5VVWtGVVgwRkhSVjlUVkZKQlZFbEdTVVZTQ2dwQ1FrMVNTVjlUVkZKQlZGOUVSVVpmU1U1ZlNVNUpWRWxCVEY5UVQxQlZURUZVU1U5T0NuUnlkV1U9IgoJCQl9CgkJXSwKCQkicmVzb3VyY2VUeXBlIjogIkxpYnJhcnkiLAoJCSJzdGF0dXMiOiAiYWN0aXZlIiwKCQkidHlwZSI6IHsKCQkJImNvZGluZyI6IFsKCQkJCXsKCQkJCQkiY29kZSI6ICJsb2dpYy1saWJyYXJ5IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbGlicmFyeS10eXBlIgoJCQkJfQoJCQldCgkJfSwKCQkidXJsIjogInVybjp1dWlkOjdmZjUzMmFkLTY5ZTQtNDhlZC1hMmQzLTllZmFmYjYwOWY2MiIKCX0sCgkibWVhc3VyZSI6IHsKCQkiZ3JvdXAiOiBbCgkJCXsKCQkJCSJjb2RlIjogewoJCQkJCSJ0ZXh0IjogInBhdGllbnRzIgoJCQkJfSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkluSW5pdGlhbFBvcHVsYXRpb24iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkdlbmRlciIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiR2VuZGVyIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbCIKCQkJCQkJfQoJCQkJCX0sCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkFnZSIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiQWdlQ2xhc3MiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfSwKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAiQ3VzdG9kaWFuIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJDdXN0b2RpYW4iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJkaWFnbm9zaXMiCgkJCQl9LAoJCQkJImV4dGVuc2lvbiI6IFsKCQkJCQl7CgkJCQkJCSJ1cmwiOiAiaHR0cDovL2hsNy5vcmcvZmhpci91cy9jcWZtZWFzdXJlcy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NxZm0tcG9wdWxhdGlvbkJhc2lzIiwKCQkJCQkJInZhbHVlQ29kZSI6ICJDb25kaXRpb24iCgkJCQkJfQoJCQkJXSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkRpYWdub3NpcyIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAiZGlhZ25vc2lzIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJEaWFnbm9zaXNDb2RlIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbC1pZGVudGlmaWVyIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJzcGVjaW1lbiIKCQkJCX0sCgkJCQkiZXh0ZW5zaW9uIjogWwoJCQkJCXsKCQkJCQkJInVybCI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NxZm1lYXN1cmVzL1N0cnVjdHVyZURlZmluaXRpb24vY3FmbS1wb3B1bGF0aW9uQmFzaXMiLAoJCQkJCQkidmFsdWVDb2RlIjogIlNwZWNpbWVuIgoJCQkJCX0KCQkJCV0sCgkJCQkicG9wdWxhdGlvbiI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJImNvZGluZyI6IFsKCQkJCQkJCQl7CgkJCQkJCQkJCSJjb2RlIjogImluaXRpYWwtcG9wdWxhdGlvbiIsCgkJCQkJCQkJCSJzeXN0ZW0iOiAiaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9tZWFzdXJlLXBvcHVsYXRpb24iCgkJCQkJCQkJfQoJCQkJCQkJXQoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJTcGVjaW1lbiIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAic2FtcGxlX2tpbmQiCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIlNhbXBsZVR5cGUiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9CgkJXSwKCQkibGlicmFyeSI6ICJ1cm46dXVpZDo3ZmY1MzJhZC02OWU0LTQ4ZWQtYTJkMy05ZWZhZmI2MDlmNjIiLAoJCSJyZXNvdXJjZVR5cGUiOiAiTWVhc3VyZSIsCgkJInNjb3JpbmciOiB7CgkJCSJjb2RpbmciOiBbCgkJCQl7CgkJCQkJImNvZGUiOiAiY29ob3J0IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbWVhc3VyZS1zY29yaW5nIgoJCQkJfQoJCQldCgkJfSwKCQkic3RhdHVzIjogImFjdGl2ZSIsCgkJInN1YmplY3RDb2RlYWJsZUNvbmNlcHQiOiB7CgkJCSJjb2RpbmciOiBbCgkJCQl7CgkJCQkJImNvZGUiOiAiUGF0aWVudCIsCgkJCQkJInN5c3RlbSI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3Jlc291cmNlLXR5cGVzIgoJCQkJfQoJCQldCgkJfSwKCQkidXJsIjogInVybjp1dWlkOjVlZThkZTczLTM0N2UtNDdjYS1hMDE0LWYyZTcxNzY3YWRmYyIKCX0KfQ== \ No newline at end of file diff --git a/resources/query_dktk.cql b/resources/query_dktk.cql new file mode 100644 index 0000000..3f59dd0 --- /dev/null +++ b/resources/query_dktk.cql @@ -0,0 +1,27 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' + +context Patient + + +DKTK_STRAT_GENDER_STRATIFIER + +DKTK_STRAT_PRIMARY_DIAGNOSIS_STRATIFIER +DKTK_STRAT_AGE_CLASS_STRATIFIER + +DKTK_STRAT_DECEASED_STRATIFIER + +DKTK_STRAT_DIAGNOSIS_STRATIFIER + +DKTK_STRAT_SPECIMEN_STRATIFIER + +DKTK_STRAT_PROCEDURE_STRATIFIER + +DKTK_STRAT_MEDICATION_STRATIFIER + + DKTK_STRAT_HISTOLOGY_STRATIFIER +DKTK_STRAT_DEF_IN_INITIAL_POPULATION +true \ No newline at end of file diff --git a/resources/query_dktk.encoded b/resources/query_dktk.encoded deleted file mode 100644 index 6caeabb..0000000 --- a/resources/query_dktk.encoded +++ /dev/null @@ -1 +0,0 @@ -ewoJImxhbmciOiAiY3FsIiwKCSJsaWIiOiB7CgkJImNvbnRlbnQiOiBbCgkJCXsKCQkJCSJjb250ZW50VHlwZSI6ICJ0ZXh0L2NxbCIsCgkJCQkiZGF0YSI6ICJiR2xpY21GeWVTQlNaWFJ5YVdWMlpRcDFjMmx1WnlCR1NFbFNJSFpsY25OcGIyNGdKelF1TUM0d0p3cHBibU5zZFdSbElFWklTVkpJWld4d1pYSnpJSFpsY25OcGIyNGdKelF1TUM0d0p3b0tZMjlrWlhONWMzUmxiU0JzYjJsdVl6b2dKMmgwZEhBNkx5OXNiMmx1WXk1dmNtY25DZ3BqYjI1MFpYaDBJRkJoZEdsbGJuUUtDZ3BFUzFSTFgxTlVVa0ZVWDBkRlRrUkZVbDlUVkZKQlZFbEdTVVZTQ2dwRVMxUkxYMU5VVWtGVVgxQlNTVTFCVWxsZlJFbEJSMDVQVTBsVFgxTlVVa0ZVU1VaSlJWSUtSRXRVUzE5VFZGSkJWRjlCUjBWZlEweEJVMU5mVTFSU1FWUkpSa2xGVWdvS1JFdFVTMTlUVkZKQlZGOUVSVU5GUVZORlJGOVRWRkpCVkVsR1NVVlNDZ3BFUzFSTFgxTlVVa0ZVWDBSSlFVZE9UMU5KVTE5VFZGSkJWRWxHU1VWU0NncEVTMVJMWDFOVVVrRlVYMU5RUlVOSlRVVk9YMU5VVWtGVVNVWkpSVklLQ2tSTFZFdGZVMVJTUVZSZlVGSlBRMFZFVlZKRlgxTlVVa0ZVU1VaSlJWSUtDa1JMVkV0ZlUxUlNRVlJmVFVWRVNVTkJWRWxQVGw5VFZGSkJWRWxHU1VWU0Nnb2dJRVJMVkV0ZlUxUlNRVlJmU0VsVFZFOU1UMGRaWDFOVVVrRlVTVVpKUlZJS1JFdFVTMTlUVkZKQlZGOUVSVVpmU1U1ZlNVNUpWRWxCVEY5UVQxQlZURUZVU1U5T0NuUnlkV1U9IgoJCQl9CgkJXSwKCQkicmVzb3VyY2VUeXBlIjogIkxpYnJhcnkiLAoJCSJzdGF0dXMiOiAiYWN0aXZlIiwKCQkidHlwZSI6IHsKCQkJImNvZGluZyI6IFsKCQkJCXsKCQkJCQkiY29kZSI6ICJsb2dpYy1saWJyYXJ5IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbGlicmFyeS10eXBlIgoJCQkJfQoJCQldCgkJfSwKCQkidXJsIjogInVybjp1dWlkOjlmM2I2ZWNiLTQxNjMtNDZmYS1iNTJmLTEwNzEwYmI5MzU4MSIKCX0sCgkibWVhc3VyZSI6IHsKCQkiZ3JvdXAiOiBbCgkJCXsKCQkJCSJjb2RlIjogewoJCQkJCSJ0ZXh0IjogInBhdGllbnRzIgoJCQkJfSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkluSW5pdGlhbFBvcHVsYXRpb24iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkdlbmRlciIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiR2VuZGVyIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbCIKCQkJCQkJfQoJCQkJCX0sCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIjc1MTg2LTciCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkRlY2Vhc2VkIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbCIKCQkJCQkJfQoJCQkJCX0sCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkFnZSIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiQWdlQ2xhc3MiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJkaWFnbm9zaXMiCgkJCQl9LAoJCQkJImV4dGVuc2lvbiI6IFsKCQkJCQl7CgkJCQkJCSJ1cmwiOiAiaHR0cDovL2hsNy5vcmcvZmhpci91cy9jcWZtZWFzdXJlcy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NxZm0tcG9wdWxhdGlvbkJhc2lzIiwKCQkJCQkJInZhbHVlQ29kZSI6ICJDb25kaXRpb24iCgkJCQkJfQoJCQkJXSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkRpYWdub3NpcyIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAiZGlhZ25vc2lzIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJEaWFnbm9zaXNDb2RlIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbC1pZGVudGlmaWVyIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJzcGVjaW1lbiIKCQkJCX0sCgkJCQkiZXh0ZW5zaW9uIjogWwoJCQkJCXsKCQkJCQkJInVybCI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NxZm1lYXN1cmVzL1N0cnVjdHVyZURlZmluaXRpb24vY3FmbS1wb3B1bGF0aW9uQmFzaXMiLAoJCQkJCQkidmFsdWVDb2RlIjogIlNwZWNpbWVuIgoJCQkJCX0KCQkJCV0sCgkJCQkicG9wdWxhdGlvbiI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJImNvZGluZyI6IFsKCQkJCQkJCQl7CgkJCQkJCQkJCSJjb2RlIjogImluaXRpYWwtcG9wdWxhdGlvbiIsCgkJCQkJCQkJCSJzeXN0ZW0iOiAiaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9tZWFzdXJlLXBvcHVsYXRpb24iCgkJCQkJCQkJfQoJCQkJCQkJXQoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJTcGVjaW1lbiIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAic2FtcGxlX2tpbmQiCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIlNhbXBsZVR5cGUiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJwcm9jZWR1cmVzIgoJCQkJfSwKCQkJCSJleHRlbnNpb24iOiBbCgkJCQkJewoJCQkJCQkidXJsIjogImh0dHA6Ly9obDcub3JnL2ZoaXIvdXMvY3FmbWVhc3VyZXMvU3RydWN0dXJlRGVmaW5pdGlvbi9jcWZtLXBvcHVsYXRpb25CYXNpcyIsCgkJCQkJCSJ2YWx1ZUNvZGUiOiAiUHJvY2VkdXJlIgoJCQkJCX0KCQkJCV0sCgkJCQkicG9wdWxhdGlvbiI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJImNvZGluZyI6IFsKCQkJCQkJCQl7CgkJCQkJCQkJCSJjb2RlIjogImluaXRpYWwtcG9wdWxhdGlvbiIsCgkJCQkJCQkJCSJzeXN0ZW0iOiAiaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9tZWFzdXJlLXBvcHVsYXRpb24iCgkJCQkJCQkJfQoJCQkJCQkJXQoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJQcm9jZWR1cmUiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIlByb2NlZHVyZVR5cGUiCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIlByb2NlZHVyZVR5cGUiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJtZWRpY2F0aW9uU3RhdGVtZW50cyIKCQkJCX0sCgkJCQkiZXh0ZW5zaW9uIjogWwoJCQkJCXsKCQkJCQkJInVybCI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NxZm1lYXN1cmVzL1N0cnVjdHVyZURlZmluaXRpb24vY3FmbS1wb3B1bGF0aW9uQmFzaXMiLAoJCQkJCQkidmFsdWVDb2RlIjogIk1lZGljYXRpb25TdGF0ZW1lbnQiCgkJCQkJfQoJCQkJXSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIk1lZGljYXRpb25TdGF0ZW1lbnQiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIk1lZGljYXRpb25UeXBlIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJQcm9jZWR1cmVUeXBlIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbCIKCQkJCQkJfQoJCQkJCX0KCQkJCV0KCQkJfSwKCQkJewoJCQkJImNvZGUiOiB7CgkJCQkJInRleHQiOiAiSGlzdG8iCgkJCQl9LAoJCQkJImV4dGVuc2lvbiI6IFsKCQkJCQl7CgkJCQkJCSJ1cmwiOiAiaHR0cDovL2hsNy5vcmcvZmhpci91cy9jcWZtZWFzdXJlcy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NxZm0tcG9wdWxhdGlvbkJhc2lzIiwKCQkJCQkJInZhbHVlQ29kZSI6ICJPYnNlcnZhdGlvbiIKCQkJCQl9CgkJCQldLAoJCQkJInBvcHVsYXRpb24iOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJjb2RpbmciOiBbCgkJCQkJCQkJewoJCQkJCQkJCQkiY29kZSI6ICJpbml0aWFsLXBvcHVsYXRpb24iLAoJCQkJCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbWVhc3VyZS1wb3B1bGF0aW9uIgoJCQkJCQkJCX0KCQkJCQkJCV0KCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiSGlzdG8iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkhpc3Rsb2dvaWVzIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJIaXN0bG9nb3kiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldCgkJCX0KCQldLAoJCSJsaWJyYXJ5IjogInVybjp1dWlkOjlmM2I2ZWNiLTQxNjMtNDZmYS1iNTJmLTEwNzEwYmI5MzU4MSIsCgkJInJlc291cmNlVHlwZSI6ICJNZWFzdXJlIiwKCQkic2NvcmluZyI6IHsKCQkJImNvZGluZyI6IFsKCQkJCXsKCQkJCQkiY29kZSI6ICJjb2hvcnQiLAoJCQkJCSJzeXN0ZW0iOiAiaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9tZWFzdXJlLXNjb3JpbmciCgkJCQl9CgkJCV0KCQl9LAoJCSJzdGF0dXMiOiAiYWN0aXZlIiwKCQkic3ViamVjdENvZGVhYmxlQ29uY2VwdCI6IHsKCQkJImNvZGluZyI6IFsKCQkJCXsKCQkJCQkiY29kZSI6ICJQYXRpZW50IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly9obDcub3JnL2ZoaXIvcmVzb3VyY2UtdHlwZXMiCgkJCQl9CgkJCV0KCQl9LAoJCSJ1cmwiOiAidXJuOnV1aWQ6MjYwZjE4ZWUtNDYxNC00ZmJlLTk0ZjUtNDI0ZDc0OGU1NThjIgoJfQp9 \ No newline at end of file diff --git a/resources/query_gbn.cql b/resources/query_gbn.cql new file mode 100644 index 0000000..b18b894 --- /dev/null +++ b/resources/query_gbn.cql @@ -0,0 +1,26 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' +codesystem icd10: 'http://hl7.org/fhir/sid/icd-10' +codesystem SampleMaterialType: 'https://fhir.bbmri.de/CodeSystem/SampleMaterialType' + + +context Patient + +BBMRI_STRAT_GENDER_STRATIFIER + +BBMRI_STRAT_DEF_SPECIMEN +if InInitialPopulation then [Specimen] else {} as List + +BBMRI_STRAT_SAMPLE_TYPE_STRATIFIER + +BBMRI_STRAT_CUSTODIAN_STRATIFIER + +BBMRI_STRAT_DIAGNOSIS_STRATIFIER + +PRISM_BBMRI_STRAT_AGE_STRATIFIER + +BBMRI_STRAT_DEF_IN_INITIAL_POPULATION +true \ No newline at end of file diff --git a/resources/query_gbn.encoded b/resources/query_gbn.encoded deleted file mode 100644 index a38bd76..0000000 --- a/resources/query_gbn.encoded +++ /dev/null @@ -1 +0,0 @@ -ewoJImxhbmciOiAiY3FsIiwKCSJsaWIiOiB7CgkJImNvbnRlbnQiOiBbCgkJCXsKCQkJCSJjb250ZW50VHlwZSI6ICJ0ZXh0L2NxbCIsCgkJCQkiZGF0YSI6ICJiR2xpY21GeWVTQlNaWFJ5YVdWMlpRcDFjMmx1WnlCR1NFbFNJSFpsY25OcGIyNGdKelF1TUM0d0p3cHBibU5zZFdSbElFWklTVkpJWld4d1pYSnpJSFpsY25OcGIyNGdKelF1TUM0d0p3b0tZMjlrWlhONWMzUmxiU0JzYjJsdVl6b2dKMmgwZEhBNkx5OXNiMmx1WXk1dmNtY25DbU52WkdWemVYTjBaVzBnYVdOa01UQTZJQ2RvZEhSd09pOHZhR3czTG05eVp5OW1hR2x5TDNOcFpDOXBZMlF0TVRBbkNtTnZaR1Z6ZVhOMFpXMGdVMkZ0Y0d4bFRXRjBaWEpwWVd4VWVYQmxPaUFuYUhSMGNITTZMeTltYUdseUxtSmliWEpwTG1SbEwwTnZaR1ZUZVhOMFpXMHZVMkZ0Y0d4bFRXRjBaWEpwWVd4VWVYQmxKd29LQ21OdmJuUmxlSFFnVUdGMGFXVnVkQW9LUWtKTlVrbGZVMVJTUVZSZlIwVk9SRVZTWDFOVVVrRlVTVVpKUlZJS0NrSkNUVkpKWDFOVVVrRlVYMFJGUmw5VFVFVkRTVTFGVGdwcFppQkpia2x1YVhScFlXeFFiM0IxYkdGMGFXOXVJSFJvWlc0Z1cxTndaV05wYldWdVhTQmxiSE5sSUh0OUlHRnpJRXhwYzNROFUzQmxZMmx0Wlc0K0NncENRazFTU1Y5VFZGSkJWRjlUUVUxUVRFVmZWRmxRUlY5VFZGSkJWRWxHU1VWU0NncENRazFTU1Y5VFZGSkJWRjlEVlZOVVQwUkpRVTVmVTFSU1FWUkpSa2xGVWdvS1FrSk5Va2xmVTFSU1FWUmZSRWxCUjA1UFUwbFRYMU5VVWtGVVNVWkpSVklLQ2tKQ1RWSkpYMU5VVWtGVVgwRkhSVjlUVkZKQlZFbEdTVVZTQ2dwQ1FrMVNTVjlUVkZKQlZGOUVSVVpmU1U1ZlNVNUpWRWxCVEY5UVQxQlZURUZVU1U5T0NuUnlkV1U9IgoJCQl9CgkJXSwKCQkicmVzb3VyY2VUeXBlIjogIkxpYnJhcnkiLAoJCSJzdGF0dXMiOiAiYWN0aXZlIiwKCQkidHlwZSI6IHsKCQkJImNvZGluZyI6IFsKCQkJCXsKCQkJCQkiY29kZSI6ICJsb2dpYy1saWJyYXJ5IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbGlicmFyeS10eXBlIgoJCQkJfQoJCQldCgkJfSwKCQkidXJsIjogInVybjp1dWlkOjdmZjUzMmFkLTY5ZTQtNDhlZC1hMmQzLTllZmFmYjYwOWY2MiIKCX0sCgkibWVhc3VyZSI6IHsKCQkiZ3JvdXAiOiBbCgkJCXsKCQkJCSJjb2RlIjogewoJCQkJCSJ0ZXh0IjogInBhdGllbnRzIgoJCQkJfSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkluSW5pdGlhbFBvcHVsYXRpb24iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsLWlkZW50aWZpZXIiCgkJCQkJCX0KCQkJCQl9CgkJCQldLAoJCQkJInN0cmF0aWZpZXIiOiBbCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkdlbmRlciIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiR2VuZGVyIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbCIKCQkJCQkJfQoJCQkJCX0sCgkJCQkJewoJCQkJCQkiY29kZSI6IHsKCQkJCQkJCSJ0ZXh0IjogIkFnZSIKCQkJCQkJfSwKCQkJCQkJImNyaXRlcmlhIjogewoJCQkJCQkJImV4cHJlc3Npb24iOiAiQWdlQ2xhc3MiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfSwKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAiQ3VzdG9kaWFuIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJDdXN0b2RpYW4iLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJkaWFnbm9zaXMiCgkJCQl9LAoJCQkJImV4dGVuc2lvbiI6IFsKCQkJCQl7CgkJCQkJCSJ1cmwiOiAiaHR0cDovL2hsNy5vcmcvZmhpci91cy9jcWZtZWFzdXJlcy9TdHJ1Y3R1cmVEZWZpbml0aW9uL2NxZm0tcG9wdWxhdGlvbkJhc2lzIiwKCQkJCQkJInZhbHVlQ29kZSI6ICJDb25kaXRpb24iCgkJCQkJfQoJCQkJXSwKCQkJCSJwb3B1bGF0aW9uIjogWwoJCQkJCXsKCQkJCQkJImNvZGUiOiB7CgkJCQkJCQkiY29kaW5nIjogWwoJCQkJCQkJCXsKCQkJCQkJCQkJImNvZGUiOiAiaW5pdGlhbC1wb3B1bGF0aW9uIiwKCQkJCQkJCQkJInN5c3RlbSI6ICJodHRwOi8vdGVybWlub2xvZ3kuaGw3Lm9yZy9Db2RlU3lzdGVtL21lYXN1cmUtcG9wdWxhdGlvbiIKCQkJCQkJCQl9CgkJCQkJCQldCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIkRpYWdub3NpcyIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAiZGlhZ25vc2lzIgoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJEaWFnbm9zaXNDb2RlIiwKCQkJCQkJCSJsYW5ndWFnZSI6ICJ0ZXh0L2NxbC1pZGVudGlmaWVyIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9LAoJCQl7CgkJCQkiY29kZSI6IHsKCQkJCQkidGV4dCI6ICJzcGVjaW1lbiIKCQkJCX0sCgkJCQkiZXh0ZW5zaW9uIjogWwoJCQkJCXsKCQkJCQkJInVybCI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3VzL2NxZm1lYXN1cmVzL1N0cnVjdHVyZURlZmluaXRpb24vY3FmbS1wb3B1bGF0aW9uQmFzaXMiLAoJCQkJCQkidmFsdWVDb2RlIjogIlNwZWNpbWVuIgoJCQkJCX0KCQkJCV0sCgkJCQkicG9wdWxhdGlvbiI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJImNvZGluZyI6IFsKCQkJCQkJCQl7CgkJCQkJCQkJCSJjb2RlIjogImluaXRpYWwtcG9wdWxhdGlvbiIsCgkJCQkJCQkJCSJzeXN0ZW0iOiAiaHR0cDovL3Rlcm1pbm9sb2d5LmhsNy5vcmcvQ29kZVN5c3RlbS9tZWFzdXJlLXBvcHVsYXRpb24iCgkJCQkJCQkJfQoJCQkJCQkJXQoJCQkJCQl9LAoJCQkJCQkiY3JpdGVyaWEiOiB7CgkJCQkJCQkiZXhwcmVzc2lvbiI6ICJTcGVjaW1lbiIsCgkJCQkJCQkibGFuZ3VhZ2UiOiAidGV4dC9jcWwtaWRlbnRpZmllciIKCQkJCQkJfQoJCQkJCX0KCQkJCV0sCgkJCQkic3RyYXRpZmllciI6IFsKCQkJCQl7CgkJCQkJCSJjb2RlIjogewoJCQkJCQkJInRleHQiOiAic2FtcGxlX2tpbmQiCgkJCQkJCX0sCgkJCQkJCSJjcml0ZXJpYSI6IHsKCQkJCQkJCSJleHByZXNzaW9uIjogIlNhbXBsZVR5cGUiLAoJCQkJCQkJImxhbmd1YWdlIjogInRleHQvY3FsIgoJCQkJCQl9CgkJCQkJfQoJCQkJXQoJCQl9CgkJXSwKCQkibGlicmFyeSI6ICJ1cm46dXVpZDo3ZmY1MzJhZC02OWU0LTQ4ZWQtYTJkMy05ZWZhZmI2MDlmNjIiLAoJCSJyZXNvdXJjZVR5cGUiOiAiTWVhc3VyZSIsCgkJInNjb3JpbmciOiB7CgkJCSJjb2RpbmciOiBbCgkJCQl7CgkJCQkJImNvZGUiOiAiY29ob3J0IiwKCQkJCQkic3lzdGVtIjogImh0dHA6Ly90ZXJtaW5vbG9neS5obDcub3JnL0NvZGVTeXN0ZW0vbWVhc3VyZS1zY29yaW5nIgoJCQkJfQoJCQldCgkJfSwKCQkic3RhdHVzIjogImFjdGl2ZSIsCgkJInN1YmplY3RDb2RlYWJsZUNvbmNlcHQiOiB7CgkJCSJjb2RpbmciOiBbCgkJCQl7CgkJCQkJImNvZGUiOiAiUGF0aWVudCIsCgkJCQkJInN5c3RlbSI6ICJodHRwOi8vaGw3Lm9yZy9maGlyL3Jlc291cmNlLXR5cGVzIgoJCQkJfQoJCQldCgkJfSwKCQkidXJsIjogInVybjp1dWlkOjVlZThkZTczLTM0N2UtNDdjYS1hMDE0LWYyZTcxNzY3YWRmYyIKCX0KfQ== \ No newline at end of file diff --git a/src/beam.rs b/src/beam.rs index 1c9ee5c..4dcdc2e 100644 --- a/src/beam.rs +++ b/src/beam.rs @@ -1,10 +1,18 @@ use crate::config::CONFIG; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _}; use beam_lib::{AppId, MsgId, RawString, TaskRequest}; +use uuid::Uuid; pub fn create_beam_task(target_sites: Vec) -> TaskRequest { let target = &CONFIG.target; let id = MsgId::new(); let proxy_id = &CONFIG.beam_app_id_long.proxy_id(); + let query_encoded: String = BASE64.encode( + CONFIG + .query_unencoded + .replace("{{LIBRARY_UUID}}", Uuid::new_v4().to_string().as_str()) + .replace("{{MEASURE_UUID}}", Uuid::new_v4().to_string().as_str()), + ); let broker_id = proxy_id .as_ref() .split_once('.') @@ -25,7 +33,7 @@ pub fn create_beam_task(target_sites: Vec) -> TaskRequest { from: CONFIG.beam_app_id_long.clone(), to, metadata, - body: CONFIG.query.clone().into(), + body: query_encoded.into(), failure_strategy: beam_lib::FailureStrategy::Retry { backoff_millisecs: 1000, max_tries: 5, diff --git a/src/config.rs b/src/config.rs index 6c8a252..43e7f6a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,6 +10,8 @@ use std::net::SocketAddr; use reqwest::Url; use tower_http::cors::AllowOrigin; +use base64::{engine::general_purpose::STANDARD as BASE64, Engine as _}; + use crate::errors::PrismError; pub(crate) static CONFIG: Lazy = Lazy::new(|| { @@ -20,7 +22,8 @@ pub(crate) static CONFIG: Lazy = Lazy::new(|| { }) }); -const CLAP_FOOTER: &str = "For updates and detailed usage instructions, visit https://github.com/samply/prism"; +const CLAP_FOOTER: &str = + "For updates and detailed usage instructions, visit https://github.com/samply/prism"; #[derive(Parser, Debug)] #[clap( @@ -72,7 +75,7 @@ pub(crate) struct Config { pub cors_origin: AllowOrigin, pub project: String, pub bind_addr: SocketAddr, - pub query: String, + pub query_unencoded: String, pub target: String, } @@ -88,17 +91,29 @@ impl Config { cors_origin: cli_args.cors_origin, project: cli_args.project, bind_addr: cli_args.bind_addr, - query: get_query(), + query_unencoded: get_query_unencoded(), target: cli_args.target, }; Ok(config) } } -fn get_query() -> String { - let query_file_name = format!("resources/query_{}.encoded", CliArgs::parse().project); - fs::read_to_string(&query_file_name) - .unwrap_or_else(|_| panic!("File {} can't be read", &query_file_name)) +fn get_query_unencoded() -> String { + let cql_file_name: String = format!("resources/query_{}.cql", CliArgs::parse().project); + let body_file_name = format!("resources/body_{}.json", CliArgs::parse().project); + + fs::read_to_string(&body_file_name) + .unwrap_or_else(|_| panic!("File {} can't be read", &body_file_name)) + .replace( + "{{LIBRARY_ENCODED}}", + BASE64 + .encode( + fs::read_to_string(&cql_file_name) + .unwrap_or_else(|_| panic!("File {} can't be read", &cql_file_name)) + .as_str(), + ) + .as_str(), + ) } fn parse_cors(v: &str) -> Result { diff --git a/src/main.rs b/src/main.rs index 463cf53..b75f7e2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -270,7 +270,7 @@ async fn get_results(shared_state: SharedState, task_id: MsgId, wait_count: usiz let (from, measure_report) = match decode_result(&msg) { Ok(v) => v, Err(PrismError::UnexpectedWorkStatus(beam_lib::WorkStatus::Claimed)) => { - info!("Task claimed:) {msg:?}"); + info!("Task claimed"); continue; } Err(PrismError::UnexpectedWorkStatus(