[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> </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> </td></td></tr>';
+ '</td><td> </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 ©right_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{
-<a href="/adm/searchcat?$parms&start=$current_min&$show=$show">reload</a>
-};
+ $links .=
+ qq{
+ <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{
-<a href="/adm/searchcat?$parms&start=$next_min&show=$show">next</a>
-};
+ $links .=
+ qq{
+ <a href="/adm/searchcat?$parms&start=$next_min&show=$show">}.
+ &mt('next').'</a>';
} else {
- $links .= ' next';
+ $links .= ' '.&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--