トップ «前の日記(2007-04-15) 最新 次の日記(2007-04-17)» 編集

3 日坊主日記


2007-04-16 [長年日記]

_ [Rel] Rel Ruby: Relation 型の比較

宿題だった Relation 型の比較ですが

class TupleType
  include TypeEquate

この include を忘れていて

  def eq
    ctdebug("=") if @ctdebugging
    t2 = popType
    t1 = popType
    unless t1.kind_of? TypeEquate

でひっかかってました。

? P TABLE_DEE = TABLE_DEE;
?
TRUE
OK

_ [Rel] Rel Ruby: UNGROUP

あと UNGROUP 演算子を実装したので RVA を簡単に検索できるようになりました。

? VAR x:=R{T{id 1,v R{T{m 1},T{m 2}}}};P x;P x UNGROUP v;
?
RELATION {id INTEGER, v RELATION {m INTEGER}} {
   TUPLE {id 1, v RELATION {m INTEGER} {
         TUPLE {m 1},
         TUPLE {m 2}}}}
RELATION {id INTEGER, m INTEGER} {
   TUPLE {id 1, m 1},
   TUPLE {id 1, m 2}}
OK

_ [Rel] 短縮形

短縮形はスキャナで実現しています。超簡易。

# lib/rel/interp/tutoriald.rb:
    until s.eos?
      s.skip(/\A\s+/)
      if tmp = s.scan(/\A[A-Z]\w*/)
        tmp = abbreviate(tmp) || tmp
        @q.push [tmp.upcase.to_sym, tmp]

  ABBR = {
    "P" => "WRITELN",
    "R" => "RELATION",
    "T" => "TUPLE",
  }
  def abbreviate(token)
    ABBR[token]
  end

_ [Rel] 基底関係変数

Rel の使い方を記録していく。

Relation をストレージに保持するには、基底関係変数を使います。 基底関係変数を使うには、まず変数を REAL (または BASE) 付きで定義します。

? VAR z REAL R{id INTEGER,name CHAR};
?
VAR z REAL created.
OK

ここで一旦 Rel インタプリタを終了してみます。

? q
quit
$ bin/rel
? P z;
?
RelVar: Get constant value for 'z'
RELATION {id INTEGER, name CHAR} {
}
OK

ちゃんと残っています。

変数には値を代入できます。

? z:=R{T{id 1,name 'A'}};
? P z;
?
RelVar: Set value for 'z'
RelVar: Get constant value for 'z'
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "A"}}
OK

また、基底関係変数に対しては INSERT 文を使えます。

? INSERT z T{id 2,name 'B'};
?
RelVar: Get mutable value for 'z'
Inserted 1 tuple.
OK
? P z;
?
RelVar: Get constant value for 'z'
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "A"},
   TUPLE {id 2, name "B"}}
OK
?

_ [Rel][BDB] BDB が PANIC てしまった!

BDB に書き込んで終了すると、BDB が PANIC ることがあります。

