Here's a way which took less than 45 seconds to execute:

let $dir := "/"

let $dir-level := "infinity"

let $dir-query := cts:directory-query($dir, $dir-level)

let $uris-1 := cts:uri-match("*.jpg", "document", $dir-query)
let $uris-2 := cts:uri-match("*.gif", "document", $dir-query)
let $uris-3 := cts:uri-match("*.ico", "document", $dir-query)
let $uris-4 := cts:uri-match("*.jpeg", "document", $dir-query)
let $uris-5 := cts:uri-match("*.tiff", "document", $dir-query)
let $uris-6 := cts:uri-match("*.tif", "document", $dir-query)
let $uris-7 := cts:uri-match("*.png", "document", $dir-query)
let $uris-8 := cts:uri-match("*.dcr", "document", $dir-query)
let $uris-9 := cts:uri-match("*.pcd", "document", $dir-query)
let $uris-10 := cts:uri-match("*.bmp", "document", $dir-query)
let $uris-11 := cts:uri-match("*.mpeg", "document", $dir-query)
let $uris-12 := cts:uri-match("*.mpg", "document", $dir-query)

return
(
<count>{fn:count($uris-1) + fn:count($uris-2) + fn:count($uris-3) + 
fn:count($uris-4) + fn:count($uris-5) + fn:count($uris-6) + fn:count($uris-7) + 
fn:count($uris-8) + fn:count($uris-9) + fn:count($uris-10) + fn:count($uris-11) 
+ fn:count($uris-12)}</count>
)

________________________________
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Hartwig, Brent 
(CL Tech Sv)
Sent: Tuesday, November 25, 2008 12:54 PM
To: General Mark Logic Developer Discussion
Subject: [MarkLogic Dev General] How to count items in the database by multiple 
file extensions?

Hello, I'm looking for an efficient means to count the number of files of a 
particular type, where each type is defined by multiple file extensions. For 
example, how do you determine the total number of audio/video files in your 
MarkLogic database? Same question but for images. Ideally, I'd like to ask 
admin to run a single XQuery from the CQ interface but fear a timeout as we 
have over 1 mln files. I'll offer the following for illustrative purposes. It 
doesn't run. Please don't laugh loud enough for me to hear ;) Thank you in 
advance for your time and thoughts.

define function get-extension($uri as xs:string)
{
        fn:tokenize($uri, "\.")[fn:last()]
}

let $uris-docs := cts:uri-match("*.*", "document", cts:directory-query("/", 
"infinity"))

(: Trying to iterate through this large collection once, setting multiple vars. 
:)
for $uri in $uris-docs
   let $ext := get-extension($uri)
   let $uris-av :=
   (
        return
        if ((fn:compare($ext, "avi") = 0) or (fn:compare($ext, "mov") = 0)
         or (fn:compare($ext, "mp3") = 0) or (fn:compare($ext, "wav") = 0)
         or (fn:compare($ext, "wma") = 0) or (fn:compare($ext, "wmv") = 0)
         or (fn:compare($ext, "ra") = 0) or (fn:compare($ext, "fla") = 0)
         or (fn:compare($ext, "flv") = 0) or (fn:compare($ext, "swf") = 0))
        then $uri else ()
   )
   let $uris-img :=
   (
        return
        if ((fn:compare($ext, "ico") = 0) or (fn:compare($ext, "gif") = 0)
         or (fn:compare($ext, "jpeg") = 0) or (fn:compare($ext, "jpg") = 0)
         or (fn:compare($ext, "mpeg") = 0) or (fn:compare($ext, "mpg") = 0)
         or (fn:compare($ext, "tiff") = 0) or (fn:compare($ext, "tif") = 0)
         or (fn:compare($ext, "png") = 0) or (fn:compare($ext, "bmp") = 0)
         or (fn:compare($ext, "dcr") = 0) or (fn:compare($ext, "pcd") = 0))
        then $uri else ()
   )

return
(
<count-av>{count($uris-av)}</count-av>
<count-img>{count($uris-img)}</count-img>
)

-Brent
_______________________________________________
General mailing list
[email protected]
http://xqzone.com/mailman/listinfo/general

Reply via email to