File: edge_cases.pg

package info (click to toggle)
pgrouting 4.0.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 17,332 kB
  • sloc: cpp: 21,315; sql: 10,419; ansic: 9,795; perl: 1,142; sh: 919; javascript: 314; xml: 182; makefile: 29
file content (139 lines) | stat: -rw-r--r-- 3,098 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/* :file: This file is part of the pgRouting project.
:copyright: Copyright (c) 2025-2026 pgRouting developers
:license: Creative Commons Attribution-Share Alike 3.0 https://creativecommons.org/licenses/by-sa/3.0 */


BEGIN;

UPDATE edges SET cost = sign(cost), reverse_cost = sign(reverse_cost);
SELECT CASE WHEN NOT min_version('4.0.0') THEN plan(1) ELSE plan(7) END;


CREATE OR REPLACE FUNCTION edge_cases()
RETURNS SETOF TEXT AS
$BODY$
BEGIN

IF NOT min_version('4.0.0') THEN
  RETURN QUERY
  SELECT skip(1, 'Function is new on 4.0.0');
  RETURN;
END IF;

-- 0 edge, 0 vertex test

PREPARE q1 AS
SELECT * FROM pgr_kingOrdering(
'SELECT id, source, target, cost, reverse_cost FROM edges WHERE id > 18'
);

RETURN QUERY
SELECT is_empty('q1', 'Graph with 0 edge and 0 vertex -> Empty row is returned');

-- 1 vertex test: 6 -- 6

PREPARE q2 AS
SELECT *
FROM pgr_kingOrdering('SELECT id, source, source AS target, cost, reverse_cost FROM edges WHERE id = 2');

RETURN QUERY
SELECT set_eq('q2', $$VALUES (1, 6)$$, '6 -- 6: Same node returned');

-- 2 vertices test (connected): 3 -- 7; 7 -- 3

PREPARE q3 AS
SELECT *
FROM pgr_kingOrdering('SELECT id, source, target, cost, reverse_cost FROM edges WHERE id = 7'
);

RETURN QUERY
SELECT set_eq('q3', $$VALUES (1,3), (2,7)$$, '3 --7; 7 -- 3: Natural order of edges');

-- 2 vertices test (connected): 7 -- 3; 3 -- 7

PREPARE q4 AS
SELECT *
FROM pgr_kingOrdering('SELECT id, target AS source, source AS target, cost, reverse_cost FROM edges WHERE id = 7'
);

RETURN QUERY
SELECT set_eq('q4', $$VALUES (1,3), (2,7)$$, '7 --3; 3 -- 7: Does not matter if 3 comes first or second');

-- 2 vertices test (isolated)

CREATE TABLE isolated_vertices_table (
  id BIGSERIAL,
  source BIGINT,
  target BIGINT,
  cost FLOAT,
  reverse_cost FLOAT
);

INSERT INTO isolated_vertices_table
(source, target, cost, reverse_cost) VALUES
(2, 2, -1, 1),
(1, 1, 1, -1);

PREPARE q5 AS
SELECT node
FROM pgr_kingOrdering('SELECT id, source, target, cost, reverse_cost FROM isolated_vertices_table'
);

RETURN QUERY
SELECT set_eq('q5', $$VALUES (1), (2)$$, 'Both isolated vertices are returned for a disconnected graph');

DROP TABLE IF EXISTS isolated_vertices_table;

-- 3 vertices test

PREPARE q6 AS
SELECT *
FROM pgr_kingOrdering('SELECT id, source, target, cost, reverse_cost FROM edges WHERE id <= 2'
);

RETURN QUERY
SELECT set_eq('q6', $$VALUES (1, 5), (2, 6), (3, 10)$$, 'Three connected vertices are ordered as expected');

-- pgRouting sample data

CREATE TABLE expected_result (
seq BIGINT,
node BIGINT);

INSERT INTO expected_result (seq, node) VALUES
(1, 13),
(2, 14),
(3, 2),
(4, 4),
(5, 1),
(6, 9),
(7, 3),
(8, 8),
(9, 5),
(10, 7),
(11, 12),
(12, 6),
(13, 11),
(14, 17),
(15, 10),
(16, 16),
(17, 15);

PREPARE q7 AS
SELECT * FROM pgr_kingOrdering('SELECT id, source, target, cost, reverse_cost FROM edges'
);

PREPARE r7 AS
SELECT * FROM expected_result;

RETURN QUERY SELECT set_eq('q7','r7','King ordering result matches expected sequence for pgRouting sample data');

END;
$BODY$
LANGUAGE plpgsql;

SELECT edge_cases();


SELECT * FROM finish();
ROLLBACK;