bin/rel: Locker does not exist
bin/rel: Locker does not exist
bin/rel: PANIC: Invalid argument
./bin/../lib/bdb.rb:13:in `abort': txn abort failed (BDB::Fatal)
        from ./bin/../lib/bdb.rb:13:in `close'
        from ./bin/../lib/bdb.rb:13:in `each'
        from ./bin/../lib/bdb.rb:13:in `close'
        from ./bin/../lib/rel/sto/je.rb:50:in `close'
        from ./bin/../lib/rel/sto/bdbstorage.rb:43:in `close'
        from ./bin/../lib/rel/storage.rb:21:in `open'
        from bin/rel:24
bin/rel: PANIC: fatal region error detected; run recovery

このときは BDB に付いている db_recover を実行してください。 home として tmp ディレクトリを指定します。

$ db_recover -h tmp

_ [Rel][BDB] BDB が固まってしまった!

起動時に固まってしまう (deadlock) ことがあります。

このときは BDB に付いている db_deadlock を実行してください。 home として tmp ディレクトリを指定します。

$ db_deadlock -h tmp

これでもだめなときは諦めて tmp/rel.db tmp/log.* tmp/__db.* を削除してください。 tmp/clean.rb で処理できます。

 $ ruby tmp/clean.rb

_ [Rel] 用語

  • Relation
  • Tuple
  • 属性
  • 属性名

_ [Rel] 基本演算

  • 射影 (project)
  • 制限 (restrict)
  • 結合 (join)
  • 交わり (intersect)
  • 和 (union)
  • 差 (minus)
  • 名前変更 (rename)
  • 拡張 (extend)

_ [Rel] 射影 (project)

文法: { [ALL BUT] 属性名, ... }

Tuple: 指定した属性名の属性で構成される Tuple を返します。

? P T{id 1, name 'A', city 'C'}{name};
?
TUPLE {name "A"}
OK

ALL BUT を付けると、指定した属性名以外の属性で構成される Tuple を返します。

? P T{id 1, name 'A', city 'C'}{ALL BUT name};
?
TUPLE {id 1, city "C"}
OK

Relation: 指定した属性名の属性で構成される Relation を返します。

? P R{T{id 1, name 'A', city 'C'}}{name};
?
RELATION {name CHAR} {
   TUPLE {name "A"}}
OK
?

_ [Rel] 制限 (restrict)

文法: WHERE 式 あるいは [ 式 ]

Relation: 式が真である Tuple で構成される Relation を返します。

? P R{T{id 1, name 'A'},T{id 2, name 'B'}} WHERE id=1;
?
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "A"}}
OK

_ [Rel] 結合 (join)

Tuple: 指定した Tuple tA tB が共通の属性を持つとき、tA と tB を結合した Tuple を返します。

結合は属性集合の和です。

? P T{id 1, name 'A'} JOIN T{id 1,city 'C'};
?
TUPLE {id 1, name "A", city "C"}
OK

Semantic error: tA tB が共通の属性を持たないとき

? P T{id 2, name 'B'} JOIN T{id 1,city 'C'};
?
FAIL
TRANSACTION ABORTED
Semantic error: Tuple #<Tuple:> and tuple #<Tuple:> have no common attributes in JOIN.

ただし、tA tB が共通の属性名を持たないときは、結合できます。

? P T{id 1, name 'A'} JOIN T{city 'C'};
?
TUPLE {id 1, name "A", city "C"}
OK
?

Relation: 指定した Relation rA rB (あるいは Tuple tB) のうち、同じ属性を持つ Tuple を結合した Tuple で構成される Relation を返します。

? P R{T{id 1, name 'A'},T{id 2, name 'B'}} JOIN R{T{id 1,city 'C'}};
?
RELATION {id INTEGER, name CHAR, city CHAR} {
   TUPLE {id 1, name "A", city "C"}}
OK
?

rA rB を構成する Tuple が共通の属性を持たないとき、Tuple を持たない Relation を返します。

? P R{T{id 1, name 'A'},T{id 2, name 'B'}} JOIN R{T{id 3,city 'C'}};
?
RELATION {id INTEGER, name CHAR, city CHAR} {
}
OK

ただし、rA rB が共通の属性名を持たないときは、結合できます。

? P R{T{id 1, name 'A'},T{id 2, name 'B'}} JOIN R{T{city 'C'}};
?
RELATION {id INTEGER, name CHAR, city CHAR} {
   TUPLE {id 1, name "A", city "C"},
   TUPLE {id 2, name "B", city "C"}}
OK

_ [Rel] 和 (union)

Tuple: 指定した Tuple tA tB が同じ型であるとき、それらを含む Relation を返します。

? P T{id 2, name 'B'} UNION T{id 1,name 'C'};
?
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "C"},
   TUPLE {id 2, name "B"}}
OK

Semantic error: tA tB が同じ型でないとき

Relation: 指定した Relation rA rB (あるいは Tuple tB) が同じ型であるとき、それらの Tuple で構成される Relation を返します。

? P R{T{id 1, name 'A'},T{id 2, name 'B'}} UNION R{T{id 1,name 'C'}};
?
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "C"},
   TUPLE {id 1, name "A"},
   TUPLE {id 2, name "B"}}
OK
?
? P R{T{id 1, name 'A'},T{id 2, name 'B'}} UNION R{T{id 1,name 'A'}};
?
RELATION {id INTEGER, name CHAR} {
   TUPLE {id 1, name "A"},
   TUPLE {id 2, name "B"}}
OK

Semantic error: rA rB が同じ型でないとき

本日のツッコミ(全1件) [ツッコミを入れる]
# shadowman (2007-04-30 08:47)

Hi! How r u? <br>nice site!

[]