+# warn "# all_filters $all_filters ", dump( $loaded->{$path}->{filtered}->{$all_filters} );
+
+ if ( ! defined $loaded->{$path}->{filtered}->{$all_filters} ) {
+
+ my $path_filters = $loaded->{$path}->{filters};
+
+ warn "create combined filter for $all_filters\n";
+
+ my @filtered;
+ foreach my $i ( 0 .. $#$sorted ) {
+ my $pos = $sorted->[$i];
+
+ if ( $#filter_names == -1 ) {
+ push @filtered, $pos;
+ next;
+ }
+
+ my $skip = 0;
+ foreach ( @filter_names ) {
+ $skip ||= 1 if ! defined $path_filters->{$_}->{$pos};
+ }
+ next if $skip;
+
+ push @filtered, $pos;
+ }
+
+ $loaded->{$path}->{filtered}->{$all_filters} = [ @filtered ];
+ }
+
+ my $filtered = $loaded->{$path}->{filtered}->{$all_filters}
+ if defined $loaded->{$path}->{filtered}->{$all_filters};
+
+ warn "all_filters $all_filters produced ", $#$filtered + 1, " items\n" if $filtered;
+
+ my $sorted_items;
+ my $data = $self->_loaded('data');
+ my $from_end = $sort eq 'd' ? $#$filtered : 0;
+ foreach ( 0 .. $limit ) {
+ my $i = $_ + $offset;
+ last unless defined $filtered->[$i];
+ $i = $from_end - $i if $from_end;
+ push @$sorted_items, $data->{items}->[ $filtered->[$i] ];
+ }
+
+ warn "# sorted_items ", $#$sorted_items + 1, " offset $offset limit $limit order $sort";