--- Webpacus2/lib/Webpacus/Action/Search.pm 2007/11/02 12:23:40 962 +++ Webpacus2/lib/Webpacus/Action/Search.pm 2007/11/02 12:59:39 963 @@ -43,6 +43,10 @@ =head2 take_action +Create C which can be accessed from L like this: + + my $results = $search->result->content('results'); + =cut sub take_action { @@ -105,6 +109,22 @@ my $store; +=head2 count + +Returns number of records in results + + my $nr_records = $results->count; + +=head2 next + +Fetch next result and return C object + + while ( my $ds = $results->next ) { + # do something with $ds object + } + +=cut + sub next { my $self = shift; @@ -132,44 +152,77 @@ return; } - my $row; + # add permanent fields + $ds->{$_} ||= { display => $hit->{$_} } foreach ( qw/database input id/ ); - foreach my $f ( keys %$ds ) { - $row->{$f} = $ds->{$f}->{display} if defined $ds->{$f}->{display}; - } + return Webpacus::Action::DS->new( $ds ); + +} + +package Webpacus::Action::DS; + +use warnings; +use strict; + +use Data::Dump qw/dump/; +use Carp qw/confess/; - return unless $row; +sub new { + my $class = shift; - $row->{$_} ||= $hit->{$_} foreach ( qw/database input id/ ); + my ( $ds ) = @_; - warn "## next row = ", dump( $row ) if $debug; + my $self = { + ds => $ds, + }; + bless ($self, $class); - return sub { - my ( $name, $delimiter ) = @_; - # default delimiter is space - $delimiter ||= ' '; - die "no name?" unless $name; - if ( defined $row->{$name} ) { - # XXX disabled, Template::Declare always want scalars :-( - if ( 0 && wantarray ) { - if ( ref($row->{$name}) eq 'ARRAY' ) { - return $row->{$name}; - } else { - return [ $row->{$name} ]; - } - } else { - if ( ref($row->{$name}) eq 'ARRAY' && $delimiter ne 'ARRAY' ) { - warn "is array ", wantarray ? 'wantarray' : 'scalar', " $name"; - return @{$row->{$name}} if wantarray; - return join( $delimiter, @{ $row->{$name} }); - } else { - warn "not array ", wantarray ? 'wantarray' : 'scalar', " $name"; - return $row->{$name}; - } - } + return $self; + +} + +sub _row { + my ( $self, $type, $field, $delimiter ) = @_; + + confess "no type?" unless $type; + confess "no field?" unless $field; + confess "no ds?" unless $self->{ds}; + + $delimiter ||= '[x]'; + + my $ds = $self->{ds}; + + warn "### ds = ",dump( $ds ) if $debug; + + return unless defined $ds->{$field}->{$type}; + + if ( my $v = $ds->{$field}->{$type} ) { + + if ( ref($v) eq 'ARRAY' ) { + warn "is array ", wantarray ? 'wantarray' : 'scalar', " $field $type" if $debug; + return @$v if wantarray; + return join( $delimiter, @$v ); + } else { + warn "not array ", wantarray ? 'wantarray' : 'scalar', " $field $type" if $debug; + return $v; } + + } else { return; } + +} + +=head2 display + + $ds->display( 'TitleProper' ); + +=cut + +sub display { + my $self = shift; + warn "## display(",dump(@_),")\n"; + return $self->_row('display',@_); } 1;