X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FMojoFacets%2FData.pm;h=eebc11470ce6ceca674c36f9e5a94cc912eb6724;hb=03ccbdf02a1117c02ce69701410d8eeeb8ea4686;hp=c5a8b8a773eecfd619d4f3339f149d93af973ee8;hpb=796df13e49a6ca1be8fb4ce2edc54b325aa5c800;p=MojoFacets.git diff --git a/lib/MojoFacets/Data.pm b/lib/MojoFacets/Data.pm index c5a8b8a..eebc114 100644 --- a/lib/MojoFacets/Data.pm +++ b/lib/MojoFacets/Data.pm @@ -10,6 +10,7 @@ use File::Slurp; use JSON; use Encode; use locale; +use File::Find; sub index { my $self = shift; @@ -17,11 +18,16 @@ sub index { my $path = $self->app->home->rel_dir('data'); die "no data dir $path" unless -d $path; - opendir(my $dir, $path) || die $!; - my @files = - grep { -f "$path/$_" && $_ =~ m/\.js(on)?$/ } - readdir $dir; - close($dir); + my @files; + find( sub { + my $file = $File::Find::name; + if ( -f $file && $file =~ m/\.(js(on)?|txt)$/ ) { + $file =~ s/$path\/*//; + push @files, $file; + } else { + warn "IGNORE: $file\n"; + } + }, $path); $self->render( files => [ @files ] ); } @@ -40,9 +46,49 @@ sub load { # we could use Mojo::JSON here, but it's too slow # $data = from_json read_file $path; $data = read_file $path; - Encode::_utf8_on($data); - warn "# json snippet: ", substr($data,0,200); - $data = from_json $data; + warn "# data snippet: ", substr($data,0,200); + if ( $path =~ m/\.js/ ) { + Encode::_utf8_on($data); + $data = from_json $data; + $self->session( 'header' => 0 ); # generate later + } elsif ( $path =~ m/\.txt/ ) { + my @lines = split(/\r?\n/, $data); + $data = { items => [] }; + + my $headers = shift @lines; + my $multiline = $headers =~ s/\^//g; + my @header = split(/\|/, $headers ); + warn "# header ", dump( @header ); + $self->session( 'header' => [ @header ] ); + $self->session( 'columns' => [ @header ] ); + while ( my $line = shift @lines ) { + chomp $line; + my @v = split(/\|/, $line); + while ( @lines && $#v < $#header ) { + $line = $lines[0]; + $line =~ s/\^//g; + chomp $line; + my @more_v = split(/\|/, $line); + if ( $#v + $#more_v > $#header ) { + warn "short line: ",dump( @v ); + last; + } + shift @lines; + $v[ $#v ] .= shift @more_v; + push @v, @more_v if @more_v; + + if ( $#v > $#header ) { + die "# splice $#header ", dump( @v ); + @v = splice @v, 0, $#header; + } + } + my $item; + $item->{ $header[$_] || "f_$_" } = [ $v[$_] ] foreach ( 0 .. $#v ); + push @{ $data->{items} }, $item; + } + } else { + warn "file format unknown $path"; + } $stats = {}; @@ -71,8 +117,15 @@ sub load { if $stats->{$n}->{array} == $stats->{$n}->{count}; } + $self->session( 'header' => [ + sort { $stats->{$b}->{count} <=> $stats->{$a}->{count} } + grep { defined $stats->{$_}->{count} } keys %$stats + ] ) unless $self->session( 'header' ); + warn dump($stats); + $self->session( 'filters' => {} ); + $self->redirect_to( '/data/columns' ); } @@ -80,16 +133,15 @@ sub load { sub columns { my $self = shift; + $self->redirect_to( '/data/index' ) unless $self->session('header'); my @columns; - @columns = @{ $self->session('columns') } if $self->session('columns'); + @columns = grep { defined $stats->{$_}->{count} } @{ $self->session('columns') } if $self->session('columns'); - foreach my $c ( sort { $stats->{$b}->{count} <=> $stats->{$a}->{count} } keys %$stats ) { + foreach my $c ( @{ $self->session( 'header' ) } ) { push @columns, $c unless grep { /^\Q$c\E$/ } @columns; } - $self->redirect_to( '/data/index' ) unless @columns; - $self->render( message => 'Select columns to display', stats => $stats, @@ -157,7 +209,7 @@ sub filter { $self->session( 'offset' => 0 ); - $self->redirect_to('/data/table'); + $self->redirect_to('/data/items'); } sub _filter_item { @@ -196,7 +248,7 @@ sub _data_items { } @{ $data->{items} }; } -sub table { +sub items { my $self = shift; $self->redirect_to('/data/index') unless $data->{items}; @@ -207,6 +259,7 @@ sub table { my $sort = $self->_perm_scalar('sort', 'a'); my $offset = $self->_perm_scalar('offset', 0); my $limit = $self->_perm_scalar('limit', 20); + $self->_perm_scalar('show', 'table'); # fix offset when changing limit $offset = int( $offset / $limit ) * $limit; @@ -243,7 +296,7 @@ sub order { my $self = shift; $self->session('order', $self->param('order')); $self->session('sort', $self->param('sort')); - $self->redirect_to('/data/table'); + $self->redirect_to('/data/items'); } sub _is_numeric { @@ -261,7 +314,7 @@ sub facet { my $f = $self->session('filters'); delete $f->{$remove}; $self->session( 'filters' => $f ); - $self->redirect_to( '/data/table' ); + $self->redirect_to( '/data/items' ); } my $facet;