[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface lonsearchcat.pm

raeburn raeburn at source.lon-capa.org
Sun Sep 1 20:20:07 EDT 2013


raeburn		Mon Sep  2 00:20:07 2013 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	lonsearchcat.pm 
  Log:
  - For 2.11
    - Backport 1.336, 1.337, 1.338
  
  
-------------- next part --------------
Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.331.4.6 loncom/interface/lonsearchcat.pm:1.331.4.7
--- loncom/interface/lonsearchcat.pm:1.331.4.6	Tue Aug 13 13:27:38 2013
+++ loncom/interface/lonsearchcat.pm	Mon Sep  2 00:20:07 2013
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Search Catalog
 #
-# $Id: lonsearchcat.pm,v 1.331.4.6 2013/08/13 13:27:38 raeburn Exp $
+# $Id: lonsearchcat.pm,v 1.331.4.7 2013/09/02 00:20:07 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -321,31 +321,31 @@
         &display_results($r,$importbutton,$closebutton,$diropendb,
                          $env{'form.area'});
     } elsif ($env{'form.phase'} =~ /^(sort|run_search)$/) {
-        my ($query,$customquery,$customshow,$libraries,$pretty_string) =
+        my ($query,$customquery,$customshow,$libraries,$pretty_string,$domainsref) =
             &get_persistent_data($persistent_db_file,
                  ['query','customquery','customshow',
-                  'libraries','pretty_string']);
+                  'libraries','pretty_string','domains']);
         if ($env{'form.phase'} eq 'sort') {
             &print_sort_form($r,$pretty_string);
         } elsif ($env{'form.phase'} eq 'run_search') {
             &run_search($r,$query,$customquery,$customshow,
-                        $libraries,$pretty_string,$env{'form.area'});
+                        $libraries,$pretty_string,$env{'form.area'},$domainsref);
         }
     } elsif(($env{'form.phase'} eq 'basic_search') ||
             ($env{'form.phase'} eq 'adv_search')) {
         #
         # We are running a search, try to parse it
-        my ($query,$customquery,$customshow,$libraries) = 
-            (undef,undef,undef,undef);
+        my ($query,$customquery,$customshow,$libraries,$domains) = 
+            (undef,undef,undef,undef,undef);
         my $pretty_string;
         if ($env{'form.phase'} eq 'basic_search') {
-            ($query,$pretty_string,$libraries) = 
+            ($query,$pretty_string,$libraries,$domains) = 
                 &parse_basic_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));
             &make_persistent({ basicexp => $env{'form.basicexp'}},
                              $persistent_db_file);
         } else {                      # Advanced search
-            ($query,$customquery,$customshow,$libraries,$pretty_string) 
+            ($query,$customquery,$customshow,$libraries,$pretty_string,$domains) 
                 = &parse_advanced_search($r,$closebutton,$hidden_fields);
             return OK if (! defined($query));
         }
@@ -353,7 +353,8 @@
                            customquery => $customquery,
                            customshow => $customshow,
                            libraries => $libraries,
-                           pretty_string => $pretty_string },
+                           pretty_string => $pretty_string,
+                           domains => $domains },
                          $persistent_db_file);
         #
         # Set up table
@@ -1012,8 +1013,9 @@
 
 This function is the reverse of &make_persistent();
 Retrieve persistent data from %persistent_db.  Retrieved items will have their
-values unescaped.  If the item contains commas (before unescaping), the
-returned value will be an array pointer. 
+values unescaped.  If the item is 'domains; then the returned
+value will be a hash pointer.  Otherwise, if the item contains
+commas (before unescaping), the returned value will be an array pointer.
 
 =cut
 
@@ -1031,13 +1033,25 @@
             push @Values, undef;
             next;
         }
