Hi Damon,
I have made the xml simple.
<entrylist>
<entry type="deny">
<identity>
<id>*</id>
</identity>
<permissionList>
<permission>read</permission>
<permission>write</permission>
</permissionList>
</entry>
<entry type="deny">
<identity>
<id>123</id>
</identity>
<permissionList>
<permission>write</permission>
</permissionList>
</entry>
</entrylist>
There will be 'n' number of xmls like the above in the DB. I need to
retrieve the xml under two conditions.
1. id = 123 and entry should have read permission in the permission list
2. id = * and entry should not have the read permission in it
I am able to form a query for the first condition. But i could not make the
second condition.
Thanks,
Sudheer
On Sun, Mar 25, 2012 at 9:09 AM, Damon Feldman
<[email protected]>wrote:
> Sudheer,****
>
> ** **
>
> Can you post a self-contained, minimal example that runs in queryConsole?
> By this I mean a document insert or two and a query that shows the problem.
> Ideally, you would simplify the query and document to the simplest example
> that shows the behavior you are seeing, perhaps a single permission and two
> notes will work.****
>
> ** **
>
> This allows people to paste it into queryConsole and immediately see your
> problem, then try solutions.****
>
> ** **
>
> Yours,****
>
> Damon****
>
> ** **
>
> *From:* [email protected] [mailto:
> [email protected]] *On Behalf Of *Sudheer Yalaverthi
> *Sent:* Friday, March 23, 2012 4:23 PM
> *To:* MarkLogic Developer Discussion
> *Subject:* Re: [MarkLogic Dev General] Problem in making use of
> cts:not-query()****
>
> ** **
>
> John,
>
> i have tried this. But still this is not helping me.
> I am putting my exact xml , scenario.
>
> Xml in DB :
>
> <notelist>
> <note>
> <text>this is my first note</text>
> <accessControl>
> <explicitAccessControlList>
> <entry type="deny">
> <identity>
> <id>*</id>
> </identity>
> <permissionList>
> <permission>read</permission>
> <permission>write</permission>
> <permission>delete</permission>
> <permission>write-acl</permission>
> </permissionList>
> </entry>
> <entry type="allow">
> <identity>
> <id>1111</id>
> </identity>
> <permissionList>
> <permission>read</permission>
> <permission>write</permission>
> <permission>delete</permission>
> <permission>write-acl</permission>
> </permissionList>
> </entry>
> </explicitAccessControlList>
> </accessControl>
> </note>
> <note>
> <note>
> <text>this is my second note</text>
> <accessControl>
> <explicitAccessControlList>
> <entry type="deny">
> <identity>
> <id>*</id>
> </identity>
> <permissionList>
> <permission>write</permission>
> <permission>delete</permission>
> </permissionList>
> </entry>
> <entry type="allow">
> <identity>
> <id>1111</id>
> </identity>
> <permissionList>
> <permission>read</permission>
> <permission>write</permission>
> <permission>delete</permission>
> </permissionList>
> </entry>
> </explicitAccessControlList>
> </accessControl>
> </note>
> </notelist>
>
>
> There will be so many xmls like this in the DB. My requirement is i have
> to retrieve this xml if i have a note element which has my qstring in the
> text, and has an entry(type=allow with my id, read permission) or an
> entry(type= deny, id = *, should not have read permission in that).
>
> Below is the query i am trying.
>
> cts:element-query(
> xs:QName("note"),
> cts:and-query((
> cts:element-word-query( xs:QName("text"),
> $qstring, "case-insensitive"),
> cts:element-query(
> xs:QName("accessControl"),
> cts:element-query(
>
> xs:QName("explicitAccessControlList"),
>
> cts:or-query((
> cts:element-query(
> xs:QName("entry"),
>
> cts:and-query((
> cts:element-query(
>
> xs:QName("identity"),
>
> cts:element-value-query(xs:QName("id"),$user-id)
> ),
>
> cts:element-attribute-value-query(xs:QName("entry"), xs:QName("type"),
> "allow") ,
>
> cts:element-value-query(xs:QName("permission"),"read"
> )
> ))
> )
>
> ,
> cts:element-query(
>
> xs:QName("entry"),
> cts:and-query((
> cts:element-query(
>
> xs:QName("identity"),
>
> cts:element-value-query(xs:QName("id"),"*")
>
> ),
>
> cts:element-attribute-value-query(xs:QName("entry"), xs:QName("type"),
> "deny")
>
> ,
>
> cts:element-range-query(xs:QName("permission"), "!=", "read", "collation=
> http://marklogic.com/collation/"
> )
> ))
>
> )
> ))
> )
> )
> ))
> )
>
>
> I am still not able to get the expected results. :(
>
>
>
> Thanks,
> Sudheer ****
>
> On Fri, Mar 23, 2012 at 12:48 PM, John Zhong <[email protected]> wrote:
> ****
>
> You can change your
> cts:not-query(cts:element-value-query(xs:QName("subject"), "C")) to
> cts:element-range-query(xs:QName("subject"), "!=","C"), which needs the
> "Element Range Indexes" on subject element.
>
> So,****
>
>
>
> cts:element-query(
> xs:QName("user"),
> cts:and-query((
> cts:element-value-query(xs:QName("id"), "222"),
> cts:element-attribute-value-query(xs:QName("user"),
> xs:QName("branch"), "CSE"),****
>
> cts:element-range-query(xs:QName("subject"), "!=","C")
> ))
> )
>
> It worked for me on ML 4.2 version.
>
> The cts:not-query does not work, in my opinion, it is because:
>
> In your sample XML:
>
> /userdetails//subject = "C"
> > true
>
> not(/userdetails//subject = "C")
> > false
>
> So, I think the cts:not-query works similarly...
>
> BTW, I tried the solution mentioned by Geert, to define the user as
> fragment root, but it did not work.
>
> John****
>
> On Fri, Mar 23, 2012 at 4:48 AM, Sudheer Yalaverthi <
> [email protected]> wrote:****
>
> Hi Team,
>
> My sample XML would be like this.
>
> <userdetails>
> <user branch="CSE">
> <id>111</id>
> <subjectList>
> <subject>C</subject>
> <subject>C++</subject>
> <subject>Oracle</subject>
> </subjectList>
> </user>
> <user branch="CSE">
> <id>222</id>
> <subjectList>
> <subject>C++</subject>
> <subject>Oracle</subject>
> </subjectList>
> </user>
> <user branch="IT">
> <id>333</id>
> <subjectList>
> <subject>C</subject>
> <subject>C++</subject>
> <subject>Oracle</subject>
> </subjectList>
> </user>
> </userdetails>
>
>
> I have a requirement where i should pick this Xml from the DB if there is
> a user entry with branch as"CSE" and id =222 and it should not have "C" as
> subject.
>
> If i write a additional query something like below for search:search()
> cts:element-query(
> xs:QName("user"),
> cts:and-query((
> cts:element-value-query(xs:QName("id"), "222"),
> cts:element-attribute-value-query(xs:QName("user"),
> xs:QName("branch"), "CSE"),
> cts:not-query(cts:element-value-query(xs:QName("subject"), "C"))
> ))
> )
>
> This is not turning me up the results. The only one scenario this query is
> gonna return back the result is if none of the users in the DB has the
> subject as "C". but this is not i am expecting. I know there is one user
> element which satisfies all the conditions and other user elements which
> fail these connditions. I want to retrieve the Xml even if one of the user
> element passes all these conditions irrespective of other elements pass or
> fail. Please suggest me.
> I am using search:search and i can not avoid this as i have some other
> requirements to sorting the result Xmls.
>
>
> Thanks,
> Sudheer
>
> ****
>
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general****
>
>
>
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general****
>
> ** **
>
> _______________________________________________
> General mailing list
> [email protected]
> http://developer.marklogic.com/mailman/listinfo/general
>
>
_______________________________________________
General mailing list
[email protected]
http://developer.marklogic.com/mailman/listinfo/general