[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();