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});
 }
 

Reply via email to