-        my @values = map { 
-            &unescape($_);
-        } split(',',$persistent_db{$name});
-        if (@values <= 1) {
-            push @Values,$values[0];
+        if ($name eq 'domains') {
+            my %valueshash;
+            my @items= map { &unescape($_); } split(',',$persistent_db{$name});
+            foreach my $item (@items) {
+                if ($item =~ /=/) {
+                    my ($key,$val) = map { &unescape($_); } split(/=/,$item);
+                    $valueshash{$key} = $val;
+                }
+            }
+            push(@Values,\%valueshash);
         } else {
-            push @Values,\@values;
+            my @values = map { 
+                &unescape($_);
+            } split(',',$persistent_db{$name});
+            if (@values <= 1) {
+                push @Values,$values[0];
+            } else {
+                push @Values,\@values;
+            }
         }
     }
     untie (%persistent_db);
@@ -1055,7 +1069,9 @@
 
 Store variables away to the %persistent_db.
 Values will be escaped.  Values that are array pointers will have their
-elements escaped and concatenated in a comma separated string.  
+elements escaped and concatenated in a comma separated string. Values 
+that are hash pointers will have their keys and values escaped and 
+concatenated in a comma separated string.
 
 =cut
 
@@ -1067,8 +1083,17 @@
     return undef if (! tie(%persistent_db,'GDBM_File',
                            $filename,&GDBM_WRCREAT(),0640));
     foreach my $name (keys(%save)) {
-        my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
-        # We handle array references, but not recursively.
+        my @values=();
+        if (ref($save{$name}) eq 'ARRAY') {
+            @values = @{$save{$name}};
+        } elsif (ref($save{$name}) eq 'HASH') {
+            foreach my $key (%{$save{$name}}) {
+                push(@values,&escape($key).'='.&escape($save{$name}{$key}));
+            }
+        } else {
+            @values = $save{$name};
+        }
+        # We handle array and hash references, but not recursively.
         my $store = join(',', map { &escape($_); } @values );
         $persistent_db{$name} = $store;
     }
@@ -1385,7 +1410,8 @@
     ##
     ## Deal with restrictions to given domains
     ## 
-    my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
+    my ($libraries_to_query,$pretty_domains_string,$domains_to_query) = 
+        &parse_domain_restrictions();
     if ($pretty_domains_string) {
        $pretty_search_string .= $pretty_domains_string."<br />\n";
     }
@@ -1401,11 +1427,12 @@
     }
     #&Apache::lonnet::logthis('advanced query = '.$/.$query);
     return ($query,$customquery,$customshow,$libraries_to_query,
-            $pretty_search_string);
+            $pretty_search_string,$domains_to_query);
 }
 
 sub parse_domain_restrictions {
     my $libraries_to_query = undef;
+    my $domains_to_query = undef;
     # $env{'form.domains'} can be either a scalar or an array reference.
     # We need an array.
     if (! exists($env{'form.domains'}) || $env{'form.domains'} eq '') {
@@ -1429,12 +1456,32 @@
         foreach (sort @allowed_domains) {
             $pretty_domains_string .= "<b>".$_."</b> ";
         }
-	my %servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
-						   'library');
+	my %library_servers = &Apache::lonnet::get_unique_servers(\@allowed_domains,
+						                  'library');
+        my (%older_library_servers,%okdoms,%domains_for_id);
+        map { $okdoms{$_} = 1; } @allowed_domains;
+        foreach my $key (keys(%library_servers)) {
+            if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {
+                my $major = $1;
+                my $minor = $2;
+                if (($major < 2) || (($major == 2) && ($minor < 11))) {
+                    map { $older_library_servers{$_} = 1; }
+                        &Apache::lonnet::machine_ids($library_servers{$key});
+                } else {
+                    my %possdoms;
+                    map { $possdoms{$_}=1 if ($okdoms{$_}); }
+                        &Apache::lonnet::machine_domains($library_servers{$key});
+                    $domains_for_id{$key} = join(',',sort(keys(%possdoms)));
+                }
+            }
+        }
+        my %servers = (%library_servers,%older_library_servers);
 	$libraries_to_query = [keys(%servers)];
+        $domains_to_query = \%domains_for_id;
     }
     return ($libraries_to_query,
-            $pretty_domains_string);
+            $pretty_domains_string,
+            $domains_to_query);
 }
 
 ######################################################################
