[svn:p5ee] r9492 - in p5ee/trunk/App-Repository/lib/App: . Repository

[email protected]
Newsgroups perl.cvs.p5ee
Message-ID <[email protected]>
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(",", @{$row}[@$alternate_aggregate_key_idx]);
+                        $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});
 }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.