/*PGR-GNU*****************************************************************
File: optimizeUpdateRaw.sql

Copyright (c) 2021 pgRouting developers
Mail: project@pgrouting.org

Function's developer:
Copyright (c) 2021 Celia Virginia Vergara Castillo
Copyright (c) 2021 Joseph Emile Honour Percival

------

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

 ********************************************************************PGR-GNU*/

CREATE OR REPLACE PROCEDURE vrp_optimizeUpdateRaw(
  TEXT, -- orders sql (required)
  TEXT, -- vehicles sql (required)
  TEXT, -- time matrix sql (required)
  TEXT, -- time dependencies SQL

  vehicles_tbl    REGCLASS, -- vehicles table to update
  id_column       TEXT    DEFAULT 'id',
  stops_column    TEXT    DEFAULT 'stops',

  execution_date  BIGINT  DEFAULT 0,
  factor          FLOAT   DEFAULT 1.0,
  max_cycles      INTEGER DEFAULT 1,

  check_triangle_inequality BOOLEAN DEFAULT false,
  subdivision_kind          INTEGER DEFAULT '0'
)
AS
$BODY$
DECLARE
  r RECORD;
  old_v BIGINT = 0;
  stops BIGINT[];
BEGIN

  EXECUTE format($$
    WITH
    new_stops AS (
      SELECT vehicle_id, array_agg(order_id ORDER BY seq) AS stops
    FROM _vrp_optimize(
      %1$L, %2$L, %3$L, %4$L,
      %5$s, %6$s, %7$s,
      %8$L, %9$s,
      false)
    GROUP BY vehicle_id
  )
  UPDATE %10$I AS v
  SET %11$I = n.stops
  FROM new_stops AS n WHERE v.%12$I = n.vehicle_id
  $$,
  _vrp_get_statement($1),
  _vrp_get_statement($2),
  _vrp_get_statement($3),
  _vrp_get_statement($4),
  factor, max_cycles, execution_date,
  check_triangle_inequality, subdivision_kind,
  vehicles_tbl, stops_column, id_column);

  COMMIT;


END;
$BODY$
LANGUAGE plpgsql;


COMMENT ON PROCEDURE vrp_optimizeUpdateRaw(TEXT, TEXT, TEXT, TEXT, REGCLASS, TEXT, TEXT, BIGINT, FLOAT, INTEGER, BOOLEAN, INTEGER)
IS 'vrp_optimizeUpdateRaw
- Documentation:
  - ${PROJECT_DOC_LINK}/vrp_optimizeUpdateRaw.html
';
