[MarkLogic Dev General] Problem in making use of cts:not-query()

Sudheer Yalaverthi sudheer.yalaverthi at gmail.com
Tue Mar 27 11:49:24 PDT 2012


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
<Damon.Feldman at marklogic.com>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:* general-bounces at developer.marklogic.com [mailto:
> general-bounces at developer.marklogic.com] *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 <john at yuxipacific.com> 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 <
> sudheer.yalaverthi at gmail.com> 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
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general****
>
>
>
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general****
>
> ** **
>
> _______________________________________________
> General mailing list
> General at developer.marklogic.com
> http://developer.marklogic.com/mailman/listinfo/general
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://developer.marklogic.com/pipermail/general/attachments/20120327/7651edc5/attachment-0001.html 


More information about the General mailing list