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()
#############################################################################