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

matthew lon-capa-cvs@mail.lon-capa.org
Wed, 03 Mar 2004 17:25:23 -0000


This is a MIME encoded message

--matthew1078334723
Content-Type: text/plain

matthew		Wed Mar  3 12:25:23 2004 EDT

  Modified files:              
    /loncom/interface	lonsearchcat.pm 
  Log:
  Modified to use LONCAPA::lonmetadata to create the table.  A number of
  whitespace and POD changes were made as well.
  
  
--matthew1078334723
Content-Type: text/plain
Content-Disposition: attachment; filename="matthew-20040303122523.txt"

Index: loncom/interface/lonsearchcat.pm
diff -u loncom/interface/lonsearchcat.pm:1.203 loncom/interface/lonsearchcat.pm:1.204
--- loncom/interface/lonsearchcat.pm:1.203	Wed Jan 14 22:18:19 2004
+++ loncom/interface/lonsearchcat.pm	Wed Mar  3 12:25:23 2004
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Search Catalog
 #
-# $Id: lonsearchcat.pm,v 1.203 2004/01/15 03:18:19 www Exp $
+# $Id: lonsearchcat.pm,v 1.204 2004/03/03 17:25:23 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -73,6 +73,7 @@
 use Apache::lonmeta;
 use Apache::lonhtmlcommon;
 use Apache::lonlocal;
+use LONCAPA::lonmetadata();
 
 ######################################################################
 ######################################################################
@@ -460,14 +461,13 @@
 
 =item &print_basic_search_form() 
 
-Returns a scalar which holds html for the basic search form.
+Prints the form for the basic search.  Sorry the name is so cryptic.
 
 =cut
 
 ######################################################################
 ######################################################################
