Algorithm-ConstructDFA2
view release on metacpan or search on metacpan
lib/Algorithm/ConstructDFA2.pm view on Meta::CPAN
package Algorithm::ConstructDFA2;
use strict;
use warnings;
use 5.024000;
use Types::Standard qw/:all/;
use List::UtilsBy qw/sort_by nsort_by partition_by/;
use List::MoreUtils qw/uniq/;
use Moo;
use Memoize;
use Log::Any qw//;
use DBI;
use JSON;
our $VERSION = '0.06';
has 'input_alphabet' => (
is => 'ro',
required => 1,
isa => ArrayRef[Int],
);
has 'input_vertices' => (
is => 'ro',
required => 1,
isa => ArrayRef[Int],
default => sub { [] },
);
has 'input_edges' => (
is => 'ro',
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;
( run in 0.514 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )