Algorithm-ConstructDFA2
view release on metacpan or search on metacpan
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
$self->_dbh->sqlite_create_function( '_canonical', 1, sub {
# Since SQLite's json_group_array does not guarantee ordering,
# we sort the items in the list ourselves here.
my @vertices = $self->_vertex_str_to_vertices(@_);
return $self->_vertex_str_from_vertices(@vertices);
});
###################################################################
# Deploy schema
$self->_log->debug("Deploying schema");
$self->_deploy_schema();
###################################################################
# Insert input data
$self->_log->debug("Initialising input");
$self->_init_input;
$self->_log->debug("Initialising vertices");
$self->_init_vertices;
$self->_log->debug("Initialising edges");
$self->_init_edges;
###################################################################
# Insert pre-computed data
$self->_log->debug("Initialising match data");
$self->_init_matches;
$self->_log->debug("Computing epsilon closures");
$self->_init_epsilon_closure;
###################################################################
# Let DB analyze data so far
$self->_log->debug("Updating DB statistics");
$self->_dbh->do('ANALYZE');
# FIXME: strictly speaking, the dead state is a ombination of all
# vertices from which an accepting combination of vertices cannot
# be reached. That might be important. Perhaps when later merging
# dead states, this would be resolved automatically? Probably not.
my $dead_state_id = $self->find_or_create_state_id();
$self->_set_dead_state_id($dead_state_id);
}
sub _deploy_schema {
my ($self) = @_;
local $self->_dbh->{sqlite_allow_multiple_statements} = 1;
$self->_dbh->do(q{
-----------------------------------------------------------------
-- Pragmata
-----------------------------------------------------------------
PRAGMA foreign_keys = ON;
PRAGMA synchronous = OFF;
PRAGMA journal_mode = OFF;
PRAGMA locking_mode = EXCLUSIVE;
-----------------------------------------------------------------
-- Input Alphabet
-----------------------------------------------------------------
CREATE TABLE Input (
value INTEGER PRIMARY KEY NOT NULL
);
-----------------------------------------------------------------
-- Input Graph Vertex
-----------------------------------------------------------------
CREATE TABLE Vertex (
value INTEGER PRIMARY KEY
CHECK(printf("%u", value) = value),
is_nullable BOOL
);
CREATE TRIGGER trigger_Vertex_insert
AFTER INSERT ON Vertex
BEGIN
UPDATE Vertex
SET is_nullable = _vertex_nullable(NEW.value)
WHERE value = NEW.value;
END;
-----------------------------------------------------------------
-- Input Graph Edges
-----------------------------------------------------------------
CREATE TABLE Edge (
src INTEGER NOT NULL,
dst INTEGER NOT NULL,
UNIQUE(src, dst),
FOREIGN KEY (dst)
REFERENCES Vertex(value)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
FOREIGN KEY (src)
REFERENCES Vertex(value)
ON DELETE NO ACTION
ON UPDATE NO ACTION
);
CREATE INDEX Edge_idx_dst ON Edge (dst);
-- can use covering index instead
-- CREATE INDEX Edge_idx_src ON Edge (src);
CREATE TRIGGER trigger_Edge_insert
BEFORE INSERT ON Edge
BEGIN
INSERT OR IGNORE
INTO Vertex(value)
VALUES(NEW.src);
( run in 2.574 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )