Diff for /loncom/interface/lonsearchcat.pm between versions 1.86 and 1.91

version 1.86, 2001/03/27 19:57:53 version 1.91, 2001/04/02 13:15:26
Line 3 Line 3
 #  #
 # 03/08/2001 Scott Harrison  # 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/12/2001, 03/13/2001, 03/14/2001, 03/15/2001, 03/19/2001
 # Scott Harrison: 03/20/2001  # Scott Harrison: 03/20/2001, 03/21/2001, 03/22/2001, 03/26/2001, 03/27/2001
   # Scott Harrison: 04/02/2001
 #  #
 # Functions  # Functions
 #  #
Line 36 Line 37
 # recursive_SQL_query_build(field name, reverse notation expression) :   # recursive_SQL_query_build(field name, reverse notation expression) : 
 #                 builds a SQL query string from a reverse notation expression  #                 builds a SQL query string from a reverse notation expression
 #                 logical expression with AND/OR keywords  #                 logical expression with AND/OR keywords
   # build_custommetadata_query(field_name, logic_statement) : builds a perl
   #                regular expression from a logical expression with AND/OR
   #                keywords
   # detailed_citation_view, summary_view, fielded_format_view, xml_sgml_view:
   #   four different ways to view metadata records.  Outputs 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, httphost, and extra custom metadata to show.
   # build_date_queries(cmonth1, cday1, cyear1, cmonth2, cday2, cyear2,
   #                    lmonth1, lday1, lyear1, lmonth2, lday2, lyear2) :
   #         Builds a SQL logic query to check time/date entries.
   # output_date_error(server reference, error message) : outputs
   #         an error message specific to bad date format.
   # make_persistent() : makes a set of hidden HTML fields to make
   #                     SQL search interface information to be persistent
   
 package Apache::lonsearchcat;  package Apache::lonsearchcat;
   
Line 46  use Apache::File(); Line 62  use Apache::File();
 use CGI qw(:standard);  use CGI qw(:standard);
 use Text::Query;  use Text::Query;
   
   # ---------------------------------------- variables used throughout the module
 my %language;  my %language;
 my $scrout;  my $scrout;
 my %metadatafields;  my %metadatafields;
 my %cprtag;  my %cprtag;
 my %mimetag;  my %mimetag;
 my $closebutton;  my $closebutton;
   
   # ------ form selection elements that allow for choosing different output views
   # Detailed Citation View ---> sub detailed_citationview
   # Summary View ---> sub summary_view
   # Fielded Format ---> sub fielded_format_view
   # XML/SGML ---> sub xml_sgml_view
 my $basicviewselect=<<END;  my $basicviewselect=<<END;
 <select name='basicviewselect'>  <select name='basicviewselect'>
 <option value='Detailed Citation View'>Detailed Citation View</option>  <option value='Detailed Citation View'>Detailed Citation View</option>
Line 69  my $advancedviewselect=<<END; Line 92  my $advancedviewselect=<<END;
 </select>  </select>
 END  END
   
   # ----------------------------- Handling routine called via Apache and mod_perl
 sub handler {  sub handler {
     my $r = shift;      my $r = shift;
   
Line 89  sub handler { Line 113  sub handler {
     %metadatafields=();      %metadatafields=();
   
     my $hidden='';      my $hidden='';
     $hidden=<<END if $ENV{'form.catalogmode'} eq 'interactive';      if ($ENV{'form.catalogmode'} eq 'interactive') {
    $hidden=<<END;
 <input type='hidden' name='catalogmode' value='interactive'>  <input type='hidden' name='catalogmode' value='interactive'>
 END  END
           $closebutton=<<END;
     $closebutton=<<END if $ENV{'form.catalogmode'} eq 'interactive';  
 <input type="button" name="close" value='CLOSE' onClick="self.close()">  <input type="button" name="close" value='CLOSE' onClick="self.close()">
 END  END
       }
   
 # ------------------------------------------------ First, check out environment  # ------------------------------------------------ First, check out environment
     $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'};      $metadatafields{'owner'}=$ENV{'user.name'}.'@'.$ENV{'user.domain'};
Line 132  END Line 157  END
  } <$fh>;   } <$fh>;
     }      }
   
   # ----------------------------------- See if a search invocation should be done
     if ($ENV{'form.basicsubmit'} eq 'SEARCH') {      if ($ENV{'form.basicsubmit'} eq 'SEARCH') {
  return &basicsearch($r,\%ENV);   return &basicsearch($r,\%ENV);
     }      }
