目次 Edit


関連 Edit

検索:FlyweightFactory

FlyweightFactory周辺のタグ Edit

Array

FlyweightFactoryとは Edit

CGI/FlyweightFactory[?]
シングルトン。
DBMSの役目を持つ。

インデックス Edit

インデックス更新時 Edit

インデックス更新時、オブジェクトから属性値を得て、すべてのインデックスを更新。

キー(属性値)→{オブジェクトID}
オブジェクトIDの1つを削除したり、追加したり、

インデックスの更新=各インデックスから削除・追加すること

インデックス Edit

インデックスに含めるもの、インデックスのキーにするものはインデックス作成側が決める。固定。

キー毎に複数作成。
オブジェクトID→永続化されたオブジェクト名(ファイル名)も含む。

インデックス更新時はインデックス自身の更新日時も更新。

キーは

  • オブジェクトID
  • 永続化時のファイル名(ほとんどの場合、オブジェクトIDと同じ)
  • クラス名
  • ページ名(Unicode)

インデックス作成に必要なものは Edit

  • オブジェクト1つ以上
  • インデックスに含める情報は何か?
    これは固定。インデックス側が決める。
  • オブジェクトID→ファイル名
    オブジェクトIDをファイル名に変換するルールはあるが、ルールだけではオブジェクトID→ファイル名はできないので、データとしても残す。
    (ファイル名が重複して末尾に連番を付けたときなどに必要)

インデックスは1つのキーで複数のオブジェクトが得られるからこそ効率がいい Edit

インデックスの更新日時 Edit

オブジェクトID→更新日時(1対1)
ファイル名→ファイルの更新日時(ファイル拡張子.idxmtime)でいい。
比較相手もファイルの更新日時なので。

DB Edit

Data::Dumperで。


データベースの使われ方 Edit

  • クラス名 → オブジェクトのリスト または 空リスト (下位クラスのオブジェクト含む)
  • (キー名(属性名),値)の集合 → オブジェクトのリスト または 空リスト (キー名には「オブジェクトID」を含む)
  • オブジェクトのリスト → 戻り値なし(インデックス更新)
  • 全オブジェクトのインデックス更新(未更新分のみ)
  • 全オブジェクトのインデックス更新(本当にすべてのオブジェクト分)

プロトタイプ Edit

package FlyweightFactory;
use strict;
use warnings;
use Toolkit;
# クラス名 → オブジェクトのリスト または 空リスト (下位クラスのオブジェクト含む)
# FetchObject(ClassName) -> @Obj
sub FetchObject
{
	my $self = shift;
	my($class) = @_;
	my @ret = ();
	foreach my $obj_id (@{$Index{ClassName}->{$class}}){
		push @ret, retrieve($obj_id);
	}
	@ret;
}
# (キー名(属性名),値)の集合 → オブジェクトのリスト または 空リスト (キー名には「オブジェクトID」を含む)
# FetchObject({key, value}) -> @Obj
# FetchObject('key=value,key=value') -> @Obj
sub FetchObject
{
	my $self = shift;
	my($keyvalue) = @_;
	my @ret;

	my($key, $value);
	while (($key, $value) = each %{$keyvalue}){
		my @ret_part = ();
		foreach my $obj_id (@{$Index{$key}->{$value}}){
			my $obj = retrieve($obj_id)
			if ($obj){
				push @ret_part, retrieve($obj_id);
			}
		}
		@ret = intersection(\@ret, \@ret_part);
	}

	@ret;
}
sub FetchObject
{
	my $self = shift;
	my($keyvalue) = @_;
	my @keyvalue_list = split /, */, $keyvalue;
	my @ret;

	my($key, $value);
	while (($key, $value) = split /=/, shift(@keyvalue_list)){
		### assert:$key and $value
		my @ret_part = ();
		foreach my $obj_id (@{$Index{$key}->{$value}}){
			my $obj = retrieve($obj_id)
			if ($obj){
				push @ret_part, retrieve($obj_id);
			}
		}
		@ret = intersection(\@ret, \@ret_part);
	}

	@ret;
}
# オブジェクトのリスト → 戻り値なし(インデックス更新)
# UpdateIndex(@Obj)
sub UpdateIndex
{
	my $self = shift;
	my(@object) = @_;

	foreach my $obj (@object){
		{
			my $idx = $Index{file};
			my $key = $obj->{file};
			if (exists $idx->{$key} and defined $idx->{$key}){
				$idx->{$key} .= ',';
			}
			$idx->{$key} .= $obj->{id};
		}
		{
			my $idx = $Index{class};
			my $key = $obj->{class};
			if (exists $idx->{$key} and defined $idx->{$key}){
				$idx->{$key} .= ',';
			}
			$idx->{$key} .= $obj->{id};
		}
	}
	undef;
}
# UpdateIndexForce(@Obj)
# 全オブジェクトのインデックス更新(未更新分のみ)
# UpdateIndex()
# 全オブジェクトのインデックス更新(本当にすべてのオブジェクト分)
# UpdateIndexForce()
sub dump
{
	my($arg) = @_;
	use Data::Dumper;
	$ret = Dumper($arg);
}