[LON-CAPA-cvs] cvs: loncom /metadata_database searchcat.pl

www lon-capa-cvs@mail.lon-capa.org
Tue, 08 Oct 2002 15:09:36 -0000


www		Tue Oct  8 11:09:36 2002 EDT

  Modified files:              
    /loncom/metadata_database	searchcat.pl 
  Log:
  Can collect dynamical metadata.
  
  
Index: loncom/metadata_database/searchcat.pl
diff -u loncom/metadata_database/searchcat.pl:1.20 loncom/metadata_database/searchcat.pl:1.21
--- loncom/metadata_database/searchcat.pl:1.20	Mon Sep  9 10:00:24 2002
+++ loncom/metadata_database/searchcat.pl	Tue Oct  8 11:09:36 2002
@@ -2,7 +2,7 @@
 # The LearningOnline Network
 # searchcat.pl "Search Catalog" batch script
 #
-# $Id: searchcat.pl,v 1.20 2002/09/09 14:00:24 harris41 Exp $
+# $Id: searchcat.pl,v 1.21 2002/10/08 15:09:36 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -44,8 +44,92 @@
 use IO::File;
 use HTML::TokeParser;
 use DBI;
+use GDBM_File;
 
 my @metalist;
+
+
+# ----------------------------------------------------- Un-Escape Special Chars
+
+sub unescape {
+    my $str=shift;
+    $str =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+    return $str;
+}
+
+
+# ------------------------------------------- Code to evaluate dynamic metadata
+
+sub dynamicmeta {
+#
+#
+# Do nothing for now ...
+#
+#
+    return;
+#
+# ..., but stuff below already works
+#
+    my $url=&declutter(shift);
+    $url=~s/\.meta$//;
+    my %returnhash=();
+    my ($adomain,$aauthor)=($url=~/^(\w+)\/(\w+)\//);
+    my $prodir=&propath($adomain,$aauthor);
+    if (tie(%evaldata,'GDBM_File',
+            $prodir.'/nohist_resevaldata.db',&GDBM_READER,0640)) {
+       my %sum=();
+       my %cnt=();
+       my %listitems=('count'        => 'add',
+                      'course'       => 'add',
+                      'avetries'     => 'avg',
+                      'stdno'        => 'add',
+                      'difficulty'   => 'avg',
+                      'clear'        => 'avg',
+                      'technical'    => 'avg',
+                      'helpful'      => 'avg',
+                      'correct'      => 'avg',
+                      'depth'        => 'avg',
+                      'comments'     => 'app',
+                      'usage'        => 'cnt'
+                      );
+       my $regexp=$url;
+       $regexp=~s/(\W)/\\$1/g;
+       $regexp='___'.$regexp.'___([a-z]+)$';
+       foreach (keys %evaldata) {
+	 my $key=&unescape($_);
+	 if ($key=~/$regexp/) {
+            if (defined($cnt{$1})) { $cnt{$1}++; } else { $cnt{$1}=1; }
+            unless ($listitems{$1} eq 'app') {
+                  if (defined($sum{$1})) {
+                     $sum{$1}+=$evaldata{$_};
+   	          } else {
+                     $sum{$1}=$evaldata{$_};
+	          }
+             } else {
+                  if (defined($sum{$1})) {
+                     if ($evaldata{$_}) {
+                        $sum{$1}.='<hr>'.$evaldata{$_};
+	             }
+ 	          } else {
+	             $sum{$1}=''.$evaldata{$_};
+	          }
+	      }
+          }
+          foreach (keys %cnt) {
+             if ($listitems{$_} eq 'avg') {
+	         $returnhash{$_}=int(($sum{$_}/$cnt{$_})*100.0+0.5)/100.0;
+             } elsif ($listitems{$_} eq 'cnt') {
+                 $returnhash{$_}=$cnt{$_};
+             } else {
+                 $returnhash{$_}=$sum{$_};
+             }
+          }
+     }
+     untie(%evaldata);
+   }
+   return %returnhash;
+}
+  
 # ----------------- Code to enable 'find' subroutine listing of the .meta files
 require "find.pl";
 sub wanted {
@@ -105,6 +189,7 @@
     my $ref=&metadata($m);
     my $m2='/res/'.&declutter($m);
     $m2=~s/\.meta$//;
+    &dynamicmeta($m2);
     my $q2="select * from metadata where url like binary '$m2'";
     my $sth = $dbh->prepare($q2);
     $sth->execute();