[elephant-devel] associations between instances of the same class

Christoph Ludwig ludwig at fh-worms.de
Wed Jul 23 16:49:19 UTC 2008


Hi,

the attached patch solves the problem with the "forgotten" associations. The
main reason for the problem was that the slot index was incorrectly named in
the controller-index-table of the store controller.

Is this patch format ok? We are admittedly all but darcs experts.

Regards

Lukas, Marc & Christoph


On Tue, Jul 22, 2008 at 08:17:21AM -0400, Ian Eslick wrote:
> Sorry everyone, I'm not going to be able to get to this until at least  
> Friday and probably not until next week.
>
> The association mechanism isn't that big and is mostly built on top of  
> the core elephant other than some metaclass support.  If someone wants  
> to look into it - the associations.lisp file and the metaclass.lisp  
> files have all you'd need to figure out what is going on.  Associations 
> simply create and manage indices.  The only magic is intercepting slot 
> reads/writes and updating the indices appropriately.  I don't doubt that 
> there is likely to be corner cases the code doesn't yet handle.  A second 
> (or third or fourth) pair of eyes is likely to be very helpful here.
>
> Ian
>
> On Jul 22, 2008, at 6:00 AM, LukasGiessmann wrote:
>
>> hi,
>>
>> i also tried to make a simple example of this situation and after a  
>> while
>> i noticed the following behavior of the class A:
>>
>> ---
>> (defpclass A()
>>  ((id :initarg :id :accessor id-of :index t)
>>   (points-to :accessor points-to :associate (A pointed-by) :many-to- 
>> many t)
>>   (pointed-by :accessor pointed-by :associate (A points-to) :many-to- 
>> many
>> t)))
>> ---
>>
>> the association index of the slots points-to and pointed-by is the  
>> same.
>> so i redefined the class:
>>
>> ---
>> (defpclass A()
>>  ((id :initarg :id :accessor id-of :index t)
>>   (points-to :accessor points-to :associate (A points-to) :many-to- 
>> many t)
>>   (pointed-by :accessor pointed-by :associate (AnotherClass points-to)
>> :many-to-many t)))
>> ---
>>
>> afterwards i made 2 instances of the new definition and checked the
>> indices and they were not equal.
>>
>> finally i defined the original class A and made the directed  
>> associations,
>> it worked.
>>
>> there's also the original file attached, with the exact program  
>> sequence.
>>
>>
>> regards
>>
>> lukas
>>
>>
>>
>>> Hi,
>>>
>>> we came across a (to us) surprising behavior of the association code 
>>> in
>>> elephant-unstable: If we generate associations between instances of  
>>> the
>>> same
>>> class, then elephant forces these associations to be symmetric. That 
>>> means
>>> we
>>> cannot use association slots to implement directed graphs.
>>>
>>> For example, the attached program is supposed to set up a "diamond"; 
>>> We'd
>>> therefore expect the following output:
>>>
>>>  Node A:
>>>    successors:   (B C)
>>>    predecessors: ()
>>>  Node B:
>>>    successors:   (D)
>>>    predecessors: (A)
>>>  Node C:
>>>    successors:   (D)
>>>    predecessors: (A)
>>>  Node D:
>>>    successors:   ()
>>>    predecessors: (B C)
>>>
>>> However, elephant makes both the successor and the predecessor slot  
>>> hold
>>> always the same references:
>>>
>>>  Node A:
>>>    successors:   (B C)
>>>    predecessors: (B C)
>>>  Node B:
>>>    successors:   (A D)
>>>    predecessors: (A D)
>>>  Node C:
>>>    successors:   (A D)
>>>    predecessors: (A D)
>>>  Node D:
>>>    successors:   (B C)
>>>    predecessors: (B C)
>>>
>>> Is this by design or is this a bug? Or did we simply use the  
>>> association
>>> API
>>> incorrectly?
>>>
>>> Regards
>>>
>>> Christoph
>>>
>> <directed_graph_works 
>> .lisp>_______________________________________________
>> elephant-devel site list
>> elephant-devel at common-lisp.net
>> http://common-lisp.net/mailman/listinfo/elephant-devel
>
> _______________________________________________
> elephant-devel site list
> elephant-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/elephant-devel
>

-- 
FH Worms - University of Applied Sciences
Fachbereich Informatik / Telekommunikation
Erenburgerstr. 19, 67549 Worms, Germany
-------------- next part --------------
diff -rN -u old-elephant/src/elephant/associations.lisp new-elephant/src/elephant/associations.lisp
--- old-elephant/src/elephant/associations.lisp	2008-07-23 18:44:10.000000000 +0200
+++ new-elephant/src/elephant/associations.lisp	2008-07-23 18:44:10.000000000 +0200
@@ -128,7 +128,7 @@
     (aif (get-controller-association-index slot-def sc)
 	 (progn (add-association-slot-index it slot-def sc) it)
 	 (let ((new-idx (make-dup-btree sc)))
-	   (add-slot-index sc new-idx (foreign-classname slot-def) (foreign-slotname slot-def))
+	   (add-slot-index sc new-idx (association-slot-base slot-def) (slot-definition-name slot-def))
 	   (add-association-slot-index new-idx slot-def sc)
 	   new-idx))))
 



More information about the elephant-devel mailing list