From 6686a4eb515ff134514c34c131c2992c341a37cc Mon Sep 17 00:00:00 2001 From: Andrew McDonnell Date: Sat, 17 Aug 2013 00:13:18 +0930 Subject: [PATCH] Tests for bug #1213120 --- .../suite/oqgraph/regression_1213120.test | 618 +++++++++++++++++ .../oqgraph/regression_1213120_sleep.test | 621 ++++++++++++++++++ 2 files changed, 1239 insertions(+) create mode 100644 mysql-test/suite/oqgraph/regression_1213120.test create mode 100644 mysql-test/suite/oqgraph/regression_1213120_sleep.test diff --git a/mysql-test/suite/oqgraph/regression_1213120.test b/mysql-test/suite/oqgraph/regression_1213120.test new file mode 100644 index 00000000000..344264148e2 --- /dev/null +++ b/mysql-test/suite/oqgraph/regression_1213120.test @@ -0,0 +1,618 @@ +--disable_warnings +DROP TABLE IF EXISTS graph_base; +DROP TABLE IF EXISTS graph; +DROP TABLE IF EXISTS graph2; +--enable_warnings + +# Create the backing store +CREATE TABLE graph_base ( + from_id INT UNSIGNED NOT NULL, + to_id INT UNSIGNED NOT NULL, + PRIMARY KEY (from_id,to_id), + INDEX (to_id) + ) ENGINE=MyISAM; + + +CREATE TABLE graph ( + latch VARCHAR(32) NULL, + origid BIGINT UNSIGNED NULL, + destid BIGINT UNSIGNED NULL, + weight DOUBLE NULL, + seq BIGINT UNSIGNED NULL, + linkid BIGINT UNSIGNED NULL, + KEY (latch, origid, destid) USING HASH, + KEY (latch, destid, origid) USING HASH + ) ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id', DESTID='to_id'; + +#-- +#-- ASCII art graph of this test data +#-- +-->(2) +#-- ( )<---+ +#-- (1) +#-- ( )<---+ +#-- +-->(3)<------->(4) +#-- +#-- (7)<----------(5)<--------->(6) (9) +#-- +#-- +--->(11) +#-- | | +#-- (10) | +#-- ^ v +#-- +----(12) + +INSERT INTO graph_base(from_id, to_id) VALUES (1,2), (2,1); +INSERT INTO graph_base(from_id, to_id) VALUES (1,3), (3,1); +INSERT INTO graph_base(from_id, to_id) VALUES (3,4), (4,3); +INSERT INTO graph_base(from_id, to_id) VALUES (5,6), (6,5); + +#-- extra unidirected node +INSERT INTO graph_base(from_id, to_id) VALUES (5,7); + +#-- isolated node with no loop - disallowed +#-- so origid 8 below should return an empty rowset +#-- INSERT INTO graph_base(from_id, to_id) VALUES (8,NULL); + +#-- isolated node with a (undirected) loop +#-- we have no way of representing a directed loop on an isolated node, is this valid in pure graph theory? +INSERT INTO graph_base(from_id, to_id) VALUES (9,9); + +#-- directed _cyclic_ graph triangle? +INSERT INTO graph_base(from_id, to_id) VALUES (10,11); +INSERT INTO graph_base(from_id, to_id) VALUES (11,12); +INSERT INTO graph_base(from_id, to_id) VALUES (12,10); + +--echo # Return all edges +#-- we note that when weight is NULL it defaults to 1 +SELECT * FROM graph; +--echo # Currently count should be 13 +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +--echo # Return all edges when latch is NULL - this is different to latch='' and same as no where clause +SELECT * FROM graph where latch is NULL; + +--echo # Return all vertices, and subsets of vertices +SELECT * FROM graph where latch=''; +SELECT * FROM graph where latch='0'; + +--echo # Currently count should be 11 + +SELECT count(*) FROM graph where latch=''; +#-- get a subset of vertices +SELECT * FROM graph where latch='' and linkid = 2; +SELECT * FROM graph where latch='' and (linkid > 2 and linkid < 6); +SELECT * FROM graph where latch='' and linkid = NULL; +SELECT * FROM graph where latch='' and linkid = 666; + +#-- Query out-edges for vertex (no_search AND origid=N) +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 1; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 2; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 4; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 9; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 10; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = NULL; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 666; + +#-- Query in-edges for vertex (no_search AND destid=N) +#-- linkid will have the other end +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 1; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 2; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 4; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 9; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 10; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = NULL; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 666; + +# The following returns a result that makes no sense... +#-- what happens when we combined orig and dest? +#-- Bug https://bugs.launchpad.net/oqgraph/+bug/1195778 +#SELECT * FROM graph where latch='' and origid = 1; +#SELECT * FROM graph where latch='' and destid = 2; +#SELECT * FROM graph where latch='' and origid=1 and destid = 2; + +SELECT * FROM graph where latch='0'; +SELECT count(*) FROM graph where latch='0'; +SELECT * FROM graph where latch='0' and linkid = 2; +SELECT * FROM graph where latch='0' and (linkid > 2 and linkid < 6); +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 1; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 2; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 4; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 9; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 10; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 1; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 2; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 4; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 9; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 10; + +--echo # Breadth-first search tests +#-- We are asking "Is there a path from node 'origid' to (all) other nodes?" +#-- We return a row for each other node that is reachable, with its id in 'linkid' +#-- and the weight calculated as "How many _directed_ hops to get there" +#-- If there is no path from origid to another node then there is no row for that linkid +#-- We include 'origid' in the set of reachable nodes i.e. as a 'loop', with weight 0 +#-- 'seq' is the counted distance of the search, thus, the loop link will always have seq 1 +#-- if there are two reachable neighbours, they will have seq 2,3 and so on +#-- linkid is the other end +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 666; # <-- note, should return nothing +#-- The above results can then be filtered by weight, so the results should be a subset for the corresponding origid above +#-- so effectively, `AND weight=1` returns the neighbours of origid in linkid +#<----- orig test harness - still returns (breadth_first 1 NULL 1 3 3), (breadth_first 1 NULL 1 2 2) +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 1; +#-- so effectively, `count(... AND weight=1)` returns the number of _reachable_ immediate neighbours +#-- included because it allows human to quickly eyeball against the visual ASCII graph for correctness... +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 1; +#-- so effectively, `AND weight=2` returns the second-level neighbours of origid in linkid +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 3; + +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND (weight = 1 or weight = 2); # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND (weight = 1 or weight = 2); + +#-- now do it in reverse - using destid find originating vertices +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 3; + +#-- These return empty sets - origid or destid must be specified and non null to get a result set +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = NULL; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = NULL; +SELECT * FROM graph WHERE latch = 'breadth_first' AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first'; + +#-- Repeat the above with legacy string +SELECT * FROM graph WHERE latch = '2' AND origid = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 4; +SELECT * FROM graph WHERE latch = '2' AND origid = 5; +SELECT * FROM graph WHERE latch = '2' AND origid = 6; +SELECT * FROM graph WHERE latch = '2' AND origid = 7; +SELECT * FROM graph WHERE latch = '2' AND origid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9; +SELECT * FROM graph WHERE latch = '2' AND origid = 10; +SELECT * FROM graph WHERE latch = '2' AND origid = 11; +SELECT * FROM graph WHERE latch = '2' AND origid = 12; +SELECT * FROM graph WHERE latch = '2' AND origid = 666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 1 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 2 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 3 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 4 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 5 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 6 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 7 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 9 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 10 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 11 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 12 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 3; + +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND (weight = 1 or weight = 2); # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND (weight = 1 or weight = 2); + +SELECT * FROM graph WHERE latch = '2' AND destid = 1; + +SELECT * FROM graph WHERE latch = '2' AND destid = 12; +SELECT * FROM graph WHERE latch = '2' AND destid = 1 and weight = 1; + + +#-- These return empty sets - origid must be specified and non null to get a result set +SELECT * FROM graph WHERE latch = '2' AND origid = NULL; +SELECT * FROM graph WHERE latch = '2' AND destid = NULL; +SELECT * FROM graph WHERE latch = '2' AND weight = 1; +SELECT * FROM graph WHERE latch = '2'; + + +--echo # Dijkstras algorithm tests +#-- We ask 'What is the shortest path (if any) between 'origid' and 'destid' +#-- This returns the number of directed hops +1 (for the starting node) +#-- 'weight' is NULL for the starting point, or 1 +#-- 'linkid' is the way point id +#-- 'seq' is the distance of the waypoint from the start (counting from zero) +#-- the default order returned is waypoints out from the start +#-- zero hop (1 row) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=1; +#-- one hop +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=2; +#-- one hop in reverse +SELECT * FROM graph WHERE latch='dijkstras' AND origid=2 AND destid=1; +#-- two hops (via 3) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=4; +#-- two hops in reverse direction +SELECT * FROM graph WHERE latch='dijkstras' AND origid=4 AND destid=1; +#-- no result (no connection) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=5; +#-- no result (no destination exists) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=666; + +#-- one hop on a unidirected link +SELECT * FROM graph WHERE latch='dijkstras' AND origid=5 AND destid=7; +#-- zero hop in reverse direction on a unidirected link +SELECT * FROM graph WHERE latch='dijkstras' AND origid=7 AND destid=5; + +#-- Trickery - what about the cyclic loop? +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11 AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11 AND destid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12 AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12 AND destid=11; + +#-- reachable vertices +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=2; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=3; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=4; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=5; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=6; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=7; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='dijkstras' AND origid=9; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=666; # <-- note, should return nothing + +#-- originating vertices +SELECT * FROM graph WHERE latch='dijkstras' AND destid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=2; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=3; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=4; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=5; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=6; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=7; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='dijkstras' AND destid=9; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=12; + +--echo # legacy string number +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=2; +SELECT * FROM graph WHERE latch='1' AND origid=2 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=4; +SELECT * FROM graph WHERE latch='1' AND origid=4 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=5; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND origid=5 AND destid=7; +SELECT * FROM graph WHERE latch='1' AND origid=7 AND destid=5; +SELECT * FROM graph WHERE latch='1' AND origid=10 AND destid=11; +SELECT * FROM graph WHERE latch='1' AND origid=10 AND destid=12; +SELECT * FROM graph WHERE latch='1' AND origid=11 AND destid=10; +SELECT * FROM graph WHERE latch='1' AND origid=11 AND destid=12; +SELECT * FROM graph WHERE latch='1' AND origid=12 AND destid=10; +SELECT * FROM graph WHERE latch='1' AND origid=12 AND destid=11; +SELECT * FROM graph WHERE latch='1' AND origid=1; +SELECT * FROM graph WHERE latch='1' AND origid=2; +SELECT * FROM graph WHERE latch='1' AND origid=3; +SELECT * FROM graph WHERE latch='1' AND origid=4; +SELECT * FROM graph WHERE latch='1' AND origid=5; +SELECT * FROM graph WHERE latch='1' AND origid=6; +SELECT * FROM graph WHERE latch='1' AND origid=7; +SELECT * FROM graph WHERE latch='1' AND origid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND origid=9; +SELECT * FROM graph WHERE latch='1' AND origid=10; +SELECT * FROM graph WHERE latch='1' AND origid=11; +SELECT * FROM graph WHERE latch='1' AND origid=12; +SELECT * FROM graph WHERE latch='1' AND origid=666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND destid=1; +SELECT * FROM graph WHERE latch='1' AND destid=2; +SELECT * FROM graph WHERE latch='1' AND destid=3; +SELECT * FROM graph WHERE latch='1' AND destid=4; +SELECT * FROM graph WHERE latch='1' AND destid=5; +SELECT * FROM graph WHERE latch='1' AND destid=6; +SELECT * FROM graph WHERE latch='1' AND destid=7; +SELECT * FROM graph WHERE latch='1' AND destid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND destid=9; +SELECT * FROM graph WHERE latch='1' AND destid=10; +SELECT * FROM graph WHERE latch='1' AND destid=11; +SELECT * FROM graph WHERE latch='1' AND destid=12; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +#-- What if we add two equally valid two-hop paths? +#-- +#-- +#-- +--->(14)----------+ +#-- | v +#-- | +--->(11)---->(13) +#-- | | | +#-- +-(10) | +#-- ^ v +#-- +----(12) +#-- +#-- We note it chooses 10,11,13 but will it always? +INSERT INTO graph_base(from_id, to_id) VALUES (11,13); +INSERT INTO graph_base(from_id, to_id) VALUES (10,14); +INSERT INTO graph_base(from_id, to_id) VALUES (14,13); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; +DELETE FROM graph_base where from_id=10 and to_id=11; +INSERT INTO graph_base(from_id, to_id) VALUES (10,15); +INSERT INTO graph_base(from_id, to_id) VALUES (15,13); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; +INSERT INTO graph_base(from_id, to_id) VALUES (10,11); +#-- We note is _appears_ to use the lowered valued node id if there are two equal paths +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +#-- add some extra and check +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (21,22); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=21; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=22; +INSERT INTO graph_base(from_id, to_id) VALUES (4,17); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (4,16); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (17,18); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=1; + +--echo # Now we add a connection from 4->6 +INSERT INTO graph_base (from_id,to_id) VALUES (4,6); + +SELECT * FROM graph; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +--echo # And delete all references to node 5 +DELETE FROM graph_base WHERE from_id=5; +DELETE FROM graph_base WHERE from_id=3 AND to_id=5; + +#-- The following queries would currently return incorrect results +#-- 6 rows instead of 21 +#-- Maybe manifestation of https://bugs.launchpad.net/oqgraph/+bug/796647 +#-- SELECT count(*) FROM graph; +#-- SELECT count(*) FROM graph_base; + +--echo # which means there is a path in one direction only 1>3>4>6 +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=6; +--echo # but not 6>4>3>1 (so no result) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=6 AND destid=1; + +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=6; +SELECT * FROM graph WHERE latch='1' AND origid=6 AND destid=1; + +DELETE FROM graph_base; + +#-- The following line would hang mysqld currently, see bug https://bugs.launchpad.net/oqgraph/+bug/1195735 +#-- SELECT * FROM graph; + +FLUSH TABLES; +TRUNCATE TABLE graph_base; + +DROP TABLE graph_base; +DROP TABLE graph; + +#-- Reminder - the basic spec is at http://openquery.com/graph/doc +#-- Query edges stored in graph engine (latch=NULL) +#-- SELECT * FROM foo; +#-- Results: +#-- vertex id for origin of edge in origid column. +#-- vertex id for destination of edge in destid column. +#-- weight of edge in weight column. +#-- Essentially this returns the values (origid,destid pairs with optional weight) you put in, in this mode OQGRAPH looks very close to a real table. But it also does nothing special, it's just store/retrieve for those columns. The other columns will be returned as NULL. +#-- +#-- Query vertices stored in graph engine (latch=0) +#-- SELECT * FROM foo WHERE latch = 0; +#-- Results: +#-- vertex id in linkid column +#-- +#-- Query out-edges for vertex (latch=0 AND origid=N) +#-- SELECT * FROM foo WHERE latch = 0 AND origid = 2; +#-- Results: +#-- vertex id in linkid column +#-- edge weight in weight column +#-- +#-- Query in-edges for vertex (latch=0 AND destid=N) +#-- SELECT * FROM foo WHERE latch = 0 AND destid = 6; +#-- Results: +#-- vertex id in linkid column +#-- edge weight in weight column +#-- +#-- Dijkstra's shortest path algorithm (latch=1) +#-- Find shortest path: +#-- SELECT * FROM foo WHERE latch = 1 AND origid = 1 AND destid = 6; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id of the current step in linkid column. +#-- weight of traversed edge in weight column. +#-- step counter in seq column, so you can sort and use the result (starting at step 0). +#-- Example: SELECT GROUP_CONCAT(linkid ORDER BY seq) ... +#-- +#-- Find reachable vertices: +#-- SELECT * FROM foo WHERE latch = 1 AND origid = 1; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id in linkid column. +#-- aggregate of weights in weight column. +#-- +#-- Find originating vertices: +#-- SELECT * FROM foo WHERE latch = 1 AND destid = 6; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id in linkid column. +#-- aggregate of weights in weight column. +#-- +#-- Breadth-first search (latch=2, assumes that each vertex is weight 1) +#-- Find shortest path: +#-- SELECT * FROM foo WHERE latch = 2 AND origid = 1 AND destid = 6; +#-- Results: +#-- vertex id in linkid column. +#-- weight column = 1 for each hop. +#-- +#-- Find reachable vertices: +#-- SELECT * FROM foo WHERE latch = 2 AND origid = 1; +#-- Results: +#-- vertex id in linkid column. +#-- computed number of hops in weight column. +#-- +#-- Find originating vertices: +#-- SELECT * FROM foo WHERE latch = 2 AND destid = 6; +#-- Results: +#-- vertex id in linkid column. +#-- computed number of hops in weight column. + + diff --git a/mysql-test/suite/oqgraph/regression_1213120_sleep.test b/mysql-test/suite/oqgraph/regression_1213120_sleep.test new file mode 100644 index 00000000000..259475ca05d --- /dev/null +++ b/mysql-test/suite/oqgraph/regression_1213120_sleep.test @@ -0,0 +1,621 @@ +--disable_warnings +DROP TABLE IF EXISTS graph_base; +DROP TABLE IF EXISTS graph; +DROP TABLE IF EXISTS graph2; +--enable_warnings + +# Create the backing store +CREATE TABLE graph_base ( + from_id INT UNSIGNED NOT NULL, + to_id INT UNSIGNED NOT NULL, + PRIMARY KEY (from_id,to_id), + INDEX (to_id) + ) ENGINE=MyISAM; + + +CREATE TABLE graph ( + latch VARCHAR(32) NULL, + origid BIGINT UNSIGNED NULL, + destid BIGINT UNSIGNED NULL, + weight DOUBLE NULL, + seq BIGINT UNSIGNED NULL, + linkid BIGINT UNSIGNED NULL, + KEY (latch, origid, destid) USING HASH, + KEY (latch, destid, origid) USING HASH + ) ENGINE=OQGRAPH DATA_TABLE='graph_base' ORIGID='from_id', DESTID='to_id'; + +#-- +#-- ASCII art graph of this test data +#-- +-->(2) +#-- ( )<---+ +#-- (1) +#-- ( )<---+ +#-- +-->(3)<------->(4) +#-- +#-- (7)<----------(5)<--------->(6) (9) +#-- +#-- +--->(11) +#-- | | +#-- (10) | +#-- ^ v +#-- +----(12) + +INSERT INTO graph_base(from_id, to_id) VALUES (1,2), (2,1); +INSERT INTO graph_base(from_id, to_id) VALUES (1,3), (3,1); +INSERT INTO graph_base(from_id, to_id) VALUES (3,4), (4,3); +INSERT INTO graph_base(from_id, to_id) VALUES (5,6), (6,5); + +#-- extra unidirected node +INSERT INTO graph_base(from_id, to_id) VALUES (5,7); + +#-- isolated node with no loop - disallowed +#-- so origid 8 below should return an empty rowset +#-- INSERT INTO graph_base(from_id, to_id) VALUES (8,NULL); + +#-- isolated node with a (undirected) loop +#-- we have no way of representing a directed loop on an isolated node, is this valid in pure graph theory? +INSERT INTO graph_base(from_id, to_id) VALUES (9,9); + +#-- directed _cyclic_ graph triangle? +INSERT INTO graph_base(from_id, to_id) VALUES (10,11); +INSERT INTO graph_base(from_id, to_id) VALUES (11,12); +INSERT INTO graph_base(from_id, to_id) VALUES (12,10); + +--echo # Return all edges +#-- we note that when weight is NULL it defaults to 1 +SELECT * FROM graph; +--echo # Currently count should be 13 +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +--echo # Return all edges when latch is NULL - this is different to latch='' and same as no where clause +SELECT * FROM graph where latch is NULL; + +--echo # Return all vertices, and subsets of vertices +SELECT * FROM graph where latch=''; +SELECT * FROM graph where latch='0'; + +--echo # Currently count should be 11 + +SELECT count(*) FROM graph where latch=''; +#-- get a subset of vertices +SELECT * FROM graph where latch='' and linkid = 2; +SELECT * FROM graph where latch='' and (linkid > 2 and linkid < 6); +SELECT * FROM graph where latch='' and linkid = NULL; +SELECT * FROM graph where latch='' and linkid = 666; + +#-- Query out-edges for vertex (no_search AND origid=N) +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 1; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 2; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 4; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 9; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 10; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = NULL; +SELECT origid as `from`, linkid as `to` FROM graph where latch='' and origid = 666; + +#-- Query in-edges for vertex (no_search AND destid=N) +#-- linkid will have the other end +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 1; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 2; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 4; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 9; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 10; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = NULL; +SELECT linkid as `from`, destid as `to` FROM graph where latch='' and destid = 666; + +# The following returns a result that makes no sense... +#-- what happens when we combined orig and dest? +#-- Bug https://bugs.launchpad.net/oqgraph/+bug/1195778 +#SELECT * FROM graph where latch='' and origid = 1; +#SELECT * FROM graph where latch='' and destid = 2; +#SELECT * FROM graph where latch='' and origid=1 and destid = 2; + +SELECT * FROM graph where latch='0'; +SELECT count(*) FROM graph where latch='0'; +SELECT * FROM graph where latch='0' and linkid = 2; +SELECT * FROM graph where latch='0' and (linkid > 2 and linkid < 6); +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 1; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 2; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 4; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 9; +SELECT origid as `from`, linkid as `to` FROM graph where latch='0' and origid = 10; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 1; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 2; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 4; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 9; +SELECT linkid as `from`, destid as `to` FROM graph where latch='0' and destid = 10; + +--echo # Breadth-first search tests +#-- We are asking "Is there a path from node 'origid' to (all) other nodes?" +#-- We return a row for each other node that is reachable, with its id in 'linkid' +#-- and the weight calculated as "How many _directed_ hops to get there" +#-- If there is no path from origid to another node then there is no row for that linkid +#-- We include 'origid' in the set of reachable nodes i.e. as a 'loop', with weight 0 +#-- 'seq' is the counted distance of the search, thus, the loop link will always have seq 1 +#-- if there are two reachable neighbours, they will have seq 2,3 and so on +#-- linkid is the other end +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 666; # <-- note, should return nothing +#-- The above results can then be filtered by weight, so the results should be a subset for the corresponding origid above +#-- so effectively, `AND weight=1` returns the neighbours of origid in linkid +#<----- orig test harness - still returns (breadth_first 1 NULL 1 3 3), (breadth_first 1 NULL 1 2 2) +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 1; +#-- so effectively, `count(... AND weight=1)` returns the number of _reachable_ immediate neighbours +#-- included because it allows human to quickly eyeball against the visual ASCII graph for correctness... +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 1; +#-- so effectively, `AND weight=2` returns the second-level neighbours of origid in linkid +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND weight = 3; + +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 1 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 2 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 3 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 4 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 5 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 6 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 7 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 8 AND (weight = 1 or weight = 2); # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 9 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 10 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 11 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = 12 AND (weight = 1 or weight = 2); + +#-- now do it in reverse - using destid find originating vertices +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 2; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 1 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 2 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 3 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 4 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 5 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 6 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 7 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 8 and weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 9 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 10 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 11 and weight = 3; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = 12 and weight = 3; + +#-- These return empty sets - origid or destid must be specified and non null to get a result set +SELECT * FROM graph WHERE latch = 'breadth_first' AND origid = NULL; +SELECT * FROM graph WHERE latch = 'breadth_first' AND destid = NULL; +SELECT * FROM graph WHERE latch = 'breadth_first' AND weight = 1; +SELECT * FROM graph WHERE latch = 'breadth_first'; + +#-- Repeat the above with legacy string +SELECT * FROM graph WHERE latch = '2' AND origid = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 4; +SELECT * FROM graph WHERE latch = '2' AND origid = 5; +SELECT * FROM graph WHERE latch = '2' AND origid = 6; +SELECT * FROM graph WHERE latch = '2' AND origid = 7; +SELECT * FROM graph WHERE latch = '2' AND origid = 8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9; +SELECT * FROM graph WHERE latch = '2' AND origid = 10; +SELECT * FROM graph WHERE latch = '2' AND origid = 11; +SELECT * FROM graph WHERE latch = '2' AND origid = 12; +SELECT * FROM graph WHERE latch = '2' AND origid = 666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 1 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 2 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 3 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 4 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 5 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 6 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 7 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 8 AND weight = 1; # <-- note, should return nothing +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 9 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 10 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 11 AND weight = 1; +SELECT count(*) FROM graph WHERE latch = '2' AND origid = 12 AND weight = 1; +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 2; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 2; +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND weight = 3; # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND weight = 3; +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND weight = 3; + +SELECT * FROM graph WHERE latch = '2' AND origid = 1 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 2 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 3 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 4 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 5 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 6 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 7 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 8 AND (weight = 1 or weight = 2); # <-- note, should return nothing +SELECT * FROM graph WHERE latch = '2' AND origid = 9 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 10 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 11 AND (weight = 1 or weight = 2); +SELECT * FROM graph WHERE latch = '2' AND origid = 12 AND (weight = 1 or weight = 2); + +SELECT * FROM graph WHERE latch = '2' AND destid = 1; + +SELECT * FROM graph WHERE latch = '2' AND destid = 12; +SELECT * FROM graph WHERE latch = '2' AND destid = 1 and weight = 1; + + +#-- These return empty sets - origid must be specified and non null to get a result set +SELECT * FROM graph WHERE latch = '2' AND origid = NULL; +SELECT * FROM graph WHERE latch = '2' AND destid = NULL; +SELECT * FROM graph WHERE latch = '2' AND weight = 1; +SELECT * FROM graph WHERE latch = '2'; + + +--echo # Dijkstras algorithm tests +#-- We ask 'What is the shortest path (if any) between 'origid' and 'destid' +#-- This returns the number of directed hops +1 (for the starting node) +#-- 'weight' is NULL for the starting point, or 1 +#-- 'linkid' is the way point id +#-- 'seq' is the distance of the waypoint from the start (counting from zero) +#-- the default order returned is waypoints out from the start +#-- zero hop (1 row) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=1; +#-- one hop +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=2; +#-- one hop in reverse +SELECT * FROM graph WHERE latch='dijkstras' AND origid=2 AND destid=1; +#-- two hops (via 3) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=4; +#-- two hops in reverse direction +SELECT * FROM graph WHERE latch='dijkstras' AND origid=4 AND destid=1; +#-- no result (no connection) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=5; +#-- no result (no destination exists) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=666; + +#-- one hop on a unidirected link +SELECT * FROM graph WHERE latch='dijkstras' AND origid=5 AND destid=7; +#-- zero hop in reverse direction on a unidirected link +SELECT * FROM graph WHERE latch='dijkstras' AND origid=7 AND destid=5; + +#-- Trickery - what about the cyclic loop? +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11 AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11 AND destid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12 AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12 AND destid=11; + +#-- reachable vertices +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=2; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=3; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=4; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=5; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=6; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=7; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='dijkstras' AND origid=9; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=12; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=666; # <-- note, should return nothing + +#-- originating vertices +SELECT * FROM graph WHERE latch='dijkstras' AND destid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=2; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=3; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=4; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=5; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=6; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=7; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='dijkstras' AND destid=9; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=10; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=11; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=12; + +--echo # legacy string number +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=2; +SELECT * FROM graph WHERE latch='1' AND origid=2 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=4; +SELECT * FROM graph WHERE latch='1' AND origid=4 AND destid=1; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=5; +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND origid=5 AND destid=7; +SELECT * FROM graph WHERE latch='1' AND origid=7 AND destid=5; +SELECT * FROM graph WHERE latch='1' AND origid=10 AND destid=11; +SELECT * FROM graph WHERE latch='1' AND origid=10 AND destid=12; +SELECT * FROM graph WHERE latch='1' AND origid=11 AND destid=10; +SELECT * FROM graph WHERE latch='1' AND origid=11 AND destid=12; +SELECT * FROM graph WHERE latch='1' AND origid=12 AND destid=10; +SELECT * FROM graph WHERE latch='1' AND origid=12 AND destid=11; +SELECT * FROM graph WHERE latch='1' AND origid=1; +SELECT * FROM graph WHERE latch='1' AND origid=2; +SELECT * FROM graph WHERE latch='1' AND origid=3; +SELECT * FROM graph WHERE latch='1' AND origid=4; +SELECT * FROM graph WHERE latch='1' AND origid=5; +SELECT * FROM graph WHERE latch='1' AND origid=6; +SELECT * FROM graph WHERE latch='1' AND origid=7; +SELECT * FROM graph WHERE latch='1' AND origid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND origid=9; +SELECT * FROM graph WHERE latch='1' AND origid=10; +SELECT * FROM graph WHERE latch='1' AND origid=11; +SELECT * FROM graph WHERE latch='1' AND origid=12; +SELECT * FROM graph WHERE latch='1' AND origid=666; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND destid=1; +SELECT * FROM graph WHERE latch='1' AND destid=2; +SELECT * FROM graph WHERE latch='1' AND destid=3; +SELECT * FROM graph WHERE latch='1' AND destid=4; +SELECT * FROM graph WHERE latch='1' AND destid=5; +SELECT * FROM graph WHERE latch='1' AND destid=6; +SELECT * FROM graph WHERE latch='1' AND destid=7; +SELECT * FROM graph WHERE latch='1' AND destid=8; # <-- note, should return nothing +SELECT * FROM graph WHERE latch='1' AND destid=9; +SELECT * FROM graph WHERE latch='1' AND destid=10; +SELECT * FROM graph WHERE latch='1' AND destid=11; +SELECT * FROM graph WHERE latch='1' AND destid=12; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +#-- What if we add two equally valid two-hop paths? +#-- +#-- +#-- +--->(14)----------+ +#-- | v +#-- | +--->(11)---->(13) +#-- | | | +#-- +-(10) | +#-- ^ v +#-- +----(12) +#-- +#-- We note it chooses 10,11,13 but will it always? +INSERT INTO graph_base(from_id, to_id) VALUES (11,13); +INSERT INTO graph_base(from_id, to_id) VALUES (10,14); +INSERT INTO graph_base(from_id, to_id) VALUES (14,13); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; +DELETE FROM graph_base where from_id=10 and to_id=11; +INSERT INTO graph_base(from_id, to_id) VALUES (10,15); +INSERT INTO graph_base(from_id, to_id) VALUES (15,13); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; +INSERT INTO graph_base(from_id, to_id) VALUES (10,11); +#-- We note is _appears_ to use the lowered valued node id if there are two equal paths +SELECT * FROM graph WHERE latch='dijkstras' AND origid=10 AND destid=13; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +#-- add some extra and check +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (21,22); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=21; +SELECT * FROM graph WHERE latch='dijkstras' AND origid=22; +INSERT INTO graph_base(from_id, to_id) VALUES (4,17); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (4,16); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +INSERT INTO graph_base(from_id, to_id) VALUES (17,18); +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1; +SELECT * FROM graph WHERE latch='dijkstras' AND destid=1; + +--echo # Now we add a connection from 4->6 +INSERT INTO graph_base (from_id,to_id) VALUES (4,6); + +#-- Without this sleep when the line immediately after gets executed +#-- we get a segfault +select SLEEP(2); +SELECT * FROM graph; + +SELECT count(*) FROM graph; +SELECT count(*) FROM graph_base; + +--echo # And delete all references to node 5 +DELETE FROM graph_base WHERE from_id=5; +DELETE FROM graph_base WHERE from_id=3 AND to_id=5; + +#-- The following queries would currently return incorrect results +#-- 6 rows instead of 21 +#-- Maybe manifestation of https://bugs.launchpad.net/oqgraph/+bug/796647 +#-- SELECT count(*) FROM graph; +#-- SELECT count(*) FROM graph_base; + +--echo # which means there is a path in one direction only 1>3>4>6 +SELECT * FROM graph WHERE latch='dijkstras' AND origid=1 AND destid=6; +--echo # but not 6>4>3>1 (so no result) +SELECT * FROM graph WHERE latch='dijkstras' AND origid=6 AND destid=1; + +SELECT * FROM graph WHERE latch='1' AND origid=1 AND destid=6; +SELECT * FROM graph WHERE latch='1' AND origid=6 AND destid=1; + +DELETE FROM graph_base; + +#-- The following line would hang mysqld currently, see bug https://bugs.launchpad.net/oqgraph/+bug/1195735 +#-- SELECT * FROM graph; + +FLUSH TABLES; +TRUNCATE TABLE graph_base; + +DROP TABLE graph_base; +DROP TABLE graph; + +#-- Reminder - the basic spec is at http://openquery.com/graph/doc +#-- Query edges stored in graph engine (latch=NULL) +#-- SELECT * FROM foo; +#-- Results: +#-- vertex id for origin of edge in origid column. +#-- vertex id for destination of edge in destid column. +#-- weight of edge in weight column. +#-- Essentially this returns the values (origid,destid pairs with optional weight) you put in, in this mode OQGRAPH looks very close to a real table. But it also does nothing special, it's just store/retrieve for those columns. The other columns will be returned as NULL. +#-- +#-- Query vertices stored in graph engine (latch=0) +#-- SELECT * FROM foo WHERE latch = 0; +#-- Results: +#-- vertex id in linkid column +#-- +#-- Query out-edges for vertex (latch=0 AND origid=N) +#-- SELECT * FROM foo WHERE latch = 0 AND origid = 2; +#-- Results: +#-- vertex id in linkid column +#-- edge weight in weight column +#-- +#-- Query in-edges for vertex (latch=0 AND destid=N) +#-- SELECT * FROM foo WHERE latch = 0 AND destid = 6; +#-- Results: +#-- vertex id in linkid column +#-- edge weight in weight column +#-- +#-- Dijkstra's shortest path algorithm (latch=1) +#-- Find shortest path: +#-- SELECT * FROM foo WHERE latch = 1 AND origid = 1 AND destid = 6; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id of the current step in linkid column. +#-- weight of traversed edge in weight column. +#-- step counter in seq column, so you can sort and use the result (starting at step 0). +#-- Example: SELECT GROUP_CONCAT(linkid ORDER BY seq) ... +#-- +#-- Find reachable vertices: +#-- SELECT * FROM foo WHERE latch = 1 AND origid = 1; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id in linkid column. +#-- aggregate of weights in weight column. +#-- +#-- Find originating vertices: +#-- SELECT * FROM foo WHERE latch = 1 AND destid = 6; +#-- Results: +#-- latch, origid, destid are same as input. +#-- vertex id in linkid column. +#-- aggregate of weights in weight column. +#-- +#-- Breadth-first search (latch=2, assumes that each vertex is weight 1) +#-- Find shortest path: +#-- SELECT * FROM foo WHERE latch = 2 AND origid = 1 AND destid = 6; +#-- Results: +#-- vertex id in linkid column. +#-- weight column = 1 for each hop. +#-- +#-- Find reachable vertices: +#-- SELECT * FROM foo WHERE latch = 2 AND origid = 1; +#-- Results: +#-- vertex id in linkid column. +#-- computed number of hops in weight column. +#-- +#-- Find originating vertices: +#-- SELECT * FROM foo WHERE latch = 2 AND destid = 6; +#-- Results: +#-- vertex id in linkid column. +#-- computed number of hops in weight column. + +