Cockatoo近況
まとまった時間が取れたのでCockatooの機能追加をしました。
v1.0ブランチを切りました
https://github.com/cockatoo-org/Cockatoo/tree/v1.0
ある程度互換性を無視して一気に進みます。
Beak高機能化
アプリ開発の簡易化(わざわざMongoDBなどを立てなくても開発できるように!)を目指して作った機能です。
発案当初はCockatooシステム構成を柔軟にする為のモノだったのですが、開発の流れでアプリデータまでサポートしてしまい、非常に中途半端なORMになってしまいました。
今回一通りの機能を揃え、まともに使えるレベルになってきました。
しかし元々分散システム用に諦めている部分が多く
アプリデータまでサポートしようとしても、どこまで行っても中途半端なORMになってしまいます。
さらにORM(で複雑な事をやった時)の副作用で避けては通れない問題
- パフォーマンス劣化
- 隠ぺいによる煩わしさ
- 使用可能プロダクトの限定
- などなど
に悩まされる事になるので、積極的にはサポートしていかない方針です。
今後はCockatooシステム自体が必要とした場合に限定して、機能追加されて行くでしょう。
シンプルI/F
これまでのBeakController::beakQueryは複数並列クエリーを前提として設計されました。
しかし実際には単発クエリーを打つことが多く冗長でした。
今回新たに、単発クエリー用のI/FBeakController::beakSimpleQueryを用意しました。
$admin_data = BeakController::beakSimpleQuery("storage://wiki-storage/users/admin?get"); $admin_data["history"] []= $histdata; $res = BeakController::beakSimpleQuery("storage://wiki-storage/users/admin?set",$admin_data);
勿論、今後もBeakController::beakQueryは並列用として残ります。
範囲取得(getR)
MongoDBのクエリーと互換です。(そのまま渡します)
なので条件を渡さない場合はコレクション全体を取得します。
$query = array('_u" => array('$gt' => time()-86400)); $histories = BeakController::beakSimpleQuery("storage://wiki-storage/hist/?get",$query); foreach( $histories as $history ){ : }
現在サポートしている演算子はこれだけ。
- $in
- $gt
- $lt
- $gte
- $lte
Sort , Skip , Limit
MongoDBとほぼおなじです。
ただし、Sortに関しては以下の制限があります
- 指定できるキーは1つだけ
- キーは条件に指定したもの(table scanを避ける為の措置)
$query = array('_u" => array('$gt' => time()-86400)); // キー'_u'で降順ソートし、21番目〜30番目のドキュメントを取得する $cond = array(Beak::Q_SORT=>'_u:-1',Beak::Q_SKIP=>20,Beak::Q_LIMIT=>10); $histories = BeakController::beakSimpleQuery("storage://wiki-storage/hist/?get",$query,$cond); foreach( $histories as $history ){ : }
ドメインマッチドライバ
地味だけど今回一番大きな変更です。(ここがCockatooの心臓部です)
今までは先頭のスキーム単位でドライバを選択していました。
== config.php == self::$BEAKS = array ( Def::BP_CMS => 'Cockatoo\BeakFile' , // cms://... Def::BP_SESSION => 'Cockatoo\BeakFile' , // session://... Def::BP_LAYOUT => 'Cockatoo\BeakFile' , // layout://... Def::BP_COMPONENT=> 'Cockatoo\BeakFile' , // component://... Def::BP_STATIC => 'Cockatoo\BeakFile' , // static://... Def::BP_STORAGE => 'Cockatoo\BeakFile' , // storage://... Def::BP_ACTION => 'Cockatoo\BeakProxy' , // action://... null );
この場合BeakProxyが採用され、リモートサーバのアクションがコールされます。
- "action://wiki-acion/wiki/PageAction" => BeakProxy = (RPC)
- "action://core-acion/wiki/AccountAction" => BeakProxy = (RPC)
しかしRPCオーバーヘッドより小さな処理や
一部のストレージをmemcachedに流したかったりする要望がありました。
今回、設定項目が増え、より柔軟な構成が可能になりました。
== config.php ==
self::$EXT_BEAKS = array (
'action://core-action/' => 'Cockatoo\BeakAction' ,
null
);
$EXT_BEAKSは$BEAKSより優先されます。
よって上記の設定と合わせて以下の様に動作します。
class DeviceSelector
名称変更 TemplateSelector