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

matthew lon-capa-cvs@mail.lon-capa.org
Tue, 16 Jul 2002 15:02:07 -0000


This is a MIME encoded message

--matthew1026831727
Content-Type: text/plain

matthew		Tue Jul 16 11:02:07 2002 EDT

  Modified files:              
    /loncom/interface	lonsearchcat.pm 
  Log:
  Very beginnings of results database started.
  &handler, &parse_basic_search, and &parse_advanced_search 
      Added support for 'pretty' version of query string which appears at the
      top of the search results page.
  &search_results_header
      Print out the pretty query string.
  
  
--matthew1026831727
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20020716110207.txt"

Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.142 loncom/interface/lonsearchcat.pm:1.143
--- loncom/interface/lonsearchcat.pm:1.142	Fri Jul 12 17:02:27 2002
+++ loncom/interface/lonsearchcat.pm	Tue Jul 16 11:02:06 2002
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Search Catalog
 #
-# $Id: lonsearchcat.pm,v 1.142 2002/07/12 21:02:27 matthew Exp $
+# $Id: lonsearchcat.pm,v 1.143 2002/07/16 15:02:06 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -125,6 +125,10 @@
 adding a line to the definition of this hash and making sure the function
 takes the proper parameters.
 
+=item $results_db
+
+The name of the database results from searches are put in.
+
 =back 
 
 =cut
@@ -140,6 +144,7 @@
 my %groupsearch_db;     # database hash
 my $diropendb = "";    # db file
 
+my $results_db = "";
 #             View Description           Function Pointer
 my %Views = ("Detailed Citation View" => \&detailed_citation_view,
              "Summary View"           => \&summary_view,
@@ -178,16 +183,19 @@
     $r->content_type('text/html');
     $r->send_http_header;
     return OK if $r->header_only;
-
+    ##
+    ## Initialize global variables
+    ##
     my $domain  = $r->dir_config('lonDefDomain');
     $diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
             "\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db";
-
+    $results_db = "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain).
+        '_'.&Apache::lonnet::escape($ENV{'user.name'})."_searchresults.db";
     &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
              ['catalogmode','launch','acts','mode','form','element',
               'reqinterface']);
     ##
-    ## Clear out old values from database
+    ## Clear out old values from groupsearch database
     ##
     if ($ENV{'form.launch'} eq '1') {
 	if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
@@ -239,15 +247,16 @@
         # We are running a search
         my ($query,$customquery,$customshow,$libraries) = 
             (undef,undef,undef,undef);
+        my $pretty_string;
         if ($searchtype eq 'Basic') {
-            $query = &parse_basic_search($r);
+            ($query,$pretty_string) = &parse_basic_search($r);
         } elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
-            ($query,$customquery,$customshow,$libraries) 
+            ($query,$customquery,$customshow,$libraries,$pretty_string) 
                 = &parse_advanced_search($r);
             return OK if (! defined($query));
         }
         # Output some information to the user.
-        $r->print(&search_results_header($searchtype));
+        $r->print(&search_results_header($searchtype,$pretty_string));
         $r->print("Sending search request to LON-CAPA servers.<br />\n");
         $r->rflush();
         # Send query statements over the network to be processed by 
