了解。
ここからは 「DSL → DB DML マッピング表」 を OS として完成させる流れを続けるね。
あなたの前提(combo=i, combo_sub=j を js と python で共有)により、
DB は combo / combo_sub を上位キーとして持つだけでよく、
Flask は常に i, j を自動付与して DML を実行する
という OS 構造が確定した。
ここでは、
MeshOS の命令セット(DSL)を MySQL DML にマッピングする「OS カーネル表」
を完成させる。
🧩 MeshOS DSL → MySQL DML マッピング表(OS カーネル)
以下は Flask が DSL をパースした後に実行する DB 操作を
OS の命令セットとしてまとめたもの。
combo=i, combo_sub=j は Flask が自動付与する。
H2: 1. CREATE MESH(基本形状生成)
DSL
CREATE MESH egg USING SPHERE radius=1 segments=32;
Flask の動作
- Python 側で SphereGeometry を生成
- 頂点と面を DB に INSERT
MySQL DML
INSERT INTO meshes (combo, combo_sub, name)
VALUES (:i, :j, 'egg');
SET @mesh_id = LAST_INSERT_ID();
頂点 INSERT(Python ループ)
INSERT INTO vertices (combo, combo_sub, mesh_id, x, y, z)
VALUES (:i, :j, @mesh_id, :x, :y, :z);
面 INSERT
INSERT INTO faces (combo, combo_sub, mesh_id, v1_id, v2_id, v3_id)
VALUES (:i, :j, @mesh_id, :v1, :v2, :v3);
H2: 2. SELECT(選択)
2.1 連続面(BFS)
DSL
SELECT FACES CONNECTED FROM face_id = 120 INTO groupA;
Flask の動作
- faces テーブルから隣接面を BFS
- 結果を face_groups に保存
MySQL DML
INSERT INTO face_groups (combo, combo_sub, name)
VALUES (:i, :j, 'groupA');
SET @group_id = LAST_INSERT_ID();
INSERT INTO face_group_items (group_id, face_id)
VALUES (@group_id, :face_id);
2.2 SHAPE 選択
DSL
SELECT FACES INSIDE SHAPE almond1 INTO groupB;
Flask の動作
- SHAPE 定義を Python 側で評価
- faces の重心が SHAPE 内か判定
- 結果を face_group_items に保存
H2: 3. CREATE MESH FROM FACES(部分メッシュ生成)
DSL
CREATE MESH part1 FROM FACES groupA;
Flask の動作
- groupA の face_ids を取得
- それに含まれる頂点を取得
- 新しい mesh を作成
- 頂点と面をコピー(ID マッピング)
MySQL DML
新メッシュ作成:
INSERT INTO meshes (combo, combo_sub, name)
VALUES (:i, :j, 'part1');
SET @new_mesh_id = LAST_INSERT_ID();
頂点コピー(Python ループ):
INSERT INTO vertices (combo, combo_sub, mesh_id, x, y, z)
VALUES (:i, :j, @new_mesh_id, :x, :y, :z);
面コピー:
INSERT INTO faces (combo, combo_sub, mesh_id, v1_id, v2_id, v3_id)
VALUES (:i, :j, @new_mesh_id, :new_v1, :new_v2, :new_v3);
H2: 4. MOVE / SCALE / ROTATE(変形)
4.1 MESH 全体の移動
DSL
MOVE part1 BY (0,1,0);
MySQL DML
UPDATE vertices
SET x = x + 0,
y = y + 1,
z = z + 0
WHERE combo = :i AND combo_sub = :j AND mesh_id = :mesh_id;
4.2 FACE_GROUP の移動
DSL
MOVE groupA BY (0,1,0);
MySQL DML
UPDATE vertices
SET x = x + 0,
y = y + 1,
z = z + 0
WHERE id IN (
SELECT DISTINCT v1_id FROM faces WHERE id IN (SELECT face_id FROM face_group_items WHERE group_id=:groupA)
UNION
SELECT DISTINCT v2_id ...
UNION
SELECT DISTINCT v3_id ...
);
4.3 INSTANCE の移動
DSL
MOVE inst1 BY (0,1,0);
MySQL DML
UPDATE instances
SET ty = ty + 1
WHERE id = :instance_id AND combo = :i AND combo_sub = :j;
H2: 5. CREATE INSTANCE(LinkNode)
DSL
CREATE INSTANCE inst1 FROM MESH part1 AT (0,0,0);
MySQL DML
INSERT INTO instances (
combo, combo_sub, mesh_id,
tx, ty, tz,
rx, ry, rz,
sx, sy, sz
)
VALUES (:i, :j, :mesh_id, 0,0,0, 0,0,0, 1,1,1);
H2: 6. DELETE(削除)
DSL
DELETE MESH part1;
MySQL DML
DELETE FROM faces WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM vertices WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM instances WHERE combo=:i AND combo_sub=:j AND mesh_id=:mesh_id;
DELETE FROM meshes WHERE combo=:i AND combo_sub=:j AND id=:mesh_id;
🧩 ここまでで「MeshOS の命令セット(DSL)→ DB DML」が完成した
つまり:
- Three.js は DB を読むだけ
- Flask は DSL をパースして DB に DML を実行
- DB が唯一の真実
- combo=i, combo_sub=j がプロジェクト空間
- MeshOS が完全に DB 上で動く
という OS が成立した。
🧩 次に続けるべきこと(あなたへの提案)
ここまで来たら、次は Flask の DSL 実行エンジンの内部構造を設計する。
具体的には:
★ ① DSL パーサ(SQL 風 DSL → AST)
- CREATE
- SELECT
- MOVE
- SCALE
- ROTATE
- DELETE
- INSTANCE
を AST に変換する。
★ ② AST → DML 実行器(Executor)
- AST ノードごとに DB DML を実行
- combo=i, combo_sub=j を自動付与
- 結果を JSON で返す
★ ③ Three.js の DB 読み込み API
/mesh/get?combo=i&combo_sub=j&mesh_id=123/instance/get?combo=i&combo_sub=j/group/get?combo=i&combo_sub=j&group=groupA
次は DSL パーサ(AST 設計) に進める?
それとも Flask API 設計から行く?