-
-sub print_basic_search_form{
+sub print_basic_search_form {
     my ($r,$closebutton,$hidden_fields) = @_;
     my $bodytag=&Apache::loncommon::bodytag('Search').
 	&Apache::loncommon::help_open_topic('Finding_Resources').
@@ -585,13 +585,12 @@
 
 =item &advanced_search_form() 
 
-Returns a scalar which holds html for the advanced search form.
+Prints the advanced search form.
 
 =cut
 
 ######################################################################
 ######################################################################
-
 sub print_advanced_search_form{
     my ($r,$closebutton,$hidden_fields) = @_;
     my %lt=&Apache::lonlocal::texthash('srch' => 'Search',
@@ -650,18 +649,20 @@
 	    &Apache::loncommon::domain_select('domains',
 						   $ENV{'form.domains'},1).
 	    '</td><td>&nbsp;</td></td></tr>';
-    my %dates=&Apache::lonlocal::texthash('creationdatestart'     => 'Creation Date After',
-				  	  'creationdateend'       => 'Creation Date Before',
-					  'lastrevisiondatestart' => 'Last Revision Date After',
-					  'lastrevisiondateend'   => 'Last Revision Date Before');
+    my %dates=&Apache::lonlocal::texthash
+        ('creationdatestart'     => 'Creation Date After',
+         'creationdateend'       => 'Creation Date Before',
+         'lastrevisiondatestart' => 'Last Revision Date After',
+         'lastrevisiondateend'   => 'Last Revision Date Before');
     foreach (sort keys %dates) {
-	$scrout.='<tr bgcolor="#FFFFBB"><td>'.&titlefield($dates{$_}).'</td><td>'. 
+	$scrout.='<tr bgcolor="#FFFFBB">'.
+            '<td>'.&titlefield($dates{$_}).'</td><td>'. 
 	    &Apache::lonhtmlcommon::date_setter('advsearch',$_,0,'',1).
-	    '</td><td>&nbsp;</td></td></tr>';
+	    '</td><td>&nbsp;</td></td>'.
+            '</tr>';
     }
 
     $scrout.="</table>\n";
-
     $scrout.=<<ENDDOCUMENT;
 $advanced_buttons
 </form>
@@ -671,12 +672,13 @@
     $r->print($scrout);
     return;
 }
+
 ######################################################################
 ######################################################################
 
 =pod 
 
-=item &titlefield
+=item &titlefield()
 
 Inputs: title text
 
@@ -686,17 +688,17 @@
 
 ######################################################################
 ######################################################################
-
 sub titlefield {
     my $title=shift;
     return '<font face="arial" color="#800000">'.$title.'</font>';
 }
+
 ######################################################################
 ######################################################################
 
 =pod 
 
-=item viewoptiontext
+=item viewoptiontext()
 
 Inputs: codename for view option
 
@@ -706,21 +708,23 @@
 
 ######################################################################
 ######################################################################
-
 sub viewoptiontext {
     my $code=shift;
-    my %desc=&Apache::lonlocal::texthash('detailed' => "Detailed Citation View",
-					 'xml' => 'XML/SGML',
-					 'compact' => 'Compact View',
-					 'fielded' => 'Fielded Format',
-					 'summary' => 'Summary View');
+    my %desc=&Apache::lonlocal::texthash
+        ('detailed' => "Detailed Citation View",
+         'xml' => 'XML/SGML',
+         'compact' => 'Compact View',
+         'fielded' => 'Fielded Format',
+         'summary' => 'Summary View');
     return $desc{$code};
 }
+
+######################################################################
 ######################################################################
 
 =pod 
 
-=item viewoptions
+=item viewoptions()
 
 Inputs: none
 
@@ -730,9 +734,9 @@
 
 ######################################################################
 ######################################################################
-
 sub viewoptions {
-    my $scrout="\n\n".'<table bgcolor="#FFFFBB"><tr><th>'.&mt('View Options').'</th><th>'.
+    my $scrout="\n\n".'<table bgcolor="#FFFFBB">'.
+        '<tr><th>'.&mt('View Options').'</th><th>'.
 	&mt('Records per Page').'</th></tr><tr><td>';
     unless ($ENV{'form.viewselect'}) { $ENV{'form.viewselect'}='detailed'; }
     $scrout.=&Apache::lonmeta::selectbox('viewselect',
@@ -749,10 +753,11 @@
 }
 
 ######################################################################
+######################################################################
 
 =pod 
 
-=item searchhelp
+=item searchhelp()
 
 Inputs: none
 
@@ -762,7 +767,6 @@
 
 ######################################################################
 ######################################################################
-
 sub searchhelp {
     return &mt('Enter terms or phrases separated by AND, OR, or NOT');
 }
@@ -772,7 +776,7 @@
 
 =pod 
 
-=item &get_persistent_form_data
+=item &get_persistent_form_data()
 
 Inputs: filename of database
 
@@ -827,7 +831,7 @@
 
 =pod 
 
-=item &get_persistent_data
+=item &get_persistent_data()
 
 Inputs: filename of database, ref to array of values to recover.
 
@@ -987,7 +991,8 @@
 	}
     }
     unless ($fillflag) {
-	&output_blank_field_error($r,$closebutton,'phase=disp_adv',$hidden_fields);
+	&output_blank_field_error($r,$closebutton,
+                                  'phase=disp_adv',$hidden_fields);
 	return ;
     }
     # Turn the form input into a SQL-based query
@@ -1038,7 +1043,7 @@
         $pretty_search_string .=$font.'mime</font> contains <b>'.
             $searchphrase.'</b><br />';
     }
-    #####
+    #
     # Evaluate option lists
     if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') {
 	push @queries,"(language like \"$ENV{'form.language'}\")";
@@ -1077,24 +1082,30 @@
         # 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'});
-#    }
+    ##
+    ## The custom metadata search was removed q long time ago mostly 
+    ## because I was unable to figureout exactly how it worked and could
+    ## not imagine people actually using it.  MH
+    ##
+    # 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);
-#	$customshow=join(" ",@fields);
-#    }
-    ## ---------------------------------------------------------------
+    # 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);
+    #    $customshow=join(" ",@fields);
+    # }
+    ##
     ## Deal with restrictions to given domains
     ## 
     my ($libraries_to_query,$pretty_domains_string) = 
@@ -1124,6 +1135,7 @@
     } else {
         @allowed_domains = ($ENV{'form.domains'});
     }
