mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Tests for bug #1213120
This commit is contained in:
618
mysql-test/suite/oqgraph/regression_1213120.test
Normal file
618
mysql-test/suite/oqgraph/regression_1213120.test
Normal file
@ -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.
|
||||
|
||||
|
621
mysql-test/suite/oqgraph/regression_1213120_sleep.test
Normal file
621
mysql-test/suite/oqgraph/regression_1213120_sleep.test
Normal file
@ -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.
|
||||
|
||||
|
Reference in New Issue
Block a user