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