@@ -561,13 +570,13 @@
 sub make_persistent {
     my %save = %{shift()};
     my $persistent='';
-    foreach (keys %save) {
-	if (/^form\./ && !/submit/) {
-	    my $name=$_;
+    foreach my $name (keys %save) {
+	if ($name =~ /^form\./ && $name !~ /submit/) {
             my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name}));
 	    $name=~s/^form\.//;
             foreach (@values) {
                 s/\"/\'/g; # do not mess with html field syntax
+                next if (! $_ );
                 $persistent.=<<END;
 <input type="hidden" name="$name" value="$_" />
 END
@@ -886,6 +895,7 @@
 sub parse_advanced_search {
     my ($r)=@_;
     my $fillflag=0;
+    my $pretty_search_string = "<br />\n";
     # Clean up fields for safety
     for my $field ('title','author','subject','keywords','url','version',
 		   'creationdatestart_month','creationdatestart_day',
@@ -925,16 +935,25 @@
     # Turn the form input into a SQL-based query
     my $query='';
     my @queries;
+    my $font = '<font color="#800000" face="helvetica">';
     # Evaluate logical expression AND/OR/NOT phrase fields.
     foreach my $field ('title','author','subject','notes','abstract','url',
 		       'keywords','version','owner','mime') {
 	if ($ENV{'form.'.$field}) {
             my $searchphrase = $ENV{'form.'.$field};
+            $pretty_search_string .= $font."$field</font> contains <b>".
+                $searchphrase."</b>";
             if ($ENV{'form.'.$field.'_related'}) {
-                $searchphrase = &related_version($searchphrase);
-                $ENV{'form.'.$field} = $searchphrase;
-                $ENV{'form.'.$field.'_related'} = undef;
+                my @New_Words;
+                ($searchphrase,@New_Words) = &related_version($searchphrase);
+                if (@New_Words) {
+                    $pretty_search_string .= " with related words: ".
+                        "<b>@New_Words</b>.";
+                } else {
+                    $pretty_search_string .= " with no related words.";
+                }
             }
+            $pretty_search_string .= "<br />\n";
 	    push @queries,&build_SQL_query($field,$searchphrase);
         }
     }
@@ -945,10 +964,17 @@
     # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
 	push @queries,"(language like \"$ENV{'form.language'}\")";
+        $pretty_search_string.=$font."language</font>= ".
+            &Apache::loncommon::languagedescription($ENV{'form.language'}).
+                "<br />\n";
     }
     if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') {
 	push @queries,"(copyright like \"$ENV{'form.copyright'}\")";
+        $pretty_search_string.=$font."copyright</font> = ".
+            &Apache::loncommon::copyrightdescription($ENV{'form.copyright'}).
+                "<br \>\n";
     }
+    #
     # Evaluate date windows
     my $datequery=&build_date_queries(
 			$ENV{'form.creationdatestart_month'},
@@ -968,18 +994,23 @@
     if ($datequery=~/^Incorrect/) {
 	&output_date_error($r,$datequery);
 	return ;
-    }
-    elsif ($datequery) {
+    } elsif ($datequery) {
+        # Here is where you would set up pretty_search_string to output
+        # date query information.
 	push @queries,$datequery;
     }
     # Process form information for custom metadata querying
     my $customquery=undef;
     if ($ENV{'form.custommetadata'}) {
+        $pretty_search_string .=$font."Custom Metadata Search</font>: <b>".
+            $ENV{'form.custommetadata'}."</b><br />\n";
 	$customquery=&build_custommetadata_query('custommetadata',
 				      $ENV{'form.custommetadata'});
     }
     my $customshow=undef;
     if ($ENV{'form.customshow'}) {
+        $pretty_search_string .=$font."Custom Metadata Display</font>: <b>".
+            $ENV{'form.customshow'}."</b><br />\n";
 	$customshow=$ENV{'form.customshow'};
 	$customshow=~s/[^\w\s]//g;
 	my @fields=split(/\s+/,$customshow);
@@ -994,18 +1025,28 @@
     my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} 
                            :  ($ENV{'form.domains'}) );
     my %domain_hash = ();
+    my $pretty_domains_string;
     foreach (@allowed_domains) {
         $domain_hash{$_}++;
     }
-    foreach (keys(%Apache::lonnet::libserv)) {
-        if ($_ eq 'any') {
-            $libraries_to_query = undef;
-            last;
+    if ($domain_hash{'any'}) {
+        $pretty_domains_string = "Searching all domains.";
+    } else {
+        if (@allowed_domains > 1) {
+            $pretty_domains_string = "Searching domains:";
+        } else {
+            $pretty_domains_string = "Searching domain ";
+        }
+        foreach (sort @allowed_domains) {
+            $pretty_domains_string .= "<b>$_</b> ";
         }
-        if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {
-            push @$libraries_to_query,$_;
+        foreach (keys(%Apache::lonnet::libserv)) {
+            if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) {
+                push @$libraries_to_query,$_;
+            }
         }
     }
+    $pretty_search_string .= $pretty_domains_string."<br />\n";
     #
     if (@queries) {
 	$query=join(" AND ",@queries);
@@ -1013,7 +1054,8 @@
     } elsif ($customquery) {
         $query = '';
     }
-    return ($query,$customquery,$customshow,$libraries_to_query);
+    return ($query,$customquery,$customshow,$libraries_to_query,
+            $pretty_search_string);
 }
 
 ######################################################################
@@ -1047,10 +1089,18 @@
 	&output_blank_field_error($r);
 	return OK;
     }
+    my $pretty_search_string = '<b>'.$ENV{'form.basicexp'}.'</b>';
     my $search_string = $ENV{'form.basicexp'};
     if ($ENV{'form.related'}) {
-        $search_string = &related_version($ENV{'form.basicexp'});
+        my @New_Words;
+        ($search_string,@New_Words) = &related_version($ENV{'form.basicexp'});
+        if (@New_Words) {
+            $pretty_search_string .= " with related words: <b>@New_Words</b>.";
+        } else {
+            $pretty_search_string .= " with no related words.";
+        }
     }
+    &Apache::lonnet::logthis("Search String: $search_string");
     # Build SQL query string based on form page
     my $query='';
     my $concatarg=join(',"    ",',
@@ -1058,7 +1108,8 @@
                         'keywords'));
     $concatarg='title' if $ENV{'form.titleonly'};
     $query=&build_SQL_query('concat('.$concatarg.')',$search_string);
-    return 'select * from metadata where '.$query;
+    $pretty_search_string .= "<br />\n";
+    return 'select * from metadata where '.$query,$pretty_search_string;
 }
 
 
@@ -1082,16 +1133,17 @@
 sub related_version {
     my $search_string = shift;
     my $result = $search_string;
+    my %New_Words = ();
     while ($search_string =~ /(\w+)/cg) {
         my $word = $1;
         next if (lc($word) =~ /\b(or|and|not)\b/);
         my @Words = &Apache::loncommon::get_related_words($word);
-        my $replacement = join " OR ", ($word,
-                                        ($#Words>4? @Words[0..4] : @Words)
-                                        );
+        @Words = ($#Words>4? @Words[0..4] : @Words);
+        foreach (@Words) { $New_Words{$_}++;}
+        my $replacement = join " OR ", ($word,@Words);
         $result =~ s/(\b)$word(\b)/$1($replacement)$2/g;
     }
-    return $result;
+    return $result,sort(keys(%New_Words));
 }
 
 ######################################################################
@@ -1657,7 +1709,7 @@
 ######################################################################
 ######################################################################
 sub search_results_header {
-    my ($mode) = @_;
+    my ($mode,$pretty_query) = @_;
     $mode = lc($mode);
     my $title;
     if ($mode eq 'advanced') {
@@ -1759,6 +1811,9 @@
 <img align=right src=/adm/lonIcons/lonlogos.gif>
 <h1>$title</h1>
 END
+    if ($pretty_query) {
+        $result .= "<p>Search query: $pretty_query</p>";
+    }
     return $result;
 }
 

--matthew1026831727--