cleanup changes and apply code on dataset
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 24 Jun 2010 22:39:12 +0000 (00:39 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 24 Jun 2010 22:39:12 +0000 (00:39 +0200)
This involved creating few more __ MojoFacets::Data methods

lib/MojoFacets/Changes.pm
lib/MojoFacets/Data.pm
templates/changes/index.html.ep

index 5e43b2e..8b4cab8 100644 (file)
@@ -20,10 +20,15 @@ sub index {
        my $path = $self->param('path') || $self->session('path');
        my $commit = $self->param('commit');
        my ( $items, $unique2id );
-       if ( my $apply_on_path = $self->param('apply_on_path') ) {
-               $items = $MojoFacets::Data::loaded->{$apply_on_path}->{data}->{items};
-               die "no $apply_on_path" unless $items;
-               warn "using $items for $apply_on_path\n";
+       if ( $path ) {
+               $items = $MojoFacets::Data::loaded->{$path}->{data}->{items};
+               if ( ! $items ) {
+                       warn "$path not loaded";
+                       $self->session('path', $path);
+                       $self->redirect_to('/data/index');
+                       return;
+               }
+               warn "using $items for $path\n";
        }
        my $invalidate_columns;
        my $changes;
@@ -58,8 +63,24 @@ sub index {
                        }
                        $e->{_status} = $status;
                        $stats->{$status}++;
+               } elsif ( my $code = $e->{code} ) {
+                       if ( $commit ) {
+                               my $commit_changed;
+                               my $t = time();
+                               foreach my $i ( 0 .. $#$items ) {
+                                       MojoFacets::Data::__commit_path_code( $path, $i, $code, \$commit_changed );
+                               }
+                               $t = time() - $t;
+                               $self->stash( 'commit_changed', $commit_changed );
+                               warn "commit_changed in $t s ",dump( $e->{commit_changed}, $commit_changed );
+                               $e->{commit_changed_this} = $commit_changed;
+                               MojoFacets::Data::__invalidate_path_column( $path, $_ ) foreach keys %$commit_changed;
+                               MojoFacets::Data::__path_rebuild_stats( $path );
+                       }
+                       $stats->{code}++;
                } else {
                        warn "no unique in ", dump($e);
+                       $stats->{no_unique}++;
                }
                push @$changes, $e;
        }
@@ -73,7 +94,7 @@ sub index {
        my @loaded = MojoFacets::Data::__loaded_paths();
        warn "# loaded paths ",dump @loaded;
 
-       $self->render( changes => $changes, loaded => \@loaded, stats => $stats );
+       $self->render( path => $path, changes => $changes, loaded => \@loaded, stats => $stats );
 }
 
 sub remove {
index 2d3b4c7..761ded7 100644 (file)
@@ -279,11 +279,18 @@ sub _loaded {
                        warn "rebuild stats for $path ignored caller $caller\n";
                } else {
                        warn "rebuild stats for $path FORCED by modified caller $caller\n";
-                       $loaded->{$path}->{stats} = __stats( $loaded->{$path}->{data}->{items} );
+#                      $loaded->{$path}->{stats} = __stats( $loaded->{$path}->{data}->{items} );
+                       $loaded->{$path}->{rebuild_stats} = 1;
                        $loaded->{$path}->{modified} = 1;
                }
        }
 
+       if ( defined $loaded->{$path}->{rebuild_stats} ) {
+               warn "rebuild_stats $path";
+               $loaded->{$path}->{stats} = __stats( $loaded->{$path}->{data}->{items} );
+               delete $loaded->{$path}->{rebuild_stats};
+       }
+
        if ( ! defined $loaded->{$path}->{$name} ) {
                warn "$path $name isn't loaded\n";
                $self->_load_path( $path );
@@ -542,6 +549,21 @@ sub __all_filters {
        join(',', sort(@_), 'order', $order);
 }
 
+sub __commit_path_code {
+       my ( $path, $i, $code, $commit_changed ) = @_;
+
+       my $items = $loaded->{$path}->{data}->{items} || die "no items for $path";
+       my $row = $items->[$i];
+       my $update;
+       eval $code;
+       foreach ( keys %$update ) {
+               $$commit_changed->{$_}++;
+               $loaded->{$path}->{data}->{items}->[$i]->{$_} = $update->{$_};
+       }
+       warn "XX ",dump( $loaded->{$path}->{data}->{items}->[$i] );
+       warn "__commit_path_code $path ",dump( $update );
+}
+
 sub items {
        my $self = shift;
 
@@ -624,7 +646,7 @@ sub items {
        my $data = $self->_loaded('data');
 
        my $code = $self->_param_scalar('code','');
-       $code =~ s{[\r\n]+$}{}s;
+       $code =~ s{[\r\n]+$}{\n}s;
 
        my $commit = $self->param('commit');
        my $test = $self->param('test');
@@ -650,13 +672,7 @@ sub items {
                my $out;
                foreach ( 0 .. $#$filtered ) {
                        my $i = $filtered->[$_];
-                       my $row = $data->{items}->[$i];
-                       my $update;
-                       eval $code;
-                       foreach ( keys %$update ) {
-                               $commit_changed->{$_}++;
-                               $row->{$_} = $update->{$_};
-                       }
+                       __commit_path_code( $path, $i, $code, \$commit_changed );
                }
 
                $self->_save_change({
@@ -726,7 +742,7 @@ sub items {
                }
 
                # this might move before $out to recalculate stats on source dataset?
-               __path_modified( $path, 2 );
+               __path_rebuild_stats( $path );
                my $c = { map { $_ => 1 } @columns };
                my @added_columns = sort grep { ! $c->{$_} } keys %$commit_changed;
                warn "# added_columns ",dump( @added_columns );
@@ -970,6 +986,8 @@ sub __path_modified {
        warn "# __path_modified $path $value\n";
 }
 
+sub __path_rebuild_stats { $loaded->{ $_[0] }->{rebuild_stats} = 1 };
+
 sub _save_change {
        my ($self,$change) = @_;
 
@@ -1030,8 +1048,7 @@ sub edit {
                        __invalidate_path_column( $path, $name );
 
                        $status = 201; # created
-                       # modified = 2 -- force rebuild of stats
-                       __path_modified( $path, 2 );
+                       __path_rebuild_stats( $path );
        
                        $new_content = join("\xB6",@$v);
 
index d867c3e..f4e5881 100644 (file)
@@ -1,14 +1,12 @@
 % layout 'ui';
 
-
 % my $dump = param('dump');
-% my $apply_on_path = param('apply_on_path') || session('path');
 
 <form method=post>
-<input type=submit value="Apply"> on
-<select name=apply_on_path>
+<input name=apply type=submit value="Apply"> on
+<select name=path>
 % foreach my $p ( @$loaded ) {
-<option<%= $p eq $apply_on_path ? ' selected' : '' %>><%= $p %></option>
+<option<%= $p eq $path ? ' selected' : '' %>><%= $p %></option>
 % }
 </select>
 
@@ -16,7 +14,7 @@
 
 <label><input type=checkbox name=dump <%= $dump ? 'checked' : '' %>>dump</label>
 
-% if ( $apply_on_path ) {
+% if ( $path ) {
 <ul id=status>
 %  foreach my $status ( keys %$stats ) {
 <li><label>
 %  }
 </ul>
 
-%  if ( ! param('commit') ) {
+%  if ( ! param('commit') && param('apply') ) {
 <input type=submit name=commit value="Commit changes">
-%  } else {
+%  } elsif ( param('commit') ) {
 <b>
-Changes commited to <a href="<%= url_for( controller => 'data', action => 'load' )->query( path => $apply_on_path ) %>"><%= $apply_on_path %></a>
+Changes commited to <a href="<%= url_for( controller => 'data', action => 'load' )->query( path => $path ) %>"><%= $path %></a>
 </b>
+<pre><%= dumper stash('commit_changed') %></pre>
 %  }
 
 % }