# Copyright for the Uniform Repository Service (c) 1995 - 2019,
# by Gerald Banon. All rights reserved.
# Version 2.1
# statistics.tcl
# Example:
# http://$site/statistics.cgi/$rep
# http://banon-pc.dpi.inpe.br:1905/statistics.cgi/dpi.inpe.br/banon/1995/09.18.18.50
# PATH_INFO = /dpi.inpe.br/banon/1995/09.18.18.50
# QUERY_STRING = returnaddress=
proc Statistics {} {
global searchResultList
global numberOfSites
global numberOfSatisfiedQueries
global env
global cgi
global currentRep
global mirrorHomePageRep ;# defined in FindLanguage (utilities1.tcl)
global homePath ;# used in FindLanguage
global loBiMiRep ;# used in MultipleSubmit (called in FindSiteContainingTheOriginal2)
global serverAddress ;# used in SetFieldValue
# array set environment [array get env] ;# used in MultipleSubmit
set monthAbbreviation(01) Jan
set monthAbbreviation(02) Feb
set monthAbbreviation(03) Mar
set monthAbbreviation(04) Apr
set monthAbbreviation(05) May
set monthAbbreviation(06) Jun
set monthAbbreviation(07) Jul
set monthAbbreviation(08) Aug
set monthAbbreviation(09) Sep
set monthAbbreviation(10) Oct
set monthAbbreviation(11) Nov
set monthAbbreviation(12) Dec
set col ../../../../..
# currentRep
set currentRep $env(LOBIMIREP) ;# used by MultipleSubmit
# URLibServiceRepository
set URLibServiceRepository $env(URLIB_SERVICE_REP)
# homePath (used in FindLanguage)
set homePath $env(DOCUMENT_ROOT)
# loBiMiRep
set loBiMiRep $env(LOBIMIREP) ;# used in MultipleSubmit (called in FindSiteContainingTheOriginal2)
source ../$col/$URLibServiceRepository/doc/utilities1.tcl
source ../$col/$URLibServiceRepository/doc/cgi/mirrorfind-.tcl
# Find the language and the language repository
# use the same languages as used for the local bibliographic mirror
foreach {language languageRep1 languageRep2} [FindLanguage $env(LOBIMIREP)] {break}
# Find the language and the language repository - end
if [info exists env(QUERY_STRING)] {
foreach {name value} [split $env(QUERY_STRING) &=] {
set cgi([DecodeURL $name]) [DecodeURL $value]
}
}
## site
# set site $env(HTTP_HOST)
# bgColor, background and bgProperties
foreach {bgColor background bgProperties fontTag fontTag2} [GetBg $languageRep1 $language] {break}
set background [subst $background]
source ../$col/$languageRep2/doc/mirror/${language}Statistics.tcl
global "${languageRep2}::Average number of visits per day"
global "${languageRep2}::over 10 periods of \$periodLength days"
global "${languageRep2}::The red period number indicates that the corresponding period contains the day May 17, 20151."
global "${languageRep2}::The height of each purple bar is proportional to the average\
number of visits per day
within the corresponding period."
global "${languageRep2}::Period 1 begins on \$startingDay"
global "${languageRep2}::and Period 10 ends on \$todayDate"
global "${languageRep2}::The number of visits over the 10 periods is \
\$totalNumberOfVisits."
global "${languageRep2}::The average number of visits per day over the 10 periods is \
\$average."
global "${languageRep2}::These statistics have been extracted from \$numberOfActiveSites \
out of \$numberOfSites sites."
global "${languageRep2}::1Before May 17, 2015, all each user visits (IP) were added, thereafter, \
only one visit per day for each user (IP) is added."
# accessdate
global "${languageRep2}::accessDate"
global "${languageRep2}::Jan"
global "${languageRep2}::Feb"
global "${languageRep2}::Mar"
global "${languageRep2}::Apr"
global "${languageRep2}::May"
global "${languageRep2}::Jun"
global "${languageRep2}::Jul"
global "${languageRep2}::Aug"
global "${languageRep2}::Sep"
global "${languageRep2}::Oct"
global "${languageRep2}::Nov"
global "${languageRep2}::Dec"
global "${languageRep2}::Return"
puts {Content-Type: text/html}
puts {}
# rep
regsub -all { } [lrange [file split $env(PATH_INFO)] 1 4] {/} rep
## serverAddressWithIP
# set serverAddressWithIP [list $env(IP_ADDR) $env(URLIB_PORT)]
# serverAddress
set serverAddress [list $env(SERVER_NAME) $env(URLIB_PORT)]
# Get metadata
set siteContainingTheOriginal [FindSiteContainingTheOriginal2 $rep 0] ;# without ip
# puts $siteContainingTheOriginal
if ![string equal {} $siteContainingTheOriginal] {
set serverAddress $siteContainingTheOriginal
}
set metadataRep [Execute $serverAddress [list FindMetadataRep $rep]]
SetFieldValue $serverAddress $metadataRep-0 {referencetype title author year}
set referenceType $referencetype
set author [FormatAuthorList $author]
set author "$author :$year:"
# Get metadata - end
# Compute the todayDate
# today
set today [clock format [clock seconds] -format %Y.%m.%d]
foreach {year month day} [split $today .] {break}
set month monthAbbreviation($month)
regsub {^0} $day {} day
set todayDate [subst [subst [subst $accessDate]]]
# Compute the todayDate - end
# Compute siteList
# set siteList [list $serverAddressWithIP]
set siteList [list $serverAddress]
# Compute siteList - end
# puts $siteList
# Compute the smallerFirstDay
set query "list GetFirstDay $rep"
# MULTIPLE SUBMIT
set searchResultList {}
MultipleSubmit {} $query searchResultList 0 $siteList
set searchResultList [join $searchResultList]
set numberOfActiveSites $numberOfSatisfiedQueries
set smallerFirstDay $today
# LOOP OVER EACH SITE (now just one loop)
foreach {site firstDay} $searchResultList {
# site not used
if {$firstDay == ""} {continue}
set smallerFirstDay [StringMin $smallerFirstDay $firstDay]
}
# Compute the smallerFirstDay - end
puts [SetFont [subst [set ${languageRep2}::header]]]
if {$smallerFirstDay != ""} {
# at least on click
# Compute periodLength
set firstAccessNOD [ComputeNOD $smallerFirstDay]
set todayNOD [ComputeNOD $today]
set allPeriod [expr $todayNOD - $firstAccessNOD + 1]
set periodLength [expr $allPeriod / 10] ;# integer part
# Compute periodLength - end
if {$periodLength != 0} {
# Compute histogramSum and totalNumberOfVisits
# startingDay
set numberOfDays [expr $periodLength * 10]
set startDayNOD [expr $todayNOD - $numberOfDays + 1]
set startDay [clock format [expr $startDayNOD * 24 * 3600] -format %Y.%m.%d]
foreach {year month day} [split $startDay .] {break}
set month monthAbbreviation($month)
regsub {^0} $day {} day
set startingDay [subst [subst [subst $accessDate]]]
set may17NOD [ComputeNOD 2015.05.17] ;# date of the new count policy
set oldCountPolicyPeriod [expr $may17NOD - $startDayNOD]
if {$oldCountPolicyPeriod > 0} {
set periodNumber [expr 1 + ($oldCountPolicyPeriod - 1) / $periodLength] ;# 1, 2, 3...
} else {
set periodNumber 0
}
# LOOP OVER EACH SITE (now just one loop)
foreach i {1 2 3 4 5 6 7 8 9 10} {
set histogramSum($i) 0
}
set totalNumberOfVisits 0
# puts --$searchResultList--
foreach {site firstDay} $searchResultList {
# firstDay not used
foreach {serverName urlibPort} [ReturnCommunicationAddress $site] {break}
if [catch \
{StartCommunication $serverName $urlibPort} \
localURLibClientSocketId] {continue} ;# catch is for unix
# histogram
catch {
array set histogram [Submit $localURLibClientSocketId [list GetHistogram $rep $periodLength $todayNOD] 0] ;# not async
} m
close $localURLibClientSocketId
# puts $m
# global errorInfo
# puts $errorInfo
foreach i {1 2 3 4 5 6 7 8 9 10} {
set histogramSum($i) [expr $histogram($i) + $histogramSum($i)]
set totalNumberOfVisits [expr $histogram($i) + $totalNumberOfVisits]
}
}
# Compute histogramSum and totalNumberOfVisits - end
} else {
# Compute totalNumberOfVisits
# startingDay
foreach {year month day} [split $smallerFirstDay .] {break}
set month monthAbbreviation($month)
regsub {^0} $day {} day
set startingDay [subst [subst [subst $accessDate]]]
# LOOP OVER EACH SITE (now just one loop)
set totalNumberOfVisits 0
foreach {site firstDay} $searchResultList {
# firstDay not used
foreach {serverName urlibPort} [ReturnCommunicationAddress $site] {break}
if [catch {StartCommunication $serverName $urlibPort} localURLibClientSocketId] {continue} ;# catch is for unix
# numberOfVisits
set numberOfVisits [Submit $localURLibClientSocketId [list GetNumberOfVisits $rep] 0] ;# not async
close $localURLibClientSocketId
set totalNumberOfVisits [expr $numberOfVisits + $totalNumberOfVisits]
}
# Compute totalNumberOfVisits - end
}
puts [subst [set ${languageRep2}::atLeastOneClick]]
if {$periodLength != 0} {
# Draw the histogram
# Find the vertical scale
set max 0
foreach i {1 2 3 4 5 6 7 8 9 10} {
set max [Max $max $histogramSum($i)]
}
if {$max == 0} {
set maxHeight 0
set max 1 ;# to avoid division by zero
} else {
set maxAverage [expr $max. / $periodLength]
set maxHeight \
[expr int ([expr [expr 4 + log10($maxAverage)] * 10])]
}
# Find the vertical scale - end
# Compute precision
set precision [expr int([expr ceil([expr log10($periodLength)])])]
if {$precision > 2} {set precision 2}
set precisionAll [expr int([expr ceil([expr log10($allPeriod)])])]
if {$precisionAll > 2} {set precisionAll 2}
foreach i {1 2 3 4 5 6 7 8 9 10} {
set counter($i) 0
}
# Compute precision - end
# average
set average [format "%4.${precisionAll}f" \
[expr $totalNumberOfVisits. / $numberOfDays]]
lappend page {}
lappend page {}
lappend page {${Average number of visits per day} }
lappend page "${over 10 periods of $periodLength days} |
"
lappend page {}
lappend page {}
foreach i {1 2 3 4 5 6 7 8 9 10} {
set height [expr $histogramSum($i) * $maxHeight / $max]
if {$height == 0} {
lappend page "\
\
$histogramSum($i) \
\
| "
} else {
set localAverage [format "%4.${precision}f" \
[expr $histogramSum($i). / $periodLength]]
lappend page "\
\
$localAverage \
\
| "
}
}
lappend page { }
lappend page {\
\
1 | }
foreach i {2 3 4 5 6 7 8 9} {
lappend page "\
\
$i | "
}
lappend page {\
10 \
| \
|
}
lappend page {}
if {$periodNumber != 0} {lappend page "${The red period number indicates that the corresponding period contains the day May 17, 20151.}
"}
lappend page {
${The height of each purple bar is proportional to the average\
number of visits per day
within the corresponding period.}
}
lappend page "${Period 1 begins on $startingDay} ( \
),"
lappend page "${and Period 10 ends on $todayDate} ( \
).
"
lappend page "${The number of visits over the 10 periods is \
$totalNumberOfVisits.}
"
lappend page "${The average number of visits per day over the 10 periods is \
$average.}
"
lappend page "${1Before May 17, 2015, all each user visits (IP) were added, thereafter, \
only one visit per day for each user (IP) is added.}
"
if {$numberOfSites != 1} {
lappend page "${These statistics have been extracted from $numberOfActiveSites \
out of $numberOfSites sites.}
"
}
puts [subst [join $page \n]]
# Draw the histogram - end
}
} else {
# no click
puts [set ${languageRep2}::noClick]
}
set display [GetFrameName]
puts [CreateReturnButton
../$col/$languageRep2/doc/mirror {} $display $Return {} {} {} {} 1]
puts $fontTag2