From 04c84e87c21ccac632980961d15cecdf82633087 Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Wed, 6 May 2026 22:42:16 -0700 Subject: [PATCH 1/6] Update SNPRC_EHRTest to run on postgres. Get SNPRC_EHR module running and fix upgrade script. Fix query errors during Folder import. --- snprc_ehr/module.properties | 2 +- .../resources/queries/ehr/ProtocolLookup.sql | 2 +- .../ehr_lookups/AcquisitionTypesLookup.sql | 2 +- .../queries/ehr_lookups/AgeClassRanges.sql | 10 ++--- .../queries/snprcApath/apath_encounters.sql | 4 +- .../queries/snprc_ehr/AccountLookup.sql | 2 +- .../snprc_ehr/CurrentSpeciesLookup.sql | 2 +- .../snprc_ehr/FeeScheduleActivityIdLookup.sql | 4 +- .../snprc_ehr/HL7BiochemistryPivot.sql | 2 +- .../queries/snprc_ehr/HL7CulturePivot.sql | 2 +- .../queries/snprc_ehr/HL7HematologyPivot.sql | 2 +- .../queries/snprc_ehr/HL7HistologyPivot.sql | 2 +- .../queries/snprc_ehr/HL7MiscPivot.sql | 2 +- .../snprc_ehr/HL7ParasitologyPivot.sql | 2 +- .../snprc_ehr/HL7SurveillancePivotInner.sql | 2 +- .../queries/snprc_ehr/HL7UnknownPivot.sql | 2 +- .../queries/snprc_ehr/HL7UrinalysisPivot.sql | 2 +- .../resources/queries/study/DailyObs.sql | 44 +++++++++---------- .../queries/study/acq_dispHistory.sql | 4 +- .../queries/study/availableChargeIds.sql | 4 +- .../queries/study/culturePivotInner.sql | 2 +- .../resources/queries/study/dailyObsPivot.sql | 20 ++++----- .../queries/study/hematologyPivotInner.sql | 2 +- .../queries/study/labworkResultsAll.sql | 2 +- .../resources/queries/study/mhcSummary.sql | 4 +- .../postgresql/snprc_ehr-0.000-25.000.sql | 10 ++--- .../org/labkey/snprc_ehr/SNPRC_EHRModule.java | 2 - .../test/tests/snprc_ehr/SNPRC_EHRTest.java | 2 +- snprc_genetics/module.properties | 2 +- snprc_scheduler/module.properties | 2 +- 30 files changed, 72 insertions(+), 74 deletions(-) diff --git a/snprc_ehr/module.properties b/snprc_ehr/module.properties index 260e34592..c6a614d81 100644 --- a/snprc_ehr/module.properties +++ b/snprc_ehr/module.properties @@ -1,5 +1,5 @@ ModuleClass: org.labkey.snprc_ehr.SNPRC_EHRModule -SupportedDatabases: mssql +SupportedDatabases: mssql, pgsql ManageVersion: true License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 diff --git a/snprc_ehr/resources/queries/ehr/ProtocolLookup.sql b/snprc_ehr/resources/queries/ehr/ProtocolLookup.sql index 48d86c4a4..924705eab 100644 --- a/snprc_ehr/resources/queries/ehr/ProtocolLookup.sql +++ b/snprc_ehr/resources/queries/ehr/ProtocolLookup.sql @@ -3,7 +3,7 @@ PARAMETERS newAssignmentsParm INTEGER DEFAULT 1 ) SELECT p.protocol AS Iacuc, - p.protocol + ' - ' + RTRIM(p.inves)+ ' -' + RTRIM(p.title) AS DisplayValue, + p.protocol || ' - ' || RTRIM(p.inves) || ' -' || RTRIM(p.title) AS DisplayValue, RIGHT(p.protocol, 2) AS Species, p.project_type as ProjectType, p.sequenceNumber as SequenceNumber, diff --git a/snprc_ehr/resources/queries/ehr_lookups/AcquisitionTypesLookup.sql b/snprc_ehr/resources/queries/ehr_lookups/AcquisitionTypesLookup.sql index 1469b0586..a784a809e 100644 --- a/snprc_ehr/resources/queries/ehr_lookups/AcquisitionTypesLookup.sql +++ b/snprc_ehr/resources/queries/ehr_lookups/AcquisitionTypesLookup.sql @@ -1,6 +1,6 @@ SELECT a.value as AcqCode, a.category as Category, - rtrim(a.value) + ' - ' + a.description as DisplayValue, + rtrim(a.value) || ' - ' || a.description as DisplayValue, a.sort_order as SortOrder from ehr_lookups.AcquisitionType as a where a.date_disabled is null diff --git a/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql b/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql index 80aca8df9..378e877a8 100644 --- a/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql +++ b/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql @@ -20,13 +20,13 @@ SELECT -- please excuse the ugly formatting - A sql server convert function would be helpful here! case when (age."max" is NULL and age.label = 'Senior') then - (CAST(age."min" as VARCHAR(5) ) + case when (age."min"- truncate(age."min", 0) > 0) then '' else '.0 - ' end) + (CAST(age."min" as VARCHAR(5) ) || case when (age."min"- FLOOR(age."min", 0) > 0) then '' else '.0 - ' end) ELSE - (CAST(age."min" as VARCHAR(5)) + - + case when (age."min"- truncate(age."min", 0) > 0) then ' - ' else '.0 - ' end + (CAST(age."min" as VARCHAR(5)) || + case when (age."min"- FLOOR(age."min", 0) > 0) then ' - ' else '.0 - ' end - + CAST(age."max" as varchar(5)) - + case when (age."max"- truncate(age."max", 0) > 0) then '' else '.0' end ) + || CAST(age."max" as varchar(5)) + || case when (age."max"- FLOOR(age."max", 0) > 0) then '' else '.0' end ) END AS ageRange, age.gender diff --git a/snprc_ehr/resources/queries/snprcApath/apath_encounters.sql b/snprc_ehr/resources/queries/snprcApath/apath_encounters.sql index 92d309e0a..2e981c884 100644 --- a/snprc_ehr/resources/queries/snprcApath/apath_encounters.sql +++ b/snprc_ehr/resources/queries/snprcApath/apath_encounters.sql @@ -29,11 +29,11 @@ ELSE 'Completed' END AS QCStateLabel, CASE -WHEN a.tissue IS NOT NULL THEN (a.tissue + '-' + b.description) +WHEN a.tissue IS NOT NULL THEN (a.tissue || '-' || b.description) ELSE b.description END AS title FROM snprcApath.apath a INNER JOIN snprcApath.valid_accession_codes b ON a.accession_code = b.accession_code INNER JOIN snprcApath.valid_record_status d ON a.record_status = d.record_status -WHERE a.animal_id IS NOT NULL AND COALESCE(a.biopsy, a.death) IS NOT NULL AND b.description IS NOT NULL \ No newline at end of file +WHERE a.animal_id IS NOT NULL AND COALESCE(a.biopsy, a.death) IS NOT NULL AND b.description IS NOT NULL diff --git a/snprc_ehr/resources/queries/snprc_ehr/AccountLookup.sql b/snprc_ehr/resources/queries/snprc_ehr/AccountLookup.sql index 15cb83ea3..ab6072d34 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/AccountLookup.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/AccountLookup.sql @@ -4,7 +4,7 @@ SELECT a.accountGroup AS AccountGroup, a.account AS Account, a.date AS StartDate, a.description AS Description, - a.account + ' - ' + rtrim(a.description) as DisplayValue + a.account || ' - ' || rtrim(a.description) as DisplayValue FROM snprc_ehr.validAccounts AS a where enddate is null and a.account <> '0000-000-00' diff --git a/snprc_ehr/resources/queries/snprc_ehr/CurrentSpeciesLookup.sql b/snprc_ehr/resources/queries/snprc_ehr/CurrentSpeciesLookup.sql index 1df1f979c..284887112 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/CurrentSpeciesLookup.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/CurrentSpeciesLookup.sql @@ -1,6 +1,6 @@ SELECT DISTINCT s.species_code as SpeciesCode, rtrim(sc.common_name) as CommonName, - s.species_code + ' (' + rtrim(s.arc_species_code) + ') - ' + rtrim(s.scientific_name) + '/'+ rtrim(sc.common_name) as DisplayColumn, + s.species_code || ' (' || rtrim(s.arc_species_code) || ') - ' || rtrim(s.scientific_name) || '/' || rtrim(sc.common_name) as DisplayColumn, s.scientific_name as ScientificName, s.arc_species_code as arcSpeciesCode FROM snprc_ehr.species AS s diff --git a/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql b/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql index 882a95fc6..874877f68 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql @@ -15,7 +15,7 @@ */ SELECT fs.ActivityId, - cast(fs.ActivityId as VARCHAR(5)) + ' - ' + fs.Description as description + cast(fs.ActivityId as VARCHAR(5)) || ' - ' || fs.Description as description FROM snprc_ehr.FeeSchedule AS fs WHERE fs.StartingYear = YEAR(NOW()) @@ -23,4 +23,4 @@ AND fs.BudgetYear = YEAR(NOW()) AND fs.VersionLabel = 'Capped Fee Schedule' AND fs.ActivityId between 4000 and 4999 -order by ActivityId \ No newline at end of file +order by ActivityId diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7BiochemistryPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7BiochemistryPivot.sql index de3a70914..5c6708980 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7BiochemistryPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7BiochemistryPivot.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Biochemistry' diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7CulturePivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7CulturePivot.sql index 07d6a6bf4..f720f8454 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7CulturePivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7CulturePivot.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Culture' diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7HematologyPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7HematologyPivot.sql index e85632f99..d775bfe7d 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7HematologyPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7HematologyPivot.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Hematology' diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7HistologyPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7HistologyPivot.sql index 5158720ad..152a5ce59 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7HistologyPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7HistologyPivot.sql @@ -12,7 +12,7 @@ SELECT obr.ANIMAL_ID as id, FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) WHERE obr.PROCEDURE_ID.Dataset = 'Histology' GROUP BY obr.ANIMAL_ID, obr.OBSERVATION_DATE_TM, obr.MESSAGE_ID, obr.PROCEDURE_NAME, obr.SET_ID, COALESCE (lp.ServiceId.ServiceName, obr.PROCEDURE_NAME), obr.PROCEDURE_ID, nte.COMMENT, COALESCE (lp.TestName, obx.TEST_NAME) diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7MiscPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7MiscPivot.sql index f80d03bf6..c14b3aa77 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7MiscPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7MiscPivot.sql @@ -12,7 +12,7 @@ SELECT obr.ANIMAL_ID as id, FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) WHERE obr.PROCEDURE_ID.Dataset = 'Misc Tests' GROUP BY obr.ANIMAL_ID, obr.OBSERVATION_DATE_TM, obr.MESSAGE_ID, obr.PROCEDURE_NAME, obr.SET_ID, COALESCE (lp.ServiceId.ServiceName, obr.PROCEDURE_NAME), obr.PROCEDURE_ID, nte.COMMENT, COALESCE (lp.TestName, obx.TEST_NAME) diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7ParasitologyPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7ParasitologyPivot.sql index 7987d2e49..5a889cb84 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7ParasitologyPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7ParasitologyPivot.sql @@ -12,7 +12,7 @@ SELECT obr.ANIMAL_ID as id, FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) WHERE obr.PROCEDURE_ID.Dataset = 'Parasitology' GROUP BY obr.ANIMAL_ID, obr.OBSERVATION_DATE_TM, obr.MESSAGE_ID, obr.PROCEDURE_NAME, obr.SET_ID, COALESCE (lp.ServiceId.ServiceName, obr.PROCEDURE_NAME), obr.PROCEDURE_ID, nte.COMMENT, COALESCE (lp.TestName, obx.TEST_NAME) diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql index e25b11d69..127931b40 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) WHERE obr.PROCEDURE_ID.Dataset = 'Surveillance' UNION diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7UnknownPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7UnknownPivot.sql index c557fc0fb..b0e4d48be 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7UnknownPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7UnknownPivot.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Unknown' diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7UrinalysisPivot.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7UrinalysisPivot.sql index 0f20e91db..9c76e0687 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7UrinalysisPivot.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7UrinalysisPivot.sql @@ -12,7 +12,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Urinalysis' diff --git a/snprc_ehr/resources/queries/study/DailyObs.sql b/snprc_ehr/resources/queries/study/DailyObs.sql index c47ab407d..1c0afd323 100644 --- a/snprc_ehr/resources/queries/study/DailyObs.sql +++ b/snprc_ehr/resources/queries/study/DailyObs.sql @@ -29,34 +29,34 @@ SELECT o.Id, CASE WHEN o.SaNone = 'Y' THEN 'None' ELSE '' - END + - CASE + END || + CASE WHEN o.SaUnknown = 'Y' THEN 'Unknown' ELSE '' - END + - CASE WHEN o.SaNormal = 'Y' THEN 'Normal' + END || + CASE WHEN o.SaNormal = 'Y' THEN 'Normal' ELSE '' - END + + END || CASE WHEN o.SaLoose = 'Y' THEN ' Loose' - ELSE '' - END + + ELSE '' + END || CASE WHEN o.SaSoft = 'Y' THEN ' Soft' ELSE '' - END + - CASE WHEN o.SaWatery = 'Y' THEN ' Watery' - ELSE '' - END + - CASE WHEN o.SaBloody = 'Y' THEN ' Bloody' - ELSE '' - END + - CASE WHEN o.SaDry = 'Y' THEN ' Dry' - ELSE '' - END + - CASE WHEN o.SaOther = 'Y' THEN ' Other' - ELSE '' - END + - CASE WHEN o.SaPellet = 'Y' THEN ' Pellet' - ELSE '' + END || + CASE WHEN o.SaWatery = 'Y' THEN ' Watery' + ELSE '' + END || + CASE WHEN o.SaBloody = 'Y' THEN ' Bloody' + ELSE '' + END || + CASE WHEN o.SaDry = 'Y' THEN ' Dry' + ELSE '' + END || + CASE WHEN o.SaOther = 'Y' THEN ' Other' + ELSE '' + END || + CASE WHEN o.SaPellet = 'Y' THEN ' Pellet' + ELSE '' END AS Stool, coalesce(o.HousingStatus.description,'NA') as Housing, o.taskid, diff --git a/snprc_ehr/resources/queries/study/acq_dispHistory.sql b/snprc_ehr/resources/queries/study/acq_dispHistory.sql index fdd97af36..7bad5f330 100644 --- a/snprc_ehr/resources/queries/study/acq_dispHistory.sql +++ b/snprc_ehr/resources/queries/study/acq_dispHistory.sql @@ -21,9 +21,9 @@ SELECT a.id as id, a.date as acq_date, - a.acquisitionType.description + ' (' + cast(a.AcquisitionType as varchar(10)) + ')' as acquisitionType, + a.acquisitionType.description || ' (' || cast(a.AcquisitionType as varchar(10)) || ')' as acquisitionType, d.date as disp_date, - d.dispositionType.description + ' (' + cast(d.dispositionType as varchar(10)) + ')' as dispositionType, + d.dispositionType.description || ' (' || cast(d.dispositionType as varchar(10)) || ')' as dispositionType, FROM arrival a LEFT OUTER JOIN departure d diff --git a/snprc_ehr/resources/queries/study/availableChargeIds.sql b/snprc_ehr/resources/queries/study/availableChargeIds.sql index 1f0a9166c..1140f8327 100644 --- a/snprc_ehr/resources/queries/study/availableChargeIds.sql +++ b/snprc_ehr/resources/queries/study/availableChargeIds.sql @@ -49,7 +49,7 @@ SELECT DISTINCT sp.projectType AS sndProjectType, sp.ObjectId AS sndProjectObjectId, c.caseid AS admitId, - c.problem + '/' + c.admitcomplaint AS projectText, + c.problem || '/' || c.admitcomplaint AS projectText, GREATEST (c.date, sp.startDate) AS startDate, LEAST (c.enddate, TIMESTAMPADD('SQL_TSI_DAY', 1, sp.endDate), NOW()) AS endDate, sp.projectId AS sndProjectId, @@ -62,4 +62,4 @@ FROM study.cases AS c WHERE d.id = ANIMAL_ID AND vcbs.species = d.species.arc_species_code AND GREATEST (c.date, sp.startDate) <= EVENT_DATE - AND LEAST (c.endDate, TIMESTAMPADD('SQL_TSI_DAY', 1, sp.endDate), NOW()) >= EVENT_DATE \ No newline at end of file + AND LEAST (c.endDate, TIMESTAMPADD('SQL_TSI_DAY', 1, sp.endDate), NOW()) >= EVENT_DATE diff --git a/snprc_ehr/resources/queries/study/culturePivotInner.sql b/snprc_ehr/resources/queries/study/culturePivotInner.sql index b9ee417dd..39df2c48d 100644 --- a/snprc_ehr/resources/queries/study/culturePivotInner.sql +++ b/snprc_ehr/resources/queries/study/culturePivotInner.sql @@ -23,6 +23,6 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Culture' diff --git a/snprc_ehr/resources/queries/study/dailyObsPivot.sql b/snprc_ehr/resources/queries/study/dailyObsPivot.sql index 99a1d7050..61912e374 100644 --- a/snprc_ehr/resources/queries/study/dailyObsPivot.sql +++ b/snprc_ehr/resources/queries/study/dailyObsPivot.sql @@ -19,15 +19,15 @@ c.date, c."water::observation" as water, c."feed::observation" as feed, -case when c."sa_none::observation" = 'Y' then 'None' else '' end + -case when c."sa_unknown::observation" = 'Y' then 'Unknown' else '' end + -case when c."sa_normal::observation" = 'Y' then 'Normal' else '' end + -case when c."sa_bloody::observation" = 'Y' then ' Bloody' else '' end + -case when c."sa_dry::observation" = 'Y' then ' Dry' else '' end + -case when c."sa_loose::observation" = 'Y' then ' Loose' else '' end + -case when c."sa_other::observation" = 'Y' then ' Other' else '' end + -case when c."sa_soft::observation" = 'Y' then ' Soft' else '' end + -case when c."sa_pellet::observation" = 'Y' then ' Pellet' else '' end + +case when c."sa_none::observation" = 'Y' then 'None' else '' end || +case when c."sa_unknown::observation" = 'Y' then 'Unknown' else '' end || +case when c."sa_normal::observation" = 'Y' then 'Normal' else '' end || +case when c."sa_bloody::observation" = 'Y' then ' Bloody' else '' end || +case when c."sa_dry::observation" = 'Y' then ' Dry' else '' end || +case when c."sa_loose::observation" = 'Y' then ' Loose' else '' end || +case when c."sa_other::observation" = 'Y' then ' Other' else '' end || +case when c."sa_soft::observation" = 'Y' then ' Soft' else '' end || +case when c."sa_pellet::observation" = 'Y' then ' Pellet' else '' end || case when c."sa_watery::observation" = 'Y' then ' Watery' else '' end as stool, COALESCE (c."housing_status::observation", '0') as housing_status, COALESCE (c."comments::observation", ' ') as comments, @@ -54,4 +54,4 @@ PIVOT observation BY category IN (select category_name from snprc_ehr.clinical_observation_datasets where dataset_name = 'daily_obs' order by sort_order) ) as c -order by id, date desc \ No newline at end of file +order by id, date desc diff --git a/snprc_ehr/resources/queries/study/hematologyPivotInner.sql b/snprc_ehr/resources/queries/study/hematologyPivotInner.sql index bee66db5a..a705958fd 100644 --- a/snprc_ehr/resources/queries/study/hematologyPivotInner.sql +++ b/snprc_ehr/resources/queries/study/hematologyPivotInner.sql @@ -37,6 +37,6 @@ SELECT obx.ABNORMAL_FLAGS as abnormal_flags FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE AS nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID WHERE obr.PROCEDURE_ID.Dataset = 'Hematology' diff --git a/snprc_ehr/resources/queries/study/labworkResultsAll.sql b/snprc_ehr/resources/queries/study/labworkResultsAll.sql index 35c92f40d..bbc5724f7 100644 --- a/snprc_ehr/resources/queries/study/labworkResultsAll.sql +++ b/snprc_ehr/resources/queries/study/labworkResultsAll.sql @@ -68,7 +68,7 @@ SELECT FROM snprc_ehr.HL7_OBR obr LEFT OUTER JOIN snprc_ehr.HL7_OBX obx ON obr.OBJECT_ID = obx.OBR_OBJECT_ID AND obr.SET_ID = obx.OBR_SET_ID LEFT OUTER JOIN snprc_ehr.HL7_GroupNTE nte ON obr.OBJECT_ID = nte.OBR_OBJECT_ID AND obr.SET_ID = nte.OBR_SET_ID - LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = lp.ServiceId + LEFT OUTER JOIN snprc_ehr.labwork_Panels AS lp on obx.TEST_ID = lp.TestId AND obr.PROCEDURE_ID = CAST(lp.ServiceId AS VARCHAR) INNER JOIN core.QCState as q on q.Label = 'Completed' UNION select diff --git a/snprc_ehr/resources/queries/study/mhcSummary.sql b/snprc_ehr/resources/queries/study/mhcSummary.sql index 130fa7bf5..9c7444d26 100644 --- a/snprc_ehr/resources/queries/study/mhcSummary.sql +++ b/snprc_ehr/resources/queries/study/mhcSummary.sql @@ -15,9 +15,9 @@ */ SELECT m.Id AS Id, - 'A001: ' + m.A001Status + ' B003: ' + m.B003Status + ' B008: ' + m.B008Status + ' B017: ' + m.B017Status as mhcSummary, + 'A001: ' || m.A001Status || ' B003: ' || m.B003Status || ' B008: ' || m.B008Status || ' B017: ' || m.B017Status as mhcSummary, lsid, qcstate.publicData as publicData -FROM study.mhcStatus m \ No newline at end of file +FROM study.mhcStatus m diff --git a/snprc_ehr/resources/schemas/dbscripts/postgresql/snprc_ehr-0.000-25.000.sql b/snprc_ehr/resources/schemas/dbscripts/postgresql/snprc_ehr-0.000-25.000.sql index dc3d0f179..98706d8a5 100644 --- a/snprc_ehr/resources/schemas/dbscripts/postgresql/snprc_ehr-0.000-25.000.sql +++ b/snprc_ehr/resources/schemas/dbscripts/postgresql/snprc_ehr-0.000-25.000.sql @@ -665,7 +665,7 @@ CREATE TABLE snprc_ehr.ExternalReports ); CREATE TABLE snprc_ehr.HL7_IMPORT_LOG ( - TID NUMERIC(18, 0) GENERATED BY DEFAULT AS IDENTITY NOT NULL, + TID BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, MESSAGE_ID VARCHAR(50) NOT NULL, OBSERVATION_DATE_TM TIMESTAMP NULL, MESSAGE_CONTROL_ID VARCHAR(50) NULL, @@ -1102,7 +1102,7 @@ BEGIN RETURN 0; END IF; - trimmed_value := TRIM(REPLACE(value, ' ', '')) + trimmed_value := TRIM(REPLACE(value, ' ', '')); -- Check if it is a valid numeric using Regex -- This regex matches optional sign, digits, optional dot, optional digits @@ -1123,9 +1123,9 @@ BEGIN RETURN 0; END IF; - RETURN 1; - END IF; +RETURN 1; +END IF; - RETURN 0; +RETURN 0; END; $$ LANGUAGE plpgsql; diff --git a/snprc_ehr/src/org/labkey/snprc_ehr/SNPRC_EHRModule.java b/snprc_ehr/src/org/labkey/snprc_ehr/SNPRC_EHRModule.java index 7f22b236a..1449ae0b9 100644 --- a/snprc_ehr/src/org/labkey/snprc_ehr/SNPRC_EHRModule.java +++ b/snprc_ehr/src/org/labkey/snprc_ehr/SNPRC_EHRModule.java @@ -104,8 +104,6 @@ import java.util.Date; import java.util.Set; -//import org.labkey.snprc_ehr.views.FeeScheduleWebPart; - public class SNPRC_EHRModule extends ExtendedSimpleModule { public static final String NAME = "SNPRC_EHR"; diff --git a/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java b/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java index 5b106e7c3..5a140d103 100644 --- a/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java +++ b/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java @@ -74,7 +74,7 @@ @Category ({CustomModules.class, EHR.class, SNPRC.class}) @BaseWebDriverTest.ClassTimeout(minutes = 45) -public class SNPRC_EHRTest extends AbstractGenericEHRTest implements SqlserverOnlyTest +public class SNPRC_EHRTest extends AbstractGenericEHRTest { private static final String ASSAY_GENE_EXPRESSION = "Gene Expression"; private static final File ASSAY_GENE_EXPRESSION_XAR = TestFileUtils.getSampleData("snprc/assays/Gene Expression.xar"); diff --git a/snprc_genetics/module.properties b/snprc_genetics/module.properties index d41cfed2d..ed88888ab 100644 --- a/snprc_genetics/module.properties +++ b/snprc_genetics/module.properties @@ -1,5 +1,5 @@ ModuleClass: org.labkey.snprc_genetics.SNPRC_GeneticsModule -SupportedDatabases: mssql +SupportedDatabases: mssql, pgsql License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 ManageVersion: true diff --git a/snprc_scheduler/module.properties b/snprc_scheduler/module.properties index 3d5fa7233..c85a3d342 100644 --- a/snprc_scheduler/module.properties +++ b/snprc_scheduler/module.properties @@ -1,7 +1,7 @@ ModuleClass: org.labkey.snprc_scheduler.SNPRC_schedulerModule Label: SNPRC EHR Procedure scheduling module Description: The SNPRC scheduler provides timeline and procedure scheduling for snprc_ehr module. -SupportedDatabases: mssql +SupportedDatabases: mssql, pgsql License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 ManageVersion: false From bca966443c4a435c1a547eacbb6a88175c904cc7 Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Tue, 12 May 2026 14:08:48 -0700 Subject: [PATCH 2/6] Fix errors related to coercion, casting for UNION, and others --- snd/resources/queries/snd/DeletedLookupSets.sql | 2 +- snd/resources/queries/snd/DeletedLookups.sql | 2 +- .../queries/ehr_lookups/AgeClassRanges.sql | 6 +++--- .../queries/snprc_ehr/ExportSndLookupSets.sql | 6 +++--- .../queries/snprc_ehr/ExportSndLookups.sql | 8 ++++---- .../snprc_ehr/FeeScheduleActivityIdLookup.sql | 3 ++- .../snprc_ehr/HL7SurveillancePivotInner.sql | 5 +++-- .../resources/queries/study/DemographicsHL7.sql | 2 +- .../queries/study/DemographicsHL7DeleteSource.sql | 2 +- .../resources/queries/study/GenDemoCustomizer.sql | 8 ++++---- .../resources/queries/study/GenDemoHasData.sql | 8 ++++---- .../queries/study/R24WeightsDeletedSrc.sql | 2 +- .../study/baboonAssignedColonyUsageQuery.sql | 3 ++- .../study/baboonBreedingColonyUsageQuery.sql | 3 ++- .../study/baboonUnassignedColonyUsageQuery.sql | 3 ++- .../resources/queries/study/clinpathRunsAll.sql | 14 +++++++------- .../resources/queries/study/colonyUsageQuery.sql | 3 ++- .../queries/study/demographicsIdHistory.sql | 2 +- 18 files changed, 44 insertions(+), 38 deletions(-) diff --git a/snd/resources/queries/snd/DeletedLookupSets.sql b/snd/resources/queries/snd/DeletedLookupSets.sql index b6de93f93..d6dae6e7c 100644 --- a/snd/resources/queries/snd/DeletedLookupSets.sql +++ b/snd/resources/queries/snd/DeletedLookupSets.sql @@ -1,5 +1,5 @@ select - substring(qae.oldrecordmap, charindex('objectid=',qae.oldrecordmap, 0) + len('objectid='), 36) as objectid, + substring(qae.oldrecordmap, LOCATE('objectid=', qae.oldrecordmap) + LENGTH('objectid='), 36) as objectid, qae.date as modified from auditLog.QueryUpdateAuditEvent as qae diff --git a/snd/resources/queries/snd/DeletedLookups.sql b/snd/resources/queries/snd/DeletedLookups.sql index b5cb96f87..45a7bdf07 100644 --- a/snd/resources/queries/snd/DeletedLookups.sql +++ b/snd/resources/queries/snd/DeletedLookups.sql @@ -1,5 +1,5 @@ select - substring(qae.oldrecordmap, charindex('objectid=',qae.oldrecordmap, 0) + len('objectid='), 36) as objectid, + substring(qae.oldrecordmap, LOCATE('objectid=', qae.oldrecordmap) + LENGTH('objectid='), 36) as objectid, qae.date as modified from auditLog.QueryUpdateAuditEvent as qae diff --git a/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql b/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql index 378e877a8..6b486169e 100644 --- a/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql +++ b/snprc_ehr/resources/queries/ehr_lookups/AgeClassRanges.sql @@ -20,13 +20,13 @@ SELECT -- please excuse the ugly formatting - A sql server convert function would be helpful here! case when (age."max" is NULL and age.label = 'Senior') then - (CAST(age."min" as VARCHAR(5) ) || case when (age."min"- FLOOR(age."min", 0) > 0) then '' else '.0 - ' end) + (CAST(age."min" as VARCHAR(5) ) || case when (age."min"- FLOOR(age."min") > 0) then '' else '.0 - ' end) ELSE (CAST(age."min" as VARCHAR(5)) || - case when (age."min"- FLOOR(age."min", 0) > 0) then ' - ' else '.0 - ' end + case when (age."min"- FLOOR(age."min") > 0) then ' - ' else '.0 - ' end || CAST(age."max" as varchar(5)) - || case when (age."max"- FLOOR(age."max", 0) > 0) then '' else '.0' end ) + || case when (age."max"- FLOOR(age."max") > 0) then '' else '.0' end ) END AS ageRange, age.gender diff --git a/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookupSets.sql b/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookupSets.sql index 0e545f3c7..68d6f0142 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookupSets.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookupSets.sql @@ -2,9 +2,9 @@ SELECT SetName as LOOKUP_KEY, ObjectId as OBJECT_ID, LEFT(s.Email, - CASE WHEN charindex('@', s.Email) = 0 - THEN LEN(s.Email) - ELSE (charindex('@', s.Email) - 1) END) as USER_NAME, + CASE WHEN LOCATE('@', s.Email) = 0 + THEN LENGTH(s.Email) + ELSE (LOCATE('@', s.Email) - 1) END) as USER_NAME, ls.Modified as ENTRY_DATE_TM FROM snd.LookupSets ls diff --git a/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookups.sql b/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookups.sql index 384cd38f2..ca4902739 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookups.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/ExportSndLookups.sql @@ -3,14 +3,14 @@ SELECT ls.SetName as LOOKUP_KEY, Value as VALUE, CASE - WHEN l.Displayable = 0 THEN 'Y' ELSE 'N' END as IS_HIDDEN, + WHEN l.Displayable = false THEN 'Y' ELSE 'N' END as IS_HIDDEN, l.SortOrder as ORDER_NUM, l.ObjectId as OBJECT_ID, 'N' as DEFAULT_FLAG, LEFT(s.Email, - CASE WHEN charindex('@', s.Email) = 0 - THEN LEN(s.Email) - ELSE (charindex('@', s.Email) - 1) END) as USER_NAME, + CASE WHEN LOCATE('@', s.Email) = 0 + THEN LENGTH(s.Email) + ELSE (LOCATE('@', s.Email) - 1) END) as USER_NAME, l.Modified as ENTRY_DATE_TM FROM snd.Lookups l diff --git a/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql b/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql index 874877f68..00dc0fbeb 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/FeeScheduleActivityIdLookup.sql @@ -19,7 +19,8 @@ SELECT FROM snprc_ehr.FeeSchedule AS fs WHERE fs.StartingYear = YEAR(NOW()) -AND fs.BudgetYear = YEAR(NOW()) +-- BudgetYear is VARCHAR in the schema; Postgres won't implicitly compare it to a numeric, so cast. +AND fs.BudgetYear = CAST(YEAR(NOW()) AS VARCHAR) AND fs.VersionLabel = 'Capped Fee Schedule' AND fs.ActivityId between 4000 and 4999 diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql index 127931b40..321402639 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql @@ -21,7 +21,8 @@ SELECT b.id, b.date, b.serviceTestId.serviceId.ServiceName AS PROCEDURE_NAME, - b.serviceTestId.serviceId AS PROCEDURE_ID, + -- HL7_OBR.PROCEDURE_ID is VARCHAR but labwork_services.ServiceId is INT; cast so the UNION types match on Postgres. + CAST(b.serviceTestId.serviceId AS VARCHAR) AS PROCEDURE_ID, b.serviceTestId.testName AS TestName, b.remark as COMMENT, '' AS ABNORMAL_FLAGS, @@ -36,7 +37,7 @@ SELECT b.id, b.date, b.serviceTestId.serviceId.ServiceName AS PROCEDURE_NAME, - b.serviceTestId.serviceId AS PROCEDURE_ID, + CAST(b.serviceTestId.serviceId AS VARCHAR) AS PROCEDURE_ID, b.serviceTestId.testName AS TestName, b.remark as COMMENT, '' AS ABNORMAL_FLAGS, diff --git a/snprc_ehr/resources/queries/study/DemographicsHL7.sql b/snprc_ehr/resources/queries/study/DemographicsHL7.sql index ade45a958..ee201555d 100644 --- a/snprc_ehr/resources/queries/study/DemographicsHL7.sql +++ b/snprc_ehr/resources/queries/study/DemographicsHL7.sql @@ -12,4 +12,4 @@ SELECT d.modifiedBy.DisplayName as modifiedBy, d.modified FROM demographics as d -where len(d.id) <= 6 \ No newline at end of file +where LENGTH(d.id) <= 6 \ No newline at end of file diff --git a/snprc_ehr/resources/queries/study/DemographicsHL7DeleteSource.sql b/snprc_ehr/resources/queries/study/DemographicsHL7DeleteSource.sql index 75373dc78..cba42042c 100644 --- a/snprc_ehr/resources/queries/study/DemographicsHL7DeleteSource.sql +++ b/snprc_ehr/resources/queries/study/DemographicsHL7DeleteSource.sql @@ -1,5 +1,5 @@ select - substring(dae.oldrecordmap, charindex('objectid=',dae.oldrecordmap, 0) + len('objectid='), 36) as objectid, + substring(dae.oldrecordmap, LOCATE('objectid=', dae.oldrecordmap) + LENGTH('objectid='), 36) as objectid, dae.date as modified from auditLog.DatasetAuditEvent as dae diff --git a/snprc_ehr/resources/queries/study/GenDemoCustomizer.sql b/snprc_ehr/resources/queries/study/GenDemoCustomizer.sql index bb9c6979d..a921e7cd4 100644 --- a/snprc_ehr/resources/queries/study/GenDemoCustomizer.sql +++ b/snprc_ehr/resources/queries/study/GenDemoCustomizer.sql @@ -16,10 +16,10 @@ Select d.Id, d.species, d.species.arc_species_code as ARC_species, */ - IFNULL(g.HasGeneExpressionData,0) as HasGeneExpressionData, - IFNULL(s.HasSNPData,0) as HasSNPData, - IFNULL(m.HasMicrosatellitesData,0) as HasMicrosatellitesData, - IFNULL(p.HasphenotypesData,0) as HasPhenotypeData + IFNULL(g.HasGeneExpressionData, false) as HasGeneExpressionData, + IFNULL(s.HasSNPData, false) as HasSNPData, + IFNULL(m.HasMicrosatellitesData, false) as HasMicrosatellitesData, + IFNULL(p.HasphenotypesData, false) as HasPhenotypeData From study.demographics d LEFT OUTER JOIN study.GenFlagSNP s diff --git a/snprc_ehr/resources/queries/study/GenDemoHasData.sql b/snprc_ehr/resources/queries/study/GenDemoHasData.sql index ccbf954af..a235a7cc9 100644 --- a/snprc_ehr/resources/queries/study/GenDemoHasData.sql +++ b/snprc_ehr/resources/queries/study/GenDemoHasData.sql @@ -7,10 +7,10 @@ Select d.Id, d.gender, d.species, d.species.arc_species_code as ARC_species, - IFNULL(g.HasGeneExpressionData,0) as HasGeneExpressionData, - IFNULL(s.HasSNPData,0) as HasSNPData, - IFNULL(m.HasMicrosatellitesData,0) as HasMicrosatellitesData, - IFNULL(p.HasphenotypesData,0) as HasPhenotypeData + IFNULL(g.HasGeneExpressionData, false) as HasGeneExpressionData, + IFNULL(s.HasSNPData, false) as HasSNPData, + IFNULL(m.HasMicrosatellitesData, false) as HasMicrosatellitesData, + IFNULL(p.HasphenotypesData, false) as HasPhenotypeData From study.demographics d LEFT OUTER JOIN study.GenFlagSNP s diff --git a/snprc_ehr/resources/queries/study/R24WeightsDeletedSrc.sql b/snprc_ehr/resources/queries/study/R24WeightsDeletedSrc.sql index ffae74b5f..151c8a28d 100644 --- a/snprc_ehr/resources/queries/study/R24WeightsDeletedSrc.sql +++ b/snprc_ehr/resources/queries/study/R24WeightsDeletedSrc.sql @@ -14,7 +14,7 @@ * limitations under the License. */ select - substring(dae.oldrecordmap, charindex('objectid=',dae.oldrecordmap, 0) + len('objectid='), 36) as objectid, + substring(dae.oldrecordmap, LOCATE('objectid=', dae.oldrecordmap) + LENGTH('objectid='), 36) as objectid, dae.date as modified from auditLog.DatasetAuditEvent as dae diff --git a/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql index 02a10dfbf..b78b0d711 100644 --- a/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql @@ -72,7 +72,8 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups)) col + -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code INNER JOIN diff --git a/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql index 7f3e86f55..7e2e57663 100644 --- a/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql @@ -63,7 +63,8 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups)) col -- ('pc_SPF', 'pc_Conv')) col + -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code INNER JOIN -- Total -- diff --git a/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql index 1c52bd179..15663ee5d 100644 --- a/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql @@ -63,7 +63,8 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups)) col -- ('pc_SPF', 'pc_Conv')) col + -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code INNER JOIN diff --git a/snprc_ehr/resources/queries/study/clinpathRunsAll.sql b/snprc_ehr/resources/queries/study/clinpathRunsAll.sql index e1eeaa0c3..642408baa 100644 --- a/snprc_ehr/resources/queries/study/clinpathRunsAll.sql +++ b/snprc_ehr/resources/queries/study/clinpathRunsAll.sql @@ -45,7 +45,7 @@ UNION select obr.ANIMAL_ID as Id, obr.OBSERVATION_DATE_TM AS date, - NULL AS enddate, + CAST(NULL AS TIMESTAMP) AS enddate, obr.PROCEDURE_ID.Dataset.ServiceType AS type, NULL as tissue, obr.CHARGE_ID AS project, @@ -57,11 +57,11 @@ select obr.SPECIMEN_NUM AS sampleId, NULL AS collectionMethod, NULL AS method, - NULL AS sampleQuantity, + CAST(NULL AS DOUBLE) AS sampleQuantity, NULL AS quantityUnits, NULL AS chargetype, obr.VERIFIED_DATE_TM AS verifiedDate, - NULL AS datefinalized, + CAST(NULL AS TIMESTAMP) AS datefinalized, nte.comment AS remark, NULL AS history, obr.OBJECT_ID AS objectid, @@ -105,19 +105,19 @@ UNION SELECT DISTINCT tr.Id, tr.date, - null enddate, + CAST(NULL AS TIMESTAMP) AS enddate, 'surveillance' as type, null as tissue, - null as project, + CAST(NULL AS INTEGER) as project, null as instructions, ls.serviceName, null as units, - 20000 as serviceId, + CAST(20000 AS VARCHAR) as serviceId, null as collectedBy, null as sampleId, null as collectionMethod, null as method, - null as sampleQuantity, + CAST(NULL AS DOUBLE) as sampleQuantity, null as quantityUnits, null as chargetype, tr.date as verifiedDate, diff --git a/snprc_ehr/resources/queries/study/colonyUsageQuery.sql b/snprc_ehr/resources/queries/study/colonyUsageQuery.sql index 466c3f834..87659c5d3 100644 --- a/snprc_ehr/resources/queries/study/colonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/colonyUsageQuery.sql @@ -59,7 +59,8 @@ FROM WHERE isActive = true AND a.Id.Demographics.gender IS NOT NULL AND a.Id.AgeClass.label IS NOT NULL AND protocol.inves IS NOT NULL and a.assignmentStatus = 'A' GROUP BY protocol.inves, demographicsCurrentColony.colony, a.Id.Demographics.species.arc_species_code - PIVOT grouptotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups)) col + -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + PIVOT grouptotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.investigator = col.investigator AND gen.species_code = col.species_code diff --git a/snprc_ehr/resources/queries/study/demographicsIdHistory.sql b/snprc_ehr/resources/queries/study/demographicsIdHistory.sql index 0538a5813..02901ff1f 100644 --- a/snprc_ehr/resources/queries/study/demographicsIdHistory.sql +++ b/snprc_ehr/resources/queries/study/demographicsIdHistory.sql @@ -25,7 +25,7 @@ SELECT case when i.id_type.description = 'Name' THEN i.value ELSE NULL END as id_name FROM study.idHistory i -where i.id_type.value not in ( 1, 30) +where CAST(i.id_type.value AS INTEGER) not in (1, 30) ) i1 From 8a0ad6eabfa41f1ad16b721f85e2e33004af98bd Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Wed, 13 May 2026 20:38:31 -0700 Subject: [PATCH 3/6] Fix typo, column names, and correct metadata files --- .../queries/study/ReportTcruziNewPositives.query.xml | 5 +---- .../queries/study/ReportTcruziSummaryAll.query.xml | 3 --- .../queries/study/ReportTcruziSummaryAll/.qview.xml | 2 +- .../resources/queries/study/labworkResultsAll.query.xml | 2 +- snprc_ehr/resources/queries/study/labworkResultsAll.sql | 9 +++++---- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/snprc_ehr/resources/queries/study/ReportTcruziNewPositives.query.xml b/snprc_ehr/resources/queries/study/ReportTcruziNewPositives.query.xml index 771b551b4..b4baeb9cf 100644 --- a/snprc_ehr/resources/queries/study/ReportTcruziNewPositives.query.xml +++ b/snprc_ehr/resources/queries/study/ReportTcruziNewPositives.query.xml @@ -23,13 +23,10 @@ T cruzi result - + First Date - - - diff --git a/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll.query.xml b/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll.query.xml index d42e2b85f..4c85c4717 100644 --- a/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll.query.xml +++ b/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll.query.xml @@ -31,9 +31,6 @@ Test Count - - - diff --git a/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll/.qview.xml b/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll/.qview.xml index 5db6a2823..17934c235 100644 --- a/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll/.qview.xml +++ b/snprc_ehr/resources/queries/study/ReportTcruziSummaryAll/.qview.xml @@ -35,7 +35,7 @@ - + diff --git a/snprc_ehr/resources/queries/study/labworkResultsAll.query.xml b/snprc_ehr/resources/queries/study/labworkResultsAll.query.xml index ade016a6a..9168b0ca5 100644 --- a/snprc_ehr/resources/queries/study/labworkResultsAll.query.xml +++ b/snprc_ehr/resources/queries/study/labworkResultsAll.query.xml @@ -107,7 +107,7 @@ UserId Users core - ` + true diff --git a/snprc_ehr/resources/queries/study/labworkResultsAll.sql b/snprc_ehr/resources/queries/study/labworkResultsAll.sql index bbc5724f7..77d4b108a 100644 --- a/snprc_ehr/resources/queries/study/labworkResultsAll.sql +++ b/snprc_ehr/resources/queries/study/labworkResultsAll.sql @@ -24,7 +24,8 @@ SELECT lr.Id, lr.date, lr.project, - lr.serviceId, + -- serviceId is INTEGER here but VARCHAR in the HL7_OBR branch (PROCEDURE_ID); cast everything to VARCHAR for the UNION on Postgres. + CAST(lr.serviceId AS VARCHAR) AS serviceId, lp.objectID AS serviceTestId, lr.testid, lr.resultOORIndicator, @@ -60,7 +61,7 @@ SELECT obx.REFERENCE_RANGE as refRange, obx.ABNORMAL_FLAGS as abnormal_flags, obx.OBR_OBJECT_ID as runId, - NULL as enddate, + CAST(NULL AS TIMESTAMP) as enddate, NULL as method, nte.COMMENT as remark, obx.OBJECT_ID AS objectId, @@ -75,7 +76,7 @@ select alr.Id, alr.date, alr.project, - alr.serviceId, + CAST(alr.serviceId AS VARCHAR) AS serviceId, alr.serviceTestId, alr.testid, alr.resultOORIndicator, @@ -98,7 +99,7 @@ select lt.Id, lt.date, lt.project, - lt.serviceId, + CAST(lt.serviceId AS VARCHAR) AS serviceId, lt.serviceTestId, lt.testid, lt.resultOORIndicator, From e0b1e3d3c567ab573338b76410ee574e67ffdaa5 Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Tue, 19 May 2026 23:43:06 -0700 Subject: [PATCH 4/6] fix query validation errors --- .../queries/snprc_ehr/HL7SurveillancePivotInner.sql | 5 +++-- snprc_ehr/resources/queries/study/SndBcsSource.sql | 2 +- snprc_ehr/resources/queries/study/labworkTaqman.sql | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql index 321402639..79c079271 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/HL7SurveillancePivotInner.sql @@ -27,7 +27,8 @@ SELECT b.remark as COMMENT, '' AS ABNORMAL_FLAGS, b.qualresult as QUALITATIVE_RESULT, - b.RESULT as RESULT + -- labworkTaqman.RESULT is DOUBLE but HL7_OBX.RESULT (first UNION branch) is TEXT; cast to VARCHAR so the UNION types match on Postgres. + CAST(b.RESULT AS VARCHAR) as RESULT FROM study.labworkTaqman b WHERE b.serviceTestId.includeInPanel = true and b.qcstate.publicdata = true and b.serviceTestid.ServiceId.Dataset = 'Surveillance' @@ -42,6 +43,6 @@ SELECT b.remark as COMMENT, '' AS ABNORMAL_FLAGS, b.qualresult as QUALITATIVE_RESULT, - NULL as RESULT + CAST(NULL AS VARCHAR) as RESULT FROM study.assay_labworkResults b WHERE b.serviceTestId.includeInPanel = true and b.qcstate.publicdata = true and b.serviceTestid.ServiceId.Dataset = 'Surveillance' \ No newline at end of file diff --git a/snprc_ehr/resources/queries/study/SndBcsSource.sql b/snprc_ehr/resources/queries/study/SndBcsSource.sql index 7e39e1d07..7b7094a3d 100644 --- a/snprc_ehr/resources/queries/study/SndBcsSource.sql +++ b/snprc_ehr/resources/queries/study/SndBcsSource.sql @@ -3,7 +3,7 @@ SELECT b.SubjectId as participantid, b.date, l.value as BCS, - CAST(SUBSTRING(l.value, 1, locate(' -', l.value ,1)) AS varchar(4)) AS BCSValue, + CAST(SUBSTRING(l.value, 1, CAST(locate(' -', l.value, 1) AS INTEGER)) AS varchar(4)) AS BCSValue, p.ReferenceId as project, null as taskid, null as requestid, diff --git a/snprc_ehr/resources/queries/study/labworkTaqman.sql b/snprc_ehr/resources/queries/study/labworkTaqman.sql index 3556a2a4b..9f571f4c5 100644 --- a/snprc_ehr/resources/queries/study/labworkTaqman.sql +++ b/snprc_ehr/resources/queries/study/labworkTaqman.sql @@ -7,13 +7,13 @@ SELECT lp.TestId, NULL AS resultOORIndicator, 'TX' AS value_type, - NULL AS result, + CAST(NULL AS DOUBLE) AS result, NULL AS units, tr.SWBV AS qualresult, NULL AS refRange, NULL AS abnormal_flags, tr.objectId AS runid, - NULL AS enddate, + CAST(NULL AS TIMESTAMP) AS enddate, NULL AS method, 'From Excel import' AS remark, tr.history AS history, @@ -35,13 +35,13 @@ SELECT lp.TestId, NULL AS resultOORIndicator, 'TX' AS value_type, - NULL AS result, + CAST(NULL AS DOUBLE) AS result, NULL AS units, tr.STLV1 AS qualresult, NULL AS refRange, NULL AS abnormal_flags, tr.objectId AS runid, - NULL AS enddate, + CAST(NULL AS TIMESTAMP) AS enddate, NULL AS method, 'From Excel import', tr.history AS history, From f26d6d4da6471d59581c6902c9e2a5ab9d07688d Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Sun, 28 Jun 2026 22:04:59 -0600 Subject: [PATCH 5/6] Address claude review changes --- .../queries/study/baboonAssignedColonyUsageQuery.sql | 5 ++++- .../queries/study/baboonBreedingColonyUsageQuery.sql | 5 ++++- .../queries/study/baboonUnassignedColonyUsageQuery.sql | 5 ++++- snprc_ehr/resources/queries/study/colonyUsageQuery.sql | 5 ++++- snprc_ehr/resources/queries/study/labworkTaqman.sql | 2 +- .../src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java | 1 - 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql index b78b0d711..e17419dae 100644 --- a/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonAssignedColonyUsageQuery.sql @@ -72,7 +72,10 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + -- SQL Server used a dynamic list here: + -- PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups) + -- During the Postgres migration, validation broke when BaboonColonyGroups was empty, so this query now uses the literal list below. + -- Maintenance consequence: the query is no longer driven by BaboonColonyGroups; future colony groups require manual query changes here and in the outer SELECT. PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code diff --git a/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql index 7e2e57663..5644be7bf 100644 --- a/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonBreedingColonyUsageQuery.sql @@ -63,7 +63,10 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + -- SQL Server used a dynamic list here: + -- PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups) + -- During the Postgres migration, validation broke when BaboonColonyGroups was empty, so this query now uses the literal list below. + -- Maintenance consequence: the query is no longer driven by BaboonColonyGroups; future colony groups require manual query changes here and in the outer SELECT. PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code INNER JOIN diff --git a/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql b/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql index 15663ee5d..2a369c251 100644 --- a/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/baboonUnassignedColonyUsageQuery.sql @@ -63,7 +63,10 @@ FROM WHERE aag.Id.Demographics.gender IS NOT NULL AND aag.Id.Demographics.calculated_status = 'Alive' GROUP BY aag.accountGroup, dcc.colony, aag.Id.Demographics.species.arc_species_code - -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + -- SQL Server used a dynamic list here: + -- PIVOT colonytotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups) + -- During the Postgres migration, validation broke when BaboonColonyGroups was empty, so this query now uses the literal list below. + -- Maintenance consequence: the query is no longer driven by BaboonColonyGroups; future colony groups require manual query changes here and in the outer SELECT. PIVOT colonytotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.accountGroup = col.accountGroup AND gen.species_code = col.species_code diff --git a/snprc_ehr/resources/queries/study/colonyUsageQuery.sql b/snprc_ehr/resources/queries/study/colonyUsageQuery.sql index 87659c5d3..6f2b018e9 100644 --- a/snprc_ehr/resources/queries/study/colonyUsageQuery.sql +++ b/snprc_ehr/resources/queries/study/colonyUsageQuery.sql @@ -59,7 +59,10 @@ FROM WHERE isActive = true AND a.Id.Demographics.gender IS NOT NULL AND a.Id.AgeClass.label IS NOT NULL AND protocol.inves IS NOT NULL and a.assignmentStatus = 'A' GROUP BY protocol.inves, demographicsCurrentColony.colony, a.Id.Demographics.species.arc_species_code - -- Literal IN list; outer SELECT only consumes pc_SPF and pc_Conv anyway, and a dynamic subquery against an empty BaboonColonyGroups breaks query validation. + -- SQL Server used a dynamic list here: + -- PIVOT grouptotal BY colony IN (SELECT name FROM snprc_ehr.BaboonColonyGroups) + -- During the Postgres migration, validation broke when BaboonColonyGroups was empty, so this query now uses the literal list below. + -- Maintenance consequence: the query is no longer driven by BaboonColonyGroups; future colony groups require manual query changes here and in the outer SELECT. PIVOT grouptotal BY colony IN ('pc_SPF', 'pc_Conv')) col ON gen.investigator = col.investigator AND gen.species_code = col.species_code diff --git a/snprc_ehr/resources/queries/study/labworkTaqman.sql b/snprc_ehr/resources/queries/study/labworkTaqman.sql index 9f571f4c5..6be0ba1c0 100644 --- a/snprc_ehr/resources/queries/study/labworkTaqman.sql +++ b/snprc_ehr/resources/queries/study/labworkTaqman.sql @@ -43,7 +43,7 @@ SELECT tr.objectId AS runid, CAST(NULL AS TIMESTAMP) AS enddate, NULL AS method, - 'From Excel import', + 'From Excel import' AS remark, tr.history AS history, tr.lsid, tr.Sequencenum, diff --git a/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java b/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java index ac779ed4f..10f4ee4f1 100644 --- a/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java +++ b/snprc_ehr/test/src/org/labkey/test/tests/snprc_ehr/SNPRC_EHRTest.java @@ -54,7 +54,6 @@ import org.labkey.test.util.Maps; import org.labkey.test.util.PortalHelper; import org.labkey.test.util.RReportHelper; -import org.labkey.test.util.SqlserverOnlyTest; import org.labkey.test.util.TextSearcher; import org.labkey.test.util.ext4cmp.Ext4FieldRef; import org.openqa.selenium.By; From 225bafc946dfa94b7c95dc0b57352130506ba26c Mon Sep 17 00:00:00 2001 From: Binal Patel Date: Mon, 29 Jun 2026 12:54:22 -0600 Subject: [PATCH 6/6] Make clinical history timestamps and animal group colony/pedigree queries portable to Postgres (also fixes test failures) --- .../queries/snprc_ehr/BaboonColonyGroups.sql | 2 +- .../resources/queries/snprc_ehr/colonyGroups.sql | 2 +- .../resources/queries/snprc_ehr/pedigreeGroups.sql | 2 +- .../queries/study/breedingGrpAssignments.sql | 2 +- .../resources/queries/study/colonyAssignments.sql | 2 +- .../queries/study/demographicsAnimalGroups.sql | 14 +++++++------- .../queries/study/demographicsCurrentColony.sql | 5 +++-- .../queries/study/demographicsCurrentPedigree.sql | 2 +- .../history/DefaultTreatmentOrdersDataSource.java | 12 +++++++++++- .../snprc_ehr/history/LabworkDataSource.java | 14 ++++++++++++-- 10 files changed, 39 insertions(+), 18 deletions(-) diff --git a/snprc_ehr/resources/queries/snprc_ehr/BaboonColonyGroups.sql b/snprc_ehr/resources/queries/snprc_ehr/BaboonColonyGroups.sql index 2d36f77b0..3e9de7570 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/BaboonColonyGroups.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/BaboonColonyGroups.sql @@ -16,4 +16,4 @@ SELECT ag.* FROM snprc_ehr.animal_groups AS ag INNER JOIN snprc_ehr.animal_group_categories AS agc ON ag.category_code = agc.category_code -WHERE agc.description LIKE '%baboon colonies%' and ag.enddate is null \ No newline at end of file +WHERE lower(agc.description) LIKE '%baboon colonies%' and ag.enddate is null diff --git a/snprc_ehr/resources/queries/snprc_ehr/colonyGroups.sql b/snprc_ehr/resources/queries/snprc_ehr/colonyGroups.sql index 129516fd3..0a14999f9 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/colonyGroups.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/colonyGroups.sql @@ -25,4 +25,4 @@ FROM snprc_ehr.animal_groups AS ag SELECT DISTINCT primate, arc_species_code FROM snprc_ehr.species ) AS s on agc.Species = s.arc_species_code -WHERE agc.description LIKE '%colonies%' +WHERE lower(agc.description) LIKE '%colonies%' diff --git a/snprc_ehr/resources/queries/snprc_ehr/pedigreeGroups.sql b/snprc_ehr/resources/queries/snprc_ehr/pedigreeGroups.sql index 375a4bafc..c3e4517f3 100644 --- a/snprc_ehr/resources/queries/snprc_ehr/pedigreeGroups.sql +++ b/snprc_ehr/resources/queries/snprc_ehr/pedigreeGroups.sql @@ -20,4 +20,4 @@ SELECT ag.category_code as Category, agc.Species as Species FROM snprc_ehr.animal_groups AS ag INNER JOIN snprc_ehr.animal_group_categories AS agc ON ag.category_code = agc.category_code -WHERE agc.description LIKE '%pedigree%' \ No newline at end of file +WHERE lower(agc.description) LIKE '%pedigree%' diff --git a/snprc_ehr/resources/queries/study/breedingGrpAssignments.sql b/snprc_ehr/resources/queries/study/breedingGrpAssignments.sql index 3526a66d7..d622ea5f9 100644 --- a/snprc_ehr/resources/queries/study/breedingGrpAssignments.sql +++ b/snprc_ehr/resources/queries/study/breedingGrpAssignments.sql @@ -12,4 +12,4 @@ agm.groupId.name, ag.comment FROM study.animal_group_members as agm -JOIN snprc_ehr.animal_groups ag on ((ag.category_code.description like '%Breeding%' or ag.category_code.description like '%cycle%') and agm.groupId = ag.code) +JOIN snprc_ehr.animal_groups ag on ((lower(ag.category_code.description) like '%breeding%' or lower(ag.category_code.description) like '%cycle%') and agm.groupId = ag.code) diff --git a/snprc_ehr/resources/queries/study/colonyAssignments.sql b/snprc_ehr/resources/queries/study/colonyAssignments.sql index 2bd50f362..4a2183df3 100644 --- a/snprc_ehr/resources/queries/study/colonyAssignments.sql +++ b/snprc_ehr/resources/queries/study/colonyAssignments.sql @@ -11,4 +11,4 @@ SELECT agm.groupId.name FROM study.animal_group_members as agm -where agm.groupId.category_code.description like '%colonies%' \ No newline at end of file +where lower(agm.groupId.category_code.description) like '%colonies%' diff --git a/snprc_ehr/resources/queries/study/demographicsAnimalGroups.sql b/snprc_ehr/resources/queries/study/demographicsAnimalGroups.sql index e9a21f691..f45731264 100644 --- a/snprc_ehr/resources/queries/study/demographicsAnimalGroups.sql +++ b/snprc_ehr/resources/queries/study/demographicsAnimalGroups.sql @@ -16,8 +16,8 @@ SELECT d.id, -- special handling for colonies and pedigrees -case when agc.description like '%colonies%' then 'Colony' - when agc.description like '%pedigree%' then 'Pedigree' else agc.description end as category, +case when lower(agc.description) like '%colonies%' then 'Colony' + when lower(agc.description) like '%pedigree%' then 'Pedigree' else agc.description end as category, cast(group_concat(ag.name) as varchar(128)) as animal_group -- CAST(group_concat(ag.name) AS VARCHAR) as animal_group -- min(ag.name) as animal_group @@ -31,10 +31,10 @@ WHERE agm.enddate is null AND agm.qcstate.publicdata = true group by d.id, - case when agc.description like '%colonies%' then 'Colony' - when agc.description like '%pedigree%' then 'Pedigree' else agc.description end + case when lower(agc.description) like '%colonies%' then 'Colony' + when lower(agc.description) like '%pedigree%' then 'Pedigree' else agc.description end PIVOT animal_group BY category IN -(select case when description like '%colonies%' then 'Colony' - when description like '%pedigree%' then 'Pedigree' else description end as description - from snprc_ehr.animal_group_categories ) \ No newline at end of file +(select case when lower(description) like '%colonies%' then 'Colony' + when lower(description) like '%pedigree%' then 'Pedigree' else description end as description + from snprc_ehr.animal_group_categories ) diff --git a/snprc_ehr/resources/queries/study/demographicsCurrentColony.sql b/snprc_ehr/resources/queries/study/demographicsCurrentColony.sql index 48df9dfe9..13a7b2c3a 100644 --- a/snprc_ehr/resources/queries/study/demographicsCurrentColony.sql +++ b/snprc_ehr/resources/queries/study/demographicsCurrentColony.sql @@ -20,5 +20,6 @@ SELECT FROM study.animal_group_members as agm INNER JOIN snprc_ehr.animal_groups as ag ON ag.code = agm.groupId - INNER JOIN snprc_ehr.animal_group_categories as agc on ag.category_code = agc.category_code and agc.description like '%colonies%' -WHERE agm.isActive = true and agm.qcstate.PublicData = true and id.demographics.calculated_status = 'Alive' \ No newline at end of file + -- SQL Server's default collation matched this case-insensitively; Postgres LIKE does not. + INNER JOIN snprc_ehr.animal_group_categories as agc on ag.category_code = agc.category_code and lower(agc.description) like '%colonies%' +WHERE agm.isActive = true and agm.qcstate.PublicData = true and id.demographics.calculated_status = 'Alive' diff --git a/snprc_ehr/resources/queries/study/demographicsCurrentPedigree.sql b/snprc_ehr/resources/queries/study/demographicsCurrentPedigree.sql index 37e30e36d..5ae76ee16 100644 --- a/snprc_ehr/resources/queries/study/demographicsCurrentPedigree.sql +++ b/snprc_ehr/resources/queries/study/demographicsCurrentPedigree.sql @@ -20,5 +20,5 @@ SELECT FROM study.animal_group_members as agm INNER JOIN snprc_ehr.animal_groups as ag ON ag.code = agm.groupId -INNER JOIN snprc_ehr.animal_group_categories as agc on ag.category_code = agc.category_code and agc.description like '%pedigree%' +INNER JOIN snprc_ehr.animal_group_categories as agc on ag.category_code = agc.category_code and lower(agc.description) like '%pedigree%' WHERE agm.isActive = true and agm.qcstate.PublicData = true diff --git a/snprc_ehr/src/org/labkey/snprc_ehr/history/DefaultTreatmentOrdersDataSource.java b/snprc_ehr/src/org/labkey/snprc_ehr/history/DefaultTreatmentOrdersDataSource.java index d96fae35d..4659a0de3 100644 --- a/snprc_ehr/src/org/labkey/snprc_ehr/history/DefaultTreatmentOrdersDataSource.java +++ b/snprc_ehr/src/org/labkey/snprc_ehr/history/DefaultTreatmentOrdersDataSource.java @@ -25,9 +25,19 @@ import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; public class DefaultTreatmentOrdersDataSource extends AbstractDataSource { + // SQL Server commonly includes fractional seconds, while Postgres may omit them when zero. + private static final DateTimeFormatter DATE_TIME_PARSER = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd HH:mm:ss") + .optionalStart() + .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true) + .optionalEnd() + .toFormatter(); + public DefaultTreatmentOrdersDataSource(Module module) { super("study", "treatment_order", "Medication Ordered", "Therapy", module); @@ -58,7 +68,7 @@ protected String safeAppendDateAndTime(Results rs, String label, String field) t String result = ""; if (rs.hasColumn(fk) && rs.getObject(fk) != null) { String date = rs.getString(fk); - String time = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")).format(DateTimeFormatter.ofPattern("MM-dd-yyyy H:mm a")); + String time = LocalDateTime.parse(date, DATE_TIME_PARSER).format(DateTimeFormatter.ofPattern("MM-dd-yyyy H:mm a")); result = (label == null ? "" : label + ": ") + time + "\n"; } diff --git a/snprc_ehr/src/org/labkey/snprc_ehr/history/LabworkDataSource.java b/snprc_ehr/src/org/labkey/snprc_ehr/history/LabworkDataSource.java index d25a26128..ffab76981 100644 --- a/snprc_ehr/src/org/labkey/snprc_ehr/history/LabworkDataSource.java +++ b/snprc_ehr/src/org/labkey/snprc_ehr/history/LabworkDataSource.java @@ -38,6 +38,8 @@ import java.sql.SQLException; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeFormatterBuilder; +import java.time.temporal.ChronoField; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; @@ -53,6 +55,14 @@ */ public class LabworkDataSource extends AbstractDataSource { + // SQL Server commonly includes fractional seconds, while Postgres may omit them when zero. + private static final DateTimeFormatter DATE_TIME_PARSER = new DateTimeFormatterBuilder() + .appendPattern("yyyy-MM-dd HH:mm:ss") + .optionalStart() + .appendFraction(ChronoField.NANO_OF_SECOND, 1, 9, true) + .optionalEnd() + .toFormatter(); + private Map> _results; private Map> _flags; @@ -204,11 +214,11 @@ protected String safeAppendTimeFromDate(Results rs, String label, String field) String result = ""; if (rs.hasColumn(fk) && rs.getObject(fk) != null) { String date = rs.getString(fk); - String time = LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S")).format(DateTimeFormatter.ofPattern("H:mm a")); + String time = LocalDateTime.parse(date, DATE_TIME_PARSER).format(DateTimeFormatter.ofPattern("H:mm a")); result = (label == null ? "" : label + ": ") + time + "\n"; } return PageFlowUtil.filter(result); } -} \ No newline at end of file +}