--- loncom/interface/lonsearchcat.pm 2001/03/14 15:26:47 1.9
+++ loncom/interface/lonsearchcat.pm 2001/03/21 02:34:35 1.55
@@ -2,7 +2,41 @@
# Search Catalog
#
# 03/08/2001 Scott Harrison
+# Scott Harrison: 03/12/2001, 03/13/2001, 03/14/2001, 03/15/2001, 03/19/2001
+# Scott Harrison: 03/20/2001
#
+# Functions
+#
+# handler(server reference) : interacts with the Apache server layer
+# (for /adm/searchcat URLs)
+# simpletextfield(name,value) : returns HTML formatted string for simple text
+# field
+# simplecheckbox(name,value) : returns HTML formatted string for simple
+# checkbox
+# searchphrasefield(title,name,value) : returns HTML formatted string for
+# a search expression phrase field
+# dateboxes(name, defaultmonth, defaultday, defaultyear) : returns HTML
+# formatted string
+# for a calendar date
+# selectbox(title,name,value,%HASH=options) : returns HTML formatted string for
+# a selection box field
+# advancedsearch(server reference, environment reference) : perform a complex
+# multi-field logical query
+# filled(field) : determines whether a given field has been filled
+# basicsearch(server reference, environment reference) : perform a simple
+# single-field logical query
+# output_blank_field_error(server reference) : outputs a message saying that
+# more fields need to be filled in
+# output_results(output mode,
+# server reference,
+# environment reference,
+# reply list reference) : outputs results from search
+# build_SQL_query(field name, logic) : builds a SQL query string from a
+# logical expression with AND/OR keywords
+# recursive_SQL_query_build(field name, reverse notation expression) :
+# builds a SQL query string from a reverse notation expression
+# logical expression with AND/OR keywords
+
package Apache::lonsearchcat;
use strict;
@@ -10,12 +44,30 @@ use Apache::Constants qw(:common);
use Apache::lonnet();
use Apache::File();
use CGI qw(:standard);
+use Text::Query;
my %language;
my $scrout;
my %metadatafields;
my %cprtag;
my %mimetag;
+my $closebutton;
+my $basicviewselect=<
+
+
+
+
+
+END
+my $advancedviewselect=<
+
+
+
+
+
+END
sub handler {
my $r = shift;
@@ -41,6 +93,10 @@ sub handler {
END
+ $closebutton=<
+END
+
# ------------------------------------------------ First, check out environment
$metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'};
@@ -77,30 +133,45 @@ END
}
if ($ENV{'form.basicsubmit'} eq 'SEARCH') {
- return &basicsearch($r,$ENV{'form.basicexp'});
+ return &basicsearch($r,\%ENV);
+ }
+ elsif ($ENV{'form.advancedsubmit'} eq 'SEARCH') {
+ return &advancedsearch($r,\%ENV);
}
$scrout=''; # building a part of screen output
$scrout.=&searchphrasefield('Limit by title','title',
- '');
+ $ENV{'form.title'});
$scrout.=&searchphrasefield('Limit by author','author',
- '');
+ $ENV{'form.author'});
$scrout.=&searchphrasefield('Limit by subject','subject',
- '');
+ $ENV{'form.subject'});
+
+ $scrout.=&searchphrasefield('Limit by keywords','keywords',
+ $ENV{'form.keywords'});
+
+ $scrout.=&searchphrasefield('Limit by URL','url',
+ $ENV{'form.url'});
+
+ $scrout.=&searchphrasefield('Limit by version','version',
+ $ENV{'form.version'});
$scrout.=&searchphrasefield('Limit by notes','notes',
- '');
+ $ENV{'form.notes'});
$scrout.=&searchphrasefield('Limit by abstract','abstract',
- '');
+ $ENV{'form.abstract'});
+ $ENV{'form.mime'}='notxxx' unless length($ENV{'form.mime'});
$scrout.=&selectbox('Limit by MIME type','mime',
- 'notxxx',%mimetag);
+ $ENV{'form.mime'},%mimetag);
+
+ $ENV{'form.language'}='any' unless length($ENV{'form.language'});
$scrout.=&selectbox('Limit by language','language',
- 'any',%language);
+ $ENV{'form.language'},%language);
# ------------------------------------------------ Compute date selection boxes
@@ -111,11 +182,19 @@ END
between:
CREATIONDATESTART
- $scrout.=&dateboxes('creationdatestart',1,1,1976);
+ $scrout.=&dateboxes('creationdatestart',1,1,1976,
+ $ENV{'form.creationdatestart_month'},
+ $ENV{'form.creationdatestart_day'},
+ $ENV{'form.creationdatestart_year'},
+ );
$scrout.=<";
$scrout.=< between:
LASTREVISIONDATESTART
- $scrout.=&dateboxes('lastrevisiondatestart',1,1,1976);
+ $scrout.=&dateboxes('lastrevisiondatestart',1,1,1976,
+ $ENV{'form.lastrevisiondatestart_month'},
+ $ENV{'form.lastrevisiondatestart_day'},
+ $ENV{'form.lastrevisiondatestart_year'},
+ );
$scrout.=<';
$scrout.=&searchphrasefield('Limit by publisher/owner','owner',
- $metadatafields{'owner'});
+ $ENV{'form.owner'});
+# $metadatafields{'owner'});
+ $ENV{'form.copyright'}='any' unless length($ENV{'form.copyright'});
$scrout.=&selectbox('Limit by copyright/distribution','copyright',
- 'any',%cprtag);
+ $ENV{'form.copyright'},%cprtag);
+
+# ------------------------------------------- Compute customized metadata field
+ $scrout.=<
+LIMIT BY OTHER METADATA FIELDS:
+
+For author-specific metadata, enter in an expression in the form of
+key=value separated by operators such as AND or OR.
+Example: grandmother=75 OR grandfather=85
+
+CUSTOMMETADATA
+$scrout.=&simpletextfield('custommetadata',$ENV{'form.custommetadata'});
+$scrout.=' initial users of this system do not need to worry about this option';
# ---------------------------------------------------------------- Print screen
$r->print(<
-
-
-Title only
+ENDDOCUMENT
+ $r->print(&simpletextfield('basicexp',$ENV{'form.basicexp'}));
+ $r->print(' ');
+ $r->print(&simplecheckbox('titleonly',$ENV{'form.titleonly'}));
+ $r->print('Title only ');
+ $r->print(&simplecheckbox('allversions',$ENV{'form.allversions'}));
+ $r->print(<Search historic archives
-
+$closebutton
+$basicviewselect
Advanced Search
@@ -170,7 +278,8 @@ $scrout
-
+$closebutton
+$advancedviewselect
@@ -181,10 +290,16 @@ ENDDOCUMENT
# --------------------------------------------------------- Various form fields
-sub textfield {
- my ($title,$name,$value)=@_;
- return "\n
$title: ".
- '';
+sub simpletextfield {
+ my ($name,$value)=@_;
+ return '';
+}
+
+sub simplecheckbox {
+ my ($name,$value)=@_;
+ my $checked='';
+ $checked="CHECKED" if $value eq 'on';
+ return '';
}
sub searchphrasefield {
@@ -200,137 +315,147 @@ END
}
sub dateboxes {
- my ($name,$defaultmonth,$defaultday,$defaultyear)=@_;
- return<
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+END
+ $month=~s/(\"$currentmonth\")/$1 SELECTED/ if length($currentmonth);
+ my $day=<
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+END
+ $day=~s/(\"$currentday\")/$1 SELECTED/ if length($currentday);
+ my $year=<
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
END
+ $year=~s/(\"$currentyear\")/$1 SELECTED/ if length($currentyear);
+ return "$month$day$year";
}
sub selectbox {
@@ -346,75 +471,80 @@ sub selectbox {
return $selout.'';
}
-# --------------------------------------------------- Performing a basic search
-sub basicsearch {
- my ($r,$expression)=@_;
+# ----------------------------------------------- Performing an advanced search
+sub advancedsearch {
+ my ($r,$envhash)=@_;
+ my %ENV=%{$envhash};
+
+ my $fillflag=0;
+ for my $field ('title','author','subject','keywords','url','version',
+ 'notes','abstract','mime','language','owner',
+ 'custommetadata') {
+ if (&filled($ENV{"form.$field"})) {
+ $fillflag++;
+ }
+ }
- my $query=$expression;
- $query="select * from metadata where concat(title,\" \",author) like '\%$expression\%'";
- my $reply=&Apache::lonnet::reply("querysend:$query",'msul3');
-
- my @results;
-
- my $replyfile='';
- $reply=~/^([\.\w]+)$/; # must do since 'use strict' checks for tainting
- $replyfile=$r->dir_config('lonDaemons').'/tmp/'.$1;
- $reply=~/(.*?)\_/;
- my $hostname=$1;
+ unless ($fillflag) {
+ &output_blank_field_error($r);
+ return OK;
+ }
- {
- while (1) {
- last if -e $replyfile;
- sleep 1;
+ my $query='';
+
+ my @queries;
+ # Go through logical expression AND/OR/NOT phrase fields.
+ foreach my $field ('title','author','subject','notes','abstract') {
+ if ($ENV{'form.'.$field}) {
+ push @queries,&build_SQL_query($field,$ENV{'form.'.$field});
}
- # QUESTION: how should I handle this error condition..
- # I'm sure there is syntax elsewhere I can use..
- my $fh=Apache::File->new($replyfile) or
- ($r->print('file cannot be opened') and return OK);
- @results=<$fh>;
}
+ if (@queries) {
+ $query=join(" and ",@queries);
+ $query="select * from metadata where $query";
+ my $reply=&Apache::lonnet::metadata_query($query);
+ &output_results('Advanced',$r,$envhash,$query,$reply);
+ }
+ else {
+ &output_results('Advanced',$r,$envhash,$query);
+ }
+ return OK;
+}
- my $compiledresult='';
-
- foreach my $result (@results) {
- my ($title,$author,$subject,$url,$keywords,$version,
- $notes,$abstract,$mime,$lang,
- $creationdate,$lastrevisiondate,$owner,$copyright
- )=map {&Apache::lonnet::unescape($_)} (split(/\,/,$result));
- my $shortabstract=$abstract;
- $shortabstract=substr($abstract,0,200) if length($abstract)>200;
- $compiledresult.=<
-END
- $compiledresult.=<
-
-
-END
- $compiledresult.=<URL: $url
-Title: $title
-Author(s): $author
-Subject: $subject
-Keyword(s): $keywords
-Notes: $notes
-Abstract: $shortabstract
-MIME Type: $mimetag{$mime}
-Language: $language{$lang}
-Creation Date: $creationdate
-Last Revision Date: $lastrevisiondate
-Publisher/Owner: $owner
-Copyright/Distribution: $copyright
-Repository Location: $hostname
-
-END
+# ---------------------------------------------------- see if a field is filled
+sub filled {
+ my ($field)=@_;
+ if ($field=~/\S/) {
+ return 1;
+ }
+ else {
+ return 0;
+ }
}
- unless ($compiledresult) {
- $compiledresult="There were no results that matched your query";
+# --------------------------------------------------- Performing a basic search
+sub basicsearch {
+ my ($r,$envhash)=@_;
+ my %ENV=%{$envhash};
+
+ unless (&filled($ENV{'form.basicexp'})) {
+ &output_blank_field_error($r);
+ return OK;
}
+ my $query='';
+ my $concatarg=join('," ",',
+ ('title', 'author', 'subject', 'notes', 'abstract'));
+
+ $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'";
+ my $reply=&Apache::lonnet::metadata_query($query);
+ &output_results('Basic',$r,$envhash,$query,$reply);
+ return OK;
+}
+
+# ---------------- Message to output when there are not enough fields filled in
+sub output_blank_field_error {
+ my ($r)=@_;
# make query information persistent to allow for subsequent revision
my $persistent='';
map {
@@ -433,7 +563,126 @@ END