That seems reasonable to me, as you have to do 1 million x 12 matches.  
Assuming everything in your database has a URI starting with a "/" though, the 
directory-query does not buy you anything (as it matches all documents).  If 
you were able to constrain that directory query more, you might make things 
faster yet.

Also, if you are using 4.0 with function mapping, you can simplify this code a 
little.  something like:

xquery version "1.0-ml";
let $ext := ("*.jpg", "*.gif", "*.ico", "*.jpeg", "*.tiff", "*.tif", 
   "*.png", "*.dcr", "*.pcd", "*.bmp", "*.mpeg", "*.mpg")
return
<count>{ fn:count(cts:uri-match($ext)) }</count>

(: note that both the cts:uri-match and the fn:count
   will use function mapping to iterate over the sequence :)

-Danny

  

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

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