@@ -1463,7 +1510,8 @@
 	$env{"form.$_"}=&unescape($env{"form.$_"});
 	$env{"form.$_"}=~s/[^\w\/\s\(\)\=\-\"\']//g;
     }
-    my ($libraries_to_query,$pretty_domains_string) = &parse_domain_restrictions();
+    my ($libraries_to_query,$pretty_domains_string,$domains_to_query) = 
+        &parse_domain_restrictions();
     #
     # Check to see if enough of a query is filled in
     my $search_string = $env{'form.basicexp'};
@@ -1509,7 +1557,7 @@
     $pretty_search_string =~ s:^<br /> and ::;
     &Apache::lonnet::logthis('simple search final query = '.$/.$final_query);
     return ($final_query,$pretty_search_string,
-            $libraries_to_query);
+            $libraries_to_query,$domains_to_query);
 }
 
 
@@ -2039,7 +2087,7 @@
 #    $result.="</select>\n";
     my $revise = &revise_button();
     $result.='<p>'
-            .&mt('There are [_1] matches to your query.',$total_results)
+            .&mt('Total of [quant,_1,match,matches] to your query.',$total_results)
             .' '.$revise.'</p>'
             .'<p>'.&mt('Search: ').$pretty_query_string
             .'</p></form>';
@@ -2259,7 +2307,7 @@
 ######################################################################
 sub run_search {
     my ($r,$query,$customquery,$customshow,$serverlist,
-        $pretty_string,$area) = @_;
+        $pretty_string,$area,$domainsref) = @_;
     my $tabletype = 'metadata';
     if ($area eq 'portfolio') {
         $tabletype = 'portfolio_search';
@@ -2291,16 +2339,39 @@
     $r->rflush();
     #
     # Determine the servers we need to contact.
-    my @Servers_to_contact;
+    my (@Servers_to_contact,%domains_by_server);
     if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {
             @Servers_to_contact = @$serverlist;
         } else {
             @Servers_to_contact = ($serverlist);
         }
+        if (ref($domainsref) eq 'HASH') {
+            foreach my $server (@Servers_to_contact) {
+                $domains_by_server{$server} = $domainsref->{$server};
+            }
+        }
     } else {
-	my %all_library_servers = &Apache::lonnet::unique_library();
+	my %library_servers = &Apache::lonnet::unique_library();
+        my (%all_library_servers, %older_library_servers);
+        foreach my $key (keys(%library_servers)) {
+            if (&Apache::lonnet::get_server_loncaparev('',$key) =~ /^\'?(\d+)\.(\d+)/) {
+                my $major = $1;
+                my $minor = $2;
+                if (($major < 2) || (($major == 2) && ($minor < 11))) {
+                    map { $older_library_servers{$_} = 1; }
+                        &Apache::lonnet::machine_ids($library_servers{$key});
+                }
+            }
+        }
+        %all_library_servers = (%library_servers,%older_library_servers);
         @Servers_to_contact = sort(keys(%all_library_servers));
+        foreach my $server (@Servers_to_contact) {
+            my %possdoms;
+            map { $possdoms{$_}=1;  } &Apache::lonnet::machine_domains($all_library_servers{$server});
+            $domains_by_server{$server} =
+                join(',',sort(&Apache::lonnet::machine_domains($all_library_servers{$server})));
+        }
     }
     my %Server_status;
     #
@@ -2370,7 +2441,7 @@
             my $server = shift(@Servers_to_contact);
             &update_status($r,&mt('contacting [_1]',$server));
             my $reply=&Apache::lonnet::metadata_query($query,$customquery,
-                                                      $customshow,[$server]);
+                                                      $customshow,[$server],\%domains_by_server);
             ($server) = keys(%$reply);
             $Server_status{$server} = $reply->{$server};
         } else {


More information about the LON-CAPA-cvs mailing list