Algorithm-ConstructDFA2
view release on metacpan or search on metacpan
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
required => 1,
isa => ArrayRef[ArrayRef[Int]],
);
has 'vertex_matches' => (
is => 'ro',
required => 1,
isa => CodeRef,
);
has 'vertex_nullable' => (
is => 'ro',
required => 1,
isa => CodeRef,
);
has 'storage_dsn' => (
is => 'ro',
required => 1,
isa => Str,
default => sub {
'dbi:SQLite:dbname=:memory:'
},
);
has '_dbh' => (
is => 'ro',
required => 0,
writer => '_set_dbh',
);
has 'dead_state_id' => (
is => 'ro',
required => 0,
isa => Int,
writer => '_set_dead_state_id',
);
has '_log' => (
is => 'rw',
required => 0,
default => sub {
Log::Any->get_logger()
},
);
has '_json' => (
is => 'rw',
required => 0,
default => sub {
JSON->new->canonical(1)->indent(0)->ascii(1)
},
);
sub BUILD {
my ($self) = @_;
###################################################################
# Create dbh
$self->_log->debug("Creating database");
my $dbh = DBI->connect( $self->storage_dsn );
$dbh->{RaiseError} = 1;
# $dbh->{AutoCommit} = 1;
$self->_set_dbh( $dbh );
###################################################################
# Register Extension functions
$self->_log->debug("Register extension functions");
$self->_dbh->sqlite_create_function( '_vertex_matches', 2, sub {
return !! $self->vertex_matches->(@_);
});
$self->_dbh->sqlite_create_function( '_vertex_nullable', 1, sub {
return !! $self->vertex_nullable->(@_);
});
$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,
( run in 0.722 second using v1.01-cache-2.11-cpan-0bd6704ced7 )