このプロジェクトは、XMLデータをディレクトリ構造に展開し、Swiftで自動生成されたコードを使ってWeb APIとして提供する仕組みを示すサンプルです。
- Swift 5.3以降
- Swift Package Manager (Swiftに同梱されています)
- リポジトリをクローンします。
git clone ChaosReadman/Albion.git - プロジェクトディレクトリに移動します。
cd Albion - 依存関係を解決します。
swift package resolve - ビルドします。
swift build -c release
xmldataディレクトリにXMLデータを配置してください。サンプルとして、nutrient.xmlとsample.xmlが含まれています。
queryRootディレクトリにXQueryファイルを配置してください。サンプルとして、searchfoodとnutrientsのディレクトリが含まれています。
mk.shを起動して、XML展開ツールを作成してください。
ツールを使ってXMLデータをディレクトリに展開します。
./loadxml xmldata/sample.xml mnt ./loadxml xmldata/nutrient.xml food
rm -rf .build
swift run Run serve --port 5000
http://localhost:5000/foodinfo/searchfood?foodname=ぶどう
http://localhost:5000/foodinfo/nutrients?id=14028
http://localhost:5000/mnt/getbooks?price=0
各々のリクエスト先にあるqueryRoot/searchfood/query.xqyとqueryRoot/nutrients/query.xqyからswiftコードが自動生成され、コンパイルされ、実行され、その結果がブラウザに表示されます。
既存のデータベースシステムが行っている「メモリ上のデータをファイルシステムへシリアライズする」という行為は、OSのファイルシステムの上に、さらにもう一つのファイルシステムを二重に構築しているように見えます。 また、同時アクセス制御なども、OSのファイルシステムに任せれば平和裏に解決される問題を、アプリケーション層で自前でロック管理を行うなど、現代の視点では余計な複雑さを抱え込んでいるように感じられます。
かつてはそのような独自実装に意味があった時代もありましたが、現代においては時代遅れになりつつあると考えます。 そこでAlbionでは、データをそのままファイルシステムへ置き換えることで、誰の目にもシンプルに映る実装を最優先しました。 この思想に基づき、無駄に複雑になりがちなXQueryの完全実装を潔く諦め、ファイルシステム操作に必要な部分だけに絞って実装を行っています。
このプロジェクトは「完全なXQuery 3.0の実装」ではなく、**ファイルシステム(ディレクトリ構造)に展開されたXMLデータを効率的に操作するためのDSL(ドメイン特化言語)**として設計されています。 標準的なXQueryの構文(FLWOR式など)を借用していますが、アーキテクチャの特性上、以下の独自仕様(サブセット)となっています。
-
データモデルの違い
doc('name')はXMLドキュメントではなく、展開されたディレクトリを指します。- 変数(例:
$x)にはXMLノードオブジェクトではなく、**ディレクトリのパス(文字列)**が格納されます。
-
出力の挙動
return $xと記述した場合、XML要素がシリアライズされて出力されるのではなく、そのディレクトリのパスが出力されます。- XMLタグとして出力したい場合は、
<tag>{$x/text()}</tag>のように明示的にタグを構築する必要があります。
-
パス式・関数の制約
$x/text()はディレクトリ内のinner.txtを読み込みます。$x/@attrはディレクトリ内のattr.txtから属性値を読み込みます。string()やdata()などの関数は、トランスパイラによって無視(削除)されます(既に文字列として扱われているため)。- 親要素へのアクセス(
..)や子要素の属性チェックは、専用のヘルパー関数に変換される形で限定的にサポートされています。