Skip to content

Commit a928e3c

Browse files
authored
Merge pull request #11 from nike0good/toposort
pgr_topologicalSort GSOC-2019 week 3
2 parents c9642b8 + 1afa3ce commit a928e3c

File tree

8 files changed

+112
-97
lines changed

8 files changed

+112
-97
lines changed

include/topologicalSort/pgr_topologicalSort.hpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3535
#include <boost/typeof/typeof.hpp>
3636
#include <boost/graph/topological_sort.hpp>
3737

38+
3839
#include <iostream>
3940
#include <vector>
4041
#include <algorithm>
@@ -65,8 +66,20 @@ class Pgr_topologicalSort {
6566
std::vector< pgr_topologicalSort_t >
6667
generatetopologicalSort(
6768
const G &graph ) {
68-
std::vector< pgr_topologicalSort_t > results;
69-
69+
70+
std::vector< pgr_topologicalSort_t > results;
71+
72+
typedef typename std::vector< V > container;
73+
container c;
74+
topological_sort(graph.graph, std::back_inserter(c));
75+
76+
typename std::vector< V >::reverse_iterator ii;
77+
for (ii=c.rbegin(); ii!=c.rend(); ++ii) {
78+
auto t=*ii;
79+
pgr_topologicalSort_t tmp;
80+
tmp.sorted_v=t;
81+
results.push_back(tmp);
82+
}
7083
// auto parities = boost::make_one_bit_color_map(
7184
// num_vertices(graph.graph),
7285
// get(boost::vertex_index, graph.graph));
@@ -101,9 +114,9 @@ class Pgr_topologicalSort {
101114
// }
102115

103116
// pgassert(w == totalcost);
104-
pgr_topologicalSort_t tmp;
105-
tmp.seq=tmp.sorted_v=1;
106-
results.push_back(tmp);
117+
// pgr_topologicalSort_t tmp;
118+
// tmp.seq=tmp.sorted_v=1;
119+
// results.push_back(tmp);
107120
return results;
108121
}
109122
};
@@ -112,7 +125,7 @@ template < class G >
112125
std::vector<pgr_topologicalSort_t>
113126
Pgr_topologicalSort< G >::topologicalSort(
114127
G &graph) {
115-
// pgassert(num_vertices(graph.graph) > 1);
128+
pgassert(num_vertices(graph.graph) > 1);
116129
return generatetopologicalSort(
117130
graph);
118131
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
\i setup.sql
2+
3+
SELECT plan(5);
4+
5+
CREATE TABLE edge_table1 (
6+
id serial,
7+
source integer,
8+
target integer,
9+
cost double precision,
10+
reverse_cost double precision
11+
);
12+
INSERT INTO edge_table1 (source,target,cost,reverse_cost) VALUES ( 1, 2,0,0);
13+
INSERT INTO edge_table1 (source,target,cost,reverse_cost) VALUES (2,3,0,0);
14+
15+
SELECT has_function('pgr_topologicalsort');
16+
17+
SELECT function_returns('pgr_topologicalsort', ARRAY['text'], 'setof record');
18+
19+
-- flags
20+
-- error
21+
SELECT throws_ok(
22+
'SELECT * FROM pgr_topologicalsort(
23+
''SELECT id, source, target, cost, reverse_cost FROM edge_table id < 2'',
24+
3
25+
)','42883','function pgr_topologicalsort(unknown, integer) does not exist',
26+
'6: Documentation says it does not work with 1 flags');
27+
28+
29+
SELECT lives_ok(
30+
'SELECT * FROM pgr_topologicalsort(
31+
''SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2 ''
32+
)',
33+
'4: Documentation says works with no flags');
34+
35+
36+
-- prepare for testing return types
37+
38+
PREPARE all_return AS
39+
SELECT
40+
'integer'::text AS t1,
41+
'integer'::text AS t2;
42+
43+
PREPARE q1 AS
44+
SELECT pg_typeof(seq)::text AS t1,
45+
pg_typeof(sorted_v)::text AS t2
46+
FROM (
47+
SELECT * FROM pgr_topologicalsort(
48+
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2'
49+
) ) AS a
50+
limit 1;
51+
52+
53+
SELECT set_eq('q1', 'all_return', 'Expected returning, columns names & types');
54+
55+
SELECT * FROM finish();
56+
ROLLBACK;

