Changeset 14845 for gsdl/trunk/perllib/classify/GenericList.pm
- Timestamp:
- 2007-11-22T16:03:51+13:00 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
gsdl/trunk/perllib/classify/GenericList.pm
r14173 r14845 307 307 return; 308 308 } 309 my %OIDtometavalueshash = %{$self->{$metadata_group . ".list"}};310 309 311 310 # Create a mapping from metadata value to OID 312 my %metavaluetoOIDhash = (); 313 foreach my $OID (@OIDs) { 314 if ($OIDtometavalueshash{$OID}) { 315 my @metavalues = @{$OIDtometavalueshash{$OID}}; 316 foreach my $metavalue (@metavalues) { 317 push(@{$metavaluetoOIDhash{$metavalue}}, $OID); 318 } 319 } 320 } 321 # print STDERR "Number of distinct values: " . scalar(keys %metavaluetoOIDhash) . "\n"; 311 my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"}; 312 my %metadata_value_to_OIDs_hash = (); 313 foreach my $OID (@OIDs) 314 { 315 if ($OID_to_metadata_values_hash_ref->{$OID}) 316 { 317 my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}}; 318 foreach my $metadata_value (@metadata_values) 319 { 320 push(@{$metadata_value_to_OIDs_hash{$metadata_value}}, $OID); 321 } 322 } 323 } 324 # print STDERR "Number of distinct values: " . scalar(keys %metadata_value_to_OIDs_hash) . "\n"; 322 325 323 326 # Partition the values (if necessary) … … 325 328 if ($partition_type_within_level =~ /^per_letter$/i) { 326 329 # Generate one hlist for each letter 327 my @sortedmeta values = $self->sort_metadata_values_array(keys(%metavaluetoOIDhash));328 my %meta valuetoOIDsubhash = ();329 330 my $lastpartition = substr($sortedmeta values[0], 0, 1);331 foreach my $meta value (@sortedmetavalues) {332 my $meta valuepartition = substr($metavalue, 0, 1);330 my @sortedmetadata_values = $self->sort_metadata_values_array(keys(%metadata_value_to_OIDs_hash)); 331 my %metadata_value_to_OIDs_subhash = (); 332 333 my $lastpartition = substr($sortedmetadata_values[0], 0, 1); 334 foreach my $metadata_value (@sortedmetadata_values) { 335 my $metadata_valuepartition = substr($metadata_value, 0, 1); 333 336 334 337 # Is this the start of a new partition? 335 if ($meta valuepartition ne $lastpartition) {336 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%meta valuetoOIDsubhash);337 %meta valuetoOIDsubhash = ();338 $lastpartition = $meta valuepartition;339 } 340 341 $meta valuetoOIDsubhash{$metavalue} = $metavaluetoOIDhash{$metavalue};338 if ($metadata_valuepartition ne $lastpartition) { 339 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%metadata_value_to_OIDs_subhash); 340 %metadata_value_to_OIDs_subhash = (); 341 $lastpartition = $metadata_valuepartition; 342 } 343 344 $metadata_value_to_OIDs_subhash{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value}; 342 345 } 343 346 344 347 # Don't forget to add the last partition 345 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%meta valuetoOIDsubhash);348 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $lastpartition, \%metadata_value_to_OIDs_subhash); 346 349 347 350 # The partitions are stored in an HList … … 352 355 # Generate hlists of a certain size 353 356 my $partition_size_within_level = $self->{$metadata_group . ".partition_size_within_level"}; 354 if ($partition_type_within_level =~ /^constant_size$/i && scalar(keys %meta valuetoOIDhash) > $partition_size_within_level) {355 my @sortedmeta values = $self->sort_metadata_values_array(keys(%metavaluetoOIDhash));357 if ($partition_type_within_level =~ /^constant_size$/i && scalar(keys %metadata_value_to_OIDs_hash) > $partition_size_within_level) { 358 my @sortedmetadata_values = $self->sort_metadata_values_array(keys(%metadata_value_to_OIDs_hash)); 356 359 my $itemsdone = 0; 357 my %meta valuetoOIDsubhash = ();360 my %metadata_value_to_OIDs_subhash = (); 358 361 my $lastpartitionend = ""; 359 362 my $partitionstart; 360 foreach my $meta value (@sortedmetavalues) {361 $meta valuetoOIDsubhash{$metavalue} = $metavaluetoOIDhash{$metavalue};363 foreach my $metadata_value (@sortedmetadata_values) { 364 $metadata_value_to_OIDs_subhash{$metadata_value} = $metadata_value_to_OIDs_hash{$metadata_value}; 362 365 $itemsdone++; 363 my $itemsinpartition = scalar(keys %meta valuetoOIDsubhash);366 my $itemsinpartition = scalar(keys %metadata_value_to_OIDs_subhash); 364 367 365 368 # Is this the start of a new partition? 366 369 if ($itemsinpartition == 1) { 367 $partitionstart = $self->generate_partition_start($meta value, $lastpartitionend, $self->{"partition_name_length"});370 $partitionstart = $self->generate_partition_start($metadata_value, $lastpartitionend, $self->{"partition_name_length"}); 368 371 } 369 372 370 373 # Is this the end of the partition? 371 if ($itemsinpartition == $partition_size_within_level || $itemsdone == @sortedmeta values) {372 my $partitionend = $self->generate_partition_end($meta value, $partitionstart, $self->{"partition_name_length"});374 if ($itemsinpartition == $partition_size_within_level || $itemsdone == @sortedmetadata_values) { 375 my $partitionend = $self->generate_partition_end($metadata_value, $partitionstart, $self->{"partition_name_length"}); 373 376 my $partitionname = $partitionstart; 374 377 if ($partitionend ne $partitionstart) { … … 376 379 } 377 380 378 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%meta valuetoOIDsubhash);379 %meta valuetoOIDsubhash = ();381 $self->add_hlist_partition(\@metadata_groups, $classifier_node, $partitionname, \%metadata_value_to_OIDs_subhash); 382 %metadata_value_to_OIDs_subhash = (); 380 383 $lastpartitionend = $partitionend; 381 384 } … … 388 391 # Otherwise just add all the values to a VList 389 392 else { 390 $self->add_vlist(\@metadata_groups, $classifier_node, \%meta valuetoOIDhash);393 $self->add_vlist(\@metadata_groups, $classifier_node, \%metadata_value_to_OIDs_hash); 391 394 } 392 395 } … … 423 426 { 424 427 my $self = shift(@_); 425 my $meta value = shift(@_);428 my $metadata_value = shift(@_); 426 429 my $lastpartitionend = shift(@_); 427 430 my $partition_name_length = shift(@_); 428 431 429 432 if ($partition_name_length) { 430 return substr($meta value, 0, $partition_name_length);431 } 432 433 my $partitionstart = substr($meta value, 0, 1);433 return substr($metadata_value, 0, $partition_name_length); 434 } 435 436 my $partitionstart = substr($metadata_value, 0, 1); 434 437 if ($partitionstart le $lastpartitionend) { 435 $partitionstart = substr($meta value, 0, 2);438 $partitionstart = substr($metadata_value, 0, 2); 436 439 # Give up after three characters 437 440 if ($partitionstart le $lastpartitionend) { 438 $partitionstart = substr($meta value, 0, 3);441 $partitionstart = substr($metadata_value, 0, 3); 439 442 } 440 443 } … … 447 450 { 448 451 my $self = shift(@_); 449 my $meta value = shift(@_);452 my $metadata_value = shift(@_); 450 453 my $partitionstart = shift(@_); 451 454 my $partition_name_length = shift(@_); 452 455 453 456 if ($partition_name_length) { 454 return substr($meta value, 0, $partition_name_length);455 } 456 457 my $partitionend = substr($meta value, 0, length($partitionstart));457 return substr($metadata_value, 0, $partition_name_length); 458 } 459 460 my $partitionend = substr($metadata_value, 0, length($partitionstart)); 458 461 if ($partitionend gt $partitionstart) { 459 $partitionend = substr($meta value, 0, 1);462 $partitionend = substr($metadata_value, 0, 1); 460 463 if ($partitionend le $partitionstart) { 461 $partitionend = substr($meta value, 0, 2);464 $partitionend = substr($metadata_value, 0, 2); 462 465 # Give up after three characters 463 466 if ($partitionend le $partitionstart) { 464 $partitionend = substr($meta value, 0, 3);467 $partitionend = substr($metadata_value, 0, 3); 465 468 } 466 469 } … … 477 480 my $classifier_node = shift(@_); 478 481 my $partitionname = shift(@_); 479 my %metavaluetoOIDhash = %{shift(@_)};482 my $metadata_value_to_OIDs_hash_ref = shift(@_); 480 483 481 484 # Create an hlist partition … … 485 488 486 489 # Add the children to the hlist partition 487 $self->add_vlist(\@metadata_groups, \%child_classifier_node, \%metavaluetoOIDhash);490 $self->add_vlist(\@metadata_groups, \%child_classifier_node, $metadata_value_to_OIDs_hash_ref); 488 491 push(@{$classifier_node->{'contains'}}, \%child_classifier_node); 489 492 } … … 495 498 my @metadata_groups = @{shift(@_)}; 496 499 my $classifier_node = shift(@_); 497 my %metavaluetoOIDhash = %{shift(@_)};500 my $metadata_value_to_OIDs_hash_ref = shift(@_); 498 501 499 502 my $metadata_group = shift(@metadata_groups); … … 501 504 502 505 # Create an entry in the vlist for each value 503 foreach my $metavalue ($self->sort_metadata_values_array(keys(%metavaluetoOIDhash))) { 504 my @OIDs = @{$metavaluetoOIDhash{$metavalue}}; 506 foreach my $metadata_value ($self->sort_metadata_values_array(keys(%{$metadata_value_to_OIDs_hash_ref}))) 507 { 508 my @OIDs = @{$metadata_value_to_OIDs_hash_ref->{$metadata_value}}; 505 509 506 510 # If there is only one item and 'always_bookshelf' is false, add the item to the list … … 510 514 # Find the offset of this metadata value 511 515 my $offset = 0; 512 my %OIDtometavalueshash = %{$self->{$metadata_group . ".list"}};513 my @meta values = @{$OIDtometavalueshash{$OID}};514 for (my $i = 0; $i < scalar(@meta values); $i++) {515 if ($meta value eq $metavalues[$i]) {516 my $OID_to_metadata_values_hash_ref = $self->{$metadata_group . ".list"}; 517 my @metadata_values = @{$OID_to_metadata_values_hash_ref->{$OID}}; 518 for (my $i = 0; $i < scalar(@metadata_values); $i++) { 519 if ($metadata_value eq $metadata_values[$i]) { 516 520 $offset = $i; 517 521 last; … … 523 527 # Otherwise create a sublist (bookshelf) for the metadata value 524 528 else { 525 my %child_classifier_node = ( 'Title' => $self->convert_unicode_string_to_utf8_string($meta value),529 my %child_classifier_node = ( 'Title' => $self->convert_unicode_string_to_utf8_string($metadata_value), 526 530 'childtype' => "VList", 527 531 'contains' => [] ); … … 538 542 my @sort_leaf_nodes_usingmetadata_groups = @{$self->{'sort_leaf_nodes_using_metadata_groups'}}; 539 543 foreach my $sort_leaf_nodes_usingmetaelem (reverse @sort_leaf_nodes_usingmetadata_groups) { 540 my %OIDtometavalueshash = %{$self->{$sort_leaf_nodes_usingmetaelem . ".list"}};544 my $OID_to_metadata_values_hash_ref = $self->{$sort_leaf_nodes_usingmetaelem . ".list"}; 541 545 # Force a stable sort (Perl 5.6's sort isn't stable) 542 546 # !! The [0] bits aren't ideal (multiple metadata values) !! 543 @OIDs = @OIDs[ sort { $OID tometavalueshash{$OIDs[$a]}[0] cmp $OIDtometavalueshash{$OIDs[$b]}[0] || $a <=> $b; } 0..$#OIDs ];547 @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 ]; 544 548 } 545 549
Note:
See TracChangeset
for help on using the changeset viewer.