52 int initial_solution_id,
55 size_t *result_count) {
58 (errcode(ERRCODE_INTERNAL_ERROR),
59 errmsg(
"Illegal value in parameter: factor"),
60 errhint(
"Value found: %f <= 0", factor)));
62 (*result_tuples) = NULL;
68 (errcode(ERRCODE_INTERNAL_ERROR),
69 errmsg(
"Illegal value in parameter: max_cycles"),
70 errhint(
"Value found: %d <= 0", max_cycles)));
72 (*result_tuples) = NULL;
76 if (initial_solution_id < 0 || initial_solution_id > 7) {
78 (errcode(ERRCODE_INTERNAL_ERROR),
79 errmsg(
"Illegal value in parameter: initial"),
80 errhint(
"Value found: %d <= 0", initial_solution_id)));
82 (*result_tuples) = NULL;
89 size_t total_pd_orders = 0;
91 &pd_orders_arr, &total_pd_orders);
93 if (total_pd_orders == 0) {
95 (*result_tuples) = NULL;
98 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
102 (errcode(ERRCODE_INTERNAL_ERROR),
103 errmsg(
"No orders found")));
109 size_t total_vehicles = 0;
111 &vehicles_arr, &total_vehicles,
114 if (total_vehicles == 0) {
116 (*result_tuples) = NULL;
119 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
120 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
124 (errcode(ERRCODE_INTERNAL_ERROR),
125 errmsg(
"No vehicles found")));
130 PGR_DBG(
"total orders %ld", total_pd_orders);
131 for (
size_t i = 0; i < total_pd_orders; i++) {
132 PGR_DBG(
"%ld %f pick %ld - %ld %ld %ld"
133 "deliver %ld - %ld %ld %ld ",
135 pd_orders_arr[i].demand,
137 pd_orders_arr[i].pick_node_id,
139 pd_orders_arr[i].pick_open_t,
140 pd_orders_arr[i].pick_close_t,
141 pd_orders_arr[i].pick_service_t,
143 pd_orders_arr[i].deliver_node_id,
145 pd_orders_arr[i].deliver_open_t,
146 pd_orders_arr[i].deliver_close_t,
147 pd_orders_arr[i].deliver_service_t);
152 PGR_DBG(
"total vehicles %ld", total_vehicles);
153 for (
size_t i = 0; i < total_vehicles; i++) {
154 PGR_DBG(
"%ld %f %f , start %ld %ld %ld %ld "
155 "end %ld %ld %ld %ld number %ld ",
157 vehicles_arr[i].capacity,
158 vehicles_arr[i].speed,
160 vehicles_arr[i].start_node_id,
161 vehicles_arr[i].start_open_t,
162 vehicles_arr[i].start_close_t,
163 vehicles_arr[i].start_service_t,
165 vehicles_arr[i].end_node_id,
166 vehicles_arr[i].end_open_t,
167 vehicles_arr[i].end_close_t,
168 vehicles_arr[i].end_service_t,
170 vehicles_arr[i].cant_v);
175 size_t total_cells = 0;
178 PGR_DBG(
"total matrix rows %ld", total_cells);
180 for (
size_t i = 0; i < total_cells; i++) {
182 matrix_cells_arr[i].from_vid,
183 matrix_cells_arr[i].to_vid,
184 matrix_cells_arr[i].cost);
188 if (total_cells == 0) {
190 (*result_tuples) = NULL;
193 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
194 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
195 if (matrix_cells_arr) {pfree(matrix_cells_arr); matrix_cells_arr = NULL;}
198 (errcode(ERRCODE_INTERNAL_ERROR),
199 errmsg(
"No matrix found")));
205 PGR_DBG(
"Total %ld orders in query:", total_pd_orders);
206 PGR_DBG(
"Total %ld vehicles in query:", total_vehicles);
207 PGR_DBG(
"Total %ld matrix cells in query:", total_cells);
210 PGR_DBG(
"Starting processing");
211 clock_t start_t = clock();
212 char *log_msg = NULL;
213 char *notice_msg = NULL;
214 char *err_msg = NULL;
217 pd_orders_arr, total_pd_orders,
218 vehicles_arr, total_vehicles,
219 matrix_cells_arr, total_cells,
232 time_msg(
"pgr_pickDeliver", start_t, clock());
234 if (err_msg && (*result_tuples)) {
235 pfree(*result_tuples);
237 (*result_tuples) = NULL;
242 if (log_msg) {pfree(log_msg); log_msg = NULL;}
243 if (notice_msg) {pfree(notice_msg); notice_msg = NULL;}
244 if (err_msg) {pfree(err_msg); err_msg = NULL;}
245 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
246 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
247 if (matrix_cells_arr) {pfree(matrix_cells_arr); matrix_cells_arr = NULL;}
259 FuncCallContext *funcctx;
260 TupleDesc tuple_desc;
264 size_t result_count = 0;
267 if (SRF_IS_FIRSTCALL()) {
268 MemoryContext oldcontext;
269 funcctx = SRF_FIRSTCALL_INIT();
270 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
282 text_to_cstring(PG_GETARG_TEXT_P(0)),
283 text_to_cstring(PG_GETARG_TEXT_P(1)),
284 text_to_cstring(PG_GETARG_TEXT_P(2)),
293 funcctx->max_calls = result_count;
294 funcctx->user_fctx = result_tuples;
295 if (get_call_result_type(fcinfo, NULL, &tuple_desc)
296 != TYPEFUNC_COMPOSITE) {
298 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
299 errmsg(
"function returning record called in context "
300 "that cannot accept type record")));
303 funcctx->tuple_desc = tuple_desc;
304 MemoryContextSwitchTo(oldcontext);
307 funcctx = SRF_PERCALL_SETUP();
308 tuple_desc = funcctx->tuple_desc;
311 if (funcctx->call_cntr < funcctx->max_calls) {
316 size_t call_cntr = funcctx->call_cntr;
337 values = palloc(numb *
sizeof(Datum));
338 nulls = palloc(numb *
sizeof(
bool));
341 for (i = 0; i < numb; ++i) {
346 values[0] = Int32GetDatum(funcctx->call_cntr + 1);
347 values[1] = Int32GetDatum(result_tuples[call_cntr].vehicle_seq);
348 values[2] = Int64GetDatum(result_tuples[call_cntr].vehicle_id);
349 values[3] = Int32GetDatum(result_tuples[call_cntr].stop_seq);
350 values[4] = Int32GetDatum(result_tuples[call_cntr].stop_type + 1);
351 values[5] = Int64GetDatum(result_tuples[call_cntr].stop_id);
352 values[6] = Int64GetDatum(result_tuples[call_cntr].order_id);
353 values[7] = Int64GetDatum(result_tuples[call_cntr].cargo);
354 values[8] = Int64GetDatum(result_tuples[call_cntr].travelTime);
355 values[9] = Int64GetDatum(result_tuples[call_cntr].arrivalTime);
356 values[10] = Int64GetDatum(result_tuples[call_cntr].waitDuration);
357 values[11] = Int64GetDatum(result_tuples[call_cntr].serviceDuration);
358 values[12] = Int64GetDatum(result_tuples[call_cntr].departureTime);
362 tuple = heap_form_tuple(tuple_desc, values, nulls);
363 result = HeapTupleGetDatum(tuple);
364 SRF_RETURN_NEXT(funcctx, result);
366 SRF_RETURN_DONE(funcctx);