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