[EMAIL PROTECTED] wrote:
'The mapview must be empty the first time this hash view is used,
so that Metakit can fill it based on whatever rows are already
present in the underlying view.'
This seems to imply that you can't "impose" a hash view on an
existing view. But I seem to be able to do this. That is, in an
existing storage I get an existing view (either via .view()
or .getas()) and then create a hash view on it. This does work,
doesn't it?
Yes. There are two views involved: the data, and a hash index. The
data can contain anything. The index must *either* be empty *or* up
to date when setting up a hash layer on top using data.hash(index).
Note that either view can be blocked, and either view can be
persistent. It's all orthogonal.
Also, use of the hash view isn't "permanent" -- in the sense that
the underlying view retains its own integrity (so long as you don't
try to access it directly while the hash view is "in effect")?
That is, it *seems* to work nicely to create a view, define a hash
view on it, populate the view, drop the hash view, and then commit
() so that only the underlying view goes into the storage. This
behavior also seems to imply that you should be able to lay a hash
view on top of an existing view, access and update via the hash
view, then drop it and commit only the underlying view. Have I
missed anything here?
Correct. No need to explicitly "drop" anything. If the data view is
part of a storage, it gets committed. If the index view is part of a
storage, it gets committed - if not, then presumably you'll create a
new empty index view before calling hash() the next time around.
One final question: Is there a way to create a hash view to hash
on a particular property? I seem to frequently want, say, a two-
column table where I can create one hash view based on the first
column and another based on the second.
This is a design limitation that never got resolved properly. You
*might* be able to do the following:
a = db.getas(a[X,Y,Z])
a1 = a.project(a.Y,a.X,a.Z)
a2 = a1.hash(metakit.view(),1)
a3 = a2.project(a.X,a.Y,a.Z)
a = a3.hash(metakit.view(),1)
I am not sure the above is correct, nor have I ever checked whether
the above actually does offer hash O(1) search performance on both X
and Y. Might be worth fiddling a bit with this. If it doesn't work,
you could set up a second hash mapping Y to the row number in "a",
but that is obviously a bit more manual work, and perhaps not that
much more convenient than setting up a Python dict to handle
secondary hashes.
As I said, such multi-index issues (and hashes on other columns than
the first N) haven't been properly extended into today's MK, alas.
-jcw
_____________________________________________
Metakit mailing list - Metakit@equi4.com
http://www.equi4.com/mailman/listinfo/metakit