version 1.140, 2002/07/09 17:27:11
|
version 1.143, 2002/07/16 15:02:06
|
Line 109 button that closes the search window
|
Line 109 button that closes the search window
|
|
|
button to take the select results and go to group sorting |
button to take the select results and go to group sorting |
|
|
=item %hash |
=item %groupsearch_db |
|
|
The ubiquitous database hash |
Database hash used to save values for the groupsearch RAT interface. |
|
|
=item $diropendb |
=item $diropendb |
|
|
Line 125 that produces it. Adding a new view typ
|
Line 125 that produces it. Adding a new view typ
|
adding a line to the definition of this hash and making sure the function |
adding a line to the definition of this hash and making sure the function |
takes the proper parameters. |
takes the proper parameters. |
|
|
|
=item $results_db |
|
|
|
The name of the database results from searches are put in. |
|
|
=back |
=back |
|
|
=cut |
=cut |
Line 137 my $closebutton; # button that closes t
|
Line 141 my $closebutton; # button that closes t
|
my $importbutton; # button to take the selected results and go to group sorting |
my $importbutton; # button to take the selected results and go to group sorting |
|
|
# -- miscellaneous variables |
# -- miscellaneous variables |
my %hash; # database hash |
my %groupsearch_db; # database hash |
my $diropendb = ""; # db file |
my $diropendb = ""; # db file |
|
|
|
my $results_db = ""; |
# View Description Function Pointer |
# View Description Function Pointer |
my %Views = ("Detailed Citation View" => \&detailed_citation_view, |
my %Views = ("Detailed Citation View" => \&detailed_citation_view, |
"Summary View" => \&summary_view, |
"Summary View" => \&summary_view, |
Line 173 string that holds portions of the screen
|
Line 178 string that holds portions of the screen
|
###################################################################### |
###################################################################### |
sub handler { |
sub handler { |
my $r = shift; |
my $r = shift; |
untie %hash; |
untie %groupsearch_db; |
|
|
$r->content_type('text/html'); |
$r->content_type('text/html'); |
$r->send_http_header; |
$r->send_http_header; |
return OK if $r->header_only; |
return OK if $r->header_only; |
|
## |
|
## Initialize global variables |
|
## |
my $domain = $r->dir_config('lonDefDomain'); |
my $domain = $r->dir_config('lonDefDomain'); |
$diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). |
$diropendb= "/home/httpd/perl/tmp/".&Apache::lonnet::escape($domain). |
"\_".&Apache::lonnet::escape($ENV{'user.name'})."_searchcat.db"; |
"\_".&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'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['catalogmode','launch','acts','mode','form','element', |
['catalogmode','launch','acts','mode','form','element', |
'reqinterface']); |
'reqinterface']); |
## |
## |
## Clear out old values from database |
## Clear out old values from groupsearch database |
## |
## |
if ($ENV{'form.launch'} eq '1') { |
if ($ENV{'form.launch'} eq '1') { |
if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
if (tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
&start_fresh_session(); |
&start_fresh_session(); |
untie %hash; |
untie %groupsearch_db; |
} else { |
} else { |
$r->print('<html><head></head><body>Unable to tie hash to db '. |
$r->print('<html><head></head><body>Unable to tie hash to db '. |
'file</body></html>'); |
'file</body></html>'); |
Line 239 END
|
Line 247 END
|
# We are running a search |
# We are running a search |
my ($query,$customquery,$customshow,$libraries) = |
my ($query,$customquery,$customshow,$libraries) = |
(undef,undef,undef,undef); |
(undef,undef,undef,undef); |
|
my $pretty_string; |
if ($searchtype eq 'Basic') { |
if ($searchtype eq 'Basic') { |
$query = &parse_basic_search($r); |
($query,$pretty_string) = &parse_basic_search($r); |
} elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { |
} elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') { |
($query,$customquery,$customshow,$libraries) |
($query,$customquery,$customshow,$libraries,$pretty_string) |
= &parse_advanced_search($r); |
= &parse_advanced_search($r); |
return OK if (! defined($query)); |
return OK if (! defined($query)); |
} |
} |
|
# Output some information to the user. |
|
$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 |
# Send query statements over the network to be processed by |
# either the SQL database or a recursive scheme of 'grep'-like |
# either the SQL database or a recursive scheme of 'grep'-like |
# actions (for custom metadata). |
# actions (for custom metadata). |
$r->rflush(); |
|
my $reply=&Apache::lonnet::metadata_query($query,$customquery, |
my $reply=&Apache::lonnet::metadata_query($query,$customquery, |
$customshow,$libraries); |
$customshow,$libraries); |
|
$r->rflush(); |
&output_results($searchtype,$r,$reply,$hidden); |
&output_results($searchtype,$r,$reply,$hidden); |
} else { |
} else { |
# |
# |
Line 318 ENDDOCUMENT
|
Line 331 ENDDOCUMENT
|
' '; |
' '; |
# $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); |
# $scrout.=&simplecheckbox('allversions',$ENV{'form.allversions'}); |
# $scrout.='<font color="#800000">Search historic archives</font>'; |
# $scrout.='<font color="#800000">Search historic archives</font>'; |
|
my $checkbox = &simplecheckbox('related',$ENV{'form.related'}); |
$scrout.=<<END; |
$scrout.=<<END; |
</td><td><a href="/adm/searchcat?reqinterface=advanced">Advanced Search</a></td></tr></table> |
</td><td><a href="/adm/searchcat?reqinterface=advanced">Advanced Search</a></td></tr> |
|
<tr><td>$checkbox use related words</td><td></td></tr> |
|
</table> |
</p> |
</p> |
<p> |
<p> |
<input type="submit" name="basicsubmit" value='SEARCH' /> |
<input type="submit" name="basicsubmit" value='SEARCH' /> |
Line 394 ENDHEADER
|
Line 410 ENDHEADER
|
$ENV{'form.viewselect'}, |
$ENV{'form.viewselect'}, |
undef,undef,undef, |
undef,undef,undef, |
sort(keys(%Views))); |
sort(keys(%Views))); |
$scrout.="</td></tr>\n"; |
$scrout.="</td><td>Related<br />Words</td></tr>\n"; |
$scrout.=&searchphrasefield('title', 'title' ,$ENV{'form.title'}); |
$scrout.=&searchphrasefield_with_related('title', 'title' , |
|
$ENV{'form.title'}); |
$scrout.=&searchphrasefield('author', 'author' ,$ENV{'form.author'}); |
$scrout.=&searchphrasefield('author', 'author' ,$ENV{'form.author'}); |
$scrout.=&searchphrasefield('subject', 'subject' ,$ENV{'form.subject'}); |
$scrout.=&searchphrasefield_with_related('subject', 'subject' , |
$scrout.=&searchphrasefield('keywords','keywords',$ENV{'form.keywords'}); |
$ENV{'form.subject'}); |
|
$scrout.=&searchphrasefield_with_related('keywords','keywords', |
|
$ENV{'form.keywords'}); |
$scrout.=&searchphrasefield('URL', 'url' ,$ENV{'form.url'}); |
$scrout.=&searchphrasefield('URL', 'url' ,$ENV{'form.url'}); |
$scrout.=&searchphrasefield('notes', 'notes' ,$ENV{'form.notes'}); |
$scrout.=&searchphrasefield_with_related('notes', 'notes' , |
$scrout.=&searchphrasefield('abstract','abstract',$ENV{'form.abstract'}); |
$ENV{'form.notes'}); |
|
$scrout.=&searchphrasefield_with_related('abstract','abstract', |
|
$ENV{'form.abstract'}); |
# Hack - an empty table row. |
# Hack - an empty table row. |
$scrout.="<tr><td> </td><td> </td></tr>\n"; |
$scrout.="<tr><td> </td><td> </td><td> </td></tr>\n"; |
$scrout.=&searchphrasefield('file<br />extension','mime', |
$scrout.=&searchphrasefield('file<br />extension','mime', |
$ENV{'form.mime'}); |
$ENV{'form.mime'}); |
$scrout.="<tr><td> </td><td> </td></tr>\n"; |
$scrout.="<tr><td> </td><td> </td><td> </td></tr>\n"; |
$scrout.=&searchphrasefield('publisher<br />owner','owner', |
$scrout.=&searchphrasefield('publisher<br />owner','owner', |
$ENV{'form.owner'}); |
$ENV{'form.owner'}); |
$scrout.="</table>\n"; |
$scrout.="</table>\n"; |
Line 549 to be somewhat persistent.
|
Line 570 to be somewhat persistent.
|
sub make_persistent { |
sub make_persistent { |
my %save = %{shift()}; |
my %save = %{shift()}; |
my $persistent=''; |
my $persistent=''; |
foreach (keys %save) { |
foreach my $name (keys %save) { |
if (/^form\./ && !/submit/) { |
if ($name =~ /^form\./ && $name !~ /submit/) { |
my $name=$_; |
|
my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); |
my @values = (ref($save{$name}) ? @{$save{$name}} : ($save{$name})); |
$name=~s/^form\.//; |
$name=~s/^form\.//; |
foreach (@values) { |
foreach (@values) { |
s/\"/\'/g; # do not mess with html field syntax |
s/\"/\'/g; # do not mess with html field syntax |
|
next if (! $_ ); |
$persistent.=<<END; |
$persistent.=<<END; |
<input type="hidden" name="$name" value="$_" /> |
<input type="hidden" name="$name" value="$_" /> |
END |
END |
Line 565 END
|
Line 586 END
|
return $persistent; |
return $persistent; |
} |
} |
|
|
|
|
###################################################################### |
###################################################################### |
|
# HTML form building functions # |
###################################################################### |
###################################################################### |
|
|
=pod |
=pod |
Line 575 END
|
Line 596 END
|
|
|
=over 4 |
=over 4 |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
=item &simpletextfield() |
=item &simpletextfield() |
|
|
Inputs: $name,$value,$size |
Inputs: $name,$value,$size |
Line 582 Inputs: $name,$value,$size
|
Line 610 Inputs: $name,$value,$size
|
Returns a text input field with the given name, value, and size. |
Returns a text input field with the given name, value, and size. |
If size is not specified, a value of 20 is used. |
If size is not specified, a value of 20 is used. |
|
|
|
=cut |
|
|
|
############################################### |
|
############################################### |
|
|
|
sub simpletextfield { |
|
my ($name,$value,$size)=@_; |
|
$size = 20 if (! defined($size)); |
|
return '<input type="text" name="'.$name. |
|
'" size="'.$size.'" value="'.$value.'" />'; |
|
} |
|
|
|
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
=item &simplecheckbox() |
=item &simplecheckbox() |
|
|
Inputs: $name,$value |
Inputs: $name,$value |
Line 589 Inputs: $name,$value
|
Line 634 Inputs: $name,$value
|
Returns a simple check box with the given $name. |
Returns a simple check box with the given $name. |
If $value eq 'on' the box is checked. |
If $value eq 'on' the box is checked. |
|
|
=item &searchphrasefield() |
=cut |
|
|
Inputs: $title,$name,$value |
############################################### |
|
############################################### |
|
|
Returns html for a title line and an input field for entering search terms. |
sub simplecheckbox { |
the instructions "Enter terms or phrases separated by search operators such |
my ($name,$value)=@_; |
as AND, OR, or NOT." are given following the title. The entry field (which |
my $checked=''; |
is where the $name and $value are used) is an 80 column simpletextfield. |
$checked="checked" if $value eq 'on'; |
|
return '<input type="checkbox" name="'.$name.'" '. $checked . ' />'; |
|
} |
|
|
=item &dateboxes() |
############################################### |
|
############################################### |
|
|
Returns html selection form elements for the specification of |
=pod |
the day, month, and year. |
|
|
|
=item &selectbox() |
=item &fieldtitle() |
|
|
Returns a scalar containing an html <select> form. |
Input: $title |
|
|
Inputs: |
Returns a scalar with html which will display $title as a search |
|
field heading. |
|
|
=over 4 |
=cut |
|
|
=item $title |
############################################### |
|
############################################### |
|
|
Printed above the select box, in uppercase. If undefined, only a select |
sub fieldtitle { |
box will be returned, with no additional html. |
my $title = uc(shift()); |
|
return '<font color="#800000" face="helvetica"><b>'.$title. |
|
': </b></font>'; |
|
} |
|
|
=item $name |
############################################### |
|
############################################### |
|
|
The name element of the <select> tag. |
=pod |
|
|
=item $default |
=item &searchphrasefield() |
|
|
The default value of the form. Can be $anyvalue, or in @idlist. |
Inputs: $title,$name,$value |
|
|
=item $anyvalue |
Returns html for a title line and an input field for entering search terms. |
|
The entry field (which is where the $name and $value are used) is a 50 column |
|
simpletextfield. The html returned is for a row in a three column table. |
|
|
The <option value="..."> used to indicate a default of |
=cut |
none of the values. Can be undef. |
|
|
|
=item $anytag |
############################################### |
|
############################################### |
|
|
|
sub searchphrasefield { |
|
my ($title,$name,$value)=@_; |
|
return '<tr><td>'.&fieldtitle($title).'</td><td>'. |
|
&simpletextfield($name,$value,50)."</td><td> </td></tr>\n"; |
|
} |
|
|
The text associate with $anyvalue above. |
############################################### |
|
############################################### |
|
|
=item $functionref |
=pod |
|
|
Each element in @idlist will be passed as a parameter |
=item &searchphrasefield_with_related() |
to the function referenced here. The return value of the function should |
|
be a scalar description of the items. If this value is undefined the |
|
description of each item in @idlist will be the item name. |
|
|
|
=item @idlist |
Inputs: $title,$name,$value |
|
|
The items to be selected from. One of these or $anyvalue will be the |
Returns html for a title line and an input field for entering search terms |
value returned by the form element, $ENV{form.$name}. |
and a check box for 'related words'. The entry field (which is where the |
|
$name and $value are used) is a 50 column simpletextfield. The name of |
|
the related words checkbox is "$name_related". |
|
|
=back |
=cut |
|
|
=back |
############################################### |
|
############################################### |
|
|
|
sub searchphrasefield_with_related { |
|
my ($title,$name,$value)=@_; |
|
return '<tr><td>'.&fieldtitle($title).'</td><td>'. |
|
&simpletextfield($name,$value,50).'</td><td align="center"> '. |
|
&simplecheckbox($name.'_related',$ENV{'form.'.$name.'_related'}). |
|
" </td></tr>\n"; |
|
} |
|
|
=cut |
############################################### |
|
############################################### |
|
|
###################################################################### |
=pod |
###################################################################### |
|
|
|
sub simpletextfield { |
=item &dateboxes() |
my ($name,$value,$size)=@_; |
|
$size = 20 if (! defined($size)); |
|
return '<input type="text" name="'.$name. |
|
'" size="'.$size.'" value="'.$value.'" />'; |
|
} |
|
|
|
sub simplecheckbox { |
Returns html selection form elements for the specification of |
my ($name,$value)=@_; |
the day, month, and year. |
my $checked=''; |
|
$checked="checked" if $value eq 'on'; |
|
return '<input type="checkbox" name="'.$name.'" '. $checked . ' />'; |
|
} |
|
|
|
sub searchphrasefield { |
=cut |
my ($title,$name,$value)=@_; |
|
my $uctitle=uc($title); |
############################################### |
return '<tr><td><font color="#800000" face="helvetica">'. |
############################################### |
'<b>'.$uctitle.': </b></font></td><td>'. |
|
&simpletextfield($name,$value,50)."</td></tr>\n"; |
|
} |
|
|
|
sub dateboxes { |
sub dateboxes { |
my ($name,$defaultmonth,$defaultday,$defaultyear, |
my ($name,$defaultmonth,$defaultday,$defaultyear, |
Line 720 END
|
Line 779 END
|
return "$month$day$year"; |
return "$month$day$year"; |
} |
} |
|
|
|
############################################### |
|
############################################### |
|
|
|
=pod |
|
|
|
=item &selectbox() |
|
|
|
Returns a scalar containing an html <select> form. |
|
|
|
Inputs: |
|
|
|
=over 4 |
|
|
|
=item $title |
|
|
|
Printed above the select box, in uppercase. If undefined, only a select |
|
box will be returned, with no additional html. |
|
|
|
=item $name |
|
|
|
The name element of the <select> tag. |
|
|
|
=item $default |
|
|
|
The default value of the form. Can be $anyvalue, or in @idlist. |
|
|
|
=item $anyvalue |
|
|
|
The <option value="..."> used to indicate a default of |
|
none of the values. Can be undef. |
|
|
|
=item $anytag |
|
|
|
The text associate with $anyvalue above. |
|
|
|
=item $functionref |
|
|
|
Each element in @idlist will be passed as a parameter |
|
to the function referenced here. The return value of the function should |
|
be a scalar description of the items. If this value is undefined the |
|
description of each item in @idlist will be the item name. |
|
|
|
=item @idlist |
|
|
|
The items to be selected from. One of these or $anyvalue will be the |
|
value returned by the form element, $ENV{form.$name}. |
|
|
|
=back |
|
|
|
=cut |
|
|
|
############################################### |
|
|
sub selectbox { |
sub selectbox { |
my ($title,$name,$default,$anyvalue,$anytag,$functionref,@idlist)=@_; |
my ($title,$name,$default,$anyvalue,$anytag,$functionref,@idlist)=@_; |
if (! defined($functionref)) { $functionref = sub { $_[0]}; } |
if (! defined($functionref)) { $functionref = sub { $_[0]}; } |
Line 745 sub selectbox {
|
Line 857 sub selectbox {
|
} |
} |
|
|
###################################################################### |
###################################################################### |
|
# End of HTML form building functions # |
|
###################################################################### |
|
|
|
=pod |
|
|
|
=back |
|
|
|
=cut |
|
|
|
|
|
###################################################################### |
###################################################################### |
###################################################################### |
|
|
=pod |
=pod |
Line 772 Parse advanced search form and return th
|
Line 895 Parse advanced search form and return th
|
sub parse_advanced_search { |
sub parse_advanced_search { |
my ($r)=@_; |
my ($r)=@_; |
my $fillflag=0; |
my $fillflag=0; |
|
my $pretty_search_string = "<br />\n"; |
# Clean up fields for safety |
# Clean up fields for safety |
for my $field ('title','author','subject','keywords','url','version', |
for my $field ('title','author','subject','keywords','url','version', |
'creationdatestart_month','creationdatestart_day', |
'creationdatestart_month','creationdatestart_day', |
Line 811 sub parse_advanced_search {
|
Line 935 sub parse_advanced_search {
|
# Turn the form input into a SQL-based query |
# Turn the form input into a SQL-based query |
my $query=''; |
my $query=''; |
my @queries; |
my @queries; |
|
my $font = '<font color="#800000" face="helvetica">'; |
# Evaluate logical expression AND/OR/NOT phrase fields. |
# Evaluate logical expression AND/OR/NOT phrase fields. |
foreach my $field ('title','author','subject','notes','abstract','url', |
foreach my $field ('title','author','subject','notes','abstract','url', |
'keywords','version','owner','mime') { |
'keywords','version','owner','mime') { |
if ($ENV{'form.'.$field}) { |
if ($ENV{'form.'.$field}) { |
push @queries,&build_SQL_query($field,$ENV{'form.'.$field}); |
my $searchphrase = $ENV{'form.'.$field}; |
|
$pretty_search_string .= $font."$field</font> contains <b>". |
|
$searchphrase."</b>"; |
|
if ($ENV{'form.'.$field.'_related'}) { |
|
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); |
} |
} |
} |
} |
# I dislike the hack below. |
# I dislike the hack below. |
Line 825 sub parse_advanced_search {
|
Line 964 sub parse_advanced_search {
|
# Evaluate option lists |
# Evaluate option lists |
if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') { |
if ($ENV{'form.language'} and $ENV{'form.language'} ne 'any') { |
push @queries,"(language like \"$ENV{'form.language'}\")"; |
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') { |
if ($ENV{'form.copyright'} and $ENV{'form.copyright'} ne 'any') { |
push @queries,"(copyright like \"$ENV{'form.copyright'}\")"; |
push @queries,"(copyright like \"$ENV{'form.copyright'}\")"; |
|
$pretty_search_string.=$font."copyright</font> = ". |
|
&Apache::loncommon::copyrightdescription($ENV{'form.copyright'}). |
|
"<br \>\n"; |
} |
} |
|
# |
# Evaluate date windows |
# Evaluate date windows |
my $datequery=&build_date_queries( |
my $datequery=&build_date_queries( |
$ENV{'form.creationdatestart_month'}, |
$ENV{'form.creationdatestart_month'}, |
Line 848 sub parse_advanced_search {
|
Line 994 sub parse_advanced_search {
|
if ($datequery=~/^Incorrect/) { |
if ($datequery=~/^Incorrect/) { |
&output_date_error($r,$datequery); |
&output_date_error($r,$datequery); |
return ; |
return ; |
} |
} elsif ($datequery) { |
elsif ($datequery) { |
# Here is where you would set up pretty_search_string to output |
|
# date query information. |
push @queries,$datequery; |
push @queries,$datequery; |
} |
} |
# Process form information for custom metadata querying |
# Process form information for custom metadata querying |
my $customquery=undef; |
my $customquery=undef; |
if ($ENV{'form.custommetadata'}) { |
if ($ENV{'form.custommetadata'}) { |
|
$pretty_search_string .=$font."Custom Metadata Search</font>: <b>". |
|
$ENV{'form.custommetadata'}."</b><br />\n"; |
$customquery=&build_custommetadata_query('custommetadata', |
$customquery=&build_custommetadata_query('custommetadata', |
$ENV{'form.custommetadata'}); |
$ENV{'form.custommetadata'}); |
} |
} |
my $customshow=undef; |
my $customshow=undef; |
if ($ENV{'form.customshow'}) { |
if ($ENV{'form.customshow'}) { |
|
$pretty_search_string .=$font."Custom Metadata Display</font>: <b>". |
|
$ENV{'form.customshow'}."</b><br />\n"; |
$customshow=$ENV{'form.customshow'}; |
$customshow=$ENV{'form.customshow'}; |
$customshow=~s/[^\w\s]//g; |
$customshow=~s/[^\w\s]//g; |
my @fields=split(/\s+/,$customshow); |
my @fields=split(/\s+/,$customshow); |
Line 874 sub parse_advanced_search {
|
Line 1025 sub parse_advanced_search {
|
my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} |
my @allowed_domains = (ref($ENV{'form.domains'}) ? @{$ENV{'form.domains'}} |
: ($ENV{'form.domains'}) ); |
: ($ENV{'form.domains'}) ); |
my %domain_hash = (); |
my %domain_hash = (); |
|
my $pretty_domains_string; |
foreach (@allowed_domains) { |
foreach (@allowed_domains) { |
$domain_hash{$_}++; |
$domain_hash{$_}++; |
} |
} |
foreach (keys(%Apache::lonnet::libserv)) { |
if ($domain_hash{'any'}) { |
if ($_ eq 'any') { |
$pretty_domains_string = "Searching all domains."; |
$libraries_to_query = undef; |
} else { |
last; |
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{$_}})) { |
foreach (keys(%Apache::lonnet::libserv)) { |
push @$libraries_to_query,$_; |
if (exists($domain_hash{$Apache::lonnet::hostdom{$_}})) { |
|
push @$libraries_to_query,$_; |
|
} |
} |
} |
} |
} |
|
$pretty_search_string .= $pretty_domains_string."<br />\n"; |
# |
# |
if (@queries) { |
if (@queries) { |
$query=join(" AND ",@queries); |
$query=join(" AND ",@queries); |
Line 893 sub parse_advanced_search {
|
Line 1054 sub parse_advanced_search {
|
} elsif ($customquery) { |
} elsif ($customquery) { |
$query = ''; |
$query = ''; |
} |
} |
return ($query,$customquery,$customshow,$libraries_to_query); |
return ($query,$customquery,$customshow,$libraries_to_query, |
|
$pretty_search_string); |
} |
} |
|
|
###################################################################### |
###################################################################### |
Line 927 sub parse_basic_search {
|
Line 1089 sub parse_basic_search {
|
&output_blank_field_error($r); |
&output_blank_field_error($r); |
return OK; |
return OK; |
} |
} |
|
my $pretty_search_string = '<b>'.$ENV{'form.basicexp'}.'</b>'; |
|
my $search_string = $ENV{'form.basicexp'}; |
|
if ($ENV{'form.related'}) { |
|
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 |
# Build SQL query string based on form page |
my $query=''; |
my $query=''; |
my $concatarg=join('," ",', |
my $concatarg=join('," ",', |
('title', 'author', 'subject', 'notes', 'abstract', |
('title', 'author', 'subject', 'notes', 'abstract', |
'keywords')); |
'keywords')); |
$concatarg='title' if $ENV{'form.titleonly'}; |
$concatarg='title' if $ENV{'form.titleonly'}; |
|
$query=&build_SQL_query('concat('.$concatarg.')',$search_string); |
$query=&build_SQL_query('concat('.$concatarg.')',$ENV{'form.'.'basicexp'}); |
$pretty_search_string .= "<br />\n"; |
return 'select * from metadata where '.$query; |
return 'select * from metadata where '.$query,$pretty_search_string; |
} |
} |
|
|
|
|
Line 945 sub parse_basic_search {
|
Line 1118 sub parse_basic_search {
|
|
|
=pod |
=pod |
|
|
|
=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 |
|
"torque" is replaced with "(torque OR word1 OR word2 OR ...)". |
|
|
|
Note: Using this twice on a string is probably silly. |
|
|
|
=cut |
|
|
|
###################################################################### |
|
###################################################################### |
|
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); |
|
@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,sort(keys(%New_Words)); |
|
} |
|
|
|
###################################################################### |
|
###################################################################### |
|
|
|
=pod |
|
|
=item &build_SQL_query() |
=item &build_SQL_query() |
|
|
Builds a SQL query string from a logical expression with AND/OR keywords |
Builds a SQL query string from a logical expression with AND/OR keywords |
Line 1147 sub output_results {
|
Line 1353 sub output_results {
|
my $persistent=&make_persistent(\%ENV); |
my $persistent=&make_persistent(\%ENV); |
# |
# |
# Begin producing output |
# Begin producing output |
$r->print(&search_results_header($mode)); |
|
$r->rflush(); |
$r->rflush(); |
# |
# |
# begin showing the cataloged results |
# begin showing the cataloged results |
Line 1250 CATALOGCONTROLS
|
Line 1455 CATALOGCONTROLS
|
&handle_custom_fields(\@results); |
&handle_custom_fields(\@results); |
my @customfields = @$customfields; |
my @customfields = @$customfields; |
my %customhash = %$customhash; |
my %customhash = %$customhash; |
untie %hash if (keys %hash); |
untie %groupsearch_db if (tied %groupsearch_db); |
# |
# |
if (! tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
if (! tie(%groupsearch_db,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) { |
$r->print('<html><head></head><body>Unable to tie hash to db '. |
$r->print('<html><head></head><body>Unable to tie hash to db '. |
'file</body></html>'); |
'file</body></html>'); |
} else { |
} else { |
Line 1300 END
|
Line 1505 END
|
} |
} |
if ($ENV{'form.catalogmode'} eq 'groupsearch') { |
if ($ENV{'form.catalogmode'} eq 'groupsearch') { |
$fnum+=0; |
$fnum+=0; |
$hash{"pre_${fnum}_link"}=$Fields{'url'}; |
$groupsearch_db{"pre_${fnum}_link"}=$Fields{'url'}; |
$hash{"pre_${fnum}_title"}=$Fields{'title'}; |
$groupsearch_db{"pre_${fnum}_title"}=$Fields{'title'}; |
$compiledresult.=<<END; |
$compiledresult.=<<END; |
<font size='-1'> |
<font size='-1'> |
<input type="checkbox" name="returnvalues" value="SELECT" |
<input type="checkbox" name="returnvalues" value="SELECT" |
Line 1319 END
|
Line 1524 END
|
$compiledresult.="<hr align='left' width='200' noshade />"; |
$compiledresult.="<hr align='left' width='200' noshade />"; |
} |
} |
} |
} |
untie %hash; |
untie %groupsearch_db; |
} |
} |
if ($compiledresult) { |
if ($compiledresult) { |
$resultflag=1; |
$resultflag=1; |
Line 1504 Checked for existance & 'edit' mode.
|
Line 1709 Checked for existance & 'edit' mode.
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
sub search_results_header { |
sub search_results_header { |
my ($mode) = @_; |
my ($mode,$pretty_query) = @_; |
$mode = lc($mode); |
$mode = lc($mode); |
my $title; |
my $title; |
if ($mode eq 'advanced') { |
if ($mode eq 'advanced') { |
Line 1606 SCRIPT
|
Line 1811 SCRIPT
|
<img align=right src=/adm/lonIcons/lonlogos.gif> |
<img align=right src=/adm/lonIcons/lonlogos.gif> |
<h1>$title</h1> |
<h1>$title</h1> |
END |
END |
|
if ($pretty_query) { |
|
$result .= "<p>Search query: $pretty_query</p>"; |
|
} |
return $result; |
return $result; |
} |
} |
|
|
Line 1968 RESULTS
|
Line 2176 RESULTS
|
|
|
=item &start_fresh_session() |
=item &start_fresh_session() |
|
|
Cleans the global %hash by removing all fields which begin with |
Cleans the global %groupsearch_db by removing all fields which begin with |
'pre_' or 'store'. |
'pre_' or 'store'. |
|
|
=cut |
=cut |
Line 1976 Cleans the global %hash by removing all
|
Line 2184 Cleans the global %hash by removing all
|
###################################################################### |
###################################################################### |
###################################################################### |
###################################################################### |
sub start_fresh_session { |
sub start_fresh_session { |
delete $hash{'mode_catalog'}; |
delete $groupsearch_db{'mode_catalog'}; |
foreach (keys %hash) { |
foreach (keys %groupsearch_db) { |
if ($_ =~ /^pre_/) { |
if ($_ =~ /^pre_/) { |
delete $hash{$_}; |
delete $groupsearch_db{$_}; |
} |
} |
if ($_ =~ /^store/) { |
if ($_ =~ /^store/) { |
delete $hash{$_}; |
delete $groupsearch_db{$_}; |
} |
} |
} |
} |
} |
} |