cvsuser     05/10/20 13:02:14

  Modified:    App-Repository/lib/App Repository.pm
  Log:
  more expression evaluation (cols extension). _get_default_columns()
  
  Revision  Changes    Path
  1.24      +111 -5    p5ee/App-Repository/lib/App/Repository.pm
  
  Index: Repository.pm
  ===================================================================
  RCS file: /cvs/public/p5ee/App-Repository/lib/App/Repository.pm,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- Repository.pm     12 Oct 2005 13:56:14 -0000      1.23
  +++ Repository.pm     20 Oct 2005 20:02:13 -0000      1.24
  @@ -600,15 +600,44 @@
       else {
           $self->_load_table_metadata($table) if (! defined 
$self->{table}{$table}{loaded});
           if (!defined $cols) {
  -            $cols = $self->{table}{$table}{columns};
  +            $cols = $self->_get_default_columns($table);
           }
           elsif (!ref($cols)) {
               $cols = [ $cols ];
           }
           elsif ($#$cols == -1) {
  -            @$cols = @{$self->{table}{$table}{columns}};
  +            my $columns = $self->_get_default_columns($table);
  +            @$cols = @$columns;
           }
  +
  +        my ($col, $contains_expr);
  +        my $column_defs = $self->{table}{$table}{column};
  +        for (my $i = 0; $i <= $#$cols; $i++) {
  +            $col = $cols->[$i];
  +            $contains_expr = 1 if ($column_defs->{$col}{expr});
  +            # TO BE IMPLEMENTED: Automatically follow relationships for 
column defs
  +            # TO BE IMPLEMENTED: Delegated get_rows() and merge on another 
table
  +            #for ($rel = 0; $rel <= $#rel_prefix; $rel++) {
  +            #    $rel_prefix  = $rel_prefix[$rel];
  +            #    $rel_cols    = $rel_cols[$rel];
  +            #    $rel_col_idx = $rel_col_idx[$rel];
  +            #    if ($col =~ /^${rel_prefix}_(.+)$/) {
  +            #        $col2 = $1;
  +            #        push(@$rel_cols, $col2);
  +            #        $rel_col_idx->[$#$rel_cols] = $i;
  +            #        last;
  +            #    }
  +            #}
  +        }
  +        if ($contains_expr) {
  +            $cols = $self->extend_columns($table, $cols);
  +        }
  +
           $row = $self->_get_row($table, $params, $cols, $options);
  +
  +        if ($contains_expr) {
  +            $self->evaluate_expressions($table, $params, $cols, [$row], 
$options);
  +        }
       }
       &App::sub_exit($row) if ($App::trace);
       return($row);
  @@ -794,20 +823,97 @@
       else {
           $self->_load_table_metadata($table) if (! defined 
$self->{table}{$table}{loaded});
           if (!defined $cols) {
  -            $cols = $self->{table}{$table}{columns};
  +            $cols = $self->_get_default_columns($table);
           }
           elsif (!ref($cols)) {
               $cols = [ $cols ];
           }
           elsif ($#$cols == -1) {
  -            @$cols = @{$self->{table}{$table}{columns}};
  +            my $columns = $self->_get_default_columns($table);
  +            @$cols = @$columns;
  +        }
  +
  +        my ($col, $contains_expr);
  +        my $column_defs = $self->{table}{$table}{column};
  +        for (my $i = 0; $i <= $#$cols; $i++) {
  +            $col = $cols->[$i];
  +            $contains_expr = 1 if ($column_defs->{$col}{expr});
  +            # TO BE IMPLEMENTED: Automatically follow relationships for 
column defs
  +            # TO BE IMPLEMENTED: Delegated get_rows() and merge on another 
table
  +            #for ($rel = 0; $rel <= $#rel_prefix; $rel++) {
  +            #    $rel_prefix  = $rel_prefix[$rel];
  +            #    $rel_cols    = $rel_cols[$rel];
  +            #    $rel_col_idx = $rel_col_idx[$rel];
  +            #    if ($col =~ /^${rel_prefix}_(.+)$/) {
  +            #        $col2 = $1;
  +            #        push(@$rel_cols, $col2);
  +            #        $rel_col_idx->[$#$rel_cols] = $i;
  +            #        last;
  +            #    }
  +            #}
  +        }
  +        if ($contains_expr) {
  +            $cols = $self->extend_columns($table, $cols);
           }
  +
           $rows = $self->_get_rows($table, $params, $cols, $options);
  +
  +        if ($contains_expr) {
  +            $self->evaluate_expressions($table, $params, $cols, $rows, 
$options);
  +        }
       }
       &App::sub_exit($rows) if ($App::trace);
       return($rows);
   }
   
  +sub _get_default_columns {
  +    &App::sub_entry if ($App::trace);
  +    my ($self, $table) = @_;
  +    my $table_def = $self->{table}{$table};
  +    my $columns = $table_def->{default_columns} || $table_def->{columns};
  +    &App::sub_exit($columns) if ($App::trace);
  +    return($columns);
  +}
  +
  +sub extend_columns {
  +    &App::sub_entry if ($App::trace);
  +    my ($self, $table, $cols) = @_;
  +    my (%colidx, $expr_columns, $expr, $extended, $col);
  +    for (my $i = 0; $i <= $#$cols; $i++) {
  +        $col = $cols->[$i];
  +        $colidx{$col} = $i;
  +    }
  +    my $column_defs = $self->{table}{$table}{column};
  +    for (my $i = 0; $i <= $#$cols; $i++) {
  +        $col = $cols->[$i];
  +        if ($column_defs->{$col}{expr_columns}) {
  +            $expr_columns = $column_defs->{$col}{expr_columns};
  +        }
  +        elsif ($column_defs->{$col}{expr}) {
  +            $expr = $column_defs->{$col}{expr};
  +            $expr =~ s/^[^\{\}]*\{//;
  +            $expr =~ s/\}[^\{\}]*$//;
  +            $expr_columns = [ split(/\}[^\{\}]*\{/, $expr) ];
  +            $column_defs->{$col}{expr_columns} = $expr_columns;
  +        }
  +        else {
  +            next;
  +        }
  +        foreach my $expr_col (@$expr_columns) {
  +            if (! defined $colidx{$expr_col}) {
  +                if (!$extended) {
  +                    $cols = [ @$cols ];  # make a copy. don't extend 
original.
  +                    $extended = 1;
  +                }
  +                push(@$cols, $expr_col);
  +                $colidx{$expr_col} = $#$cols;
  +            }
  +        }
  +    }
  +    &App::sub_exit($cols) if ($App::trace);
  +    return($cols);
  +}
  +
   #############################################################################
   # set_rows()
   #############################################################################
  
  
  

Reply via email to