On Jan 23, 2010, at 12:08 PM, Sergiu Dumitriu wrote:

> On 01/23/2010 09:01 AM, Vincent Massol wrote:
>> 
>> On Jan 23, 2010, at 1:10 AM, Sergiu Dumitriu wrote:
>> 
>>> On 01/22/2010 07:38 PM, cjdelisle (SVN) wrote:
>>>> Author: cjdelisle
>>>> Date: 2010-01-22 19:38:30 +0100 (Fri, 22 Jan 2010)
>>>> New Revision: 26312
>>>> 
>>>> Modified:
>>>>    
>>>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java
>>>> Log:
>>>> XWIKI-4754 parameterize query in getTranslationList
>>>> 
>>>> Modified: 
>>>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java
>>>> ===================================================================
>>>> --- 
>>>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java
>>>>       2010-01-22 17:49:40 UTC (rev 26311)
>>>> +++ 
>>>> platform/core/trunk/xwiki-core/src/main/java/com/xpn/xwiki/store/XWikiHibernateStore.java
>>>>       2010-01-22 18:38:30 UTC (rev 26312)
>>>> @@ -3024,11 +3024,12 @@
>>>> 
>>>>      public List<String>   getTranslationList(XWikiDocument doc, 
>>>> XWikiContext context) throws XWikiException
>>>>      {
>>>> -        String hql =
>>>> -            "select doc.language from XWikiDocument as doc where 
>>>> doc.space = '" + Utils.SQLFilter(doc.getSpace())
>>>> -                + "' and doc.name = '" + Utils.SQLFilter(doc.getName())
>>>> -                + "' and (doc.language<>   '' or (doc.language is not 
>>>> null and '' is null))";
>>>> -        List<String>   list = context.getWiki().search(hql, context);
>>>> +        String hql = "select doc.language from XWikiDocument as doc where 
>>>> doc.space = ? and doc.name = ? "
>>>> +                        + "and (doc.language<>   '' or (doc.language is 
>>>> not null and '' is null))";
>>> 
>>> doc.space and doc.name are explicitly used for historical reasons (in
>>> the beginning doc.fullName was not stored in the database). For better
>>> performance we could just use doc.fullName = ?.
>> 
>> Sergiu can you explain why we store fullName in the DB since there's already 
>> page and space. It's duplicated info which increases the risk of sync issues 
>> between the the columns. In addition I don't really see any difference in 
>> retrieving one field or 2 fields (in term of string size the full name is 
>> actually longer than the 2 fields separately so more time for comparison and 
>> serialization).
> 
> I'm not sure who and why introduced it, but IMO it's normal. Previously 
> all the code that wanted to search using a document name had to either:
> - manually split the fullname into space and name, with indexOf and 
> substring
> - or use XWiki.getFullNameSQL(), which does a concat
> 
> The first one is boring to copy/paste all over the place, while the 
> second one hurts the performance.

Using the full name is bad because it means a lot of parsing/serialization, 
that's why we introduced entity reference. Previously all document names were 
manipulated as fullname string so that's maybe why it was introduced.

> I don't know if you're right about the performance of two fields versus 
> one longer, I believe the contrary is true. Databases don't work on 
> string comparison (when the proper indexes are in place), a search on 
> one index should be close to linear time, while joining two indexes 
> still requires a join, a costly operation.

Yes with indexes you're right but you can also have an index spanning several 
columns (composite index).

All that said it's going to be hard to remove the fullname in the DB since it's 
used directly in user's HQL queries. Unless there's a way to intercept these 
queries easily after they are parsed by Hibernate and do some internal mapping.

-Vincent

>> Caleb, note that if you wanted to be compliant with references (and not used 
>> the deprecated doc.getFullName()) you'd need to use:
>> this.localEntityReferenceSerializer.serialize(doc.getDocumentReference())
> 
> Ah, yes, we'll all have to get used to the new APIs.
> 
>> For space only it's:
>> doc.getDocumentReference().getLastSpaceReference().getName()
>> 
>> For page it's:
>> doc.getDocumentReference().getName()
>> 
>> Thanks
>> -Vincent
>> 
>>>> +        ArrayList<String>   params = new ArrayList<String>();
>>>> +        params.add(doc.getSpace());
>>>> +        params.add(doc.getName());
>>>> +        List<String>   list = search(hql, 0, 0, params, context);
>>>>          return (list == null) ? new ArrayList<String>() : list;
>>>>      }
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to