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

Reply via email to