Improve overloaded MFHD::Holding comparison operator
authorDan Wells <dbw2@calvin.edu>
Tue, 2 Jul 2013 15:59:29 +0000 (11:59 -0400)
committerDan Wells <dbw2@calvin.edu>
Tue, 2 Jul 2013 15:59:29 +0000 (11:59 -0400)
This commit:
- Makes the comparison operator consider chron data, not just
  enumeration data
- Teaches the comparison operator a way to handle 'unsure' data
  (that is, data presented in brackets [])

Signed-off-by: Dan Wells <dbw2@calvin.edu>
Open-ILS/src/perlmods/lib/OpenILS/Utils/MFHD/Holding.pm

index d5571d1..33781dd 100644 (file)
@@ -898,12 +898,19 @@ sub _compare {
 
     # start doing the actual comparison
     my $result;
-    foreach my $key ('a'..'f') {
+    foreach my $key ('a'..'f', 'i'..'m') {
         if (defined($holding_1->field_values($key))) {
             if (!defined($holding_2->field_values($key))) {
                 return 1; # more details equals 'greater' (?)
             } else {
-                $result = $holding_1->field_values($key)->[0] <=> $holding_2->field_values($key)->[0];
+                my $holding_1_value = $holding_1->field_values($key)->[0];
+                my $holding_1_unsure = ($holding_1_value =~ s/\[|\]//g);
+                my $holding_2_value = $holding_2->field_values($key)->[0];
+                my $holding_2_unsure = ($holding_2_value =~ s/\[|\]//g);
+                $result = $holding_1_value <=> $holding_2_value;
+                if (!$result) { # they are 'equal' but we will sort 'maybe' values before 'sure' values (TODO: rethink this is it complicates some algorithms)
+                    $result = $holding_2_unsure <=> $holding_1_unsure;
+                }
             }
         } elsif (defined($holding_2->field_values($key))) {
             return -1; # more details equals 'greater' (?)