[Nepomuk] Re: SimpleResource rcgen redesign draft

Sebastian Trüg trueg at kde.org
Tue Jul 26 20:54:06 CEST 2011


On 07/26/2011 04:46 PM, Christian Mollekopf wrote:
> On Tue, 26 Jul 2011 13:37:12 +0200, Sebastian Trüg <trueg at kde.org> wrote:
> 
>> On 07/26/2011 10:06 AM, Christian Mollekopf wrote:
>>> On Tue, 26 Jul 2011 09:52:20 +0200, Sebastian Trüg <trueg at kde.org>  
>>> wrote:
>>>
>>>> On 07/25/2011 11:17 PM, Christian Mollekopf wrote:
>>>>> On Mon, 25 Jul 2011 23:09:26 +0200, Christian Mollekopf
>>>>> <chrigi_1 at fastmail.fm> wrote:
>>>>>
>>>>>> Another thing I just noticed:
>>>>>> The constructor should already set the type,
>>>>>> in case no properties are set.
>>>>>
>>>>> Hmm... I guess it was done this way to avoid setting the myriad of  
>>>>> types
>>>>> in the hierarchy.
>>>>
>>>> exactly.
>>>>
>>>>> Maybe add an explicit setType function instead, or add it to the
>>>>> resource() function,
>>>>> if you go for the copy version.
>>>>
>>>> Hm, is it really necessary to have a type if nothing else is set? Why
>>>> does one need the resource then anyway?
>>>>
>>>
>>> Because i.e. in the feeder I add only properties which don't actually
>>> belong to the most specific type.
>>> (Things like the label, NCAL:location for incidences, etc)
>>>
>>> Still all created items must have the right type, i.e. for queries with
>>> fulltext search.
>>> And btw. think of the AkonadiDataObject type, where we don't even have a
>>> property to add for collections.
>>
>> I suppose I could add a protected constructor to all classes which would
>> be used by child classes. This constructor would take a type URI as
>> input. That way only the top-level type would be set.
> 
> Yep, that sound like a good idea.

Ok, then, for documentation purposes and so I won't forget let me draft
one generated class:

namespace Nepomuk {
namespace NCO {
class PersonContact : public Contact
public:
PersonContact()
 : Contact(TYPE) {
}
PersonContact(const SimpleResource& r)
 : Contact(r, TYPE) {
}

protected:
PersonContact(const QUrl& type)
 : Contact(type) {
}
}
}

> Cheers
>>
>> Cheers,
>> Sebastian
>>
>>> Cheers
>>>
>>>>>>
>>>>>> On Mon, 25 Jul 2011 21:20:45 +0200, Sebastian Trüg <trueg at kde.org>
>>>>>> wrote:
>>>>>>
>>>>>>> On 07/25/2011 07:52 PM, Christian Mollekopf wrote:
>>>>>>>> On Mon, 25 Jul 2011 18:30:05 +0200, Sebastian Trüg <trueg at kde.org>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Now that the SimpleResource rcgen is in git master[1] some people
>>>>>>>>> used
>>>>>>>>> it (mostly for Akonadi feeders and the web extractor framework)  
>>>>>>>>> and
>>>>>>>>> found it to be a bit strange.
>>>>>>>>>
>>>>>>>>> This is true. Current usage is as follows:
>>>>>>>>>
>>>>>>>>> SimpleResource r;
>>>>>>>>> NCO::PersonContact(&r).setFullname("foobar");
>>>>>>>>>
>>>>>>>>> The reason for this is simple: due to multi-inheritance problems I
>>>>>>>>> cannot derive the generated classes from SimpleResource. Thus, we
>>>>>>>>> need
>>>>>>>>> wrappers.
>>>>>>>>>
>>>>>>>>> Now some ideas were floating around and I would like to settle on
>>>>>>>>> one
>>>>>>>>> better solution.
>>>>>>>>>
>>>>>>>>> One idea would be to have a hybrid thing where you could do this:
>>>>>>>>>
>>>>>>>>>   NCO::PersonContact pc;
>>>>>>>>>   pc.setFullname("foobar");
>>>>>>>>>   SimpleResource r = rc.resource();
>>>>>>>>>
>>>>>>>>> and this:
>>>>>>>>>
>>>>>>>>>   SimpleResource r;
>>>>>>>>>   NCO::PersonContact pc(r);
>>>>>>>>>   pc.setFullname("foobar");
>>>>>>>>>   r = pc.resource();
>>>>>>>>>
>>>>>>>>> (The last line would be required since all SimpleResources would  
>>>>>>>>> be
>>>>>>>>> copies.)
>>>>>>>>
>>>>>>>> Why can't you just take the reference to r, and the last copy
>>>>>>>> wouldn't
>>>>>>>> be
>>>>>>>> needed?
>>>>>>>> Of course the accessor is still needed for the NCO::PersonContact  
>>>>>>>> pc;
>>>>>>>> usecase.
>>>>>>>
>>>>>>> I cannot use refs for security reasons. Imagine someone returns a
>>>>>>> generated class from a method after putting in a ref to a local
>>>>>>> SimpleRes. Anyway, SimpleRes is implicitly shared.
>>>>>>>
>>>>>>>>>
>>>>>>>>> We could go on like so:
>>>>>>>>>
>>>>>>>>>   r.addProperty(...);
>>>>>>>>>   pc = r;
>>>>>>>>>   pc.setResource(r);
>>>>>>>>>
>>>>>>>>> The only disadvantage I see here might be a slight performance
>>>>>>>>> overhead
>>>>>>>>> due to the copying of the resources.
>>>>>>>>>
>>>>>>>>> Opinions?
>>>>>>>>
>>>>>>>> Additionally it might be nice to have an accessor to the uri of the
>>>>>>>> SimpleResource directly in the wrapper,
>>>>>>>> and the << operator for the graph.
>>>>>>>>
>>>>>>>> So we would go from this:
>>>>>>>>
>>>>>>>>    Nepomuk::SimpleResource iconRes;
>>>>>>>>    Nepomuk::NAO::FreeDesktopIcon icon(&iconRes);
>>>>>>>>    icon.setIconNames( QStringList() << iconName );
>>>>>>>>    graph << iconRes;
>>>>>>>>    res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(),
>>>>>>>> iconRes.uri() );
>>>>>>>>
>>>>>>>> to this:
>>>>>>>>
>>>>>>>>    Nepomuk::NAO::FreeDesktopIcon icon;
>>>>>>>>    icon.setIconNames( QStringList() << iconName );
>>>>>>>>    graph << icon;
>>>>>>>>    res.setProperty( Soprano::Vocabulary::NAO::prefSymbol(),
>>>>>>>> icon.uri()
>>>>>>>> );
>>>>>>>
>>>>>>> nice.
>>>>>>>
>>>>>>> Cheers
>>>>>>> Sebastian
>>>>>>>
>>>>>>>> Cheers,
>>>>>>>>
>>>>>>>> Christian
>>>>>>>>
>>>>>>>>>
>>>>>>>>> Cheers,
>>>>>>>>> Sebastian
>>>>>>>>>
>>>>>>>>> [1]
>>>>>>>>> http://quickgit.kde.org/?p=kde-runtime.git&a=blob&h=304db56a9aff5523a5672415550c49d4b7269c3c&hb=344806a2e378f3421399cad39a63f14a4428308b&f=nepomuk/services/storage/lib/nepomuk-simpleresource-rcgen.py
>>>>>>>>> _____________________________________________
> _______________________________________________
> Nepomuk mailing list
> Nepomuk at kde.org
> https://mail.kde.org/mailman/listinfo/nepomuk


More information about the Nepomuk mailing list