changeset 657:aa2e2d47465d sql-opti tip

test version: assume parents already exist
author Alain Mazy <am@orthanc.team>
date Wed, 23 Apr 2025 17:39:48 +0200 (4 days ago)
parents 5459bbd74cc6
children
files PostgreSQL/Plugins/SQL/PrepareIndex.sql
diffstat 1 files changed, 62 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/PostgreSQL/Plugins/SQL/PrepareIndex.sql	Wed Apr 23 16:38:51 2025 +0200
+++ b/PostgreSQL/Plugins/SQL/PrepareIndex.sql	Wed Apr 23 17:39:48 2025 +0200
@@ -534,47 +534,77 @@
   OUT instance_internal_id BIGINT) AS $body$
 
 BEGIN
+	-- assume the parents already exists
+
 	is_new_patient := 1;
 	is_new_study := 1;
 	is_new_series := 1;
 	is_new_instance := 1;
 
-	BEGIN
-        INSERT INTO "resources" VALUES (DEFAULT, 0, patient_public_id, NULL, 0) RETURNING internalid INTO patient_internal_id;
-    EXCEPTION
-        WHEN unique_violation THEN
-            is_new_patient := 0;
-            SELECT internalid INTO patient_internal_id FROM "resources" WHERE publicId = patient_public_id;
-    END;
+	-- First, check if the series already exists
+	SELECT internalid INTO series_internal_id FROM "resources" WHERE publicId = series_public_id;
+
+	IF series_internal_id IS NOT NULL THEN
+	    -- RAISE NOTICE 'series-found %', series_internal_id;
+		is_new_patient := 0;
+		is_new_study := 0;
+		is_new_series := 0;
 
-	BEGIN
-        INSERT INTO "resources" VALUES (DEFAULT, 1, study_public_id, patient_internal_id, 0) RETURNING internalid INTO study_internal_id;
-    EXCEPTION
-        WHEN unique_violation THEN
-            is_new_study := 0;
-            SELECT internalid INTO study_internal_id FROM "resources" WHERE publicId = study_public_id;
-    END;
+		-- If the series exists, insert the instance directly
+		BEGIN
+			INSERT INTO "resources" VALUES (DEFAULT, 3, instance_public_id, series_internal_id, 0) RETURNING internalid INTO instance_internal_id;
+		EXCEPTION
+			WHEN unique_violation THEN
+				is_new_instance := 0;
+				SELECT internalid INTO instance_internal_id FROM "resources" WHERE publicId = instance_public_id;
+		END;
+
+    	SELECT internalid INTO patient_internal_id FROM "resources" WHERE publicId = patient_public_id;
+		SELECT internalid INTO study_internal_id FROM "resources" WHERE publicId = study_public_id;
+
+	ELSE
+	    -- RAISE NOTICE 'series-not-found';
 
-	BEGIN
-	    INSERT INTO "resources" VALUES (DEFAULT, 2, series_public_id, study_internal_id, 0) RETURNING internalid INTO series_internal_id;
-    EXCEPTION
-        WHEN unique_violation THEN
-            is_new_series := 0;
-            SELECT internalid INTO series_internal_id FROM "resources" WHERE publicId = series_public_id;
-    END;
+		-- If the series does not exist, execute the "full" steps
+		BEGIN
+			INSERT INTO "resources" VALUES (DEFAULT, 0, patient_public_id, NULL, 0) RETURNING internalid INTO patient_internal_id;
+		EXCEPTION
+			WHEN unique_violation THEN
+				is_new_patient := 0;
+				SELECT internalid INTO patient_internal_id FROM "resources" WHERE publicId = patient_public_id;
+		END;
+	
+		BEGIN
+			INSERT INTO "resources" VALUES (DEFAULT, 1, study_public_id, patient_internal_id, 0) RETURNING internalid INTO study_internal_id;
+		EXCEPTION
+			WHEN unique_violation THEN
+				is_new_study := 0;
+				SELECT internalid INTO study_internal_id FROM "resources" WHERE publicId = study_public_id;
+		END;
+	
+		BEGIN
+			INSERT INTO "resources" VALUES (DEFAULT, 2, series_public_id, study_internal_id, 0) RETURNING internalid INTO series_internal_id;
+		EXCEPTION
+			WHEN unique_violation THEN
+				is_new_series := 0;
+				SELECT internalid INTO series_internal_id FROM "resources" WHERE publicId = series_public_id;
+		END;
+	
+		BEGIN
+			INSERT INTO "resources" VALUES (DEFAULT, 3, instance_public_id, series_internal_id, 0) RETURNING internalid INTO instance_internal_id;
+		EXCEPTION
+			WHEN unique_violation THEN
+				is_new_instance := 0;
+				SELECT internalid INTO instance_internal_id FROM "resources" WHERE publicId = instance_public_id;
+		END;
 
-  	BEGIN
-		INSERT INTO "resources" VALUES (DEFAULT, 3, instance_public_id, series_internal_id, 0) RETURNING internalid INTO instance_internal_id;
-    EXCEPTION
-        WHEN unique_violation THEN
-            is_new_instance := 0;
-            SELECT internalid INTO instance_internal_id FROM "resources" WHERE publicId = instance_public_id;
-    END;
+	END IF;
+
 
-    -- IF is_new_instance > 0 THEN
-    --  -- Move the patient to the end of the recycling order.
-    --    PERFORM PatientAddedOrUpdated(patient_internal_id, 1);
-    -- END IF;  
+	-- IF is_new_instance > 0 THEN
+	-- 	-- Move the patient to the end of the recycling order.
+	-- 	PERFORM PatientAddedOrUpdated(patient_internal_id, 1);
+	-- END IF;
 END;
 $body$ LANGUAGE plpgsql;