+ rows => $#filtered + 1,
+ numeric => { map { $_, $self->_is_numeric($_) } @columns },
+ filters => $self->_current_filters,
+ );
+
+}
+
+
+sub order {
+ my $self = shift;
+ $self->session('order', $self->param('order'));
+ $self->session('sort', $self->param('sort'));
+ $self->redirect_to('/data/items');
+}
+
+sub _is_numeric {
+ my ( $self, $name ) = @_;
+
+ my $stats = $self->_loaded( 'stats' );
+
+ # sort facet numerically if more >50% elements are numeric
+ my $count = $stats->{$name}->{count};
+ $count -= $stats->{$name}->{empty} if defined $stats->{$name}->{empty};
+ defined $stats->{$name}->{numeric} &&
+ $stats->{$name}->{numeric} > $count / 2;
+}
+
+sub facet {
+ my $self = shift;
+
+ my $path = $self->session('path') || $self->redirect_to( '/data/index' );
+
+ if ( my $remove = $self->param('remove') ) {
+ delete $filters->{$remove};
+ $self->redirect_to( '/data/items' );
+ }
+
+ my $facet;
+ my $name = $self->param('name') || die "no name";
+
+ my $all = $self->_perm_scalar('all', 1);
+
+ foreach my $i ( $self->_data_items($all) ) {
+ if ( ! exists $i->{$name} ) {
+ $facet->{ _missing }++;
+ } elsif ( ref $i->{$name} eq 'ARRAY' ) {
+ $facet->{$_}++ foreach @{ $i->{$name} };
+ } else {
+ $facet->{ $i->{$name} }++;
+ }
+ }
+
+# warn "# facet $name ",dump $facet;
+
+ my $checked;
+ my @facet_names =
+ $all ? keys %$facet
+ : defined $filters->{$name} ? @{ $filters->{$name} }
+ : keys %$facet;
+
+ $checked = $self->_checked( @{ $filters->{$name} } ) if defined $filters->{$name};
+
+ my $sort = $self->param('sort') || 'c';
+
+ # sort facet numerically if more >50% elements are numeric
+ my $numeric = $self->_is_numeric($name);
+
+ @facet_names = sort {
+ if ( $sort =~ m/a/i ) {
+ $numeric ? $a <=> $b : lc $a cmp lc $b;
+ } elsif ( $sort =~ m/d/i ) {
+ $numeric ? $b <=> $a : lc $b cmp lc $a;
+ } elsif ( $sort =~ m/c/i ) {
+ $facet->{$b} <=> $facet->{$a};
+ } else {
+ warn "unknown sort: $sort";
+ $a cmp $b;
+ }
+ } @facet_names;
+
+ $self->render( name => $name, facet => $facet, checked => $checked,
+ facet_names => \@facet_names, sort => $sort, numeric => $numeric,