Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dl2u の改修 #37

Merged
merged 6 commits into from
May 25, 2024
Merged

dl2u の改修 #37

merged 6 commits into from
May 25, 2024

Conversation

cedretaber
Copy link
Collaborator

@cedretaber cedretaber commented Mar 15, 2024

概要

https://hackmd.io/FF_R6nm6TFqeaO318vyfYw
dl2u の機能を拡張し、LVGN-DatalogでないDatalogを適切に変換できるようにする。

修正内容

source に現れず、 view でもない述語を許容した。
これらの述語は全て source あるいは view を呼び出していることを前提とし、その呼び出しからカラム名を導き出して中間テーブルを生成するようにした。
生成規則は既存のデルタ述語のものを流用している。
また、中間テーブルに対するデルタ述語は UPDATE/DELETE 文を生成しないようになっている。

確認方法

examples/ にファイルが入っているので指定して実行できる。

> dune exec bin/dl2u.exe -- examples/dl2u2.dl

datalog ファイル:

source a('AA':int, 'BB':string).
source b('BB':string, 'CC':int).

v(A,B,C) :- a(A,B), b(B,C).

-v(GENV1, GENV2, GENV3) :- v(GENV1, GENV2, GENV3) , GENV3 = 3 , GENV1 <> 4.
+v(GENV1, GENV2, GENV3) :- GENV1 = 4 , -v(GENV1_2, GENV2, GENV3).

uv(A,B,C) :- v(A, B, C), not -v(A,B,C).
uv(A,B,C) :- +v(A,B,C).

-a(A, B) :- a(A, B), not uv(A, B, _).
-b(B, C) :- b(B, C), uv(_, B, _), not uv(_, B, C).
+a(A, B) :- uv(A, B, _), not a(A, B).
+b(B, C) :- uv(_, B, C), not b(B, C).

結果:

CREATE TEMPORARY TABLE v AS SELECT a_0.AA AS AA, a_0.BB AS BB, b_1.CC AS CC FROM a AS a_0, b AS b_1 WHERE b_1.BB = a_0.BB;
CREATE TEMPORARY TABLE temp0 AS SELECT v_0.AA AS AA, v_0.BB AS BB, 3 AS CC FROM v AS v_0 WHERE v_0.CC = 3 AND v_0.AA <> 4;
CREATE TEMPORARY TABLE temp1 AS SELECT 4 AS AA, temp0.BB AS BB, temp0.CC AS CC FROM temp0 AS temp0;
CREATE TEMPORARY TABLE uv AS SELECT v_0.AA AS AA, v_0.BB AS BB, v_0.CC AS CC FROM v AS v_0 WHERE NOT EXISTS ( SELECT * FROM temp0 AS t WHERE t.AA = v_0.AA AND t.BB = v_0.BB AND t.CC = v_0.CC ) UNION SELECT temp1.AA AS AA, temp1.BB AS BB, temp1.CC AS CC FROM temp1 AS temp1;
CREATE TEMPORARY TABLE temp2 AS SELECT uv_0.BB AS BB, uv_0.CC AS CC FROM uv AS uv_0 WHERE NOT EXISTS ( SELECT * FROM b AS t WHERE t.BB = uv_0.BB AND t.CC = uv_0.CC );
CREATE TEMPORARY TABLE temp3 AS SELECT uv_0.AA AS AA, uv_0.BB AS BB FROM uv AS uv_0 WHERE NOT EXISTS ( SELECT * FROM a AS t WHERE t.AA = uv_0.AA AND t.BB = uv_0.BB );
CREATE TEMPORARY TABLE temp4 AS SELECT b_0.BB AS BB, b_0.CC AS CC FROM b AS b_0, uv AS uv_1 WHERE uv_1.BB = b_0.BB AND NOT EXISTS ( SELECT * FROM uv AS t WHERE t.BB = b_0.BB AND t.CC = b_0.CC );
CREATE TEMPORARY TABLE temp5 AS SELECT a_0.AA AS AA, a_0.BB AS BB FROM a AS a_0 WHERE NOT EXISTS ( SELECT * FROM uv AS t WHERE t.AA = a_0.AA AND t.BB = a_0.BB );
INSERT INTO b SELECT * FROM temp2;
INSERT INTO a SELECT * FROM temp3;
DELETE FROM b USING temp4 WHERE b.BB = temp4.BB AND b.CC = temp4.CC;
DELETE FROM a USING temp5 WHERE a.AA = temp5.AA AND a.BB = temp5.BB;

確認事項(確認していただきたいこと)

実装方法として、上記の通り、

  • source に現れない非デルタ述語は既存のデルタ述語と同じような形で CREATE TEMPORARY TABLE を生成するようにした
  • source に現れないテーブルに対するデルタ述語(サンプルで言う +v -v )は、既存のデルタ述語と同じような形の CREATE TEMPORARY TABLE を生成しつつ、 INSERT/DELETE 文を生成しないようにした

となっておりますが、この修正方針で間違いないでしょうか。

@cedretaber cedretaber self-assigned this Mar 15, 2024
@cedretaber cedretaber marked this pull request as ready for review May 14, 2024 18:10
@hiroyukikato
Copy link
Collaborator

Thanks, LGTM!

@cedretaber cedretaber merged commit 4b25e90 into master May 25, 2024
4 checks passed
@cedretaber cedretaber deleted the enhance-dl2u branch May 25, 2024 05:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants