From ec152ccd6311ffe012ba77d5e54cbb03b9e8de29 Mon Sep 17 00:00:00 2001 From: cvvergara Date: Wed, 2 Jun 2021 10:45:08 -0500 Subject: [PATCH] [vrp_pgr_pickDeliverEuclidean] fixing code for macos pgtap test --- docqueries/version/doc-full_version.result | 6 +- docqueries/version/doc-version.result | 2 +- .../wrong_data_pickDeliverEuclidean.sql | 58 +++++-------- src/common/get_check_data.c | 2 +- .../pickDeliverEuclidean_driver.cpp | 84 ++++++++++++++++--- 5 files changed, 99 insertions(+), 53 deletions(-) diff --git a/docqueries/version/doc-full_version.result b/docqueries/version/doc-full_version.result index e5f2884b09..be55939246 100644 --- a/docqueries/version/doc-full_version.result +++ b/docqueries/version/doc-full_version.result @@ -4,9 +4,9 @@ SET client_min_messages TO NOTICE; SET -- q1 SELECT version, library FROM vrp_full_version(); - version | library ----------+------------------ - 0.2.0 | vrprouting-0.2.0 + version | library +-----------+------------------ + 0.2.0-dev | vrprouting-0.2.0 (1 row) -- q2 diff --git a/docqueries/version/doc-version.result b/docqueries/version/doc-version.result index a03b2ab04a..8e56dbfb6b 100644 --- a/docqueries/version/doc-version.result +++ b/docqueries/version/doc-version.result @@ -6,7 +6,7 @@ SET SELECT vrp_version(); vrp_version ------------- - 0.2.0 + 0.2.0-dev (1 row) -- q2 diff --git a/pgtap/pgr_pickDeliver/wrong_data_pickDeliverEuclidean.sql b/pgtap/pgr_pickDeliver/wrong_data_pickDeliverEuclidean.sql index 412bf74d26..011f79ef6f 100644 --- a/pgtap/pgr_pickDeliver/wrong_data_pickDeliverEuclidean.sql +++ b/pgtap/pgr_pickDeliver/wrong_data_pickDeliverEuclidean.sql @@ -257,62 +257,48 @@ SELECT throws_ok('vehicles10', -- testing wrong data on orders -------------------------------------- ---------------------- --- d_open > d_close ---------------------- -UPDATE orders_1 SET d_close = 5 WHERE id = 1; - PREPARE orders1 AS SELECT * FROM _vrp_pgr_pickDeliverEuclidean( $$SELECT * FROM orders_1$$, $$SELECT * FROM vehicles_1$$); -SELECT todo_start('thorws text changed'); +--------------------- +-- amount <= 0 +--------------------- + +UPDATE orders_1 SET amount= -20 WHERE id =1; -SELECT CASE WHEN (pgr_full_version()).system LIKE 'Darwin%' -THEN skip('test crashing server', 1 ) -ELSE collect_tap( - throws_ok('orders1', +SELECT throws_ok('orders1', 'XX000', - 'Order not feasible on any truck was found', - 'orders1, Should throw: d_open > d_close') -) END; + 'Unexpected Negative value in column amount', + 'Should throw: pickup.demand < 0'); -UPDATE orders_1 SET d_close = 15 WHERE id = 1; +UPDATE orders_1 SET amount= 10 WHERE id =1; --------------------- --- p_open > p_close +-- d_open > d_close --------------------- -UPDATE orders_1 SET p_close = 1 WHERE id = 1; +UPDATE orders_1 SET d_close = 5 WHERE id = 1; -SELECT CASE WHEN (pgr_full_version()).system LIKE 'Darwin%' -THEN skip('test crashing server', 1 ) -ELSE collect_tap( - throws_ok('orders1', +SELECT throws_ok('orders1', 'XX000', - 'Order not feasible on any truck was found', - 'orders1, Should throw: p_open > p_close') -) END; + 'Unexpected delivery time windows found on shipments', + 'orders1, Should throw: d_open > d_close'); -UPDATE orders_1 SET p_close = 10 WHERE id = 1; +UPDATE orders_1 SET d_close = 15 WHERE id = 1; -SELECT todo_end(); --------------------- --- amount <= 0 +-- p_open > p_close --------------------- +UPDATE orders_1 SET p_close = 1 WHERE id = 1; -UPDATE orders_1 SET amount= -20 WHERE id =1; - -SELECT CASE WHEN (pgr_full_version()).system LIKE 'Darwin%' -THEN skip('test crashing server', 1 ) -ELSE collect_tap( - throws_ok('orders1', +SELECT throws_ok('orders1', 'XX000', - 'Unexpected Negative value in column amount', - 'Should throw: amount(PICKUP) < 0') -) END; + 'Unexpected pickup time windows found on shipments', + 'orders1, Should throw: p_open > p_close'); + +UPDATE orders_1 SET p_close = 10 WHERE id = 1; -UPDATE orders_1 SET amount= 10 WHERE id =11; SELECT finish(); ROLLBACK; diff --git a/src/common/get_check_data.c b/src/common/get_check_data.c index 0b9c75c774..2addec7f6e 100644 --- a/src/common/get_check_data.c +++ b/src/common/get_check_data.c @@ -77,7 +77,7 @@ check_any_integer_type(Column_info_t info) { || info.type == INT8OID)) { ereport(ERROR, (errmsg_internal("Unexpected type in column '%s'.", info.name), - errhint("Found %lu", info.type))); + errhint("Expected ANY-INTEGER"))); } } diff --git a/src/pgr_pickDeliver/pickDeliverEuclidean_driver.cpp b/src/pgr_pickDeliver/pickDeliverEuclidean_driver.cpp index fbf5da5bb3..30dc65e425 100644 --- a/src/pgr_pickDeliver/pickDeliverEuclidean_driver.cpp +++ b/src/pgr_pickDeliver/pickDeliverEuclidean_driver.cpp @@ -67,11 +67,60 @@ get_initial_solution(vrprouting::problem::PickDeliver* problem_ptr, int m_initia return m_solutions; } + +bool +are_shipments_ok( + PickDeliveryOrders_t *customers_arr, + size_t total_customers, + std::string &err_string, + std::string &hint_string) { + /** + * - demand > 0 (the type is unsigned so no need to check for negative values, only for it to be non 0 + * - pick_service_t >=0 + * - drop_service_t >=0 + * - p_open <= p_close + * - d_open <= d_close + */ + for (size_t i = 0; i < total_customers; ++i) { + if (customers_arr[i].demand == 0) { + err_string = "Unexpected zero value found on column 'demand' of shipments"; + hint_string = "Check shipment id #:" + std::to_string(customers_arr[i].id); + return false; + } + + if (customers_arr[i].pick_service_t < 0) { + err_string = "Unexpected negative value found on column 'p_service_t' of shipments"; + hint_string = "Check shipment id #:" + std::to_string(customers_arr[i].id); + return false; + } + + if (customers_arr[i].deliver_service_t < 0) { + err_string = "Unexpected negative value found on column 'd_service_t' of shipments"; + hint_string = "Check shipment id #:" + std::to_string(customers_arr[i].id); + return false; + } + + if (customers_arr[i].pick_open_t > customers_arr[i].pick_close_t) { + err_string = "Unexpected pickup time windows found on shipments"; + hint_string = "Check shipment id #:" + std::to_string(customers_arr[i].id); + return false; + } + + if (customers_arr[i].deliver_open_t > customers_arr[i].deliver_close_t) { + err_string = "Unexpected delivery time windows found on shipments"; + hint_string = "Check shipment id #:" + std::to_string(customers_arr[i].id); + return false; + } + + } + return true; +} + } // namespace void do_pgr_pickDeliverEuclidean( - struct PickDeliveryOrders_t *customers_arr, + PickDeliveryOrders_t *customers_arr, size_t total_customers, Vehicle_t *vehicles_arr, @@ -93,6 +142,13 @@ do_pgr_pickDeliverEuclidean( try { *return_tuples = nullptr; *return_count = 0; + std::string err_string; + std::string hint_string; + if (!are_shipments_ok(customers_arr, total_customers, err_string, hint_string)) { + *err_msg = pgr_msg(err_string.c_str()); + *log_msg = pgr_msg(hint_string.c_str()); + return; + } /* * transform to C++ containers @@ -105,25 +161,29 @@ do_pgr_pickDeliverEuclidean( std::map, Id> matrix_data; for (const auto &o : orders) { - matrix_data[std::pair(o.pick_x, o.pick_y)] = o.pick_node_id; - matrix_data[std::pair(o.deliver_x, o.deliver_y)] = o.deliver_node_id; + pgassert(o.pick_node_id==0); + pgassert(o.deliver_node_id==0); + matrix_data[std::pair(o.pick_x, o.pick_y)] = 0; + matrix_data[std::pair(o.deliver_x, o.deliver_y)] = 0; } for (const auto &v : vehicles) { - matrix_data[std::pair(v.start_x, v.start_y)] = v.start_node_id; - matrix_data[std::pair(v.end_x, v.end_y)] = v.end_node_id; + matrix_data[std::pair(v.start_x, v.start_y)] = 0; + matrix_data[std::pair(v.end_x, v.end_y)] = 0; } Identifiers unique_ids; + /* + * Data does not have ids for the locations' + */ + Id id(0); + for (auto &e : matrix_data) { + e.second = id++; + } + for (const auto &e : matrix_data) { unique_ids += e.second; - } - if (unique_ids.size() != matrix_data.size()) { - // ignoring ids given by the user - Id id(0); - for (auto &e : matrix_data) { - e.second = id++; - } + log << e.second << "(" << e.first.first << "," << e.first.second << ")\n"; } for (size_t i = 0; i < total_customers; ++i) {