Geoffrey-Converter-Pg

 view release on metacpan or  search on metacpan

lib/Geoffrey/Converter/Pg/Index.pm  view on Meta::CPAN

package Geoffrey::Converter::Pg::Index;

use utf8;
use 5.016;
use strict;
use warnings;

$Geoffrey::Converter::Pg::Index::VERSION = '0.000204';

use parent 'Geoffrey::Role::ConverterType';

sub add {
    my ( $self, $params ) = @_;
    if ( !$params ) {
        require Geoffrey::Exception::General;
        Geoffrey::Exception::General::throw_no_params();
    }
    if ( !$params->{table} ) {
        require Geoffrey::Exception::RequiredValue;
        Geoffrey::Exception::RequiredValue::throw_table_name();
    }
    if ( !$params->{column} ) {
        require Geoffrey::Exception::RequiredValue;
        Geoffrey::Exception::RequiredValue::throw_refcolumn_missing();
    }
    require Ref::Util;
    require Geoffrey::Utils;
    return Geoffrey::Utils::replace_spare(
        q~CREATE INDEX {0} ON {1} ({2})~,
        [
            Geoffrey::Utils::add_name(
                {
                    prefix  => 'ix',
                    name    => $params->{name},
                    context => $params->{table}
                }
            ),
            $params->{table},
            (
                join ', ', Ref::Util::is_arrayref( $params->{column} )
                ? @{ $params->{column} }
                : ( $params->{column} )
            )
        ]
    );
}

sub drop {
    my ( $self, $name ) = @_;
    if ( !$name ) {
        require Geoffrey::Exception::RequiredValue;
        Geoffrey::Exception::RequiredValue::throw_index_name();
    }
    return qq~DROP INDEX $name~;
}

sub list {
    my ( $self, $schema ) = @_;
    require Geoffrey::Utils;
    return q~SELECT
                U.usename                AS user_name,
                ns.nspname               AS schema_name,
                idx.indrelid :: REGCLASS AS table_name,
                i.relname                AS index_name,
                am.amname                AS index_type,
                idx.indkey,
                ARRAY(
                SELECT
                    pg_get_indexdef(idx.indexrelid, k + 1, TRUE)
                FROM
                    generate_subscripts(idx.indkey, 1) AS k
                ORDER BY k
                ) AS index_keys,
                (idx.indexprs IS NOT NULL) OR (idx.indkey::int[] @> array[0]) AS is_functional,
                idx.indpred IS NOT NULL AS is_partial
            FROM 
                pg_index AS idx
                JOIN pg_class AS i ON i.oid = idx.indexrelid
                JOIN pg_am AS am ON i.relam = am.oid
                JOIN pg_namespace AS NS ON i.relnamespace = NS.OID
                JOIN pg_user AS U ON i.relowner = U.usesysid
            WHERE
                    NOT nspname LIKE 'pg%'
                AND NOT idx.indisprimary
                AND NOT idx.indisunique~;
}

1;    # End of Geoffrey::Converter::Pg::Index

__END__

=pod

=head1 NAME

Geoffrey::Converter::Pg::Index - SQLite converter type for indexes!

=head1 VERSION

Version 0.000204



( run in 3.028 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )