on models, QML and Nepomuk

Marco Martin notmart at gmail.com
Fri Nov 16 14:41:35 UTC 2012


Hi all,

I am doing a big refactor for the metadata models in plasma active, used to do 
nepomuk queries.

this made me think about some things:
* we all agree we want to use nepomuk more
* we also want to use more qml to write user interfaces
* to display nepomuk data in qml, basically means: to have a model that shows 
results from a query
* i would really like to avoid both exposing sparql to qml and doing some 
weird javascript binding of the nepomuk query api, this is really stuff that 
who writes QML should *not* see

now, both writing qabstractitemmodels and nepomuk query and result display are 
two things that besides requiring quite some boilerplate are quite easy to 
screw up.

We already had a model, but since its query generation capabilities were quite 
basic, i already seen it forked somewhere else, duplicating all the bugs it 
had (hello mediacenter :p)

in the end what a model do, is basically map from the list of 
Nepomuk2::Query::Result that arrived to rows of the model, and format the data 
in a particular way depending from the role asked.

right now the MetadataModel, in the branch mart/newMetadataModel of plasma-
mobile is done this way:

The model manages the query in a thread, splitting it in chunks (with limit) 
to be able to have lazy loading

Everything specific is delegated to another class, QueryProviders, which base 
api is inplasma-
mobile/components/metadatamodel/queryproviders/abstractqueryprovider.h
it does the following things:

* it sets a query, either Nepomuk2::Query::Query or sparql

* it sets the mapping between role  indexes and role names

* given a Query::Result and a role it formats it to the data to display


this class is abstract, doesn't do anything, but is intended to be in a public 
library, to be subclassed, so in qml one can do, after registering from the 
c++ part the MyQueryProvider implementation:

MetadataModel {
	queryProvider: MyQueryProvider {
  		//setting of custom properties that control the query
        }
        delegate: ...
}

it provides some default subclasses that have the functionality of the old 
multiple models in plasma active,
simple query for resources (ie i want all resources that are images linked to 
a certain activity, with a certain mimetype)
tagcloud type of model (either cloud of tags or any other property like file 
types, basically a simple group by, very useful for visualizations
timeline: how many resources satisfy a criteria separed by year, month or day

right now the work in that branch is around at 90% complete i think, still 
some things to decide like wether export in the library all the current 
queryprovider subclasses or how to nicely map to qml things like resource 
types (now there are some heuristics that go from/to things like nfo:Audio and 
the full uri)


i would really love to have this in a place public for everyone, to be clear 
that for 99% of the needs of nepomuk in qml, use that. There still can be use 
cases for different reimplemented bindings, but if is just a simple listing of 
stuff, no need to duplicate bugs ;)

It may be nepomuk-core? (since it has a library, so unsuited for kde-runtime)

anyways, as general concept.. opinions/comments?

Cheers,
Marco Martin


More information about the Active mailing list