+    #
     my %domain_hash = ();
     my $pretty_domains_string;
     foreach (@allowed_domains) {
@@ -1164,6 +1176,7 @@
 ######################################################################
 sub parse_basic_search {
     my ($r,$closebutton)=@_;
+    #
     # Clean up fields for safety
     for my $field ('basicexp') {
 	$ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g;
@@ -1176,7 +1189,8 @@
     }
     my ($libraries_to_query,$pretty_domains_string) = 
         &parse_domain_restrictions();
-    # Check to see if enough is filled in
+    #
+    # Check to see if enough of a query is filled in
     unless (&filled($ENV{'form.basicexp'})) {
 	&output_blank_field_error($r,$closebutton,'phase=disp_basic');
 	return OK;
@@ -1192,6 +1206,7 @@
             $pretty_search_string .= " with no related words.";
         }
     }
+    #
     # Build SQL query string based on form page
     my $query='';
     my $concatarg=join(',',
@@ -1204,18 +1219,17 @@
     }
     $pretty_search_string .= "<br />\n";
     my $final_query = 'SELECT * FROM metadata WHERE '.$query;
-#    &Apache::lonnet::logthis($final_query);
+    # &Apache::lonnet::logthis($final_query);
     return ($final_query,$pretty_search_string,
             $libraries_to_query);
 }
 
-
 ######################################################################
 ######################################################################
 
 =pod 
 
-=item &related_version
+=item &related_version()
 
 Modifies an input string to include related words.  Words in the string
 are replaced with parenthesized lists of 'OR'd words.  For example
@@ -1412,6 +1426,11 @@
 
 =item &copyright_check()
 
+Inputs: $Metadata, a hash pointer of metadata for a resource.
+
+Returns: 1 if the resource is available to the user making the query, 
+         0 otherwise.
+
 =cut
 
 ######################################################################
@@ -1435,13 +1454,12 @@
     return 1;
 }
 
-
 ######################################################################
 ######################################################################
 
 =pod
 
-=item &ensure_db_and_table
+=item &ensure_db_and_table()
 
 Ensure we can get lonmysql to connect to the database and the table we
 need exists.
@@ -1497,7 +1515,10 @@
 
 =pod
 
-=item &print_sort_form
+=item &print_sort_form()
+
+The sort feature is not implemented at this time.  This form just prints 
+a link to change the search query.
 
 =cut
 
@@ -1598,61 +1619,11 @@
 
 #####################################################################
 #####################################################################
-
-my @Datatypes = 
-    ( { name => 'id', 
-        type => 'MEDIUMINT',
-        restrictions => 'UNSIGNED NOT NULL',
-        primary_key  => 'yes',
-        auto_inc     => 'yes' },
-      { name => 'title',     type=>'TEXT'},
-      { name => 'author',    type=>'TEXT'},
-      { name => 'subject',   type=>'TEXT'},
-      { name => 'url',       type=>'TEXT', restrictions => 'NOT NULL' },
-      { name => 'keywords',  type=>'TEXT'},
-      { name => 'version',   type=>'TEXT'},
-      { name => 'notes',     type=>'TEXT'},
-      { name => 'abstract',  type=>'TEXT'},
-      { name => 'mime',      type=>'TEXT'},
-      { name => 'language',  type=>'TEXT'},
-      { name => 'owner',     type=>'TEXT'},
-      { name => 'copyright', type=>'TEXT'},
-      { name => 'dependencies',     type=>'TEXT'},
-      { name => 'modifyinguser', type=>'TEXT'},
-      { name => 'authorspace', type=>'TEXT'},
-      { name => 'lowestgradelevel',  type=>'INT'},
-      { name => 'highestgradelevel', type=>'INT'},
-      { name => 'standards', type=>'TEXT'},
-      { name => 'count',     type=>'INT'},
-      { name => 'course', type=>'INT'},
-      { name => 'course_list',  type=>'TEXT'},
-      { name => 'goto', type=>'INT'},
-      { name => 'goto_list',  type=>'TEXT'},
-      { name => 'comefrom', type=>'INT'},
-      { name => 'comefrom_list',  type=>'TEXT'},
-      { name => 'sequsage', type=>'INT'},
-      { name => 'sequsage_list',  type=>'TEXT'},
-      { name => 'stdno', type=>'INT'},
-      { name => 'stdno_list',  type=>'TEXT'},
-      { name => 'avetries', type=>'FLOAT'},
-      { name => 'avetries_list',  type=>'TEXT'},
-      { name => 'difficulty', type=>'FLOAT'},
-      { name => 'difficulty_list',  type=>'TEXT'},
-      { name => 'clear',  type=>'FLOAT'},
-      { name => 'technical',  type=>'FLOAT'},
-      { name => 'correct',  type=>'FLOAT'},
-      { name => 'helpful',  type=>'FLOAT'},
-      { name => 'depth',  type=>'FLOAT'},
-      { name => 'hostname', type=> 'TEXT'},
-      #--------------------------------------------------
-      { name => 'creationdate',     type=>'DATETIME'},
-      { name => 'lastrevisiondate', type=>'DATETIME'},
-      #--------------------------------------------------
-      );
-
-my @Fullindicies = 
-    qw/title/;
-#    qw/title author subject abstract mime language owner copyright/;
+#
+# These should probably be scoped but I don't have time right now...
+#
+my @Datatypes;
+my @Fullindicies;
     
 ######################################################################
 ######################################################################
