[Dev] Blocks and Queries
Ted Leung
twl at osafoundation.org
Wed Mar 3 17:27:09 PST 2004
This note is a summary of a phone call that John and I had about
queries and blocks. John, please let me know that I captured
everything correctly. Everyone else can pile on as needed/interested.
John has an implementation of the way that blocks would like to use
queries. This implementation can be found in
osaf/chandler/Chandler/parcels/OSAF/framework/blocks/parcel.xml
osaf/chandler/Chandler/parcels/OSAF/framework/blocks/Query.py
In the application, blocks have queries associated with them. The
blocks know which queries they are using, and have access to the result
set of the queries. All interaction with the repository is via these
queries, which are stored as items in the repository. A block will
rely on notification/observable queries to load/update repository data
for display. There shouldn't be any code in a block that explicitly
runs a query. It was good for me to get a deeper understanding of how
the application is going to use/rely on queries.
The key services that the application needs from queries/the repository
are:
1. The application needs indexable (random access with good
performance) cached query results.
The UI needs to be able to scroll to various points in the query
result, or jump from one portion to another. The current
implementation of reference collections provides a list style API, and
is implemented as a doubly linked list. This data structure is not
suited for random access. There is a dict style of reference
collection, but Andi has stated that this is deprecated, although dict
based code appears to run at the moment.
2. The application needs needs good hints about the size of query
results.
In order to do a good job in the UI, the application needs to know the
size of the query result. The size information is a hint, and may be
updated in the case of incremental query evaluation or a query running
in a thread. A scenario like the following is acceptable:
Add 50 items to the result set, update the result size hint, notify the
application that the result set has changed (so it can redraw)
Add another 50 items to the result set, update the result size hint,
notify the application that the result set has changed (so it can
redraw)
And so on.
3. Delayed loading of items is important -- this is important for a
responsive UI.
We are probably moving the direction of running all queries (and other
repository operations) in a thread(s).
This likely has profound implications for our current threading model,
since threads do not share views of the repository. In order for two
thread to share, they will have to commit items. Forcing threads to
commit is a problem because the undo model of the application is based
on commit.
4. Notification/Observable queries
This was probably the area which was most surprising (although not
necessarily in a bad way). Up until this conversation, I was under the
impression that notification was a "nice to have" feature. After the
call, I realize that this is not the case, as notification is a key
part of the Query/Block API. I need to sit down and do a little more
thinking and updating of the design based on this. I probably also
need to look more deeply at notification stuff in general.
John pointed out two issues:
a. Persistent notification registrations.
If blocks are going to use notification as a way of updating their
content, then notification registrations will probably need to be
persistent, which is not how they are now. Speaking from ignorance, I
think that this should be relatively easy to do as a layer over the
current notification architecture.
b. Efficient notification
John was concerned the we not notify queries unless absolutely
necessary. He gave the example that only blocks which are being
displayed need to be notified when they query result changes. There is
probably a little more to this than meets the eye, otherwise updates
will get lost and queries may need to get re-run. In any case, it's
clear that someone needs to think about this some more (at least more
than I have).
5. Where is the line between Queries and the Application?
This is a little bit hard to define right now. We probably want the
queries used by a block to be a behavioral subclass of the QueryItem
that we end up with from the repository. This is more a question of
layering, and probably doesn't need to be answered at the moment.
Since John has an API that is in use, we can plan for how to change
that API (or migrate off of that should it be necessary -- although I
can't think of any reason that it would be).
----
Ted Leung Open Source Applications Foundation (OSAF)
PGP Fingerprint: 1003 7870 251F FA71 A59A CEE3 BEBA 2B87 F5FC 4B42
More information about the Dev
mailing list