Skip to content

Commit b754efc

Browse files
committed
[spannTree] Reading data on C++ code
1 parent c20342d commit b754efc

File tree

9 files changed

+139
-178
lines changed

9 files changed

+139
-178
lines changed

include/drivers/spanningTree/kruskal_driver.h

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,40 +31,41 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3131
#define INCLUDE_DRIVERS_SPANNINGTREE_KRUSKAL_DRIVER_H_
3232
#pragma once
3333

34-
/* for size-t */
34+
#ifdef __cplusplus
35+
extern "C" {
36+
#endif
37+
38+
#include <postgres.h>
39+
#include <utils/array.h>
40+
41+
#ifdef __cplusplus
42+
}
43+
#endif
44+
45+
#include "cpp_common/undefPostgresDefine.hpp"
46+
3547
#ifdef __cplusplus
3648
# include <cstddef>
3749
# include <cstdint>
38-
using Edge_t = struct Edge_t;
3950
using MST_rt = struct MST_rt;
4051
#else
4152
# include <stddef.h>
4253
# include <stdint.h>
43-
typedef struct Edge_t Edge_t;
4454
typedef struct MST_rt MST_rt;
4555
#endif
4656

4757
#ifdef __cplusplus
4858
extern "C" {
4959
#endif
50-
void
51-
do_pgr_kruskal(
52-
Edge_t *data_edges,
53-
size_t total_edges,
54-
55-
int64_t *root,
56-
size_t total_roots,
5760

58-
char* fn_suffix,
61+
void pgr_do_kruskal(
62+
char*,
63+
ArrayType*,
5964

60-
int64_t max_depth,
61-
double distance,
65+
char*, int64_t, double,
6266

63-
MST_rt **return_tuples,
64-
size_t *return_count,
65-
char ** log_msg,
66-
char ** notice_msg,
67-
char ** err_msg);
67+
MST_rt**, size_t*,
68+
char**, char**, char**);
6869

6970
#ifdef __cplusplus
7071
}

include/drivers/spanningTree/prim_driver.h

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -31,40 +31,42 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3131
#define INCLUDE_DRIVERS_SPANNINGTREE_PRIM_DRIVER_H_
3232
#pragma once
3333

34-
/* for size-t */
34+
#ifdef __cplusplus
35+
extern "C" {
36+
#endif
37+
38+
#include <postgres.h>
39+
#include <utils/array.h>
40+
41+
#ifdef __cplusplus
42+
}
43+
#endif
44+
45+
#include "cpp_common/undefPostgresDefine.hpp"
46+
3547
#ifdef __cplusplus
3648
# include <cstddef>
3749
# include <cstdint>
50+
using MST_rt = struct MST_rt;
3851
#else
3952
# include <stddef.h>
4053
# include <stdint.h>
54+
typedef struct MST_rt MST_rt;
4155
#endif
4256

43-
typedef struct Edge_t Edge_t;
44-
typedef struct MST_rt MST_rt;
4557

4658
#ifdef __cplusplus
4759
extern "C" {
4860
#endif
4961

50-
void do_pgr_prim(
51-
Edge_t *data_edges,
52-
size_t total_edges,
53-
54-
int64_t *rootsArr,
55-
size_t size_rootsArr,
56-
57-
char* fn_suffix,
58-
59-
int64_t max_depth,
60-
double distance,
62+
void pgr_do_prim(
63+
char*,
64+
ArrayType*,
6165

62-
MST_rt **return_tuples,
63-
size_t *return_count,
66+
char*, int64_t, double,
6467

65-
char ** log_msg,
66-
char ** notice_msg,
67-
char ** err_msg);
68+
MST_rt**, size_t*,
69+
char**, char**, char**);
6870

6971
#ifdef __cplusplus
7072
}

include/drivers/spanningTree/randomSpanningTree_driver.h

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,31 +31,40 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3131
#define INCLUDE_DRIVERS_SPANNINGTREE_RANDOMSPANNINGTREE_DRIVER_H_
3232
#pragma once
3333

