-sub _filter_item {
- my ( $self, $filters, $i ) = @_;
- my $pass = 1;
- foreach my $n ( keys %$filters ) {
- my @filter_values = @{ $filters->{$n} };
- my $include_missing = grep { /^_missing/ } @filter_values;
- if ( ! exists $i->{$n} ) {
- if ( $include_missing ) {
- $pass = 1;
- next;
- } else {
+
+sub _data_items {
+ my ( $self, $all ) = @_;
+ my $data = $self->_loaded( 'data' );
+
+ return @{ $data->{items} } if $all == 1;
+
+ my $filters = $self->_current_filters;
+ my $filter_value;
+ foreach my $f ( keys %$filters ) {
+ foreach my $n ( @{ $filters->{$f} } ) {
+ $filter_value->{$f}->{$n} = 1;
+ }
+ }
+ my @items = @{ $data->{items} };
+ @items = grep {
+ my $i = $_;
+ my $pass = 1;
+ foreach my $n ( keys %$filter_value ) {
+ if ( ! exists $i->{$n} ) {
+ if ( defined $filter_value->{$n}->{_missing} ) {
+ $pass = 1;
+ next;
+ } else {
+ $pass = 0;
+ last;
+ }
+ }
+ # and match any of values in element
+ my $have_values = 0;
+ foreach my $v ( @{ $i->{$n} } ) { # FIXME not array?
+ $have_values ||= 1 if defined $filter_value->{$n}->{$v};
+ }
+ if ( ! $have_values ) {