目次
開発

ActQLを実装する

実装がどう構成され、各部分がどの順番で依存し合っているかを説明します。CoreとHostのコントリビューター、そして仕様に対してActQLを実装するすべての人のためのページです。

ActQLは、ActQL仕様とそれが固定する機械向けの契約に対して、MoonBitで実装されています。言語の意味、ワイヤー表現、内容の識別子はそれらの契約から来るもので、別の実装の内部APIや制限から来るものではありません。バージョンの割り当てはバージョン管理のポリシーに従います。参照実装のバージョンが、契約の不変な入力になることはありません。

権限は、実行アカウントの設定(allow、deny、delegate)とHostの委任された判断を通して振り分けられます。実行の仕様が定めるとおりです。Connectorは提供元の技術的な要件を記述するものであり、アカウントを付与したり承認ポリシーを持ったりはしません。

コンポーネントの境界

これは責務の分担であって、ディレクトリ構成を定めるものではありません。

  • 値とコーデックの基盤:正規化されたJSON、型付きの値、等価性、内容の識別子。
  • プロトコルの受け付け:スキーマ、型付きの参照の閉包、Catalogとロックの検証。
  • コンパイラー:ソースのデコード(SQL/Pipeのテキストと正規化モデル)、スコープ、型、証拠、Stageの検査、正規化された変換。
  • 代数の実行:固定された代数の契約と式の評価。
  • Host:永続的な取り込み、予算、認可、予約、フェンス、復旧。
  • Connectorの境界:有界の読み取り、型付きのコマンド、認可された参照の解決。
  • CLIとSDK:作成、実行の制御、進捗、Resultへのアクセス。
  • 適合性:独立した正例と負例、正規化されたバイト列、失敗時の振る舞い。

コンパイラーはプロトコルの契約を利用しますが、プロトコルの定義がコンパイラーの内部に依存することはありません。CLIとSDKは検査済みの境界を呼ぶだけで、意味を定義し直しません。ConnectorはCLIに依存しません。共有のエンコード/デコードのコードは、複数の利用者に対して1つの契約を実装します。再利用するときも、各境界のスコープ、閉じたフィールド、型の検証、要求の規則を保たなければなりません。

デプロイとHostアダプター

Hostは、Coreを環境ごとのI/O、ストレージ、認証情報、リソース制御につなぎます。必ずしも独立したサービスである必要はありません。

表面CoreのターゲットHostアダプター
TypeScriptライブラリJSTypeScript
PythonライブラリWasmWasmランタイムを組み込んだPython
Cloudflare WorkersJSWorker APIを使うTypeScript
CLIネイティブ必要に応じて環境ごとのFFIを使うMoonBit

DuckDBは物理的な実行エンジンであって、ActQLの意味を定義するものではありません。Wasmランタイムを組み込むHostは、その外側で動くネイティブエンジンの処理も考慮しなければなりません。一時的なストレージだけでは、復旧プロファイルが求める永続性を提供できません。

共有される意味と実行の規則はMoonBitのCoreに置かれたままです。ローカルHostとマネージドHostは、同じ認可、冪等性、失敗、復旧の契約に従います。違うのは、ストレージ、認証情報の扱い、スケジューリングのアダプターです。共有のHostインターフェースとローカルHostはオープンソースで、サービス固有の統合は移植可能なCoreの外にあります。

一括実行のリソース境界

物理的なリーダーとライターは、ストリーミングか、厳密に有界かを宣言します。Hostは、それらの合計のライブメモリ要件を、演算子の状態とランタイムのオーバーヘッドと合わせて受け付けます。最大のコンポーネント単体が予算になることはありません。展開、オブジェクトの増幅、同時に存在するバッファも含めてください。スプールとスピルの経路には、一時ストレージと時間の上限も必要です。強制できる上限がない場合や、スピルの経路に対応していない場合は、データセット全体をメモリに載せて実行することにフォールバックするのではなく、受け付けの段階で失敗させます。数値の上限はHostの設定であって、Coreの定数ではありません。

