53 char* multipliers_sql,
57 int64_t execution_date,
59 bool check_triangle_inequality,
64 size_t *result_count) {
68 (errcode(ERRCODE_INTERNAL_ERROR),
69 errmsg(
"Illegal value in parameter: factor"),
70 errhint(
"Value found: %f <= 0", factor)));
76 (errcode(ERRCODE_INTERNAL_ERROR),
77 errmsg(
"Illegal value in parameter: max_cycles"),
78 errhint(
"Value found: %d <= 0", max_cycles)));
82 if (subdivision_kind < 0 || subdivision_kind > 2) {
84 (errcode(ERRCODE_INTERNAL_ERROR),
85 errmsg(
"Illegal value in parameter: subdivision_kind"),
86 errhint(
"Value found: %d", max_cycles)));
92 size_t total_pd_orders = 0;
94 get_shipments(pd_orders_sql, &pd_orders_arr, &total_pd_orders);
99 if (total_pd_orders == 0) {
101 (*result_tuples) = NULL;
104 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
111 size_t total_vehicles = 0;
112 if (use_timestamps) {
113 get_vehicles(vehicles_sql, &vehicles_arr, &total_vehicles,
true);
118 if (total_vehicles == 0) {
120 (*result_tuples) = NULL;
123 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
124 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
127 (errcode(ERRCODE_INTERNAL_ERROR),
128 errmsg(
"No vehicles found")));
135 size_t total_multipliers_arr = 0;
136 if (use_timestamps) {
142 if (total_multipliers_arr == 0) {
144 (errcode(ERRCODE_INTERNAL_ERROR),
145 errmsg(
"No matrix found")));
147 (*result_tuples) = NULL;
150 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
151 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
152 if (multipliers_arr) {pfree(multipliers_arr); multipliers_arr = NULL;}
159 size_t total_cells = 0;
160 if (use_timestamps) {
166 if (total_cells == 0) {
168 (*result_tuples) = NULL;
171 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
172 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
173 if (multipliers_arr) {pfree(multipliers_arr); multipliers_arr = NULL;}
174 if (matrix_cells_arr) {pfree(matrix_cells_arr); matrix_cells_arr = NULL;}
177 (errcode(ERRCODE_INTERNAL_ERROR),
178 errmsg(
"No matrix found")));
183 PGR_DBG(
"Total %ld orders in query:", total_pd_orders);
184 PGR_DBG(
"Total %ld vehicles in query:", total_vehicles);
185 PGR_DBG(
"Total %ld matrix cells in query:", total_cells);
186 PGR_DBG(
"Total %ld time dependant multipliers:", total_multipliers_arr);
188 clock_t start_t = clock();
189 char *log_msg = NULL;
190 char *notice_msg = NULL;
191 char *err_msg = NULL;
194 pd_orders_arr, total_pd_orders,
195 vehicles_arr, total_vehicles,
196 matrix_cells_arr, total_cells,
197 multipliers_arr, total_multipliers_arr,
203 check_triangle_inequality,
204 subdivision_kind != 0,
205 subdivision_kind == 1,
214 time_msg(
"pgr_pickDeliver", start_t, clock());
216 if (err_msg && (*result_tuples)) {
217 pfree(*result_tuples);
219 (*result_tuples) = NULL;
224 if (log_msg) {pfree(log_msg); log_msg = NULL;}
225 if (notice_msg) {pfree(notice_msg); notice_msg = NULL;}
226 if (err_msg) {pfree(err_msg); err_msg = NULL;}
227 if (pd_orders_arr) {pfree(pd_orders_arr); pd_orders_arr = NULL;}
228 if (vehicles_arr) {pfree(vehicles_arr); vehicles_arr = NULL;}
229 if (multipliers_arr) {pfree(multipliers_arr); multipliers_arr = NULL;}
230 if (matrix_cells_arr) {pfree(matrix_cells_arr); matrix_cells_arr = NULL;}
242 FuncCallContext *funcctx;
243 TupleDesc tuple_desc;
247 size_t result_count = 0;
250 if (SRF_IS_FIRSTCALL()) {
251 MemoryContext oldcontext;
252 funcctx = SRF_FIRSTCALL_INIT();
253 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
256 text_to_cstring(PG_GETARG_TEXT_P(0)),
257 text_to_cstring(PG_GETARG_TEXT_P(1)),
258 text_to_cstring(PG_GETARG_TEXT_P(2)),
259 text_to_cstring(PG_GETARG_TEXT_P(3)),
274 #if PGSQL_VERSION > 95
275 funcctx->max_calls = result_count;
277 funcctx->max_calls = (uint32_t)result_count;
279 funcctx->user_fctx = result_tuples;
280 if (get_call_result_type(fcinfo, NULL, &tuple_desc)
281 != TYPEFUNC_COMPOSITE) {
283 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
284 errmsg(
"function returning record called in context "
285 "that cannot accept type record")));
288 funcctx->tuple_desc = tuple_desc;
289 MemoryContextSwitchTo(oldcontext);
292 funcctx = SRF_PERCALL_SETUP();
293 tuple_desc = funcctx->tuple_desc;
296 if (funcctx->call_cntr < funcctx->max_calls) {
301 size_t call_cntr = funcctx->call_cntr;
304 values = palloc(numb *
sizeof(Datum));
305 nulls = palloc(numb *
sizeof(
bool));
308 for (i = 0; i < numb; ++i) {
313 values[0] = Int32GetDatum(funcctx->call_cntr + 1);
314 values[1] = Int64GetDatum(result_tuples[call_cntr].vehicle_id);
315 values[2] = Int64GetDatum(result_tuples[call_cntr].order_id);
319 tuple = heap_form_tuple(tuple_desc, values, nulls);
320 result = HeapTupleGetDatum(tuple);
322 pfree(values); values = NULL;
323 pfree(nulls); nulls = NULL;
325 SRF_RETURN_NEXT(funcctx, result);
327 if (result_tuples) {pfree(result_tuples); result_tuples = NULL;}
328 funcctx->user_fctx = NULL;
329 SRF_RETURN_DONE(funcctx);