製品のコレクションの最低価格などを決定するために、Java コレクションで集計関数を実行する簡単な方法を探しています。しかし、私はそれを純粋な Java で実行したくはありませんが、ユーザーが入力できるある種の DSL / スクリプト / 式言語であるため、可能な限りシンプルにする必要があります。
次のオブジェクト構造があるとします。
Product:
id: product1
offers: [offer1, offer2]
Offer1:
id: offer1
data:
price: 10.99
shipCost: 3.99
Offer2:
id: offer2
data:
price: 5.99
shipCost: 3.99
上記の例では、最終結果は次のようになります。
minPriceOfProduct1 = 5.99
これで、アプリケーションのユーザーは製品のリストを表示できます。各製品について、すべてのオファーの最小値である最小価格を取得したいと考えています。ユーザーは基礎となるデータストアにアクセスできないため、SQL はオプションではありません。私たちが持っている唯一のものはJavaオブジェクトです。ユーザーには何らかの表現言語を使って表現してもらいたい。
現在、Freemarker コードのスニペットを各製品に適用してデータを取得したり、次のような属性に基づいて新しい値を計算したりすることができます。
<#if (item.isProduct() && item.offers??) >
<#assign offerMinPrice = -1>
<#list item.offers as o>
<#if (offerMinPrice == -1 || ( o.data.priceCents?? && o.data.priceCents < offerMinPrice ) )>
<#assign offerMinPrice=o.data.priceCents! >
</#if>
</#list>
<#if offerMinPrice != -1>
${offerMinPrice}
<#else>
${priceCents}
</#if>
<#else>
${priceCents!}
</#if>
これは機能しますが、私の脳を出血させるだけでなく、醜いコードです。次のような、より単純な式言語のアプローチが必要です。
minOffersPrice = min(product.offers.data.price)
これはユーザーにとってはるかに単純に見え、内部で同じ集計を行う必要があります。
どのようなアプローチが頭に浮かびますか?Web を検索すると、次のことが頭に浮かびます。
- MVEL 式言語http://mvel.codehaus.org/MVEL+2.0+Operators (集計関数を解決していないようです)
- JoSQL http://josql.sourceforge.net/
- ラムダ式やクロージャなど
- Java での Rhino Javascript
- Java Reflections または apache commons beanutils と組み合わせた手動解析
ありがとうクリストフ