@@ -5497,8 +5497,15 @@ $$
54975497DECLARE
54985498 _iterator NUMERIC := 0 ;
54995499 _status_id TEXT ;
5500+ _project_id UUID;
5501+ _base_sort_order NUMERIC ;
55005502BEGIN
5503+ -- Get the project_id from the first status to ensure we update all statuses in the same project
5504+ SELECT project_id INTO _project_id
5505+ FROM task_statuses
5506+ WHERE id = (SELECT TRIM (BOTH ' "' FROM JSON_ARRAY_ELEMENTS(_status_ids)::TEXT ) LIMIT 1 )::UUID;
55015507
5508+ -- Update the sort_order for statuses in the provided order
55025509 FOR _status_id IN SELECT * FROM JSON_ARRAY_ELEMENTS((_status_ids)::JSON)
55035510 LOOP
55045511 UPDATE task_statuses
@@ -5507,6 +5514,29 @@ BEGIN
55075514 _iterator := _iterator + 1 ;
55085515 END LOOP;
55095516
5517+ -- Get the base sort order for remaining statuses (simple count approach)
5518+ SELECT COUNT (* ) INTO _base_sort_order
5519+ FROM task_statuses ts2
5520+ WHERE ts2 .project_id = _project_id
5521+ AND ts2 .id = ANY(SELECT (TRIM (BOTH ' "' FROM JSON_ARRAY_ELEMENTS(_status_ids)::TEXT ))::UUID);
5522+
5523+ -- Update remaining statuses with simple sequential numbering
5524+ -- Reset iterator to start from base_sort_order
5525+ _iterator := _base_sort_order;
5526+
5527+ -- Use a cursor approach to avoid window functions
5528+ FOR _status_id IN
5529+ SELECT id::TEXT FROM task_statuses
5530+ WHERE project_id = _project_id
5531+ AND id NOT IN (SELECT (TRIM (BOTH ' "' FROM JSON_ARRAY_ELEMENTS(_status_ids)::TEXT ))::UUID)
5532+ ORDER BY sort_order
5533+ LOOP
5534+ UPDATE task_statuses
5535+ SET sort_order = _iterator
5536+ WHERE id = _status_id::UUID;
5537+ _iterator := _iterator + 1 ;
5538+ END LOOP;
5539+
55105540 RETURN;
55115541END
55125542$$;
@@ -6394,7 +6424,7 @@ DECLARE
63946424 _offset INT := 0 ;
63956425 _affected_rows INT ;
63966426BEGIN
6397- -- PERFORMANCE OPTIMIZATION: Use CTE for better query planning
6427+ -- PERFORMANCE OPTIMIZATION: Use direct updates without CTE in UPDATE
63986428 IF (_to_index = - 1 )
63996429 THEN
64006430 _to_index = COALESCE((SELECT MAX (sort_order) + 1 FROM tasks WHERE project_id = _project_id), 0 );
@@ -6404,18 +6434,15 @@ BEGIN
64046434 IF _to_index > _from_index
64056435 THEN
64066436 LOOP
6407- WITH batch_update AS (
6408- UPDATE tasks
6409- SET sort_order = sort_order - 1
6410- WHERE project_id = _project_id
6411- AND sort_order > _from_index
6412- AND sort_order < _to_index
6413- AND sort_order > _offset
6414- AND sort_order <= _offset + _batch_size
6415- RETURNING 1
6416- )
6417- SELECT COUNT (* ) INTO _affected_rows FROM batch_update;
6437+ UPDATE tasks
6438+ SET sort_order = sort_order - 1
6439+ WHERE project_id = _project_id
6440+ AND sort_order > _from_index
6441+ AND sort_order < _to_index
6442+ AND sort_order > _offset
6443+ AND sort_order <= _offset + _batch_size;
64186444
6445+ GET DIAGNOSTICS _affected_rows = ROW_COUNT;
64196446 EXIT WHEN _affected_rows = 0 ;
64206447 _offset := _offset + _batch_size;
64216448 END LOOP;
@@ -6427,18 +6454,15 @@ BEGIN
64276454 THEN
64286455 _offset := 0 ;
64296456 LOOP
6430- WITH batch_update AS (
6431- UPDATE tasks
6432- SET sort_order = sort_order + 1
6433- WHERE project_id = _project_id
6434- AND sort_order > _to_index
6435- AND sort_order < _from_index
6436- AND sort_order > _offset
6437- AND sort_order <= _offset + _batch_size
6438- RETURNING 1
6439- )
6440- SELECT COUNT (* ) INTO _affected_rows FROM batch_update;
6457+ UPDATE tasks
6458+ SET sort_order = sort_order + 1
6459+ WHERE project_id = _project_id
6460+ AND sort_order > _to_index
6461+ AND sort_order < _from_index
6462+ AND sort_order > _offset
6463+ AND sort_order <= _offset + _batch_size;
64416464
6465+ GET DIAGNOSTICS _affected_rows = ROW_COUNT;
64426466 EXIT WHEN _affected_rows = 0 ;
64436467 _offset := _offset + _batch_size;
64446468 END LOOP;
@@ -6457,22 +6481,19 @@ DECLARE
64576481 _offset INT := 0 ;
64586482 _affected_rows INT ;
64596483BEGIN
6460- -- PERFORMANCE OPTIMIZATION: Batch updates for large datasets
6484+ -- PERFORMANCE OPTIMIZATION: Batch updates for large datasets without CTE in UPDATE
64616485 IF _to_index > _from_index
64626486 THEN
64636487 LOOP
6464- WITH batch_update AS (
6465- UPDATE tasks
6466- SET sort_order = sort_order - 1
6467- WHERE project_id = _project_id
6468- AND sort_order > _from_index
6469- AND sort_order <= _to_index
6470- AND sort_order > _offset
6471- AND sort_order <= _offset + _batch_size
6472- RETURNING 1
6473- )
6474- SELECT COUNT (* ) INTO _affected_rows FROM batch_update;
6488+ UPDATE tasks
6489+ SET sort_order = sort_order - 1
6490+ WHERE project_id = _project_id
6491+ AND sort_order > _from_index
6492+ AND sort_order <= _to_index
6493+ AND sort_order > _offset
6494+ AND sort_order <= _offset + _batch_size;
64756495
6496+ GET DIAGNOSTICS _affected_rows = ROW_COUNT;
64766497 EXIT WHEN _affected_rows = 0 ;
64776498 _offset := _offset + _batch_size;
64786499 END LOOP;
@@ -6482,18 +6503,15 @@ BEGIN
64826503 THEN
64836504 _offset := 0 ;
64846505 LOOP
6485- WITH batch_update AS (
6486- UPDATE tasks
6487- SET sort_order = sort_order + 1
6488- WHERE project_id = _project_id
6489- AND sort_order >= _to_index
6490- AND sort_order < _from_index
6491- AND sort_order > _offset
6492- AND sort_order <= _offset + _batch_size
6493- RETURNING 1
6494- )
6495- SELECT COUNT (* ) INTO _affected_rows FROM batch_update;
6506+ UPDATE tasks
6507+ SET sort_order = sort_order + 1
6508+ WHERE project_id = _project_id
6509+ AND sort_order >= _to_index
6510+ AND sort_order < _from_index
6511+ AND sort_order > _offset
6512+ AND sort_order <= _offset + _batch_size;
64966513
6514+ GET DIAGNOSTICS _affected_rows = ROW_COUNT;
64976515 EXIT WHEN _affected_rows = 0 ;
64986516 _offset := _offset + _batch_size;
64996517 END LOOP;
@@ -6502,3 +6520,38 @@ BEGIN
65026520 UPDATE tasks SET sort_order = _to_index WHERE id = _task_id AND project_id = _project_id;
65036521END
65046522$$;
6523+
6524+ -- Simple function to update task sort orders in bulk
6525+ CREATE OR REPLACE FUNCTION update_task_sort_orders_bulk (_updates json) RETURNS void
6526+ LANGUAGE plpgsql
6527+ AS
6528+ $$
6529+ DECLARE
6530+ _update_record RECORD;
6531+ BEGIN
6532+ -- Simple approach: update each task's sort_order from the provided array
6533+ FOR _update_record IN
6534+ SELECT
6535+ (item- >> ' task_id' )::uuid as task_id,
6536+ (item- >> ' sort_order' )::int as sort_order,
6537+ (item- >> ' status_id' )::uuid as status_id,
6538+ (item- >> ' priority_id' )::uuid as priority_id,
6539+ (item- >> ' phase_id' )::uuid as phase_id
6540+ FROM json_array_elements(_updates) as item
6541+ LOOP
6542+ UPDATE tasks
6543+ SET
6544+ sort_order = _update_record .sort_order ,
6545+ status_id = COALESCE(_update_record .status_id , status_id),
6546+ priority_id = COALESCE(_update_record .priority_id , priority_id)
6547+ WHERE id = _update_record .task_id ;
6548+
6549+ -- Handle phase updates separately since it's in a different table
6550+ IF _update_record .phase_id IS NOT NULL THEN
6551+ INSERT INTO task_phase (task_id, phase_id)
6552+ VALUES (_update_record .task_id , _update_record .phase_id )
6553+ ON CONFLICT (task_id) DO UPDATE SET phase_id = _update_record .phase_id ;
6554+ END IF;
6555+ END LOOP;
6556+ END
6557+ $$;
0 commit comments