App-DBBrowser

 view release on metacpan or  search on metacpan

lib/App/DBBrowser/From/Subquery.pm  view on Meta::CPAN

    $sf->{d}{stmt_types} = [ 'Select' ];
    #my $sql = { table => '()' };
    my $sql = {}; ##
    $ax->reset_sql( $sql );
    $ax->print_sql_info( $ax->get_sql_info( $sql ) ); ##
    my $subquery = $sf->subquery( $sql );
    if ( ! defined $subquery ) {
        return;
    }
    # Oracle: key word "AS" not supported in Table aliases
    my $alias = $ax->table_alias( $sql, 'derived_table', $subquery );
    return $subquery, $alias;
}


sub subquery {
    my ( $sf, $sql, $ext_info ) = @_;
    my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
    my $tr = Term::Form::ReadLine->new( $sf->{i}{tr_default} );

    CHOOSE_QUERY: while ( 1 ) {
        $sf->{from_build_SQ} = 0;
        my $selected_stmt = $sf->__choose_query( $sql, 'subquery', $ext_info );
        if ( ! defined $selected_stmt ) {
            return;
        }
        if ( $sf->{from_build_SQ} && ! $sf->{o}{G}{edit_sql_menu_sq} ) {
            $sf->{from_build_SQ} = 0;
            return "($selected_stmt)";
        }
        my $prompt = 'Query: ';
        my $info = $ext_info || $ax->get_sql_info( $sql );
        # Readline
        my $stmt = $tr->readline(
            #'Query: ',
            $prompt,
            { default => $selected_stmt, show_context => 1, info => $info }
        );
        $ax->print_sql_info( $info );
        if ( ! length $stmt ) {
            next CHOOSE_QUERY;
        }
        unshift @{$sf->{d}{subquery_history}}, $stmt;
        if ( $stmt =~ /^\s*(?:SELECT|WITH)\s/i ) {
            # A statement entered with readline could have a WITH clause.
            return "($stmt)";
        }
        else {
            return $stmt;
        }
    }
}


sub __choose_query {
    my ( $sf, $sql, $caller, $ext_info ) = @_;
    my $ax = App::DBBrowser::Auxil->new( $sf->{i}, $sf->{o}, $sf->{d} );
    my $tc = Term::Choose->new( $sf->{i}{tc_default} );
    my ( $saved_subqueries, $subquery_history, $print_history ) = $sf->__get_history();
    my $edit_sq_history_file = 'Choose:';
    my ( $readline, $build_SQ ) = ( '  Readline', '  SQL Menu' );
    my @pre = ( $edit_sq_history_file, undef, $build_SQ, $readline );
    my $old_idx = 1;

    SUBQUERY: while ( 1 ) {
        my @queries = $sf->__get_queries( $saved_subqueries, $subquery_history, $print_history );
        my $menu = [ @pre, @queries ];
        my $info = $ext_info || $ax->get_sql_info( $sql );
        # Choose
        my $idx = $tc->choose(
            $menu,
            { %{$sf->{i}{lyt_v}}, info => $info, prompt => '', index => 1, default => $old_idx, undef => '<=' }
        );
        $ax->print_sql_info( $info );
        if ( ! defined $idx || ! defined $menu->[$idx] ) {
            return;
        }
        if ( $sf->{o}{G}{menu_memory} ) {
            if ( $old_idx == $idx && ! $ENV{TC_RESET_AUTO_UP} ) {
                $old_idx = 1;
                next SUBQUERY;
            }
            $old_idx = $idx;
        }
        my $selected_stmt;
        if ( $menu->[$idx] eq $edit_sq_history_file ) {
            if ( $sf->__edit_sq_history_file() ) {
                ( $saved_subqueries, $subquery_history, $print_history ) = $sf->__get_history();
                @queries = $sf->__get_queries( $saved_subqueries, $subquery_history, $print_history );
                $menu = [ @pre, @queries ];
            }
            next SUBQUERY;
        }
        elsif ( $menu->[$idx] eq $readline ) {
            $selected_stmt = '';
        }
        elsif ( $menu->[$idx] eq $build_SQ ) {
            # Don't backup $sf->{d}{default_table_alias_count}
            my $bu_stmt_types = [ @{$sf->{d}{stmt_types}} ];
            my $bu_table_origin = $sf->{d}{table_origin};
            my $bu_main_info = $sf->{d}{main_info};
            $sf->{d}{main_info} = $ext_info || $ax->get_sql_info( $sql );
            $sf->{d}{nested_subqueries}++;
            my $stmt = $sf->__build_SQ( $caller );
            $sf->{d}{nested_subqueries}--;
            $sf->{d}{stmt_types} = $bu_stmt_types;
            $sf->{d}{table_origin} = $bu_table_origin;
            $sf->{d}{main_info} = $bu_main_info;
            if ( ! defined $stmt ) {
                next SUBQUERY;
            }
            $sf->{from_build_SQ} = 1;
            $selected_stmt = $ax->normalize_space_in_stmt( $stmt );
        }
        else {
            $idx -= @pre;
            if ( $idx < @$saved_subqueries ) {
                $selected_stmt = $saved_subqueries->[$idx]{stmt};
            }
            else {
                $idx -= @$saved_subqueries;



( run in 0.479 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )