XWQL query on comments
How to filter XWiki documents with a XWQL query based on two values contained in the same or different comments |
Type | Snippet |
Category | |
Developed by | Ricardo RodrÃguez, xwiki:XWiki.IsabelListaGarcia |
Rating | |
License | GNU Lesser General Public License 2.1 |
Table of contents
Description
Comments can be of great help and easy use to store non-structured information on XWiki documents. Any structure given to the comment content by itself can even be more useful. For instance, you can use a "tag" like "InformationItem01:" to label any comment related with a given real fact. This could be for sure also applied to XWiki tags or notes, but this simple example applies only to comments: the obvious and conspicuous mean of adding information to a document other than the document edition!
Once you have a number of comments, the devil is in designing the way of querying this particular repository. XWQL is of great help for doing that! As currently there is no direct way of setting two different conditions on all comments of a document, we do need a NOT IN construction here.
And here we go!
The question
How many documents with 'string2' and without 'string1' in any comment's content does the current xwiki's database contain?
The code
#set ($string1 = 'string1')
#set ($string2 = 'string2')
##
#set ($xwqlquery = "SELECT doc2.fullName FROM Document doc2, doc2.object(XWiki.XWikiComments) comm2
WHERE doc2.translation = 0 and comm2.comment LIKE :string1")
#set ($results = $services.query.xwql($xwqlquery).bindValue("string1","$string1").execute())
##
#foreach ($item in $results)
#set ($str=$str+"'"+$item+"'"+",")
#end
#set ($strl = $str.length())
#set ($strls = $strl - 1)
#set ($nicestr = $str.substring(4,$strls))
##
#set ($xwqlquery1 = "FROM doc.object(XWiki.XWikiComments) AS comm
WHERE doc.translation = 0 AND comm.comment like :string2 and doc.fullName NOT IN ($nicestr)")
#set ($results1 = $services.query.xwql($xwqlquery1).bindValue("string2","$string2").execute())
$results1.size()
{{/velocity}}