Maybe you could consider using sem:uuid() in MarkLogic 7? You are much
better off with a statistically unique ID than actually taking the time
and massive concurrency reduction to check uniqueness.
John
On 04/06/2014 18:01, Ron Hitchens wrote:
>
> I'm working on a project, one aspect of which requires minting unique IDs
> and assuring that no two documents with the same ID wind up in the database.
> I know how to accomplish this using locks (I'm pretty sure) but any such
> implementation is awkward and prone to subtle edge case errors, and can be
> difficult to test.
>
> It seems to me that this is something that MarkLogic could do much more
> reliably and quickly than any user-level code. The thought that occurred to
> me is a variation on range indexes which only allow a single instance of any
> given value.
>
> Conventional range indexes work by creating term lists that look like
> this (see Jason Hunter's ML Architecture paper), where each term list
> contains an element (or attribute) value and a list of fragment IDs where
> that term exists.
>
> aardvark | 23, 135, 469, 611
> ant | 23, 469, 558, 611, 750
> baboon | 53, 97, 469, 621
> etc...
>
> By making a range index like this but which only allows a single fragment
> ID in the list, that would ensure that no two documents in the database
> contain a given element with the same value. That is, attempting to add a
> second document with the same element or attribute value would cause an
> exception. And being a range index, it would provide a fast lexicon of all
> the current unique values in the DB.
>
> Such an index would look something like this:
>
> abc3vk34 | 17
> bkx46lkd | 52
> bz1d34nm | 37
> etc...
>
> Usage could be something like this:
>
> declare function create-new-id-doc ($id-root as xs:string) as xs:string
> {
> try {
> let $id := $id-root || "-" || mylib:random-string(8)
> let $uri := "/idregistry/id-" || $id
> let $_ :=
> xdmp:document-insert ($uri,
> <registered-id>
> <id>{ $id }</id>
> <created>{ fn:current-dateTime() }</created>
> </registered-id>
> return $id
> } catch (e) {
> create-new-id-doc ($id-root)
> }
> };
>
> This doesn't require that I write any (possibly buggy) mutual exclusion
> code and I can be confident that once the xdmp:document-insert succeeds that
> the ID is unique in the database and that the type (as configured for the
> range index) is correct.
>
> Any love for Unique Value Range Indexes in the next version of MarkLogic?
>
> ---
> Ron Hitchens {[email protected]} +44 7879 358212
>
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general
>
--
John Snelson, Lead Engineer http://twitter.com/jpcs
MarkLogic Corporation http://www.marklogic.com
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general