Line 139  END Line 165  END
  return &advancedsearch($r,\%ENV);   return &advancedsearch($r,\%ENV);
     }      }
   
   # ----------------------------- Else, begin building search interface to output
     $scrout=''; # building a part of screen output      $scrout=''; # building a part of screen output
     $scrout.=&searchphrasefield('Limit by title','title',      $scrout.=&searchphrasefield('Limit by title','title',
  $ENV{'form.title'});   $ENV{'form.title'});
Line 501  sub advancedsearch { Line 528  sub advancedsearch {
    'custommetadata','customshow') {     'custommetadata','customshow') {
  $ENV{"form.$field"}=~s/[^\w\s\(\)\=\-\"\']//g;   $ENV{"form.$field"}=~s/[^\w\s\(\)\=\-\"\']//g;
     }      }
   
       # Check to see if enough information was filled in
     for my $field ('title','author','subject','keywords','url','version',      for my $field ('title','author','subject','keywords','url','version',
    'notes','abstract','mime','language','owner',     'notes','abstract','mime','language','owner',
    'custommetadata') {     'custommetadata') {
Line 508  sub advancedsearch { Line 537  sub advancedsearch {
     $fillflag++;      $fillflag++;
  }   }
     }      }
   
     unless ($fillflag) {      unless ($fillflag) {
  &output_blank_field_error($r);   &output_blank_field_error($r);
  return OK;   return OK;
     }      }
   
   
       # Turn the form input into a SQL-based query
     my $query='';      my $query='';
   
     my @queries;      my @queries;
     # Go through 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') {         'keywords','version','owner') {
  if ($ENV{'form.'.$field}) {   if ($ENV{'form.'.$field}) {
     push @queries,&build_SQL_query($field,$ENV{'form.'.$field});      push @queries,&build_SQL_query($field,$ENV{'form.'.$field});
  }   }
     }      }
       # 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'}\")";
     }      }
     if ($ENV{'form.mime'} and $ENV{'form.mime'} ne 'any') {      if ($ENV{'form.mime'} and $ENV{'form.mime'} ne 'any') {
  push @queries,"(mime like \"\%$ENV{'form.mime'}\%\")";   push @queries,"(mime like \"$ENV{'form.mime'}\")";
     }      }
     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'}\")";
     }      }
       # Evaluate date windows
     my $datequery=&build_date_queries(      my $datequery=&build_date_queries(
  $ENV{'form.creationdatestart_month'},   $ENV{'form.creationdatestart_month'},
  $ENV{'form.creationdatestart_day'},   $ENV{'form.creationdatestart_day'},
Line 548  sub advancedsearch { Line 579  sub advancedsearch {
  $ENV{'form.lastrevisiondateend_day'},   $ENV{'form.lastrevisiondateend_day'},
  $ENV{'form.lastrevisiondateend_year'},   $ENV{'form.lastrevisiondateend_year'},
  );   );
       # Test to see if date windows are legitimate
     if ($datequery=~/^Incorrect/) {      if ($datequery=~/^Incorrect/) {
  &output_date_error($r,$datequery);   &output_date_error($r,$datequery);
  return OK;   return OK;
Line 555  sub advancedsearch { Line 587  sub advancedsearch {
     elsif ($datequery) {      elsif ($datequery) {
  push @queries,$datequery;   push @queries,$datequery;
     }      }
   
       # Process form information for custom metadata querying
     my $customquery='';      my $customquery='';
     if ($ENV{'form.custommetadata'}) {      if ($ENV{'form.custommetadata'}) {
  $customquery=&build_custommetadata_query('custommetadata',   $customquery=&build_custommetadata_query('custommetadata',
Line 567  sub advancedsearch { Line 601  sub advancedsearch {
  my @fields=split(/\s+/,$customshow);   my @fields=split(/\s+/,$customshow);
  $customshow=join(" ",@fields);   $customshow=join(" ",@fields);
     }      }
       # Send query statements over the network to be processed by either the SQL
       # database or a recursive scheme of 'grep'-like actions (for custom
       # metadata).
     if (@queries) {      if (@queries) {
  $query=join(" AND ",@queries);   $query=join(" AND ",@queries);
  $query="select * from metadata where $query";   $query="select * from metadata where $query";
  my $reply='';   my $reply; # reply hash reference
  unless ($customquery or $customshow) {   unless ($customquery or $customshow) {
     $reply=&Apache::lonnet::metadata_query($query);      $reply=&Apache::lonnet::metadata_query($query);
  }   }
Line 581  sub advancedsearch { Line 618  sub advancedsearch {
  &output_results('Advanced',$r,$envhash,$customquery,$reply);   &output_results('Advanced',$r,$envhash,$customquery,$reply);
     }      }
     elsif ($customquery) {      elsif ($customquery) {
  my $reply='';   my $reply; # reply hash reference
  $reply=&Apache::lonnet::metadata_query('',   $reply=&Apache::lonnet::metadata_query('',
        $customquery,$customshow);         $customquery,$customshow);
  &output_results('Advanced',$r,$envhash,$customquery,$reply);   &output_results('Advanced',$r,$envhash,$customquery,$reply);
     }      }
     $r->print('system error'); # just in case.. hrrmm..      $r->print(' '); # just in case.. hrrmm..
     return OK;      return OK;
 }  }
   
Line 611  sub basicsearch { Line 648  sub basicsearch {
  $ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g;   $ENV{"form.$field"}=~s/[^\w\s\(\)\-]//g;
     }      }
   
       # Check to see if enough is filled in
     unless (&filled($ENV{'form.basicexp'})) {      unless (&filled($ENV{'form.basicexp'})) {
  &output_blank_field_error($r);   &output_blank_field_error($r);
  return OK;   return OK;
     }      }
   
       # 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'));
       $query='select * from metadata where concat(' . $concatarg . ') like %' .
      $ENV{'form.basicexp'} . '%';
   
     $query="select * from metadata where concat($concatarg) like '\%$ENV{'form.basicexp'}\%'";      # Get reply (either a hash reference to filehandles or bad connection)
     my $reply=&Apache::lonnet::metadata_query($query);      my $reply=&Apache::lonnet::metadata_query($query);
   
       # Output search results
     &output_results('Basic',$r,$envhash,$query,$reply);      &output_results('Basic',$r,$envhash,$query,$reply);
   
     return OK;      return OK;
 }  }
   
Line 690  sub output_results { Line 734  sub output_results {
   
  my $customshow='';   my $customshow='';
  my $extrashow='';   my $extrashow='';
    my @customfields;
  if ($ENV{'form.customshow'}) {   if ($ENV{'form.customshow'}) {
     $customshow=$ENV{'form.customshow'};      $customshow=$ENV{'form.customshow'};
     $customshow=~s/[^\w\s]//g;      $customshow=~s/[^\w\s]//g;
     my @fields=map {"<font color=\"#008000\">$_:</font>"}       my @fields=map {"<font color=\"#008000\">$_:</font><!-- $_ -->"} 
                    split(/\s+/,$customshow);                     split(/\s+/,$customshow);
       @customfields=split(/\s+/,$customshow);
     if ($customshow) {      if ($customshow) {
  $extrashow="<ul><li>".join("</li><li>",@fields)."</li></ul>\n";   $extrashow="<ul><li>".join("</li><li>",@fields)."</li></ul>\n";
     }      }
  }   }
  my $customdata='';   my $customdata='';
    my %customhash;
  foreach my $result (@results) {   foreach my $result (@results) {
     if ($result=~/^(custom\=.*)$/) { # grab all custom metadata      if ($result=~/^(custom\=.*)$/) { # grab all custom metadata
  $customdata.=$result;   my $tmp=$result;
    $tmp=~s/^custom\=//;
    my ($k,$v)=map {&Apache::lonnet::unescape($_);
       } split(/\,/,$tmp);
    $customhash{$k}=$v;
     }      }
  }   }
  foreach my $result (@results) {   foreach my $result (@results) {
Line 718  sub output_results { Line 769  sub output_results {
     my $shortabstract=$abstract;      my $shortabstract=$abstract;
     $shortabstract=substr($abstract,0,200) if length($abstract)>200;      $shortabstract=substr($abstract,0,200) if length($abstract)>200;
     $fields[7]=$shortabstract;      $fields[7]=$shortabstract;
       my $extrashow2=$extrashow;
       if ($extrashow) {
    foreach my $field (@customfields) {
       my $value='';
       if ($customhash{$url}=~/\<${field}[^\>]*\>(.*?)\<\/${field}[^\>]*\>/s) {
            $value=$1;
       }
       $extrashow2=~s/\<\!\-\- $field \-\-\>/ $value/g;
    }
       }
   
       $compiledresult.=<<END if $compiledresult;
   <hr align='left' width='200' noshade />
   END
     $compiledresult.=<<END;      $compiledresult.=<<END;
 <p>  <p>
 END  END
             $compiledresult.=<<END if $ENV{'form.catalogmode'} eq 'interactive';             $compiledresult.=<<END if $ENV{'form.catalogmode'} eq 'interactive';
 <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"  <font size='-1'><INPUT TYPE="button" NAME="returnvalues" VALUE="SELECT"
 onClick="javascript:select_data('$title','$url')">  onClick="javascript:select_data('$title','$url')">
 </font>  </font>
Line 740  END Line 805  END
             if ($viewselect eq 'Detailed Citation View') {              if ($viewselect eq 'Detailed Citation View') {
  $compiledresult.=&detailed_citation_view(@fields,   $compiledresult.=&detailed_citation_view(@fields,
  $hostname,$httphost,   $hostname,$httphost,
  $extrashow);   $extrashow2);
     }      }
             elsif ($viewselect eq 'Summary View') {              elsif ($viewselect eq 'Summary View') {
  $compiledresult.=&summary_view(@fields,$hostname,$httphost,   $compiledresult.=&summary_view(@fields,$hostname,$httphost,
        $extrashow);         $extrashow2);
     }      }
             elsif ($viewselect eq 'Fielded Format') {              elsif ($viewselect eq 'Fielded Format') {
  $compiledresult.=&fielded_format_view(@fields,$hostname,   $compiledresult.=&fielded_format_view(@fields,$hostname,
       $httphost,$extrashow);        $httphost,$extrashow2);
     }      }
             elsif ($viewselect eq 'XML/SGML') {              elsif ($viewselect eq 'XML/SGML') {
  $compiledresult.=&xml_sgml_view(@fields,$hostname,$httphost,   $compiledresult.=&xml_sgml_view(@fields,$hostname,$httphost,
  $extrashow);   $extrashow2);
     }      }
   
         }          }
Line 848  sub build_custommetadata_query { Line 913  sub build_custommetadata_query {
     # quick fix to change literal into xml tag-matching      # quick fix to change literal into xml tag-matching
     # will eventually have to write a separate builder module      # will eventually have to write a separate builder module
     my $oldmatchexp=$matchexp;      my $oldmatchexp=$matchexp;
     $matchexp=~s/(\w+)\\\=(\w+)/\\\<$1\\\>\[\^\\\<\]\*$2\[\^\\\<\]\*\\\<\\\/$1\\\>/g;      $matchexp=~s/(\w+)\\\=([\w\\\+]+)/\\\<$1\\\>\[\^\\\<\]\*$2\[\^\\\<\]\*\\\<\\\/$1\\\>/g;
     return $matchexp;      return $matchexp;
 }  }
   

Removed from v.1.86  
changed lines
  Added in v.1.91


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>