Daje-Plugin-GenerateSchema

 view release on metacpan or  search on metacpan

lib/Daje/Plugin/Schema/Create.pm  view on Meta::CPAN

package Daje::Plugin::Schema::Create;
use Mojo::Base  -base, -signatures;

our $VERSION = "0.01";

use Scalar::Util qw {reftype};
use Syntax::Operator::Matches qw( matches mismatches );

has 'db';

sub get_db_schema($self, $schema) {
    $schema = 'public' unless $schema;
    my @tab;
    my @vie;
    my @tables = ();
    @tables = $self->_get_tables($schema);
    my $length = scalar @tables;
    for (my $i = 0; $i < $length; $i++) {
        my $table->{table}->{table_name} = $tables[$i]->{table_name};
        my $column_names = $self->_get_table_column_names($tables[$i]->{table_name}, $schema);
        $table->{table}->{column_names} = $column_names;
        my $indexes = $self->_get_table_indexes($tables[$i]->{table_name}, $schema);
        if (defined $indexes) {
            $table->{table}->{indexes} = $indexes;
        }
        push (@tab, $table);
        my $temp = 1;
    }
    my $result->{tables} = \@tab;
    my @views = $self->_get_views($schema);
    $length = scalar @views;
    for (my $i = 0; $i < $length; $i++ ) {
        my $view->{view} = $views[$i];
        my $column_names = $self->get_table_column_names($view->{view}->{table_name}, $schema);
        $view->{view}->{column_names} = $column_names;
        $view->{view}->{keys} = $self->_get_keys($column_names);
        push (@vie, $view);
    }

    $result->{views} = \@vie;
    return $result;
}

sub build_view_methods($self, $view, $column_names) {

    my $methods->{table_name} = $view->{table_name};
    $methods->{keys} = $self->_get_keys($column_names);
    $methods->{create_endpoint} = 1;
    my $method = $self->get_view_list($view->{table_name},$column_names);
    push @{$methods->{methods}}, $method ;

    return $methods;
}

sub _get_keys($self, $column_names) {

    my $keys->{has_companies} = 0;
    $keys->{has_users} = 0;
    $keys->{fk} = ();
    my $length = scalar @{$column_names};
    for (my $i = 0; $i < $length; $i++ ) {
        if (length(@{$column_names}[$i]->{column_name}) > 0) {
            if (index(@{$column_names}[$i]->{column_name},'_pkey') > -1){
                $keys->{pk} = @{$column_names}[$i]->{column_name};
            } elsif (@{$column_names}[$i]->{column_name} eq 'companies_fkey') {
                $keys->{has_companies} = 1;
            } elsif (@{$column_names}[$i]->{column_name} eq 'users_fkey') {
                $keys->{has_users} = 1;
            } elsif (index(@{$column_names}[$i]->{column_name},'_fkey') > -1) {
                push @{$keys->{fk}}, @{$column_names}[$i]->{column_name};
            }
        }
    }
    return $keys;
}

sub _get_tables($self, $schema) {

    my @tables = $self->db->query(qq {
            SELECT table_name
              FROM information_schema.tables
             WHERE table_schema = ?
               AND table_type='BASE TABLE';
        },($schema))->hashes;
    @tables = @{ $tables[0] };

    return @tables;
}


sub _get_views($self, $schema) {

    my @views = $self->db->query(qq {
            SELECT table_name
                FROM
                  information_schema.views
                WHERE
                  table_schema NOT IN (
                    'information_schema', 'pg_catalog'
                  ) AND table_schema = ?
                ORDER BY table_name;
        },($schema))->hashes;
    @views =  @{$views[0]};

    return @views;
}

sub _get_table_column_names($self, $table, $schema) {



( run in 0.916 second using v1.01-cache-2.11-cpan-59e3e3084b8 )