/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t end_pid, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = tolower(driving_side[0]); PGR_DBG("driving side:%c",driving_side[0]); if (! ((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } PGR_DBG("estimated driving side:%c",driving_side[0]); pgr_SPI_connect(); PGR_DBG("load the points"); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); #ifdef DEBUG size_t i = 0; for (i = 0; i < total_points; i ++) { PGR_DBG("%ld\t%ld\t%f\t%c",points[i].pid, points[i].edge_id, points[i].fraction, points[i].side); } #endif PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_data_5_columns(edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); #ifdef DEBUG for (i = 0; i < total_edges_of_points; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges_of_points[i].id, edges_of_points[i].source, edges_of_points[i].target, edges_of_points[i].cost, edges_of_points[i].reverse_cost); } #endif PGR_DBG("load the edges that dont match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_data_5_columns(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); #ifdef DEBUG for (i = 0; i < total_edges; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges[i].id, edges[i].source, edges[i].target, edges[i].cost, edges[i].reverse_cost); } #endif PGR_DBG("freeing allocated memory not used anymore"); free(edges_of_points_query); free(edges_no_points_query); if ( (total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char *err_msg = NULL; clock_t start_t = clock(); int errcode = do_pgr_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pid, directed, driving_side[0], details, only_cost, result_tuples, result_count, &err_msg); time_msg(" processing withPoints one to one", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("Returned message = %s\n", err_msg); if (!err_msg) free(err_msg); pfree(edges); pgr_SPI_finish(); if (errcode) { pgr_send_error(errcode); } }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t end_pid, int k, bool directed, bool heap_paths, char *driving_side, bool details, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = (char) tolower(driving_side[0]); PGR_DBG("driving side:%c",driving_side[0]); if (! ((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } pgr_SPI_connect(); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("freeing allocated memory not used anymore"); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); clock_t start_t = clock(); char *log_msg = NULL; char *notice_msg = NULL; char *err_msg = NULL; do_pgr_withPointsKsp( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pid, k, directed, heap_paths, driving_side[0], details, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); time_msg(" processing withPointsKSP", start_t, clock()); PGR_DBG("Returned message = %s\n", err_msg); if (err_msg) { if (*result_tuples) free(*result_tuples); } pgr_global_report(log_msg, notice_msg, err_msg); pfree(edges); pfree(edges_of_points); pfree(points); pgr_SPI_finish(); }
/* MODIFY AS NEEDED */ static void process( char* edges_sql, char* points_sql, int64_t start_pid, int64_t *end_pidsArr, size_t size_end_pidsArr, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = (char) tolower(driving_side[0]); PGR_DBG("driving side:%c", driving_side[0]); if (!((driving_side[0] == 'r') || (driving_side[0] == 'l'))) { driving_side[0] = 'b'; } PGR_DBG("estimated driving side:%c", driving_side[0]); pgr_SPI_connect(); PGR_DBG("load the points"); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); #if 0 #ifndef NDEBUG size_t i = 0; for (i = 0; i < total_points; i ++) { PGR_DBG("%ld\t%ld\t%f\t%c", points[i].pid, points[i].edge_id, points[i].fraction, points[i].side); } #endif #endif /* * TODO move this code to c++ */ PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); #if 0 #ifndef NDEBUG for (i = 0; i < total_edges_of_points; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges_of_points[i].id, edges_of_points[i].source, edges_of_points[i].target, edges_of_points[i].cost, edges_of_points[i].reverse_cost); } #endif #endif PGR_DBG("load the edges that don't match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); #if 0 #ifndef NDEBUG for (i = 0; i < total_edges; i ++) { PGR_DBG("%ld\t%ld\t%ld\t%f\t%f", edges[i].id, edges[i].source, edges[i].target, edges[i].cost, edges[i].reverse_cost); } #endif PGR_DBG("freeing allocated memory not used anymore"); #endif free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); (*result_count) = 0; (*result_tuples) = NULL; pgr_SPI_finish(); return; } PGR_DBG("Starting processing"); char *err_msg = NULL; char *log_msg = NULL; clock_t start_t = clock(); do_pgr_one_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pid, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, result_tuples, result_count, &log_msg, &err_msg); time_msg(" processing withPoints one to many", start_t, clock()); PGR_DBG("Returning %ld tuples\n", *result_count); PGR_DBG("LOG: %s\n", log_msg); if (log_msg) free(log_msg); if (err_msg) { if (*result_tuples) free(*result_tuples); if (end_pidsArr) free(end_pidsArr); elog(ERROR, "%s", err_msg); free(err_msg); } pfree(edges); pgr_SPI_finish(); }
static void process( char* edges_sql, char* points_sql, int64_t start_pid, ArrayType *ends, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = estimate_drivingSide(driving_side[0]); PGR_DBG("estimated driving side:%c", driving_side[0]); pgr_SPI_connect(); size_t size_end_pidsArr = 0; int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends); PGR_DBG("load the points"); size_t total_points = 0; Point_on_edge_t *points = NULL; pgr_get_points(points_sql, &points, &total_points); PGR_DBG(" -- change the query"); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); PGR_DBG("edges_of_points_query:\n%s", edges_of_points_query); PGR_DBG("edges_no_points_query:\n%s", edges_no_points_query); PGR_DBG("load the edges that match the points"); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges( edges_of_points_query, &edges_of_points, &total_edges_of_points); PGR_DBG("Total %ld edges in query:", total_edges_of_points); PGR_DBG("load the edges that don't match the points"); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); PGR_DBG("Total %ld edges in query:", total_edges); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { PGR_DBG("No edges found"); pgr_SPI_finish(); return; } PGR_DBG("Starting timer"); clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; do_pgr_many_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, &start_pid, 1, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, true, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_cost) { time_msg("processing pgr_withPointsCost(one to many)", start_t, clock()); } else { time_msg("processing pgr_withPoints(one to many)", start_t, clock()); } if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_count) = 0; (*result_tuples) = NULL; } pgr_global_report(log_msg, notice_msg, err_msg); if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (edges) pfree(edges); if (points) pfree(points); if (edges_of_points) pfree(edges_of_points); if (end_pidsArr) pfree(end_pidsArr); pgr_SPI_finish(); }
static void process( char* edges_sql, char* points_sql, ArrayType *starts, ArrayType *ends, bool directed, char *driving_side, bool details, bool only_cost, General_path_element_t **result_tuples, size_t *result_count) { driving_side[0] = estimate_drivingSide(driving_side[0]); pgr_SPI_connect(); size_t size_start_pidsArr = 0; int64_t* start_pidsArr = pgr_get_bigIntArray(&size_start_pidsArr, starts); size_t size_end_pidsArr = 0; int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends); Point_on_edge_t *points = NULL; size_t total_points = 0; pgr_get_points(points_sql, &points, &total_points); char *edges_of_points_query = NULL; char *edges_no_points_query = NULL; get_new_queries( edges_sql, points_sql, &edges_of_points_query, &edges_no_points_query); pgr_edge_t *edges_of_points = NULL; size_t total_edges_of_points = 0; pgr_get_edges( edges_of_points_query, &edges_of_points, &total_edges_of_points); pgr_edge_t *edges = NULL; size_t total_edges = 0; pgr_get_edges(edges_no_points_query, &edges, &total_edges); free(edges_of_points_query); free(edges_no_points_query); if ((total_edges + total_edges_of_points) == 0) { pgr_SPI_finish(); return; } clock_t start_t = clock(); char* log_msg = NULL; char* notice_msg = NULL; char* err_msg = NULL; do_pgr_many_to_many_withPoints( edges, total_edges, points, total_points, edges_of_points, total_edges_of_points, start_pidsArr, size_start_pidsArr, end_pidsArr, size_end_pidsArr, driving_side[0], details, directed, only_cost, true, result_tuples, result_count, &log_msg, ¬ice_msg, &err_msg); if (only_cost) { time_msg("processing pgr_withPointsCost(one to one)", start_t, clock()); } else { time_msg("processing pgr_withPoints(one to one)", start_t, clock()); } if (err_msg && (*result_tuples)) { pfree(*result_tuples); (*result_count) = 0; (*result_tuples) = NULL; } pgr_global_report(log_msg, notice_msg, err_msg); #if 0 if (log_msg) pfree(log_msg); if (notice_msg) pfree(notice_msg); if (err_msg) pfree(err_msg); if (edges) pfree(edges); if (points) pfree(points); if (edges_of_points) pfree(edges_of_points); if (start_pidsArr) pfree(start_pidsArr); if (end_pidsArr) pfree(end_pidsArr); #endif pgr_SPI_finish(); }