U-NEXTさんからSolrFlute,KVSFluteコントリビュート頂きました

二つのプレゼント!

DBFlute/LastaFlute
を全面的に使って頂いている、

U-NEXTさん!

より、
一気に二つのプレゼントを頂きました。

☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★

SolrFlute
 => Solrからタイプセーフな検索APIを自動生成

KVSFlute
 => KVS(Redis)を活用するタイプセーフな検索API自動生成

☆★☆★☆★☆★☆★

DBFluteらしい思想のツールです。
RDBじゃなくてもタイプセーフ!

...

こないだの DBFluteフェス2016、
そして、JJUG CCC 2016 Fall でも、
発表がありました。
そのときの資料読んだ方が早いです(^^。

社内の開発改善からOSS公開へ:
DBFluteのプラグインを開発したお話 | @nashcft

...

ありがとうございます!
こちらの Githubリポジトリにプルリクを頂きました。

// RDBじゃないDBの DBFlute Example
dbflute-example-with-non-rdb | Github


SolrFlute

Solr の schema.xml を読み込んで、
Solr用の Behavior と ConditionBean を自動生成します。
OptionalEntity<SolrExample> result
        = solrExampleBhv.selectFirst(cb -> {
    cb.query().setProductName_RangeSearchFrom("P");
});

SolrPagingResultBean<SolrExample> result
        = solrExampleBhv.selectPage(cb -> {
    cb.query().setLatestPurchaseDate_RangeSearchFrom(from);
    cb.paging(10, 1);
});

SolrFacetResultBean result
        = solrExampleBhv.selectFacetQuery(cb -> {
    cb.query().setProductName_Equal("foo");
    cb.addFacetQuery(qb -> {
        qb.setLatestPurchaseDate_RangeSearchTo(...);
        qb.setLatestPurchaseDate_RangeSearch(...);
        qb.setLatestPurchaseDate_RangeSearchFrom(...);
    });
    cb.query().addOrderBy_ProductName_Asc();
});
コードの見た目は別に目新しくないかもしれない笑。
つまり、普通の ConditionBean と同じなんです。

それが嬉しいですよね。
同じノリで書けて、そしてSolrもタイプセーフ!!!

KVSFlute

こっちはもうちょい複雑ですが便利です。
KVS (Redis) ってスキーマ構造が存在しませんが、
別にぐちゃぐちゃに入れるわけではありません。
ある程度、
"こういう名前でこういうのを入れる"
って決めてプログラムで制御するものです。

ということは...

"こういう名前でこういうのを入れる"

という情報さえわかれば、
同じように ConditionBean が作れるだろうと。

その情報は、とある JSON 形式のファイルに書いておきます。
{
    "product": {
        "$comment": "Product",
        "productId": {
            "$comment": "ID",
            "many": false,
            "kvsKeys": ["PRODUCT_ID"]
        },
        "categoryCode": {
            "$comment": "Category code of each product",
            "many": true,
            "kvsKeys": ["PRODUCT_CATEGORY_CODE"],
            "orderBy": ["REGULAR_PRICE", "PRODUCT_ID"] 
        }
    }
}
そして、自動生成すると...
OptionalEntity<Product> result
        = kvsProductBhv.selectEntityByProductId(cb -> {
    cb.query().setProductId_Equal(productId);
});

List<Product> productList
        = kvsProductBhv.selectListByCategoryCode(cb -> {
    cb.query().setProductCategoryCode_Equal(categoryCode);
    cb.query().setProductStatusCode_Equal(statusCode);
    cb.query().addOrderBy_RegisterDatetime_Desc();
});

kvsProductBhv.insertOrUpdateByCategoryCode(() -> {
    Product product = new Product();
    product.setProductName(productName);
    product.setProductHandleCode(productHandleCode);
    product.setProductCategoryCode(categoryCode);
    product.setProductStatusCode_OnSaleProduction();
    product.setRegularPrice(price);
    return product;
});
大きく二つの機能分かれていて...

o KVSキャッシュ
o KVSストア

...

KVSキャッシュは、RDBのキャッシュとしてKVSを使う。

1. 指定された条件に一致するKVSにあればそれを戻す
2. なければRDBから検索する
3. その検索されたデータをKVSに登録しておく
4. その検索されたデータを戻す

このよくあるキャッシュの手続きも、
自動生成されたクラスの中で解決しています。
RDB の Behavior と簡単に連携できるのが特徴。

...

KVSストアは、もっとシンプル。
単にKVSにデータを出し入れするだけ。
それがタイプセーフになっていると。

いずれもFreeGen

いずれも、
DBFlute の FreeGen で実現されています。

FreeGenタスク

もともとは、ESFluteに大きな影響を受けていますから...

// ESFluteによるElasticsearchでのO/Rマッパーを用いた開発 
http://www.slideshare.net/shinsuke/esfluteelasticsearchor

同じような仕組み(FreeGen)、
同じようなインターフェース(Bhv,CB)、
になっています。

U-NEXTとDBFlute

U-NEXTさんは、以前、
「DBFlute使いたい!」
ということで社内の勉強会にjfluteを呼び...
 => u-next DBFlutist | jfluteの日記

DBFlute使ってサービス再構築に大成功。
 => 大規模映像配信サービスのJava8による全面リニューアルの裏側

LastaFlute (SAFlute含む) も全面的に導入。
アクセス数半端ないサービスをこなしています。

jfluteも、その後も定期的な勉強会を重ねて交流し、
いまは「アーキテクチャデザインのアドバイザー」
をさせてもらっています。
アーキチームに優秀な人が多く、
どんどんDBFlute/LastaFluteを使いこなして
問題を解決していっているのが印象的です。

今回の、KVSFlute/SolrFluteがまさしくそうですね。
jfluteはレビューやアドバイスなどはさせて頂きましたが、
実装とかはほとんどやっていません。
現場のアーキテクトが作り上げたーという感じですね。
(必要に応じて、DBFlute本体の調整とかはしたかな笑)

...

そして、
若い優秀なアーキテクトもいて(プルリクくれた人)、
アーキテクチャデザインの考え方とか判断や行動など、
アーキテクト教育もついでにやってます(^^。
jfluteとしては「アーキテクトを育てる」って、
ずっとやりたかったことの一つなので、
そういう機会がとっても貴重ですね。

オープンソースのいのち

こないだの DBFluteフェス2016 では、
個人オープンソースのジレンマなども
お話させて頂きましたが、
こういった企業からのコントリビュートは、
DBFluteの大きな継続力となります。

本当に感謝感謝です。
ありがとうございます。
10年オープンソース続けてきた身からすれば、
泣きそうなくらい嬉しいことですよ。

U-NEXTさんのおかげで、
LastaFluteもパワーアップして、
しっかり堅いフレームワークに進化しています。

「OSSを使って、OSSにフィードバックして」

理想のオープンソースの使い方をしている
企業だなぁとしみじみ思います。

jfluteは、
DBFlute/LastaFlute使っている会社を
応援しています。