cvsuser     05/03/14 12:05:05

  Added:       App-Repository/lib/App/SessionObject
                        RepositoryObjectDomain.pm RepositoryObjectSet.pm
  Log:
  new
  
  Revision  Changes    Path
  1.1                  
p5ee/App-Repository/lib/App/SessionObject/RepositoryObjectDomain.pm
  
  Index: RepositoryObjectDomain.pm
  ===================================================================
  
  #############################################################################
  ## $Id: RepositoryObjectDomain.pm,v 1.1 2005/03/14 20:05:05 spadkins Exp $
  #############################################################################
  
  package App::SessionObject::RepositoryObjectDomain;
  
  use App;
  use App::Repository;
  use App::SessionObject;
  
  @ISA = ( "App::SessionObject" );
  
  use strict;
  
  use Date::Format;
  use Date::Parse;
  
  =head1 NAME
  
  App::RepositoryObjectDomain - A domain of repository object sets bounded by a 
set of query parameters
  
  =head1 SYNOPSIS
  
      use App::RepositoryObjectDomain;
  
      ...
  
  =cut
  
  =head1 DESCRIPTION
  
  A RepositoryObjectDomain is a domain of repository object sets bounded by
  a set of query parameters
  
  =cut
  
  ###########################################################################
  # Support Routines
  ###########################################################################
  
  sub set_params {
      &App::sub_entry if ($App::trace);
      my ($self, $params) = @_;
      $params ||= {};
      $self->{params} = { %$params };
      &App::sub_exit() if ($App::trace);
  }
  
  sub get_object_set {
      &App::sub_entry if ($App::trace);
      my ($self, $table) = @_;
      my $context = $self->{context};
      my $params = $self->{params} || {};
      my $object_set_name = $self->{object_set}{$table}{name} || 
"$self->{name}.$table";
      my $args = $self->{object_set}{$table}{args} || {};
      if (!$args->{class}) {
          $args->{class} = "App::SessionObject::RepositoryObjectSet";
      }
      if (!$args->{table}) {
          $args->{table} = $table;
      }
      if (!$args->{params}) {
          $args->{params} = $params;
      }
      my $object_set = $context->session_object($object_set_name, %$args);
      $object_set->update_params($params);
      &App::sub_exit($object_set) if ($App::trace);
      return($object_set);
  }
  
  sub get_param_domain {
      my ($self, $param) = @_;
      my $domain = [];
      my $params = $self->{params};
      if ($params) {
          if (defined $params->{$param}) {
              $domain = [ split(/,/,$params->{$param}) ];
          }
          elsif (defined $params->{"begin_${param}"} && defined 
$params->{"end_${param}"}) {
              my $value = $params->{"begin_${param}"};
              my $end_value = $params->{"end_${param}"};
              if ($value =~ /^\d+$/) {
                  $domain = [ ($value .. $end_value) ];
              }
              elsif ($value =~ /^\d{4}-\d\d-\d\d$/) {
                  my $time = str2time($value) + 2*3600;
                  while ($value le $end_value) {
                      push(@$domain, $value);
                      $time += 24*3600;
                      $value = time2str("%Y-%m-%d", $time);
                  }
              }
          }
      }
      return($domain);
  }
  
  sub get_unique_values {
      my ($self, $column, $values, $value_idx, $value_count) = @_;
  }
  
  =head1 ACKNOWLEDGEMENTS
  
   * Author:  Stephen Adkins <[EMAIL PROTECTED]>
   * License: This is free software. It is licensed under the same terms as 
Perl itself.
  
  =head1 SEE ALSO
  
  L<C<App::Context>|App::Context>,
  L<C<App::Repository>|App::Repository>
  
  =cut
  
  1;
  
  
  
  
  1.1                  
p5ee/App-Repository/lib/App/SessionObject/RepositoryObjectSet.pm
  
  Index: RepositoryObjectSet.pm
  ===================================================================
  
  #############################################################################
  ## $Id: RepositoryObjectSet.pm,v 1.1 2005/03/14 20:05:05 spadkins Exp $
  #############################################################################
  
  package App::SessionObject::RepositoryObjectSet;
  
  use App;
  use App::Repository;
  use App::SessionObject;
  
  @ISA = ( "App::SessionObject" );
  
  use strict;
  
  =head1 NAME
  
  App::SessionObject::RepositoryObjectSet - A set of repository objects 
described by a set of query parameters
  
  =head1 SYNOPSIS
  
      use App::SessionObject::RepositoryObjectSet;
  
      ...
  
  =cut
  
  =head1 DESCRIPTION
  
  A RepositoryObjectSet is a set of repository objects (i.e. rows in 
  a database).
  
  By using a RepositoryObjectSet instead of simply doing a query, you get
  a variety of benefits.
  
   * session-level caching
   * find domains of given columns (get_column_values())
   * create unique and non-unique indexes of the object set based on
     groups of columns (get_index(), get_unique_index())
   * efficiently fetch single objects within the set or subsets of objects
     which share common values in a set of attributes
  
  =cut
  
  ###########################################################################
  # Support Routines
  ###########################################################################
  
  sub _clear_cache {
      &App::sub_entry if ($App::trace);
      my ($self) = @_;
      delete $self->{objects};
      delete $self->{index};
      delete $self->{unique_index};
      delete $self->{column_values};
      &App::sub_exit() if ($App::trace);
  }
  
  sub set_table {
      &App::sub_entry if ($App::trace);
      my ($self, $table, $repository) = @_;
      $self->{repository} = $repository || "default";
      $self->{table} = $table;
      $self->_clear_cache();
      &App::sub_exit() if ($App::trace);
  }
  
  sub set_params {
      &App::sub_entry if ($App::trace);
      my ($self, $params) = @_;
      $params ||= {};
      $self->{params} = { %$params };
      $self->_clear_cache();
      &App::sub_exit() if ($App::trace);
  }
  
  sub update_params {
      &App::sub_entry if ($App::trace);
      my ($self, $params) = @_;
      my $self_params = $self->{params};
      die "params must be set before update_params() is called" if 
(!$self_params);
      my $param_changed = 0;
      foreach my $key (keys %$self_params) {
          if (exists $params->{$key} &&
              $self_params->{$key} ne $params->{$key}) {
              $self_params->{$key} = $params->{$key};
              $param_changed = 1;
          }
      }
      if ($param_changed) {
          $self->_clear_cache();
      }
      &App::sub_exit() if ($App::trace);
  }
  
  sub _get_all_objects {
      &App::sub_entry if ($App::trace);
      my ($self) = @_;
      my $objects = $self->{objects};
      if (!$objects) {
          my $context = $self->{context};
          my $repname = $self->{repository};
          my $rep     = $context->repository($repname);
          my $table   = $self->{table} || die "table not defined";
          my $params  = $self->{params} || {};
          $objects = $rep->get_objects($table, $params);
          $self->{objects} = $objects;
      }
      &App::sub_exit($objects) if ($App::trace);
      return($objects);
  }
  
  ###########################################################################
  # Accessing individual objects
  ###########################################################################
  
  sub get_index {
      &App::sub_entry if ($App::trace);
      my $self = shift;
      my $key_name = ref($_[0]) ? "ie1" : shift;
      $key_name ||= "ie1";
      my $key_columns = shift;
      my $index = $self->{index}{$key_name};
      if (!$index) {
          if ($self->{key}{$key_name}) {
              $key_columns = $self->{key}{$key_name};
          }
          die "no list of columns given or known for key [$key_name]" if 
(!$key_columns);
          my ($key);
          $index = {};
          my $objects = $self->_get_all_objects();
          foreach my $object (@$objects) {
              $key = join(",", @[EMAIL PROTECTED]);
              if ($index->{$key}) {
                  push(@{$index->{$key}}, $object);
              }
              else {
                  $index->{$key} = [ $object ];
              }
          }
          $self->{index}{$key_name} = $index;
      }
      &App::sub_exit($index) if ($App::trace);
      return($index);
  }
  
  # $self->get_unique_index($key_columns);
  # $self->get_unique_index($key_name, $key_columns);
  # $self->get_unique_index($key_name);
  sub get_unique_index {
      &App::sub_entry if ($App::trace);
      my $self = shift;
      my $key_name = ref($_[0]) ? "ak1" : shift;
      $key_name ||= "ak1";
      my $key_columns = shift;
  
      my $unique_index = $self->{unique_index}{$key_name};
      if (!$unique_index) {
          if ($self->{key}{$key_name}) {
              $key_columns = $self->{key}{$key_name};
          }
          die "no list of columns given or known for key [$key_name]" if 
(!$key_columns);
          my ($key);
          $unique_index = {};
          my $objects = $self->_get_all_objects();
          foreach my $object (@$objects) {
              $key = join(",", @[EMAIL PROTECTED]);
              $unique_index->{$key} = $object;
          }
          $self->{unique_index}{$key_name} = $unique_index;
      }
      &App::sub_exit($unique_index) if ($App::trace);
      return($unique_index);
  }
  
  sub get_column_values {
      &App::sub_entry if ($App::trace);
      my ($self, $column) = @_;
      my $values = $self->{column_values}{$column};
      if (!$values) {
          $values = [];
          my $objects = $self->_get_all_objects();
          my (%count, $value);
          foreach my $object (@$objects) {
              $value = $object->{$column};
              if (!$count{$value}) {
                  $count{$value} = 1;
                  push(@$values, $value);
              }
              else {
                  $count{$value} ++;
              }
          }
          $self->{column_values}{$column} = $values;
      }
      &App::sub_exit($values) if ($App::trace);
      return($values);
  }
  
  # $self->get_object($key, $key_columns);
  # $self->get_object($key, $key_name, $key_columns);
  # $self->get_object($key, $key_name);
  sub get_object {
      &App::sub_entry if ($App::trace);
      my $self = shift;
      my $key = shift;
      my $key_name = ref($_[0]) ? "ak1" : shift;
      my $key_columns = shift;
      my $unique_index = $self->get_unique_index($key_name, $key_columns);
      my $object = $unique_index->{$key};
      &App::sub_exit($object) if ($App::trace);
      return($object);
  }
  
  sub get_objects {
      &App::sub_entry if ($App::trace);
      my $self = shift;
      my $key = shift;
      die "key not scalar" if (ref($key));
      my $key_name = ref($_[0]) ? "ie1" : shift;
      my $key_columns = shift;
      my ($objects);
      if ($key) {
          $key_name ||= "ie1";
          my $index = $self->get_index($key_name, $key_columns);
          $objects = $index->{$key} || [];
      }
      else {
          $objects = $self->_get_all_objects();
      }
      &App::sub_exit($objects) if ($App::trace);
      return($objects);
  }
  
  =head1 ACKNOWLEDGEMENTS
  
   * Author:  Stephen Adkins <[EMAIL PROTECTED]>
   * License: This is free software. It is licensed under the same terms as 
Perl itself.
  
  =head1 SEE ALSO
  
  L<C<App::Context>|App::Context>,
  L<C<App::Repository>|App::Repository>
  
  =cut
  
  1;
  
  
  
  

Reply via email to