EDBでは,データを記憶するコアの部分にPostgreSQL 7.2を利用している.
本ページでは,PostgreSQL 7.2 のバックエンド部分に付加したタイプ,関数,オペレータについて説明する.
EDBでは記憶するデータの基本的な部分で多言語に対応できるように新しいデータ型を追加した.
この型の意図するところは,同じ意味の内容でも英語での表記,日本語での表記が異なっていることをデータの基本構造でカバーすることにある.
現時点では,英語,日本語,および日本語の読みと参照形式で登録される場合の情報識別子(EID)を一つのデータセットとして扱うための型(TYPE)を追加している.
- TYPE名: mtext
- 型 mtext には,「情報識別子(EID)」,「英語テキスト」,「日本語テキスト」,「日本語読みテキスト」が含まれる.
- mtextの入出力関数(INSERT やSELECT時に用いられる)として,
- mtext mtext_in ( 'EID|English Text|日本語テキスト|読み' )
- opaque mtext_out ( mtext )
を定義している.
- 'EID', 'English Text', '日本語テキスト', '読み'は `|'で区切られる.
- 'English Text', '日本語テキスト', '読み' 中に'|'を利用したいときには'\|'のようにバックスラッシュを用いて区切りの`|'と区別する.INSERT文ではバックスラッシュが独自に処理されるため,`\\|'のように指定する必要がある.
- SELECT文で読みだしたときには,`|'と`\|'が混在する可能性があるので,まず`\'の付いていない`|'で,'EID', 'English Text', '日本語テキスト', '読み'を分離し,その後各テキストについて`\|'を`|'に変換する.
- EIDが0のとき,そのEIDは意味をなさない.
- `読み'は主に`日本語テキスト'を50音順に配列するために用いる.`読み'そのものが利用されるケースとしては人名ぐらいと推測される.
- 型変換関数として,
- int4 int4 ( mtext ) … 情報識別子(EID)を得る.
- text english ( mtext ) … 英語テキストを得る.
- text japanese ( mtext ) … 日本語テキストを得る.
- text pronounce ( mtext ) … 読みテキストを得る.
を定義している.(下記参照)
- 型 mtext の配列は,型 _mtext と表現される.
制御関数
型 mtext にかかわる関数系で,陽に英語,日本語が指定されなかったとき,どちらの言語を主体として処理を行うか(言語モード)を指定する関数を以下のように定義している.
- text setdatabasespeaking ( speaking-language )
- mtextの言語モードを指定する.
- 現在,'English' と 'Japanese' が利用可能.
- (実行例)
- SELECT setdatabasespeaking( 'English' )
- SELECT setdatabasespeaking( 'Japanese' )
- text getdatabasespeaking ( )
- 現在の言語モードを得る.
- 値としては,'English','Japanese' などの text が戻る.
以上の制御関数の設定により,
- 関数text で mtext から取り出す言語が変化する.
- 比較関数の比較の順序が変化する.言語モードで指定されている方を先に比較する.
などの調節を行う.
比較関数
- bool mtext_lt ( mtext1, mtext2 )
- mtext1 < mtext2 のときに真.
- テキストの大小関係は辞書排列による.英語テキストは英字アルファベット順,日本語テキストは読みの50音順.
- setdatabasespeaking で設定されている言語モードによって,mtextの大小関係が変化することに注意.(以下同様)
- bool mtext_le ( mtext1, mtext2 )
- bool mtext_gt ( mtext1, mtext2 )
- bool mtext_ge ( mtext1, mtext2 )
- bool mtext_eq ( mtext1, mtext2 )
- bool mtext_ne ( mtext1, mtext2 )
- bool mtext_int4eq ( mtext, int4 )
- mtextにEIDが定義されている場合には,そのEIDと第2引数を比較.
- それ以外では0と比較する.
- bool mtext_texteq ( mtext, text )
- mtextとテキストを比較.(英語,日本語,読みのいずれかと同じであれば真)
- 第2引数はtext型でなくてはならない.
- bool mtext_textregexeq ( mtext, text )
- bool mtext_array_int4eq ( _mtext, int4 )
- bool mtext_array_texteq ( _mtext, text )
- bool mtext_array_textregexeq ( _mtext, text )
- mtext_textregexeq の配列版.(論理和)
- bool mtext_array_array_eq ( _mtext1, _mtext2 )
- bool mtext_array_array_ne ( _mtext1, _mtext2 )
- bool mtext_array_array_lt ( _mtext1, _mtext2 )
- bool mtext_array_array_le ( _mtext1, _mtext2 )
- bool mtext_array_array_gt ( _mtext1, _mtext2 )
- bool mtext_array_array_ge ( _mtext1, _mtext2 )
型変換関数
- int4 int4 ( mtext ) --- SQL関数
- int4 mtext_int4 ( mtext ) --- 組み込み関数
- mtextにEIDが登録されているときEIDの値.
- それ以外では0.
- text text ( mtext ) --- SQL関数
- text mtext_text ( mtext ) --- 組み込み関数
- setdatabasespeakingで設定されている現在の言語(英語 or 日本語)のテキストに変換する.
- text english ( mtext ) --- SQL関数
- text mtext_english ( mtext ) --- 組み込み関数
- text japanese ( mtext ) --- SQL関数
- text mtext_japanese ( mtext ) --- 組み込み関数
- text pronounce ( mtext ) --- SQL関数
- text mtext_pronounce ( mtext ) --- 組み込み関数
先に述べた関数をオペレータとして定義したものを以下に示す.
operator | usage | original function |
= | mtext = mtext | mtext_eq |
<> | mtext <> mtext | mtext_ne |
< | mtext < mtext | mtext_lt |
<= | mtext <= mtext | mtext_le |
> | mtext > mtext | mtext_gt |
>= | mtext >= mtext | mtext_ge |
= | mtext = int4 | mtext_int4eq |
= | mtext = text | mtext_texteq |
~ | mtext ~ text | mtext_textregexeq |
*= | _mtext *= int4 | mtext_array_int4eq |
*= | _mtext *= text | mtext_array_texteq |
*~ | _mtext *~ text | mtext_array_textregexeq |
= | _mtext = _mtext | mtext_array_array_eq |
<> | _mtext <> _mtext | mtext_array_array_ne |
< | _mtext < _mtext | mtext_array_array_lt |
<= | _mtext <= _mtext | mtext_array_array_le |
> | _mtext > _mtext | mtext_array_array_gt |
>= | _mtext >= _mtext | mtext_array_array_ge |