Author: spadkins
Date: Wed May 2 06:53:50 2007
New Revision: 9492
Modified:
p5ee/trunk/App-Repository/lib/App/Repository.pm
p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm
Log:
added support for summarizing columns with alternate aggregation levels. made
last_inserted_id() work for repository redirects.
Modified: p5ee/trunk/App-Repository/lib/App/Repository.pm
==============================================================================
--- p5ee/trunk/App-Repository/lib/App/Repository.pm (original)
+++ p5ee/trunk/App-Repository/lib/App/Repository.pm Wed May 2 06:53:50 2007
@@ -1893,8 +1893,26 @@
&App::sub_exit() if ($App::trace);
}
+sub last_inserted_id {
+ my ($self, $table) = @_;
+ my $repname = $self->{table}{$table}{repository};
+ my $realtable = $self->{table}{$table}{table} || $table;
+ my ($id);
+ if (defined $repname && $repname ne $self->{name}) {
+ my $rep = $self->{context}->repository($repname);
+ $id = $rep->last_inserted_id($realtable);
+ }
+ elsif (defined $realtable && $realtable ne $table) {
+ $id = $self->last_inserted_id($realtable);
+ }
+ else {
+ $id = $self->_last_inserted_id($table);
+ }
+ return($id);
+}
+
sub _last_inserted_id {
- my ($self) = @_;
+ my ($self, $table) = @_;
return(undef); # sorry. maybe some subclass will know how to do this.
}
@@ -2457,6 +2475,42 @@
return($column_def);
}
+sub get_relationship_name {
+ my ($self, $table, $column, $table_def) = @_;
+
+ $table_def = $self->get_table_def($table) if (!$table_def);
+ my $column_def = $table_def->{column}{$column};
+ my $relationship_name = $column_def->{relationship_name};
+
+ if (!$relationship_name) {
+ # Determine the order in which we will process relationships
+ my $relationship_defs = $table_def->{relationship};
+ my $relationships = $table_def->{relationships}; # maybe it's
explicit
+ if (!$relationships && $relationship_defs) { # otherwise ...
+ $relationships = [
+ reverse
+ sort {
+ ($relationship_defs->{$a}{qualifying_keys} ? 0 : 1) <=>
($relationship_defs->{$b}{qualifying_keys} ? 0 : 1) ||
+ $a cmp $b
+ }
+ keys %$relationship_defs
+ ]; # *reverse* sort (x_y before x)
+ }
+ $relationships = [] if (!$relationships);
+
+ my ($rel_name);
+ for (my $rel = 0; $rel <= $#$relationships; $rel++) {
+ $rel_name = $relationships->[$rel];
+ if (! $column_def->{is_key} && $column =~ /^${rel_name}_/) {
+ $relationship_name = $rel_name;
+ last;
+ }
+ }
+ }
+
+ return($relationship_name);
+}
+
#############################################################################
# METHODS
#############################################################################
@@ -2959,14 +3013,41 @@
}
}
+ my $alternate_aggregate = []; # assume there are no alternate
aggregates
+ my ($alternate_aggregate_key_idx, $alternate_aggregate_row_idx,
$alternate_aggregate_key);
+
# determine which columns should be summable and which have expressions
my $sum_column_idx = [];
my $expr_column_idx = [];
my $contains_expr = 0;
$row = $rows->[0];
+ my ($rel_name, %rel_aggregate, $key_column);
for ($i = 0; $i <= $#$columns; $i++) {
$column = $columns->[$i];
$value = $row->[$i];
+ $rel_name = $self->get_relationship_name($table, $column,
$table_def);
+ if ($rel_name && !defined $rel_aggregate{$rel_name} &&
$table_def->{relationship}{$rel_name}{qualifying_keys}) {
+ # TODO: should this block be made a separate method?
+ my $key_idx = [];
+ my %key_idx_used = ();
+ foreach $key_column (@$summary_keys) {
+ push(@$key_idx, $colidx{$key_column});
+ $key_idx_used{$key_column} = 1;
+ }
+ for (my $j = 0; $j <= $#$columns; $j++) {
+ $key_column = $columns->[$j];
+ if ($column_defs->{$key_column}{is_key} &&
+
$table_def->{relationship}{$rel_name}{qualifying_keys}{$key_column} &&
+ !$key_idx_used{$key_column}) {
+ push(@$key_idx, $j);
+ $key_idx_used{$key_column} = 1;
+ }
+ }
+ $rel_aggregate{$rel_name} = {
+ key_idx => $key_idx,
+ row_idx => {},
+ };
+ }
if ($column_defs->{$column}{expr}) {
push(@$expr_column_idx, $i);
$contains_expr = 1;
@@ -2976,6 +3057,7 @@
}
elsif (defined $value && $value =~ /^-?[0-9\.]+$/) {
push(@$sum_column_idx, $i);
+ $alternate_aggregate->[$i] = $rel_aggregate{$rel_name};
}
}
@@ -2999,7 +3081,20 @@
}
foreach $i (@$sum_column_idx) {
if (defined $row->[$i]) {
- $summary_row->[$i] += $row->[$i];
+ if ($alternate_aggregate->[$i]) {
+ $alternate_aggregate_key_idx =
$alternate_aggregate->[$i]{key_idx};
+ $alternate_aggregate_key = join(",", @[EMAIL
PROTECTED]);
+ $alternate_aggregate_row_idx =
$alternate_aggregate->[$i]{row_idx};
+ if (! defined
$alternate_aggregate_row_idx->{$alternate_aggregate_key}) {
+
$alternate_aggregate_row_idx->{$alternate_aggregate_key} = $rowidx;
+ }
+ if
($alternate_aggregate_row_idx->{$alternate_aggregate_key} == $rowidx) {
+ $summary_row->[$i] += $row->[$i];
+ }
+ }
+ else {
+ $summary_row->[$i] += $row->[$i];
+ }
}
}
if ($ext_summaries) {
Modified: p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm
==============================================================================
--- p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm (original)
+++ p5ee/trunk/App-Repository/lib/App/Repository/MySQL.pm Wed May 2
06:53:50 2007
@@ -108,7 +108,7 @@
}
sub _last_inserted_id {
- my ($self) = @_;
+ my ($self, $table) = @_;
return($self->{dbh}{mysql_insertid});
}