Re: [xwiki-users] Trouble with velocity script to list Object properties
[Ricardo Rodriguez] Your EPEC Network ICT Team wrote: But, please, why obj.name=doc.fullName is required? If I remove this conditions, the query retrieve only a couple of documents with the defined properties populated and a bunch of empty ones. As with any query language, select from A, B will not imply any relationship between A and B. In the query above, select from XWikiDocument, BaseObject means select from any document, and any object, without the restrictions that the selected objects belong to the selected document. You do this by adding where obj.name = doc.fullName, which changes the query into: select from any document, and any object attached to the current document, where current means each document currently considered for inclusion in the result. I guess some SQL training would be better to comprehend how queries work, but I hope that this little explanation is good for the moment. -- Sergiu Dumitriu http://purl.org/net/sergiu/ ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Tjaart van Wijck wrote: Guillaume, That worked! Thanks a lot for the help. Yet, I still don't understand why the HQL string below does not yield the correct results: $query = select obj from BaseObject obj where obj.className='Contacts.ContactClass' Can someone explain how XWiki traverses documents and objects to generate the resultset when executing HQL statements? $xwiki.selectDocuments is a safe method, because it allows to select only document names. $xwiki.search is a privileged method, because it allows a user to retrieve ANYTHING from the database, even data he might not have access to, like private documents or user emails or passwords (fortunately the passwords are not stored in plaintext in the database, so that is not an issue, but simple passwords could be cracked using brute force dictionary attacks). For this reason $xwiki.search requires programming rights, and is not the recommended method for retrieving information. This is why your query does not work: $xwiki.search(select obj from BaseObject obj...) will return what you told it to select: instances of BaseObject, which is the privileged com.xpn.xwiki.objects.BaseObject class, privileged as in it should not be exposed to the scripting world. However, since you're already using a privileged method to retrieve them, that is not a problem by itself anymore. But these objects have different methods than the object API which is regularly used in velocity scripts, located in com.xpn.xwiki.api.Object, so $item.get does not work because it is not a method of that object. When you see that a method that is supposed to work doesn't, like was the case with your $item.get, then either the object is null, or has a different type than you expect it to be. What you should do in this case is try to see what's wrong, and you do this by writing: $item $item.class This will print either $item, if it is null, or something for $item followed by the real class name. You then go to that class documentation and see what you should use. So a working script would be: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) #set($item = $item.newObjectApi($item, $context.context)) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end or: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.displayView(firstname, $context.context) | $item.displayView(surname, $context.context) | $item.displayView(phone1, $context.context) br / #end Either one of these is NOT recommended, as they require programming rights. The proper way is: #set($query=, BaseObject obj where obj.name = doc.fullName and obj.className='Contacts.ContactClass' and obj.name 'Contacts.ContactClassTemplate') ## Replace with the real name of your template document, if there is one #set($results=$xwiki.searchDocuments($query, 10, 1)) #foreach ($docName in $results) #set($docItem = $xwiki.getDocument($docName)) #foreach($item in $docItem.getObjects(Contacts.ContactClass)) $docItem.display(firstname, $item) | $docItem.display(surname, $item) | $docItem.display(phone1, $item) br / #end #end This is different from the other suggested scripts because it does not assume that there is only one object in each document, but it iterates over each object of that type. -- Sergiu Dumitriu http://purl.org/net/sergiu/ ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Tjaart van Wijck wrote: a) A class definition is essentially a special type of wiki page that defines the class structure (i.e. properties). Yes, but here special means just that it contains a class definition, as otherwise nothing makes it special. Any document can host a class, just add property definitions to it. b) No more than 1 class definition can be contained in this special type of page. Yes. In the future this _might_ not be true, but there are no plans in that direction. c) Objects are instances of these classes and must be associate with a page. (Can a single object be associated with more than 1 page?) Yes. One object resides in only one page, so you cannot associate it with more than one page directly. You can, however, define another class with a DBList property listing the existing objects, and you can then attach that type of linking object to other pages. d) Multiple objects can be associated with a wiki page. Yes, from the same or different classes. e) An HQL query iterates through the wiki pages, through each object in each page and each property in each object Only if you write the query in this manner. Basically HQL is not something XWiki invented, it is the standard Hibernate Query Language, which is an object retrieval QL. So it behaves like any query language, with the SELECT, FROM and WHERE sub-clauses. But you are right, meaning that you can use in the FROM part documents, objects and properties, and you can link them using obj.name = doc.fullName and prop.id.id = obj.id. You can use more than one property/object/document in the query (I once got to write queries with something around 30 properties in the same query, which I later had to split into 2 queries as mysql has a limit on the number of JOINs you can have). d) An HQL query specifying page/document constraints returns a Java List of documents No, unless you use $xwiki.search(select doc from...). The standard $xwiki.searchDocuments returns a java list of document names. You then have to use $xwiki.getDocument($item) or $xwiki.wrapDocs($results) to get Document API objects (which are different from the internal XWikiDocument objects) e) An HQL query specifying object constraints returns a Java List of objects (does not seem to be the case from the above code?!) Yes, if you're using $xwiki.search(select obj from BaseObject obj...). Still, this is the internal com.xpn.xwiki.objects.BaseObject class, and not the API usually accessed from scripts, which is com.xpn.xwiki.api.Object. This is why your script does not _seem_ to work, as you're using API methods on the privileged object. f) An HQL query specifying property constraints returns a Java List of properties Yes, if you're using $xwiki.search(select prop from StringProperty prop...) (replace with other property type). -- Sergiu Dumitriu http://purl.org/net/sergiu/ ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
A brief update: http://dev.xwiki.org/xwiki/bin/view/Design/XWiki+Query+Language+Specification?language=en Greetings, Ricardo -- Ricardo Rodríguez Your EPEC Network ICT Team ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
[Ricardo Rodriguez] Your EPEC Network ICT Team wrote: A brief update: http://dev.xwiki.org/xwiki/bin/view/Design/XWiki+Query+Language+Specification?language=en Greetings, Ricardo Still another entry. Sorry, I forgot it in my previous message: http://www.xwiki.org/xwiki/bin/view/FAQ/HowdoIretrievepropertiesfroma Cheers, Ricardo -- Ricardo Rodríguez Your EPEC Network ICT Team ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi Tjaart, all, Tjaart van Wijck wrote: I have created the class Contacts.ContactClass. This class has three string properties firstname, surname and phone1. I have also created two instances of this class and filled out the attributes. Now, it should be straight forward to write a Velocity script to seach for all objects with the given class type of Contacts.ContactClass and write out the attributes but I'm having some trouble. Below is my script: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end However this does not work. All I get is: $item.get(firstname) | $item.get(surname) | $item.get(phone1) $item.get(firstname) | $item.get(surname) | $item.get(phone1) When I run: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item #end I get: Contacts.Tjaart 0 Contacts.ContactClass Contacts.Jane 0 Contacts.ContactClass I think we are missing some important point about how objects are retrieved. See this FAQ... http://tinyurl.com/6rgm8h I am not able yet to relate this with Guillaume proposal. He doesn't use .getProperty and I don't know why. And this thread in xwiki-devs... http://tinyurl.com/6j5a2m I will keep this post when I get a simple example. Your feedback will be really welcome! Cheers, Ricardo -- Ricardo Rodríguez Your EPEC Network ICT Team ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi Ricardo, I have created the class Contacts.ContactClass. This class has three string properties firstname, surname and phone1. I have also created two instances of this class and filled out the attributes. Now, it should be straight forward to write a Velocity script to seach for all objects with the given class type of Contacts.ContactClass and write out the attributes but I'm having some trouble. Below is my script: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end However this does not work. All I get is: $item.get(firstname) | $item.get(surname) | $item.get(phone1) $item.get(firstname) | $item.get(surname) | $item.get(phone1) When I run: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item #end I get: Contacts.Tjaart 0 Contacts.ContactClass Contacts.Jane 0 Contacts.ContactClass I think we are missing some important point about how objects are retrieved. See this FAQ... http://tinyurl.com/6rgm8h I am not able yet to relate this with Guillaume proposal. He doesn't use .getProperty and I don't know why. And this thread in xwiki-devs... http://tinyurl.com/6j5a2m Obviously I've been writing too fast thus proposing a mistaken solution :-) I'll check on stuff I've used before and try to get back with a _working_ suggestion ;-) Guillaume ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Guillaume Lerouge wrote: Obviously I've been writing too fast thus proposing a mistaken solution :-) I'll check on stuff I've used before and try to get back with a _working_ suggestion ;-) Guillaume Thanks! -- Ricardo Rodríguez Your EPEC Network ICT Team ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi, My problem is still unresolved. I have followed the suggestions from the FAQ post: http://www.xwiki.org/xwiki/bin/view/FAQ/HowToListDocumentsWithACertainPropertyValue And rewrote the code as follows: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach($item in $results) #set($doc=$xwiki.getDocument($item)) #set($obj=$doc.getObject('Cotacts.ContactClass')) #set($firstname=$obj.getProperty('firstname').value) #set($surname=$obj.getProperty('surname').value) #set($phone1=$obj.getProperty('phone1').value) $firstname | $surname | $phone1 br / #end With the result: $firstname | $surname | $phone1 $firstname | $surname | $phone1 I should add that I would have been confused if the above had worked. Please let me know if my understanding of the object model is correct: a) A class definition is essentially a special type of wiki page that defines the class structure (i.e. properties). b) No more than 1 class definition can be contained in this special type of page. c) Objects are instances of these classes and must be associate with a page. (Can a single object be associated with more than 1 page?) d) Multiple objects can be associated with a wiki page. e) An HQL query iterates through the wiki pages, through each object in each page and each property in each object d) An HQL query specifying page/document constraints returns a Java List of documents e) An HQL query specifying object constraints returns a Java List of objects (does not seem to be the case from the above code?!) f) An HQL query specifying property constraints returns a Java List of properties Regards, Tjaart On 15/04/2008, [Ricardo Rodriguez] Your EPEC Network ICT Team [EMAIL PROTECTED] wrote: Hi Tjaart, all, Tjaart van Wijck wrote: I have created the class Contacts.ContactClass. This class has three string properties firstname, surname and phone1. I have also created two instances of this class and filled out the attributes. Now, it should be straight forward to write a Velocity script to seach for all objects with the given class type of Contacts.ContactClass and write out the attributes but I'm having some trouble. Below is my script: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end However this does not work. All I get is: $item.get(firstname) | $item.get(surname) | $item.get(phone1) $item.get(firstname) | $item.get(surname) | $item.get(phone1) When I run: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item #end I get: Contacts.Tjaart 0 Contacts.ContactClass Contacts.Jane 0 Contacts.ContactClass I think we are missing some important point about how objects are retrieved. See this FAQ... http://tinyurl.com/6rgm8h I am not able yet to relate this with Guillaume proposal. He doesn't use .getProperty and I don't know why. And this thread in xwiki-devs... http://tinyurl.com/6j5a2m I will keep this post when I get a simple example. Your feedback will be really welcome! Cheers, Ricardo -- Ricardo Rodríguez Your EPEC Network ICT Team ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi Tjaart, Here we go at last : #set($query=select obj from BaseObject obj where obj.className='Contacts .ContactClass') #set($results=$xwiki.searchDocuments($query, 10, 1)) #foreach($item in $results) #set ($itemdoc = $xwiki.getDocument($item)) #set ($itemobject = $itemdoc.getObject('Contacts.ContactClass')) $itemdoc.display('firstname') | $itemdoc.display('lastname') | $itemdoc.display('phone1') br / #end Hopefully this will work... Guillaume ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi Guillaume, Thanks for the advise but it still doesn't work. I've implemented: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.searchDocuments($query, 10, 1)) #foreach($item in $results) #set ($itemdoc = $xwiki.getDocument($item)) #set ($itemobject = $itemdoc.getObject('Contacts.ContactClass')) $itemobject.display('firstname') | $itemobject.display('lastname') | $itemobject.display('phone1') br / #end But get the error: Error number 4001 in 4: Error while parsing velocity page Contacts.Contacts Directory Wrapped Exception: Invocation of method 'searchDocuments' in class com.xpn.xwiki.api.XWiki threw exception com.xpn.xwiki.XWikiException: Error number 3223 in 3: Exception while searching documents with SQL web, doc.name from XWiki Document as doc where select obj from Base Object obj where obj.class Name='Contacts.Contact Class'? Wrapped Exception: unexpected token: select near line 1, column 85 web, doc.name from com.xpn.xwiki.doc.XWiki Document as doc where select obj from com.xpn.xwiki.objects.Base Object obj where obj.class Name='Contacts.Contact Class'? @ Contacts.Contacts Directory2,22 I also tried this with $itemdoc.display(...) as you suggested but that is not the source of the problem. Am I right in suspecting that HQL queries like select doc from XWikiDocument... will return a resultset of XWikiDocuments but a HQL query like select obj from BaseObject... will return a resultset of BaseObjects. I think the cause of the exception might be that seachDocuments should requires a doc resultset as parameter. Any ideas? Thanks. On 15/04/2008, Guillaume Lerouge [EMAIL PROTECTED] wrote: Hi Tjaart, Here we go at last : #set($query=select obj from BaseObject obj where obj.className='Contacts .ContactClass') #set($results=$xwiki.searchDocuments($query, 10, 1)) #foreach($item in $results) #set ($itemdoc = $xwiki.getDocument($item)) #set ($itemobject = $itemdoc.getObject('Contacts.ContactClass')) $itemdoc.display('firstname') | $itemdoc.display('lastname') | $itemdoc.display('phone1') br / #end Hopefully this will work... Guillaume ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Guillaume, That worked! Thanks a lot for the help. Yet, I still don't understand why the HQL string below does not yield the correct results: $query = select obj from BaseObject obj where obj.className='Contacts.ContactClass' Can someone explain how XWiki traverses documents and objects to generate the resultset when executing HQL statements? Thanks. On 15/04/2008, Guillaume Lerouge [EMAIL PROTECTED] wrote: Hi Tjaart, Unfortunately removing the select part does not help and I get the same error. It is hard to believe that few people have managed to construct a query for all object of the same class. I though this would be straight forward. I want to retrieve a list of object from a specified class and then print all their attributes. Most people simply copy/paste the standard query and it works fine for them ;-) #set ($query = , BaseObject as obj where obj.name=doc.fullName and obj.className='Contacts.ContactClass' and obj.name'Contacts.ContactClassTemplate' order by doc.date desc) #set($results=$xwiki.searchDocuments($query, 10, 1)) #foreach($item in $results) #set ($itemdoc = $xwiki.getDocument($item)) #set ($itemobject = $itemdoc.getObject('Contacts.ContactClass')) $itemdoc.display('firstname') | $itemdoc.display('lastname') | $itemdoc.display('phone1') br / #end Guillaume ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
[xwiki-users] Trouble with velocity script to list Object properties
I have created the class Contacts.ContactClass. This class has three string properties firstname, surname and phone1. I have also created two instances of this class and filled out the attributes. Now, it should be straight forward to write a Velocity script to seach for all objects with the given class type of Contacts.ContactClass and write out the attributes but I'm having some trouble. Below is my script: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end However this does not work. All I get is: $item.get(firstname) | $item.get(surname) | $item.get(phone1) $item.get(firstname) | $item.get(surname) | $item.get(phone1) When I run: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item #end I get: Contacts.Tjaart 0 Contacts.ContactClass Contacts.Jane 0 Contacts.ContactClass Which is incorrect. Please help, I've been struggling for quite a while and getting really frustrated. Thanks. ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users
Re: [xwiki-users] Trouble with velocity script to list Object properties
Hi Tjaart, I have created the class Contacts.ContactClass. This class has three string properties firstname, surname and phone1. I have also created two instances of this class and filled out the attributes. Now, it should be straight forward to write a Velocity script to seach for all objects with the given class type of Contacts.ContactClass and write out the attributes but I'm having some trouble. Below is my script: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item.get(firstname) | $item.get(surname) | $item.get(phone1) br / #end However this does not work. All I get is: $item.get(firstname) | $item.get(surname) | $item.get(phone1) $item.get(firstname) | $item.get(surname) | $item.get(phone1) When I run: #set($query=select obj from BaseObject obj where obj.className='Contacts.ContactClass') #set($results=$xwiki.search($query, 10, 1)) #foreach ($item in $results) $item #end I get: Contacts.Tjaart 0 Contacts.ContactClass Contacts.Jane 0 Contacts.ContactClass Have you tried with : #foreach($item in $results) $item.getObject('Contacts.ContactClass') $item.display('firstname') | $item.display('lastname') | $item.display('phone1') br / #end or #foreach($item in $results) $item.getObject('Contacts.ContactClass') $item.firstname | $item.lastname | $item.phone1 br / #end ? Hope this helps, Guillaume ___ users mailing list users@xwiki.org http://lists.xwiki.org/mailman/listinfo/users