- # FIXME - multi-level sort
- my $numeric = $self->_is_numeric($order);
- my $missing = $numeric ? 0 : '';
- no warnings qw(numeric);
- my @sorted = sort {
- my $v1 = exists $a->{$order} ? join('', @{$a->{$order}}) : $missing;
- my $v2 = exists $b->{$order} ? join('', @{$b->{$order}}) : $missing;
- ($v1,$v2) = ($v2,$v1) if $sort eq 'd';
- $numeric ? $v1 <=> $v2 : $v1 cmp $v2 ;
- } $self->_data_items;
+ my $sorted = $self->_data_sorted_by( $order );
+
+ my @filter_names;
+ if ( $filters ) {
+ foreach my $name ( keys %$filters ) {
+ if ( ! defined $loaded->{$path}->{stats}->{ $name } ) {
+ warn "skip filter $name not found in $path\n";
+ next;
+ }
+ push @filter_names, $name;
+ }
+ warn "filter_names ",dump( @filter_names );
+ foreach my $name ( @filter_names ) {
+ next if ref $loaded->{$path}->{filters}->{$name} eq 'ARRAY';
+ $self->_filter_on_data( $name, @{ $filters->{$name} } );
+ }
+ }
+
+ my $all_filters = join(' ',sort @filter_names,'order:',$order);
+
+# 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 ];
+ }