1 package MojoFacets::Data;
6 use base 'Mojolicious::Controller';
8 use Data::Dump qw(dump);
15 my $path = $self->app->home->rel_dir('data');
16 die "no data dir $path" unless -d $path;
18 opendir(my $dir, $path) || die $!;
20 grep { -f "$path/$_" && $_ =~ m/\.js(on)?$/ }
24 $self->render( files => [ @files ] );
33 my $path = $self->app->home->rel_file( 'data/' . $self->param('path') );
34 die "$path $!" unless -r $path;
36 # we could use Mojo::JSON here, but it's too slow
37 $data = from_json read_file $path;
39 foreach my $e ( @{ $data->{items} } ) {
40 foreach my $n ( keys %$e ) {
41 $stats->{$n}->{count}++;
42 $stats->{$n}->{number}++
43 if $e->{$n} =~ m/^[-+]?([0-9]*\.[0-9]+|[0-9]+)$/;
44 $stats->{$n}->{array} += $#{ $e->{$n} } + 1
45 if ref $e->{$n} eq 'ARRAY';
49 foreach my $n ( keys %$stats ) {
50 next unless defined $stats->{$n}->{array};
51 delete $stats->{$n}->{array}
52 if $stats->{$n}->{array} == $stats->{$n}->{count};
57 $self->redirect_to( '/data/columns' );
65 message => 'Select columns to display',
73 $self->redirect_to('/data/index') unless $data->{items};
75 my @columns = $self->param('columns');
77 my $order = $self->param('order') || $columns[0];
78 my $offset = $self->param('offset') || 0;
79 my $limit = $self->param('limit') || 10;
82 $a->{$order} cmp $b->{$order}
83 } @{ $data->{items} };
85 @sorted = splice @sorted, $offset, $limit;
87 warn "# sorted ", dump @sorted;
89 warn "$order $offset $limit";
95 sorted => [ @sorted ],
96 columns => [ @columns ],