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;
}
$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;
}
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 {
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 );
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;
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');
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({
}
# 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 );
warn "# __path_modified $path $value\n";
}
+sub __path_rebuild_stats { $loaded->{ $_[0] }->{rebuild_stats} = 1 };
+
sub _save_change {
my ($self,$change) = @_;
__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);
% 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>
<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>
% }
% }