Daje-Workflow-GenerateSchema-Activity

 view release on metacpan or  search on metacpan

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

#

#
# LICENSE
# =======
#
# Copyright (C) janeskil1525.
#
# This library is free software; you can redistribute it and/or modify
# it under the same terms as Perl itself.
#
# AUTHOR
# ======
# janeskil1525 E<lt>janeskil1525@gmail.comE<gt>



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

has 'db';
has 'excludes';

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 $excludes = $self->excludes();
    my @tables = $self->db->query(qq {
        SELECT table_name
          FROM information_schema.tables
         WHERE table_schema = ? AND table_name NOT IN(?)
           AND table_type='BASE TABLE';
    },($schema, $excludes))->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;
}



( run in 0.830 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )