On Fri, 23 Mar 2007 [EMAIL PROTECTED] wrote:

>     my $itr = Bar->get_bars_iterator();

Sorry, this should read

      my $itr = Bar::Manager->get_bars_iterator();

of course as it refers to the manager class.

-- Mike

Mike Schilli
[EMAIL PROTECTED]


>     while($itr->next()) {
>
> won't work because by default, an iterator will read in all records from
> the DB, which won't fit into memory.
>
> Using
>
>     my $itr = Bar->get_bars_iterator( per_page => 20 );
>     while($itr->next()) {
>
> works nicely, but I would rather not be in charge of keeping track
> of which page I'm currently reading and if there's more pages to
> be fetched.
>
> So I thought: Couldn't Rose have 'pager' objects acting like iterators,
> but fetching all available data in configurable chunks?
>
> The attached patch allows to say
>
>     my $pager = Bar->get_bars_pager( per_page => 20 );
>     while($pager->next()) {
>
> and the pager will act like an iterator, but instead of running
> out after one page, it will create a new iterator under the hood
> and continue until there's no more records to be fetched.
>
> What do you think?
>
> -- Mike
>
> Mike Schilli
> [EMAIL PROTECTED]
>
> --- Manager.pm.org      2007-03-23 06:26:15.000000000 -0800
> +++ Manager.pm.new      2007-03-23 08:33:55.492735974 -0800
> @@ -86,7 +86,8 @@
>
>  sub object_class { }
>
> -sub default_manager_method_types { qw(objects iterator count delete update) }
> +sub default_manager_method_types { qw(objects iterator count delete update
> +                                      pager ) }
>
>  sub make_manager_methods
>  {
> @@ -240,6 +241,26 @@
>              @_, return_iterator => 1, object_class => $object_class)
>          };
>        }
> +      elsif($type eq 'pager')
> +      {
> +        my $base_method_name =
> +          $have_full_name ? "${target_class}::$name" :
> +                            "${target_class}::get_${name}";
> +        my $iterator_method_name = "${base_method_name}_iterator";
> +        my $pager_method_name    = "${base_method_name}_pager";
> +
> +        *{$pager_method_name} = sub
> +        {
> +          shift;
> +          my($next, $finish) =
> +              $class_invocant->get_pager_methods($iterator_method_name, @_);
> +
> +          my $iterator = Rose::DB::Object::Iterator->new(active => 1);
> +          $iterator->_next_code($next);
> +          $iterator->_finish_code($finish);
> +          return $iterator;
> +        };
> +      }
>        elsif($type eq 'delete')
>        {
>          my $method_name =
> @@ -284,6 +305,31 @@
>    }
>  }
>
> +sub get_pager_methods
> +{
> +  my($class, $method, %options) = @_;
> +
> +  my $per_page        = ($options{per_page} || 20);
> +  my $page            = 0;
> +  my $itr;
> +  my $page_items_done = 0;
> +
> +  my $next = sub {
> +        # Page done? Get next iterator.
> +      if(!$itr or $page_items_done == $per_page) {
> +          $itr = $class->$method( page => ++$page, per_page => $per_page );
> +          $page_items_done = 0;
> +      }
> +
> +      $page_items_done++;
> +      return $itr->next();
> +  };
> +
> +  my $finish = sub { $itr->_finish_code() if $itr; };
> +
> +  return($next, $finish);
> +}
> +
>  sub get_objects_count
>  {
>    my($class) = shift;
>
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys-and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Rose-db-object mailing list
> Rose-db-object@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rose-db-object
>

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to