Forwarding this to xwiki devs for input.
Joshua Marks
CTO
Curriki: The Global Education and Learning Community
jmarks(a)curriki.org
www.curriki.org
US 831-685-3511
-----Original Message-----
From: curriki-devs-bounces(a)xwiki.org [mailto:curriki-devs-bounces@xwiki.org]
On Behalf Of Henri Lesourd
Sent: Tuesday, March 31, 2009 9:18 AM
To: curriki-devs(a)xwiki.org
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
curriki-devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/curriki-devs