Forwarding this to xwiki devs for input. Joshua Marks CTO Curriki: The Global Education and Learning Community [email protected] www.curriki.org US 831-685-3511
-----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Henri Lesourd Sent: Tuesday, March 31, 2009 9:18 AM To: [email protected] Subject: [curriki-devs] XWiki HQL queries too slow Although it's not specific to Curriki per se, I start by posting my question here, for perhaps somebody on the list met this problem before. My question is: I need to query documents containing an object from a specific Java class, and to access the object. In Vincent Massol's XWiki tutorial, examples of how to do this are exclusively described in the following way: (1) First, query the wiki for the names of all the documents having a specific class, e.g.: #set ($hql = ", BaseObject as obj where obj.name=doc.fullName and obj.className='XWiki.TodoClass'") for querying the names of all the documents having the class 'TodoClass'. (2) and then, for each document, fetch the document with getDocument(), and then perform a getObject() for getting the related instance of the Java class, which finally can be accessed. Here is a typical snippet: #foreach ($todo in $todos) #set ($todoDoc = $xwiki.getDocument($todo)) #set ($todoObj = $todoDoc.getObject("XWiki.TodoClass")) ........ { Code using $todoObj } .......... #end Problem is: in my version of the step (1) above I get 1800 documents, but next, in step (2), I dismiss most of them by means of performing a simple test on the slots of the object obtained from getObject(). Thus, as it is described above, the technique from the XWiki tutorial is highly inefficient, because for the sake of performing the simple test you need on the Java object contained in each document, you are forced to fetch this document, then read the object with getObject(), and it's only then that you can perform your simple test. ==> Question: is there a possibility to perform the getObject() *inside* the HQL query, in such a way that I can fetch and test the slots of a given related Java object (e.g., an XWiki.XWikiUsers, or an XWiki.XWikiGroups) directly inside the 'where' part of the HQL query ? For example, I'd like to be able to write something like: #set ($hql = ", BaseObject as obj where obj.name=doc.fullName and obj.className='XWiki.XWikiUsers' and doc.getObject('XWiki.XWikiUsers').country='Papua New Guinea')") for fetching the names of the XWiki pages of all people from Papua New Guinea. In such a case, if there are only few of them among several hundreds of users from more common nationalities, I run exactly on the problem described above. Of course, this example with the users is not very useful, and perhaps you can do that in another way from inside Java, but the pattern is typical. In practice, if you cannot perform simple tests to eliminate unwanted items directly inside the HQL, then very easily, you obtain programs performing queries lasting several dozens of seconds, which quickly becomes unbearable for the users. With more users operating in the same time, the response time for a simple Velocity program displaying a list of items can even reach response times of several minutes, like it happened to us last week during the presentation of Intergeo in a seminar in Spain (fortunately, people understand that the system is under development, but...). Thus I'm looking for an approach to eradicate this problem once for all, for otherwise, it will not be possible to build a web-based system usable by more than a dozen users, and this would be, hem, annoying so to say... Thank you in advance, Henri _______________________________________________ curriki-devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/curriki-devs _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