@@ -1672,7 +1643,21 @@
 
 ######################################################################
 ######################################################################
+sub set_up_table_structure {
+    my ($datatypes,$fullindicies) = 
+        &LONCAPA::lonmetadata::describe_metadata_storage();
+    unshift(@$datatypes,{name => 'id', 
+        type => 'MEDIUMINT',
+        restrictions => 'UNSIGNED NOT NULL',
+        primary_key  => 'yes',
+        auto_inc     => 'yes' });
+    @Datatypes = @{$datatypes};
+    @Fullindicies = @{$fullindicies};
+    return;
+}
+
 sub create_results_table {
+    &set_up_table_structure();
     my $table = &Apache::lonmysql::create_table
         ( { columns => \@Datatypes,
             FULLTEXT => [{'columns' => \@Fullindicies},],
@@ -1742,7 +1727,7 @@
 
 =pod
 
-=item &revise_button
+=item &revise_button()
 
 Inputs: None
 
@@ -1769,7 +1754,10 @@
 
 =pod
 
-=item &run_search 
+=item &run_search()
+
+Executes a search query by sending it the the other servers and putting the
+results into MySQL.
 
 =cut
 
@@ -1805,7 +1793,6 @@
     $r->rflush();
     #
     # Determine the servers we need to contact.
-    #
     my @Servers_to_contact;
     if (defined($serverlist)) {
         if (ref($serverlist) eq 'ARRAY') {
@@ -1833,13 +1820,17 @@
         return;
     }
     if (! $table_status) {
+        &Apache::lonnet::logthis("lonmysql error = ".
+                                 &Apache::lonmysql::get_error());
+        &Apache::lonnet::logthis("lonmysql debug = ".
+                                 &Apache::lonmysql::get_debug());
+        &Apache::lonnet::logthis('table status = "'.$table_status.'"');
         $r->print("The table id,$table, we tried to use is invalid.".
                   "The search has been aborted.</body></html>");
         return;
     }
     ##
     ## Prepare for the big loop.
-    ##
     my $hitcountsum;
     my $server; 
     my $status;
@@ -1884,7 +1875,6 @@
             sleep(1); 
         }
         #
-        #
         # Loop through the servers we have contacted but do not
         # have results from yet, looking for results.
         while (my ($server,$status) = each(%Server_status)) {
@@ -1958,7 +1948,9 @@
     }
     &update_status($r,&mt('Search Complete').$server);
     &update_seconds($r,0);
+    #
     &Apache::lonmysql::disconnect_from_db();
+    #
     # We have run out of time or run out of servers to talk to and
     # results to get.  
     $r->print("</body></html>");
@@ -1974,9 +1966,12 @@
 
 ######################################################################
 ######################################################################
+
 =pod
 
-=item &prev_next_buttons
+=item &prev_next_buttons()
+
+Returns html for the previous and next buttons on the search results page.
 
 =cut
 
@@ -1991,37 +1986,42 @@
     my $prev_min = $current_min - $show;
     $prev_min = 1 if $prev_min < 1;
     if ($prev_min < $current_min) {
-        $links .= qq{
-<a href="/adm/searchcat?$parms&start=$prev_min&show=$show">prev</a>
-};    
+        $links .= 
+            qq{<a href="/adm/searchcat?$parms&start=$prev_min&show=$show">}.
+            &mt('prev').'</a>';
     } else {
-        $links .= 'prev';
+        $links .= &mt('prev');
     }
     ##
     ## Pages.... Someday.
     ##
-    $links .= qq{ &nbsp;
-<a href="/adm/searchcat?$parms&start=$current_min&$show=$show">reload</a>
-};
+    $links .= 
+        qq{&nbsp;
+           <a href="/adm/searchcat?$parms&start=$current_min&$show=$show">}.
+                &mt('reload').'</a>';
     ##
     ## Next
     my $next_min = $current_min + $show;
     $next_min = $current_min if ($next_min > $total);
     if ($next_min != $current_min) {
-        $links .= qq{ &nbsp;
-<a href="/adm/searchcat?$parms&start=$next_min&show=$show">next</a>
-};    
+        $links .= 
+            qq{&nbsp;
+               <a href="/adm/searchcat?$parms&start=$next_min&show=$show">}.
+                    &mt('next').'</a>';
     } else {
-        $links .= '&nbsp;next';
+        $links .= '&nbsp;'.&mt('next');
     }
     return $links;
 }
+
 ######################################################################
 ######################################################################
 
 =pod
 
-=item &display_results
+=item &display_results()
+
+Prints the results out for selection and perusal.
 
 =cut
 
@@ -2049,8 +2049,7 @@
     ##
     my $action = "/adm/searchcat?phase=results";
     ##
-    ## Deal with groupsearch
-    ##
+    ## Deal with groupsearch by opening the groupsearch db file.
     if ($ENV{'form.catalogmode'} eq 'groupsearch') {
         if (! tie(%groupsearch_db,'GDBM_File',$diropendb,
                   &GDBM_WRCREAT(),0640)) {
@@ -2061,12 +2060,10 @@
     }
     ##
     ## Prepare the table for querying
-    ##
     my $table = $ENV{'form.table'};
     return if (! &ensure_db_and_table($r,$table));
     ##
     ## Get the number of results 
-    ##
     my $total_results = &Apache::lonmysql::number_of_rows($table);
     if (! defined($total_results)) {
         $r->print("A MySQL error has occurred.</form></body></html>");
@@ -2077,7 +2074,6 @@
     }
     ##
     ## Determine how many results we need to get
-    ##
     $ENV{'form.start'} = 1      if (! exists($ENV{'form.start'}));
     $ENV{'form.show'}  = 'all'  if (! exists($ENV{'form.show'}));
     my $min = $ENV{'form.start'};
@@ -2090,7 +2086,6 @@
     }
     ##
     ## Output links (if necessary) for 'prev' and 'next' pages.
-    ##
     $r->print
         ('<center>'.
          &prev_next_buttons($min,$ENV{'form.show'},$total_results,
@@ -2110,12 +2105,10 @@
     }
     ##
     ## Get results from MySQL table
-    ##
     my @Results = &Apache::lonmysql::get_rows($table,
                                               'id>='.$min.' AND id<='.$max);
     ##
     ## Loop through the results and output them.
-    ##
     foreach my $row (@Results) {
         if ($connection->aborted()) {
             &cleanup();
@@ -2193,7 +2186,7 @@
 
 =pod
 
-=item &parse_row
+=item &parse_row()
 
 Parse a row returned from the database.
 
@@ -2204,6 +2197,9 @@
 sub parse_row {
     my @Row = @_;
     my %Fields;
+    if (! scalar(@Datatypes)) {
+        &set_up_table_structure();
+    }
     for (my $i=0;$i<=$#Row;$i++) {
         $Fields{$Datatypes[$i]->{'name'}}=&Apache::lonnet::unescape($Row[$i]);
     }
@@ -2239,7 +2235,7 @@
 ###########################################################
 sub parse_raw_result {
     my ($result,$hostname) = @_;
-# conclude from self to others regarding fields
+    # conclude from self to others regarding fields
     my %Fields=&Apache::lonmeta::metadata_col_to_hash(
 						map {
 						 &Apache::lonnet::unescape($_);
@@ -2294,7 +2290,7 @@
 
 =pod
 
-=item &search_results_header
+=item &search_results_header()
 
 Output the proper html headers and javascript code to deal with different 
 calling modes.
@@ -2496,6 +2492,7 @@
 =item Metadata Viewing Functions
 
 Output is a HTML-ified string.
+
 Input arguments are title, author, subject, url, keywords, version,
 notes, short abstract, mime, language, creation date,
 last revision date, owner, copyright, hostname, and
@@ -2686,10 +2683,9 @@
 sub filled {
     my ($field)=@_;
     if ($field=~/\S/ && $field ne 'any') {
-	return 1;
-    }
-    else {
-	return 0;
+        return 1;
+    } else {
+        return 0;
     }
 }
 

--matthew1078334723--