34-
/* for size-t */
34+
#ifdef __cplusplus
35+
extern "C" {
36+
#endif
37+
38+
#include <postgres.h>
39+
#include <utils/array.h>
40+
41+
#ifdef __cplusplus
42+
}
43+
#endif
44+
45+
#include "cpp_common/undefPostgresDefine.hpp"
46+
3547
#ifdef __cplusplus
3648
# include <cstddef>
49+
using SpanTree_rt = struct SpanTree_rt;
3750
#else
3851
# include <stddef.h>
52+
typedef SpanTree_rt SpanTree_rt;
3953
#endif
4054

41-
typedef struct Edge_t Edge_t;
42-
typedef SpanTree_rt SpanTree_rt;
4355

4456
#ifdef __cplusplus
4557
extern "C" {
4658
#endif
4759

48-
void
49-
do_pgr_randomSpanningTree(
50-
Edge_t *data_edges,
51-
size_t total_edges,
52-
int64_t root_vertex,
53-
bool directed,
54-
SpanTree_rt **return_tuples,
55-
size_t *return_count,
56-
char ** log_msg,
57-
char ** notice_msg,
58-
char ** err_msg);
60+
void pgr_do_randomSpanningTree(
61+
char*,
62+
ArrayType*,
63+
64+
int64_t, double,
65+
66+
SpanTree_rt**, size_t*,
67+
char**, char**, char**);
5968

6069
#ifdef __cplusplus
6170
}

src/spanningTree/kruskal.c

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3434
#include "c_common/debug_macro.h"
3535
#include "c_common/e_report.h"
3636
#include "c_common/time_msg.h"
37-
#include "c_common/trsp_pgget.h"
3837
#include "c_types/mst_rt.h"
3938

