Author: spadkins
Date: Thu Nov 30 09:09:40 2006
New Revision: 8326

Modified:
   p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm

Log:
introduce summarization to graphs

Modified: p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm
==============================================================================
--- p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm       (original)
+++ p5ee/trunk/App-Widget/lib/App/Widget/Graph.pm       Thu Nov 30 09:09:40 2006
@@ -151,60 +151,80 @@
     $columns = [ split(/,/, $columns) ] if (!ref($columns));
     die "no columns in graph" if ($#$columns == -1);
 
-    my ($objects, $keys, $column_defs, $object_set);
+    my $keys = $self->{keys};
+    $keys = [ split(/,/, $keys) ] if (!ref($keys));
+
+    my ($objects, $summary_keys, $graph_keys, $column_defs, $object_set);
+
     if ($self->{objects}) {
-        $keys        = $self->{keys};
-        $objects     = $self->{objects};
-        $column_defs = $self->{column_defs};
+        $objects      = $self->{objects};
+        $summary_keys = $self->{summary_keys};
+        $column_defs  = $self->{column_defs};
     }
     else {
         $object_set = $self->get_object_set($spec);
-        if (!$object_set) {
-            die "No known way to get data";
-        }
-
+        die "No known way to get data" if (!$object_set);
         # make sure that the columns we need for the graph are in the
-        # list of columns in the dataset
+        # list of columns in the object_set
         $object_set->include_columns($columns);
-
-        $keys = $object_set->get_key_columns();  # get the columns that are 
keys
-        $column_defs = $object_set->get_column_defs();
+        $objects      = $object_set->get_objects();
+        $summary_keys = $object_set->get_key_columns();  # get the columns 
that are keys
+        $column_defs  = $object_set->get_column_defs();
     }
 
-    my $column_dims = (($#$columns > 0) ? 1 : 0);
-    my $data_dims   = ($#$keys + 1) + $column_dims;
-    my $graph_dims  = $self->get_num_dims($spec->{graphtype});
-    if ($graph_dims > $data_dims) {
-        $graph_dims = $data_dims;
+    # if the number of columns is more than 1, then the inner-most dimension 
is the different columns
+    my $column_dims        = (($#$columns > 0) ? 1 : 0);
+    my $max_graphtype_dims = $self->get_num_dims($spec->{graphtype});
+    my $max_data_dims      = $max_graphtype_dims - $column_dims;
+
+    if (!$keys) {
+        if ($summary_keys) {
+            $keys = [EMAIL PROTECTED];
+        }
+        else {
+            $keys = [];
+        }
     }
 
-    if ($self->{objects}) {
-        if ($graph_dims < $data_dims) {
-            $graph_dims = $data_dims;
-        }
+    my $needs_summarization = 0;
+    if (!$summary_keys) {
+        $needs_summarization = 1;
     }
     else {
-        if ($graph_dims < $data_dims) {
-            $graph_dims = $data_dims;
-            my (@index_keys);
-            my $index = $object_set->get_index([EMAIL PROTECTED]);
-            my $key = $spec->{key};
-            if (!$key) {
-                my @keys = (sort keys %$index);
-                $key = $keys[0];
-            }
-            $objects = $index->{$key};
-        }
-        else {
-            $graph_dims = $data_dims;
-            $objects = $object_set->get_objects();
-        }
+        my $new_keys = [];
+        my (%key_avail, $key);
+        foreach $key (@$summary_keys) {
+            $key_avail{$key} = 1;
+            #print STDERR "\$key_avail{$key} = 1\n";
+        }
+        foreach $key (reverse @$keys) {
+            #print STDERR "  \$key = [$key]\n";
+            last if ($#$new_keys + 1 >= $max_data_dims);
+            if ($key_avail{$key}) {
+                #print STDERR "     UNSHIFTED \$key = [$key]\n";
+                unshift(@$new_keys, $key);
+            }
+        }
+        if ($#$new_keys != $#$summary_keys) {
+            $needs_summarization = 1;
+        }
+        $keys = $new_keys;
+    }
+
+    if ($needs_summarization && $#$objects > -1) {
+        my $rep = $objects->[0]{_repository} || $self->{context}->repository();
+        #print STDERR "needs_summarization keys = [EMAIL PROTECTED] rows 
before [", ($#$objects + 1), "]\n";
+        #print STDERR " row {", join("|", %{$objects->[0]}), "]\n";
+        $objects = $rep->summarize_rows($spec->{table}, $objects, undef, 
$keys);
+        #print STDERR "needs_summarization keys = [EMAIL PROTECTED] rows after 
 [", ($#$objects + 1), "]\n";
+        #print STDERR " row {", join("|", %{$objects->[0]}), "]\n";
     }
 
     my (@x, @yn, $object, $column);
     my ($label);
 
-    if ($#$columns > 0 || $graph_dims < 2) {
+    my $data_dims   = ($#$keys + 1) + $column_dims;
+    if ($#$columns > 0 || $data_dims < 2) {
         for (my $i = 0; $i <= $#$objects; $i++) {
             $object = $objects->[$i];
             for (my $j = 0; $j <= $#$columns; $j++) {
@@ -267,7 +287,6 @@
 
         $spec->{y_labels} = [EMAIL PROTECTED];
     }
-
     &App::sub_exit() if ($App::trace);
 }
 

Reply via email to