X-Git-Url: http://git.rot13.org/?p=MojoFacets.git;a=blobdiff_plain;f=lib%2FMojoFacets%2FData.pm;h=e3cfa465a93f51a85159b332d189d27e9f7079cb;hp=c2283b875ba123bfc243dbf0e2e4d0e3e66524d8;hb=b237a52c75cbb03320035afada3c8e8ff60d7dd3;hpb=83132a946e365cb2b134f26bed859f60bcdb2eda diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index c2283b8..e3cfa46 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -372,7 +372,7 @@ sub _param_scalar { $self->session($name => $scalar); } - warn "# _perm_scalar $name ",dump $scalar; + warn "# _param_scalar $name ",dump $scalar; return $scalar; } @@ -605,17 +605,58 @@ sub items { warn "all_filters $all_filters produced ", $#$filtered + 1, " items\n" if $filtered; - my $sorted_items; my $data = $self->_loaded('data'); + + my $code = $self->_param_scalar('code',''); + $code =~ s{\n+$}{}s; + + my $commit = $self->param('commit'); + my $test = $self->param('test'); + + if ( $code && ( $test || $commit ) ) { + # XXX find columns used in code snippet and show them to user + foreach my $column ( $code =~ m/\$rec->{(.+?)}/g ) { + if ( $column =~ s/^(['"])// ) { + $column =~ s/$1$//; + } + next if grep { /$column/ } @columns; + unshift @columns, $column; + if ( $commit ) { + $self->session('columns', [ @columns ]); + $loaded->{$path}->{columns} = [ @columns ]; + } + } + } + + if ( $commit ) { + warn "# commit on ", $#$filtered + 1, " items:\n$code\n"; + foreach ( 0 .. $#$filtered ) { + my $i = $filtered->[$_]; + my $rec = $data->{items}->[$i]; + eval $code; + } + } + + my $sorted_items; my $from_end = $sort eq 'd' ? $#$filtered : 0; foreach ( 0 .. $limit ) { my $i = $_ + $offset; last unless defined $filtered->[$i]; $i = $from_end - $i if $from_end; my $id = $filtered->[$i]; - push @$sorted_items, - my $item = $data->{items}->[ $id ]; - $item->{_row_id} ||= $id; + my $rec = $data->{items}->[ $id ]; + $rec->{_row_id} ||= $id; + if ( $code && $test ) { + $rec = Storable::dclone $rec; + eval $code; + if ( $@ ) { + warn "ERROR evaling\n$code\n$@"; + $self->stash('eval_error', $@) if $@; + } else { + warn "EVAL ",dump($rec); + } + } + push @$sorted_items, $rec; } warn "# sorted_items ", $#$sorted_items + 1, " offset $offset limit $limit order $sort"; @@ -629,6 +670,7 @@ sub items { rows => $#$filtered + 1, numeric => { map { $_, $self->_is_numeric($_) } @columns }, filters => $self->_current_filters, + code => $code, ); }