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 = [@$summary_keys];
+ }
+ 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(\@index_keys);
- 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 = [@$keys] 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 = [@$keys] 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} = \@y;
}
-
&App::sub_exit() if ($App::trace);
}
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.