[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kahua-dev:00660] Re: オブジェクトデータベース



久住です.

On 2004/05/13, at 13:40, 久住憲嗣 wrote:
2. 親:<kahua-persistent-base> -> 子:<hoge> -> 孫1:<fuge>
                                            -> 孫2: <fuge2>
のような関係のクラスを定義して, 孫の<fuge>/<fuge2>のインスタンスを
それぞれいくつかmakeしておいたときに, <fuge>/<fuge2>のすべての
インスタンスの集合を取得する方法はあるのでしょうか.
(make-kahua-collection <hoge>)では, <hoge>の直接のインスタンスの
集合のみ取得できるようです.

あ、この機能はつけようと思ってまだつけてなかった。
make-kahua-collectionにキーワード引数で何か指定したら
サブクラスも検索するようにするつもりでした。
うーん、ちょっといじればできそうだなあ。

あー, 気力がありましたらやってみます.

作ってみました. 今現在(memory上で?)定義されているクラスの継承関係を
もとにcollectionを作成します. 継承関係が変更されると矛盾することが
あるのかもしれません (が, よく考えてません….)


diff -c -r Kahua-0.2.5-orig/src/kahua/persistence.scm Kahua/src/kahua/persistence.scm
*** Kahua-0.2.5-orig/src/kahua/persistence.scm	Sun Feb 29 20:29:03 2004
--- Kahua/src/kahua/persistence.scm	Fri May 14 21:20:01 2004
***************
*** 17,22 ****
--- 17,23 ----
    (use gauche.version)
    (use gauche.fcntl)
    (use gauche.logger)
+   (use gauche.collection)
    (export <kahua-persistent-meta> <kahua-persistent-base>
            <kahua-persistent-metainfo>
            key-of find-kahua-class find-kahua-instance
***************
*** 1081,1090 ****
    ((instances :init-keyword :instances :init-value '()))
    )

(define-method make-kahua-collection ((class <kahua-persistent-meta>) . opts)
    (let1 db (current-db)
      (unless db (error "make-kahua-collection: database not active"))
!     (make-kahua-collection db class opts)))

  (define-method make-kahua-collection ((db <kahua-db-fs>)
                                        class opts)
--- 1082,1103 ----
    ((instances :init-keyword :instances :init-value '()))
    )

+ (define-method append-map (proc (col <collection>))
+   (fold (lambda (v r)
+           (append (proc v) r))
+         '()
+         col))
+
(define-method make-kahua-collection ((class <kahua-persistent-meta>) . opts)
    (let1 db (current-db)
      (unless db (error "make-kahua-collection: database not active"))
!     (let-keywords* opts ((subclasses? :subclasses #f))
!       (if subclasses?
!           (append-map (lambda (c)
! (coerce-to <list> (make-kahua-collection db c opts)))
!                       (cons class
!                             (class-subclasses class)))
!           (make-kahua-collection db class opts)))))

  (define-method make-kahua-collection ((db <kahua-db-fs>)
                                        class opts)
***************
*** 1109,1113 ****
    (let1 p (ref coll 'instances)
      (proc (cut null? p)
            (lambda () (let1 r (car p) (pop! p) r)))))
!
  (provide "kahua/persistence")
--- 1122,1137 ----
    (let1 p (ref coll 'instances)
      (proc (cut null? p)
            (lambda () (let1 r (car p) (pop! p) r)))))
!
! (define-method class-subclasses ((class <class>))
!   (define-method class-subclasses* ((class <class>))
!     (let1 subs (class-direct-subclasses class)
!       (if (null? subs)
!           '()
!           (append subs
!                   (append-map class-subclasses* subs)))))
!
!   (delete-duplicates (class-subclasses* class)))
!
!
  (provide "kahua/persistence")
diff -c -r Kahua-0.2.5-orig/test/persistence.scm.in Kahua/test/persistence.scm.in
*** Kahua-0.2.5-orig/test/persistence.scm.in	Wed Apr  7 18:55:33 2004
--- Kahua/test/persistence.scm.in	Fri May 14 21:24:12 2004
***************
*** 323,328 ****
--- 323,341 ----
           (sort (hash-table-keys (ref db 'instance-by-key))
                 (lambda (a b) (string<? (cdr a) (cdr b))))))

+ (test* "kahua-test-subclasses" '(1 2 "woo" "wooo")
+        (sort (with-db (db *dbname*)
+                (map (cut ref <> 'id)
+ (make-kahua-collection <kahua-test> :subclasses #t)))))
+
+ ;; <kahua-test>と,そのsubclassである<kahua-test-sub>両者ともの
+ ;; 永続インスタンスのコレクションを,<kahua-test>に対する
+ ;; make-kahua-collectionを用いて作成できることを確認する.
+ (test* "kahua-test-subclasses" '(1 2 4 5)
+        (sort (with-db (db *dbname*)
+                (map (cut ref <> 'id)
+ (make-kahua-collection <kahua-test> :subclasses #t)))))
+
  ;;----------------------------------------------------------
  ;; メタ情報履歴に関するテスト:永続クラスの変更をオブジェクトマネージャ
  ;; が認識し、世代番号を自動的に付与して管理していることを確認する。