On Jun 17, 2008, at 3:23 PM, LukasGiessmann wrote:

hello,

just in case you're wondering why i'm coming up with questions concerning marc's topic "associations in the elephant system", i'm trying to assist him with this topic, so there might be several questions coming up in the
next time - hope you don't mind.
to get straight to the point:

1)
i tried to work with the last person/job example and the new association
slots, so i made the following example:

I apologize for not documenting or providing better examples for the final association design. Hopefully this will help in the meantime.

---
(defpclass job()
 ((title :initarg :title :accessor title-of :index t)
  (company :initarg :company :accessor company-of :index t)))


(defpclass job()
 ((title :initarg :title :accessor title-of :index t)
  (company :initarg :company :accessor company-of :index t)
  (people :accessor job-holders :associate (person job))))

Associations are restricted to mappings between classes. Here we indicate that a virtual slot people (accessor is job-holders) is associated with all objects of class 'person that contain this instances in slot 'job.

(defpclass person()
 ((name :initarg :name :accessor name-of :index t)
  (job :initarg :job :accessor job-of :associate t)))

(defpclass person()
 ((name :initarg :name :accessor name-of :index t)
  (job :initarg :job :accessor job-of :associate job)))

Providing :associate job tells the person class that the slot 'job contains instances of type job and to maintain an association to job instances (each person has 1 job, each job may have many people).

The initarg for job here requires a patch that I'll submit shortly.


(defvar *max-persons* 500)
(defvar *max-jobs* 100)

(defun make-instances ()
 (with-transaction ()
   (dotimes (i *max-jobs*)
     (let ((current-job (make-instance 'job :title (string (gensym))
:company (string (gensym)))))
        (dotimes (j (/ *max-persons* *max-jobs*))
(make-instance 'person :name (string (gensym)) :job current- job))))))
---

after the call of make-instances there are 100 jobs and for every job
there exist 5 persons.
but i have still the following problem:
how can i get all persons which associate a certain job by using the
instance of the job which should be associated by the persons.
i thought on something like:

---
(defvar *obj* (first (get-instances-by-class 'job)))
(get-instance-by-value 'person 'job *obj*)
---

(job-holders *obj*) => < list of five people >

(setf (job-holders *obj*) (sixth (get-instances-by-class 'person)))
(job-holders *obj*) => < list of six people >

I made two small enhancements while exploring this example which I will checkin shortly:

1) Can treat a slot associated with another class as an indexed slot:
   (get-instances-by-value 'person 'job *obj*)

2) Now allows :initargs to set the slot value for association slots that
   contain a single object.  (I may allow this for other types later)


2)
what is the better way for using association slots in your opinion,
the one of the example above or a special class which contains only
associations of jobs and persons?


---
(defpclass p-j-assoc()
 ((job :initarg :job :accessor job-of :associate t)
  (person :initarg :person :accessor person-of :associate t)))
---

3)
how do i work with many-to-many association slots, since it is not
possible for me to assign a value to the slot.

This is what associations are an effective shorthand for; so you don't have to create an explicit object.

(defpclass job()
 ((title :initarg :title :accessor title-of :index t)
  (company :initarg :company :accessor company-of :index t)
(people :accessor job-holders :associate (person job) :many-to-many t)))

(defpclass person()
 ((name :initarg :name :accessor name-of :index t)
  (jobs :accessor jobs-of :associate (job people) :many-to-many t))

This defines a many-to-many relationship between job and person. Unfortunately currently initargs don't work here. You can add elements by (setf (jobs-of joe) janitor) and get access to all associated elements via (job-holders janitor) => joe.

I need to add insert/delete operations (there are stubs in association.lisp) so you can work with the association more directly. I also fixed a bug or two as well. I'll let you know when I've checked in the fixes. Thanks for prompting the exercise!


thank you in advance.


best regards

lukas

_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel

_______________________________________________
elephant-devel site list
elephant-devel@common-lisp.net
http://common-lisp.net/mailman/listinfo/elephant-devel

Reply via email to