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

3 日坊主日記


2007-04-18 [長年日記]

_ [Rel] 半結合 (semijoin)

rA rB の半結合

 rA SEMIJOIN rB

は、rA rB の結合を rA の属性に射影したものです。

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

これはようするに rB の Tuple にマッチする rA の Tuple を返すことになります。 そこで SEMIJOIN には MATCHING という別名が用意されています。

 rA MATCHING rB

_ [Rel] 半差 (semiminus)

rA rB の半差

 rA SEMIMINUS rB

は、rA と rA SEMIJOIN rB の差です。

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

これはようするに rB の Tuple にマッチしない rA の Tuple を返すことになります。 そこで SEMIMINUS には NOT MATCHING という別名が用意されています。

 rA NOT MATCHING rB

_ [Rel] compose

rA rB の compose

 rA COMPOSE rB

は、rA rB の結合から共通属性を除いたものです。

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

_ [Rel] Ruby への組み込み方を検討中

#!/usr/bin/ruby
# Rel Ruby

$:.unshift(File.dirname(__FILE__) + '/../lib')
require 'rel.rb'
require 'rel/interp/tutoriald.rb'

parser = TutorialD.new
@rel = Rel.newSession(parser)
parser.session = @rel

def execute(source)
  @rel.interpreter.run(source)
  ret = @rel.result
  ret.unbox
ensure
  @rel.reset
end

TutorialD::ABBR["P"] = "RESULT"

p execute("P 1+1;") #=> 2
p execute("P TABLE_DEE;") #=> [{}]
p execute("P TABLE_DUM;") #=> []
p execute("P T{a 1};") #=> {:a=>1}
p execute("P R{T{a 1},T{a 2}};") #=> [{:a=>1}, {:a=>2}]

parser と session は DI な感じなんだけど

require 'rel'
Rel.execute("RESULT 1+1;").unbox #=> 2

て書きたいねやっぱり。

あと @rel.interpreter の値は parser なんだけど、 どっちかの名前に合わせてほしい。

[]