(bug #3558) fix build_browser_and_cloud
[koha.git] / misc / cronjobs / build_browser_and_cloud.pl
index ecce40e..05ea3fb 100755 (executable)
@@ -2,6 +2,12 @@
 # small script that builds the tag cloud
 
 use strict;
+BEGIN {
+    # find Koha's Perl modules
+    # test carefully before changing this
+    use FindBin;
+    eval { require "$FindBin::Bin/../kohalib.pl" };
+}
 
 use C4::Koha;
 use C4::Context;
@@ -34,10 +40,10 @@ if ($version || (!$confirm)) {
     -t TTT to define the MARC fields/subfield to use to fill the tag cloud. If not defined, the cloud table won't be filled.
      
      example :
-     export PERL5LIB=/path/to/koha;export KOHA_CONF=/etc/koha.xml;./build_browser_and_cloud.pl -b -f 676a -t 606 -c
+     export PERL5LIB=/path/to/koha;export KOHA_CONF=/etc/koha/koha-conf.xml;./build_browser_and_cloud.pl -b -f 676a -t 606 -c
 EOF
 ;
-die;
+exit;
 }
 
 ##################################
@@ -73,6 +79,7 @@ my %browser_result;
 
 # the result hash for the cloud table
 my %cloud_result;
+
 while ((my ($biblionumber)= $sth->fetchrow)) {
     $i++;
     print "." unless $batch;
@@ -86,7 +93,7 @@ while ((my ($biblionumber)= $sth->fetchrow)) {
            next;
     }
     # deal with BROWSER part
-    if ($browser_tag) { 
+    if ($browser_tag && $Koharecord) { 
         foreach my $browsed_field ($Koharecord->subfield($browser_tag,$browser_subfield)) {
             $browsed_field =~ s/\.//g;
             my $upto = length($browsed_field)<=$max_digits?length($browsed_field):$max_digits;
@@ -97,15 +104,19 @@ while ((my ($biblionumber)= $sth->fetchrow)) {
         }
     }
     #deal with CLOUD part
-    if ($cloud_tag) {
-        foreach ($Koharecord->field($cloud_tag)) {
-            my $line;
-            foreach ($_->subfields()) {
-                next if $_->[0]=~ /\d/;
-                $line .= $_->[1].' ';
+    if ($cloud_tag && $Koharecord) {
+        if($Koharecord->field($cloud_tag)){
+            foreach ($Koharecord->field($cloud_tag)) {
+                my $line;
+                foreach ($_->subfields()) {
+                    next if $_->[0]=~ /\d/;
+                    $line .= $_->[1].' ';
+                }
+                $line =~ s/ $//;
+                $cloud_result{$line}++;
             }
-            $line =~ s/ $//;
-            $cloud_result{$line}++;
+        }else{
+            print "!";
         }
     }
 
@@ -118,9 +129,10 @@ if ($browser_tag) {
     print "inserting datas in browser table\n";
     # read existing classification table is possible
     my $classification;
-    if (C4::Context->preference('opaclanguages') eq 'fr' && $browser_tag eq '676' & $browser_subfield eq 'a') {
+    if (C4::Context->preference('opaclanguages') =~ m/^fr/i && $browser_tag eq '676' & $browser_subfield eq 'a') {
         $classification = dewey_french();
     }
+
     foreach (keys %browser_result) {
         my $father = substr($_,0,-1);
         $browser_result{$father}->{notendnode}=1;
@@ -128,16 +140,24 @@ if ($browser_tag) {
     $dbh->do("truncate browser");
     my $sth = $dbh->prepare("insert into browser (level,classification,description,number,endnode) values (?,?,?,?,?)");
     foreach (keys %browser_result) {
-        $sth->execute(length($_),$_,$classification->{$_}?$classification->{$_}:"classification $_",$browser_result{$_}->{value},$browser_result{$_}->{notendnode}?0:1);
+        $sth->execute(length($_),$_,$classification->{$_}?$classification->{$_}:"classification $_",$browser_result{$_}->{value},$browser_result{$_}->{notendnode}?0:1) if $browser_result{$_}->{value};
     }
 }
 
 # fills the cloud (tags) table
+my $sthver = $dbh->prepare("SELECT weight FROM tags WHERE entry = ? ");
+my $sthins = $dbh->prepare("insert into tags (entry,weight) values (?,?)");
+my $sthup  = $dbh->prepare("UPDATE tags SET weight = ? WHERE entry = ?");
 if ($cloud_tag) {
     $dbh->do("truncate tags");
-    my $sth = $dbh->prepare("insert into tags (entry,weight) values (?,?)");
-    foreach (keys %cloud_result) {
-        $sth->execute($_,$cloud_result{$_});
+    foreach my $key (keys %cloud_result) {
+        $sthver->execute($key);
+        if(my $row = $sthver->fetchrow_hashref){
+            my $count = $row->{weight} + $cloud_result{$key};
+            $sthup->execute($count, $key);
+        }else{
+            $sthins->execute($key,$cloud_result{$key});
+        }
     }
 }
 # $dbh->do("unlock tables");