DuckDBのようなエンジンは、ステージングしたファイルを直接読み、すべてのレコードをMoonBitのオブジェクトツリーに通すことなく、有界の出力バッチを作ることがあります。その配置をしても、検査済みの契約の検証は省けません。アダプターは、結果の同一性を主張する前に、正確なdecimal、時刻の表現、入れ子の値、nullable、正規化された出力の規則を保たなければなりません。ストレージ上のバイト列が壊れていないことだけでは、型付きの値の同一性は立証されません。

実装の順序

  1. 正規化された値、UTF-16の順序、再帰的な型の契約、内容の識別子。固定のバイト列と受け付け/拒否のケースを、独立したベクトルで比較する。NULL、decimal、参照、空の値、未知のフィールドを含める。
  2. 型付きの参照の走査、Catalogの閉包、権限とロックの検証。登録された参照のロールを走査するのであって、識別子に見える文字列を走査するのではない。
  3. フロントエンド:SQL/Pipeテキストの解析と正規化されたプログラムモデルへの変換。パラメーターと既定値の束縛、ローカルの名前空間、インポートとエクスポート、証拠の伝播、Stageとプログラムの正規化された識別子。
  4. Coreのリレーショナル代数と式の実行。共有の受け付け済みルートの検証、コレクション全体の予算、要求を保つ評価を伴う。
  5. 共通のRun Graph、Stageの起動、永続的な取り込み、Checkpoint、論理項目の台帳、復旧、読み取り元のカーソルのコミット。
  6. 取得、Artifact、追加の代数プロファイルを、それぞれの閉じた契約に対して実装する。対応していないプロファイルは、外部へ送る前に拒否する。
  7. CLIとSDK、安全なローカルHostの既定値、生成された作成用のディスカバリー。取り込み、部分的な失敗、クラッシュ、再開を通して、シナリオ全体を検証する。

主張するプロファイルのそれぞれについて、その規範の振る舞いすべてと、独立した実行の証拠が必要です。上の順序がプロファイルの主張を定義し直すことはありません。

SourceViewとEffectの境界

SourceViewは、受け付けられた取得の契約のもとで、宣言したCarrierの観測を生み出します。キーによる外部との結合には、Relationの値を持つSourceViewが必要です。ほかの利用者はそれぞれのCarrierの要件を保ちます。リクエストは、閉じたロールの契約のもとで、受け付けられたリテラルまたはパラメーターの値と、不透明な束縛を使います。キーによる結合は、ルックアップによる取得とリレーショナル代数に変換されます。順位付きの取得には、専用の候補とカバレッジの契約があります。提供元からの読み取りを、代数のコールバックの中に隠すことはできません。

Stageの起動は、先行するStageの成功とインポートの利用可能性に従います。1つのStageの中で、Effectは順序のない集合を作ります。具体的なプレビュー、認可、項目の衝突、永続的な予約が、送信に先立ちます。不明な結果には突き合わせが必要です。再試行が、会計を消したり、成功をでっち上げたりすることはありません。

ローカルのグラフ、ベクトル、イベントのCarrierは言語の値です。それらがあるからといって、任意の提供元のAPI、無制限の読み取り、暗黙の変更が認可されることはありません。

受け入れ

  • 主張するすべての契約に、受け付けの正例と負例がある。
  • コンパイラーの出力が、テスト対象の実装から昇格させたスナップショットではなく、独立した正規化の期待値と一致する。
  • 空の値がスキーマ、順序、ポリシー、完全性の証拠を保つ。
  • ルートの検査と、与えられたコンテキストの契約が、述語の有無にかかわらず成り立つ。
  • ルックアップのキー、バッチ、採用したページ、会計、証拠の閉包が、再試行や遅れた応答を経ても、登録されたエンベロープと一致する。
  • Stageの順序、承認のスコープ、項目の同一性、カーソルの義務が、クラッシュ、キャンセル、部分的な失敗、復旧を経ても保たれる。
  • 数値の観測は取り込んだ値を再生し、正確な数値の経路はその正確な法則を保つ。
  • 依存関係の固定とビルドが、クリーンなチェックアウトから再現できる。
  • リリースの主張は、実装の正確なバイト列と、適合性の規則のもとでそれを裏付ける証拠を特定する。

Nodeベースの文書チェックと、独立したPythonの参照変換は検証のためのツールです。MoonBit実装のアーキテクチャを決めるものではありません。

Source: actql/actql/docs/contributing/implementing.md at d904416674e4 · Edit on GitHub