pgtap/topologicalSort/topologicalSort-innerQuery.sql

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,11 @@
22

33
SELECT plan(2);
44

5-
SELECT has_function('pgr_topologicalSort',
6-
ARRAY['text']);
5+
SET client_min_messages TO ERROR;
76

8-
SELECT function_returns('pgr_topologicalSort',
9-
ARRAY['text'],
10-
'setof record');
7+
SELECT has_function('pgr_topologicalsort');
118

9+
SELECT function_returns('pgr_topologicalsort',ARRAY['text'],'setof record');
1210

13-
SELECT * FROM finish();
11+
SELECT finish();
1412
ROLLBACK;

sql/topologicalSort/_topologicalSort.sql

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ Mail: [email protected]
66
Function's developer:
77
Copyright (c) 2019 Hang Wu
88
9-
109
------
1110
1211
This program is free software; you can redistribute it and/or modify
@@ -26,21 +25,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2625
********************************************************************PGR-GNU*/
2726

2827
---------------
29-
---------------
30-
-- topologicalSort
31-
---------------
28+
-- pgr_topologicalSort
3229
---------------
3330

31+
3432
CREATE OR REPLACE FUNCTION _pgr_topologicalSort(
3533
edges_sql TEXT,
3634

3735
OUT seq INTEGER,
3836
OUT sorted_v INTEGER)
3937
RETURNS SETOF RECORD AS
4038
'MODULE_PATHNAME', 'topologicalSort'
41-
LANGUAGE C VOLATILE STRICT;
39+
LANGUAGE c VOLATILE STRICT;
4240

4341
-- COMMENTS
4442

43+
4544
COMMENT ON FUNCTION _pgr_topologicalSort(TEXT)
4645
IS 'pgRouting internal function';
46+

sql/topologicalSort/topologicalSort.sql

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,26 +28,29 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
2828
-- pgr_topologicalSort
2929
---------------
3030

31+
3132
CREATE OR REPLACE FUNCTION pgr_topologicalSort(
32-
TEXT, -- edges_sql (required)
33-
33+
edges_sql TEXT, -- edges_sql (required)
34+
3435
OUT seq INTEGER,
3536
OUT sorted_v INTEGER)
3637
RETURNS SETOF RECORD AS
3738
$BODY$
3839
SELECT *
39-
FROM _pgr_topologicalSort(_pgr_get_statement($1)) ;
40+
FROM _pgr_topologicalSort(_pgr_get_statement($1));
4041
$BODY$
41-
LANGUAGE sql VOLATILE STRICT
42+
LANGUAGE SQL VOLATILE STRICT;
4243

4344

4445
-- COMMENTS
4546

47+
4648
COMMENT ON FUNCTION pgr_topologicalSort(TEXT)
4749
IS 'pgr_topologicalSort
50+
- EXPERIMENTAL
51+
- Directed graph
4852
- Parameters:
49-
- Edges SQL with columns: id, source, target, cost [,reverse_cost]
53+
- edges SQL with columns: id, source, target, cost [,reverse_cost]
5054
- Documentation:
51-
- ${PGROUTING_DOC_LINK}/pgr_topologicalSort.html
55+
- ${PGROUTING_DOC_LINK}/pgr_topologicalSort.html
5256
';
53-

src/topologicalSort/topologicalSort_driver.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
3535
#include <algorithm>
3636
#include <limits>
3737

38-
//#if 0
3938
#include "topologicalSort/pgr_topologicalSort.hpp"
40-
//#endif
39+
4140
//TODO(nike0good) : Remove below headers once pgr_topologicalSort.hpp is implemented.
4241
#include "cpp_common/basePath_SSEC.hpp"
4342
#include "cpp_common/pgr_base_graph.hpp"
@@ -51,14 +50,14 @@ static
5150
std::vector<pgr_topologicalSort_t>
5251
pgr_topologicalSort(
5352
G &graph) {
54-
5553
Pgr_topologicalSort< G > fn_topologicalSort;
5654
return fn_topologicalSort.topologicalSort(graph);
57-
/*
55+
#if 0
5856
std::vector<pgr_topologicalSort_t> vv;
59-
return vv;*/
60-
}
57+
return vv;
58+
#endif
6159

60+
}
6261

6362

6463
// CREATE OR REPLACE FUNCTION pgr_topologicalSort(
Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +0,0 @@
1-
BEGIN;
2-
BEGIN
3-
SET client_min_messages TO NOTICE;
4-
SET
5-
SELECT * FROM pgr_topologicalSort(
6-
\'SELECT id, source, target, cost, reverse_cost FROM edge_table\'
7-
);
8-
ERROR: function pgr_topologicalsort(unknown) does not exist
9-
LINE 1: SELECT * FROM pgr_topologicalSort(
10-
^
11-
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
12-
-- q1
13-
SELECT * FROM pgr_topologicalSort(
14-
\'SELECT id, source, target, cost, reverse_cost
15-
FROM edge_table
16-
WHERE id < 17\'
17-
);
18-
ERROR: current transaction is aborted, commands ignored until end of transaction block
19-
-- q2
20-
SELECT * FROM pgr_topologicalSort(
21-
\'SELECT id, source, target, cost, reverse_cost
22-
FROM edge_table
23-
WHERE id = 18\'
24-
);
25-
ERROR: current transaction is aborted, commands ignored until end of transaction block
26-
-- q3
27-
SELECT * FROM pgr_topologicalSort(
28-
$$
29-
SELECT id, source, target, cost, reverse_cost FROM edge_table
30-
where source = any (ARRAY(SELECT node FROM pgr_connectedComponents(
31-
\'SELECT id, source, target, cost, reverse_cost FROM edge_table \')
32-
WHERE component = 14)
33-
)
34-
OR
35-
target = any (ARRAY(SELECT node FROM pgr_connectedComponents(
36-
\'SELECT id, source, target, cost, reverse_cost FROM edge_table \')
37-
WHERE component = 14)
38-
)
39-
$$
40-
);
41-
ERROR: current transaction is aborted, commands ignored until end of transaction block
42-
-- q4
43-
ROLLBACK;
44-
ROLLBACK
Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,25 @@
1-
SELECT * FROM pgr_topologicalSort(
2-
'SELECT id, source, target, cost, reverse_cost FROM edge_table'
3-
);
41

52
\echo -- q1
63
SELECT * FROM pgr_topologicalSort(
7-
'SELECT id, source, target, cost, reverse_cost
8-
FROM edge_table
9-
WHERE id < 17'
4+
'SELECT id, source, target, cost FROM edge_table',
5+
1, 6
106
);
117

128
\echo -- q2
139
SELECT * FROM pgr_topologicalSort(
14-
'SELECT id, source, target, cost, reverse_cost
15-
FROM edge_table
16-
WHERE id = 18'
10+
'SELECT id, source, target, cost FROM edge_table',
11+
1, ARRAY[5,6]
1712
);
18-
1913
\echo -- q3
2014
SELECT * FROM pgr_topologicalSort(
21-
$$
22-
SELECT id, source, target, cost, reverse_cost FROM edge_table
23-
where source = any (ARRAY(SELECT node FROM pgr_connectedComponents(
24-
'SELECT id, source, target, cost, reverse_cost FROM edge_table ')
25-
WHERE component = 14)
26-
)
27-
OR
28-
target = any (ARRAY(SELECT node FROM pgr_connectedComponents(
29-
'SELECT id, source, target, cost, reverse_cost FROM edge_table ')
30-
WHERE component = 14)
31-
)
32-
$$
33-
);
15+
'SELECT id, source, target, cost FROM edge_table',
16+
ARRAY[1,3], 6
17+
);
3418

3519
\echo -- q4
20+
SELECT * FROM pgr_topologicalSort(
21+
'SELECT id, source, target, cost FROM edge_table',
22+
ARRAY[1, 4],ARRAY[12,6]
23+
);
24+
\echo -- q5
25+

0 commit comments

Comments
 (0)