4039
#include "drivers/spanningTree/mst_common.h"
@@ -59,6 +58,8 @@ process(
5958
char* log_msg = NULL;
6059
char* notice_msg = NULL;
6160
char* err_msg = NULL;
61+
(*result_tuples) = NULL;
62+
(*result_count) = 0;
6263

6364

6465
char * fn_name = get_name(0, fn_suffix, &err_msg);
@@ -67,30 +68,10 @@ process(
6768
return;
6869
}
6970

70-
/* checks previously done on sql now done here */
71-
if (strcmp(fn_suffix, "DD") == 0 && distance < 0) {
72-
throw_error("Negative value found on 'distance'", "Must be positive");
73-
} else if ((strcmp(fn_suffix, "BFS") == 0 || strcmp(fn_suffix, "DFS") == 0) && max_depth < 0) {
74-
throw_error("Negative value found on 'max_depth'", "Must be positive");
75-
}
76-
77-
size_t size_rootsArr = 0;
78-
int64_t* rootsArr = pgr_get_bigIntArray(&size_rootsArr, roots, false, &err_msg);
79-
throw_error(err_msg, "While getting start vids");
80-
81-
(*result_tuples) = NULL;
82-
(*result_count) = 0;
83-
84-
Edge_t *edges = NULL;
85-
size_t total_edges = 0;
86-
87-
pgr_get_edges(edges_sql, &edges, &total_edges, true, false, &err_msg);
88-
throw_error(err_msg, edges_sql);
89-
9071
clock_t start_t = clock();
91-
do_pgr_kruskal(
92-
edges, total_edges,
93-
rootsArr, size_rootsArr,
72+
pgr_do_kruskal(
73+
edges_sql,
74+
roots,
9475
fn_suffix,
9576
max_depth,
9677
distance,
@@ -100,15 +81,13 @@ process(
10081
&log_msg,
10182
&notice_msg,
10283
&err_msg);
103-
10484
time_msg(fn_name, start_t, clock());
10585

10686
if (err_msg) {
10787
if (*result_tuples) pfree(*result_tuples);
10888
}
10989
pgr_global_report(log_msg, notice_msg, err_msg);
11090

111-
if (edges) pfree(edges);
11291
if (log_msg) pfree(log_msg);
11392
if (notice_msg) pfree(notice_msg);
11493
if (err_msg) pfree(err_msg);
@@ -128,8 +107,6 @@ PGDLLEXPORT Datum _pgr_kruskalv4(PG_FUNCTION_ARGS) {
128107
funcctx = SRF_FIRSTCALL_INIT();
129108
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
130109

131-
132-
/* Edge sql, tree roots, fn_suffix, max_depth, distance */
133110
process(
134111
text_to_cstring(PG_GETARG_TEXT_P(0)),
135112
PG_GETARG_ARRAYTYPE_P(1),
@@ -259,7 +236,6 @@ PGDLLEXPORT Datum _pgr_kruskal(PG_FUNCTION_ARGS) {
259236
values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
260237
values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
261238
values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
262-
/**********************************************************************/
263239

264240
tuple = heap_form_tuple(tuple_desc, values, nulls);
265241
result = HeapTupleGetDatum(tuple);

src/spanningTree/kruskal_driver.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3333
#include <vector>
3434
#include <string>
3535

36+
#include "cpp_common/pgdata_getters.hpp"
3637
#include "cpp_common/pgr_alloc.hpp"
3738
#include "cpp_common/pgr_assert.h"
3839

@@ -41,12 +42,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
4142

4243

4344
void
44-
do_pgr_kruskal(
45-
Edge_t *data_edges,
46-
size_t total_edges,
47-
48-
int64_t *rootsArr,
49-
size_t size_rootsArr,
45+
pgr_do_kruskal(
46+
char *edges_sql,
47+
ArrayType* starts,
5048

5149
char* fn_suffix,
5250

@@ -62,31 +60,39 @@ do_pgr_kruskal(
6260
using pgrouting::pgr_alloc;
6361
using pgrouting::pgr_msg;
6462
using pgrouting::pgr_free;
63+
using pgrouting::pgget::get_intArray;
6564

6665
std::ostringstream log;
6766
std::ostringstream err;
6867
std::ostringstream notice;
68+
char *hint = nullptr;
69+
6970
try {
7071
pgassert(!(*log_msg));
7172
pgassert(!(*notice_msg));
7273
pgassert(!(*err_msg));
7374
pgassert(!(*return_tuples));
7475
pgassert(*return_count == 0);
7576

76-
std::vector<int64_t> roots(rootsArr, rootsArr + size_rootsArr);
77+
auto roots = get_intArray(starts, false);
78+
79+
hint = edges_sql;
80+
auto edges = pgrouting::pgget::get_edges(std::string(edges_sql), true, false);
81+
hint = nullptr;
82+
7783
std::string suffix(fn_suffix);
7884

7985
std::vector<MST_rt> results;
8086

81-
if (total_edges == 0) {
87+
pgrouting::UndirectedGraph undigraph(UNDIRECTED);
88+
undigraph.insert_edges(edges);
89+
pgrouting::functions::Pgr_kruskal<pgrouting::UndirectedGraph> kruskal;
90+
91+
if (edges.empty()) {
8292
results = pgrouting::details::get_no_edge_graph_result(roots);
93+
*notice_msg = pgr_msg("No edges found");
94+
*log_msg = pgr_msg(edges_sql);
8395
} else {
84-
pgrouting::UndirectedGraph undigraph(UNDIRECTED);
85-
undigraph.insert_edges(data_edges, total_edges);
86-
87-
pgrouting::functions::Pgr_kruskal
88-
<pgrouting::UndirectedGraph> kruskal;
89-
9096
if (suffix == "") {
9197
results = kruskal.kruskal(undigraph);
9298
} else if (suffix == "BFS") {
@@ -104,13 +110,6 @@ do_pgr_kruskal(
104110

105111
auto count = results.size();
106112

107-
if (count == 0) {
108-
(*return_tuples) = NULL;
109-
(*return_count) = 0;
110-
notice << "No spanning tree found";
111-
return;
112-
}
113-
114113
(*return_tuples) = pgr_alloc(count, (*return_tuples));
115114
for (size_t i = 0; i < count; i++) {
116115
*((*return_tuples) + i) = results[i];
@@ -130,6 +129,9 @@ do_pgr_kruskal(
130129
err << except.what();
131130
*err_msg = pgr_msg(err.str().c_str());
132131
*log_msg = pgr_msg(log.str().c_str());
132+
} catch (const std::string &ex) {
133+
*err_msg = pgr_msg(ex.c_str());
134+
*log_msg = hint? pgr_msg(hint) : pgr_msg(log.str().c_str());
133135
} catch (std::exception &except) {
134136
(*return_tuples) = pgr_free(*return_tuples);
135137
(*return_count) = 0;

0 commit comments

Comments
 (0)