[elephant-devel] Quick sketch of type evolution system
Leslie P. Polzer
leslie.polzer at gmx.net
Thu Dec 27 11:06:58 UTC 2007
Hello everyone,
to clarify one of the points that are important to me,
I have prepared this working sketch:
(defmethod slot-value-using-class ((class persistent-metaclass) (instance
persistent-object) (slot-def persistent-slot-definition))
"Get the slot value from the database."
(let* ((name (slot-definition-name slot-def))
(value (persistent-slot-reader (get-con instance) instance name))
(data-type (type-of value)) ; type of data in store
(slot-type (sb-mop::slot-definition-type slot-def))) ; type declared in defclass
(format t "slot-value-using-class for slot ~A (declared type '~A');
value '~A', type '~A'~%"
name slot-type value data-type)
(if (typep data-type slot-type)
value
#| here we would call the user-provided change-class for the
old and new types |# )))
Notes:
* it's obviously implementation dependent as of yet, but this
is trivial.
* we should provide a way for the user to specify that this type
checking shouldn't take place, for performance reasons. This is
simple, too.
* as you can see, I don't care much about evolution at the class level
(class renamed, substituted, ...) right now, but at the slot level.
* I don't see any other way than slot-value-using-class to catch
type changes. They can occur at every place in time between
slot reads.
* the replacement of slots (one slot discarded, new slot added -- how
do we connect this?) could be done by a ":replaces" slot initarg.
But this collides with multiple subsequent replacements, so I think
the most sensible way would be a new class option named "version"
of type integer.
This would facilitate a user-level schema evolution protocol as
outlined in the recent discussion:
(defmethod elephant:class-evolve ((class myclass)
(version (eql 1)) (version (eql 2)))
[obviously would implement transition 1->2 for class "foo"]
And Ian, thanks for your concise, patient and quick answers.
I thought one could never get *all* three of those :)
Leslie
--
My personal blog: http://blog.viridian-project.de/
More information about the elephant-devel
mailing list