Changeset 21969


Ignore:
Timestamp:
2010-04-27T16:00:59+12:00 (11 years ago)
Author:
kjdon
Message:

store the offsets in add_vlist for all the cases, not just for when there is only one item for a particular metadata value

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/classify/List.pm

    r20904 r21969  
    793793    if (@OIDs == 1 && $self->{$metadata_group . ".bookshelf_type"} ne "always") {
    794794        my $OID = $OIDs[0];
    795 
    796         # Find the offset of this metadata value
    797         my $offset = 0;
    798         my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"};
    799         my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}};
    800         for (my $i = 0; $i < scalar(@metadata_values); $i++) {
    801         if ($metadata_value eq $metadata_values[$i]) {
    802             $offset = $i;
    803             last;
    804         }
    805         }
     795        my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
    806796        push(@{$classifier_node->{'contains'}}, { 'OID' => $OID, 'offset' => $offset });
    807     } 
     797    }
    808798    # If 'bookshelf_type' is 'never', list all the items even if there are duplicated values
    809799    elsif ($self->{$metadata_group . ".bookshelf_type"} eq "never") {
    810        $self->add_sorted_leaf_items(\@OIDs, $classifier_node);
     800        @OIDs = $self->sort_leaf_items(\@OIDs);
     801        foreach my $OID (@OIDs) {
     802        my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
     803        push(@{$classifier_node->{'contains'}}, { 'OID' => $OID , 'offset' => $offset });
     804        }
     805   
    811806    }
    812807    # Otherwise create a sublist (bookshelf) for the metadata value
     
    814809        my %child_classifier_node = ( 'Title' => $self->convert_unicode_string_to_utf8_string($metadata_value),
    815810                      'childtype' => "VList",
     811                      'mdtype' => $metadata_group,
    816812                      'contains' => [] );
    817813
     
    824820        # Otherwise just add the documents as children of this list
    825821        else {
    826         $self->add_sorted_leaf_items(\@OIDs, \%child_classifier_node);
     822        @OIDs = $self->sort_leaf_items(\@OIDs);
     823        foreach my $OID (@OIDs) {
     824            my $offset = $self->metadata_offset($metadata_group, $OID, $metadata_value);
     825            push(@{$child_classifier_node{'contains'}}, { 'OID' => $OID , 'offset' => $offset });
     826        }
     827
    827828        }
    828829
     
    833834}
    834835
    835 sub add_sorted_leaf_items
     836sub metadata_offset
     837{
     838    my $self = shift(@_);
     839    my $metadata_group = shift(@_);
     840    my $OID = shift(@_);
     841    my $metadata_value = shift(@_);
     842   
     843    my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"};
     844    my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}};
     845    for (my $i = 0; $i < scalar(@metadata_values); $i++) {
     846    if ($metadata_value eq $metadata_values[$i]) {
     847        return $i;
     848    }
     849    }
     850   
     851    return 0;
     852}
     853
     854sub sort_leaf_items
    836855{
    837856    my $self = shift(@_);
    838857    my @OIDs = @{shift(@_)};
    839     my $classifier_node = shift(@_);   
     858#    my $classifier_node = shift(@_);
    840859   
    841860    # Sort leaf nodes and add to list
     
    847866    @OIDs = @OIDs[ sort { $OID_to_metadata_values_hash_ref->{$OIDs[$a]}[0] cmp $OID_to_metadata_values_hash_ref->{$OIDs[$b]}[0] || $a <=> $b; } 0..$#OIDs ];
    848867    }
    849 
    850     foreach my $OID (@OIDs) {
    851     push(@{$classifier_node->{'contains'}}, { 'OID' => $OID });
    852     }
    853 }
     868    return @OIDs;
     869}
     870
    854871
    855872
Note: See TracChangeset for help on using the changeset viewer.