Thanks you Damon.
On 4/22/13, Damon Feldman <[email protected]> wrote: > Pradeep, > > This sounds like a reasonable approach. > > If you can use the directory itself rather than a separate ID for the > directory, I think that would be simpler, since the directory is already a > sort of ID grouping all information below it. Note you can query by > directory via cts:directory-query() to use the directory as a query > mechanism without needing an ID separate from the directory. > > Another possible solution is to store the directory ID in the properties > fragment of the actual documents. This would duplicate the data, but still > allow most functionality. > > These are only possible other approaches. Your solution seems to work, and > I'm sure matches your design. > > Best, > Damon > > From: [email protected] > [mailto:[email protected]] On Behalf Of Pradeep > Maddireddy > Sent: Monday, April 22, 2013 10:52 AM > To: MarkLogic Developer Discussion > Subject: Re: [MarkLogic Dev General] Try Catch Conflicting updates > > Hi Damon, > > We have a function data:crtdoc-and-directories in a library module which > would > i) insert a document into MLS and > ii) then to attach an unqiue id to every directory.To attach an id to every > directory we are creating a document with the directory name and setting it > a property. > > Let's say the function receives an uri "/root/fldr1/fldr11/abc.xml" the > function creates the document with this name and then creates the following > documents as well > /root/ > /root/fldr1/ > /root/fldr1/fldr11/ and then sets a property so that every directory can > have an unique id. The problem is when we are invoking this function from a > different module iteratively. for example > > > for $uri in ( "/root/fldr1/fldr11/abc.xml" , "/root/fldr1/fldr11/def.xml" > ) > > return data:crtdoc-and-directories( $uri ) > > In the above scenario it would try to create same set of documents and > update the same property which is throwing conflicting errors. All we need > is assign a unique id to every directory. So I thought of using try catch > and ignore the update if it errors out as we already have assigned one. > > For now I have modified the function to just return the directories without > creating and then choose distinct directories and then start assigning the > id values in the invoking module itself. As this function was used in > multiple places in my project I was hesitating to make this change but had > no other option. > > > Thanks > Pradeep Maddireddy > > On Mon, Apr 22, 2013 at 6:06 PM, Damon Feldman > <[email protected]<mailto:[email protected]>> wrote: > Pradeep, > > I see that behavior too (thanks for the excellent, self-contained example > code). > > I can only assume that recent versions of MarkLogic added some conflict > checking that I was not aware of, which occurs before the transaction > commit, but that it is not as universal as the checks the commit logic is > able to do. Someone on the list from MarkLogic Engineering may be able to > correct me if I'm wrong. > > If you know the problem is with multiple properties, Geert's suggestion of > putting them all in a map, keyed by URI with the required property for each > URI, should work. > > If you can tell us the nature of the problem, there may be other solutions > as well. > > Damon > > > From: > [email protected]<mailto:[email protected]> > [mailto:[email protected]<mailto:[email protected]>] > On Behalf Of Pradeep Maddireddy > Sent: Monday, April 22, 2013 5:28 AM > To: MarkLogic Developer Discussion > Subject: Re: [MarkLogic Dev General] Try Catch Conflicting updates > > Hi Damon, > > Thank you. Just one more observation > > The first query seems to work fine, in every iteration we insert the same > document and update its property try catch seems to work fine. But in the > query two we insert the document only once and update the property twice > throws conflicting updates error. > (: > --------------------------------------------------------------------------------------------------------- > :) > (: query one :) > let $uri := "/root/abc.xml" > for $prop in 1 to 2 > return > try > { > xdmp:document-insert($uri,<root/>), > xdmp:document-set-property($uri,<priority>{$prop}</priority>), > "Successfuly updated property." > } > catch($err) > { > "Error updating property." > } > (: > --------------------------------------------------------------------------------------------------------- > :) > (: query two :) > let $uri := "/root/abc.xml" > let $_ := xdmp:document-insert($uri,<root/>) > for $prop in 1 to 2 > return > try > { > > xdmp:document-set-property($uri,<priority>{$prop}</priority>), > "Successfuly updated property." > } > catch($err) > { > "Error updating property." > } > (: > --------------------------------------------------------------------------------------------------------- > :) > > Thanks > Pradeep Maddireddy > > On Fri, Apr 19, 2013 at 8:09 PM, Damon Feldman > <[email protected]<mailto:[email protected]>> wrote: > Pradeep, > > The commit of all updates from a transaction occurs after the XQuery is done > running, including the try/catch. So setting the properties did not trigger > the conflict (or at least it is not detected) inside the try/catch. That > code completes, then when the system actually processes the transaction > commit after all code is done, it sees the same fragment being updated in > inconsistent ways and raises the error. > > So you need to look at your program logic to avoid the conflict. Can you > describe what happens and what you are trying to accomplish at a high > level? > > Yours, > Damon > > -- > Damon Feldman > Sr. Principal Consultant, MarkLogic > > > > > From: > [email protected]<mailto:[email protected]> > [mailto:[email protected]<mailto:[email protected]>] > On Behalf Of Pradeep Maddireddy > Sent: Friday, April 19, 2013 10:15 AM > To: General Mark Logic Developer Discussion > Subject: [MarkLogic Dev General] Try Catch Conflicting updates > > Hi..! > > Try catch doesn't seem to work with conflicting updates problem. I am trying > to update the same document property in the same transaction so I used try > catch so that the second update can be ignored but doesn't seem to work. > Marklogic is still throwing an hard error even when I am using a try catch > in the below case. > Is there anything wrong in the below block of code. > > My actual situation isn't as straight forward so I cannot use alternate > approaches. > > try { > ( > xdmp:document-set-property("/root/abc.xml",<priority>5</priority>), > xdmp:document-set-property("/root/abc.xml",<priority>6</priority>) > ) > } > catch($err) > { > "error" > } > > Thanks > Pradeep Maddireddy > > _______________________________________________ > General mailing list > [email protected]<mailto:[email protected]> > http://developer.marklogic.com/mailman/listinfo/general > > > _______________________________________________ > General mailing list > [email protected]<mailto:[email protected]> > http://developer.marklogic.com/mailman/listinfo/general > > _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
