package gw.rating.rtm.valueprovider
uses gw.api.locale.DisplayKey
uses java.util.Map
uses java.util.Set
uses java.util.HashMap
uses java.util.TreeSet
uses gw.rating.rtm.domain.DatabasePopulator
uses gw.rating.rtm.domain.PersistenceAdapter
uses gw.rating.rtm.domain.table.RateTableModel
uses gw.rating.rtm.domain.table.RateTableCell
/**
*
Retrieves all distinct values used in a column of a rate table (source rate table).
* Must have two arguments configured:
*
* - Rate table code - code of a source rate table
* - Column name - name of the column in the source rate table
*
*
* Example: gw.rating.rtm.valueprovider.ReferenceFactorValueProvider(MakeModelYear,ClassCode) -
* will retrieve all distinct values from ClassCode column of
* MakeModelYear rate table.
*
* Note: the lookup of the source rate table is done in the same rate book as the table
* specifying this value provider.
*
*/
class ReferenceFactorValueProvider extends RateTableCellValueProvider {
private var _cache : Map> = new HashMap>()
construct(column : RateTableColumn) {
super(column)
}
/**
* Returns a list of distinct values from a specific column of the source rate table.
*
* @see gw.rating.rtm.valueprovider.RateTableCellValueProvider#getValues(KeyableBean)
*/
override function getValues(adapter : PersistenceAdapter) : String[] {
return getValuesAsSet(adapter).toTypedArray()
}
override function containsCodeFor(cell : RateTableCell) : boolean {
return getValuesAsSet(cell.Adapter).contains(cell.Value as String)
}
private function getValuesAsSet(adapter : PersistenceAdapter) : Set {
// must have 2 arguments configured
// 1) table code
// 2) factor column code
if (Arguments == null or Arguments.length < 2) return {}
var tableCode = Arguments[0]
var columnCode = Arguments[1]
var cacheKey = Arguments.join(",")
var values = _cache.get(cacheKey)
if (values == null) {
values = new TreeSet()
try {
// find rate table that this factor bean belongs to
var rateTable = adapter.getFieldValue("RateTable") as RateTable
// through the rate book that the rate table belongs to, find the referenced table
var sourceTable = rateTable.RateBook.RateTables.firstWhere(\ rt -> rt.Definition.TableCode == tableCode)
// find a factor column in the referenced table's definition
var factorColumn = sourceTable.Definition.AllColumns.firstWhere(\ f -> f.ColumnName == columnCode)
// create a populate rate table model for source rate table
var model = new RateTableModel(sourceTable)
new DatabasePopulator().refresh(model)
// get factor values form all rate table rows
model.FactorRows.each(\ row -> {
var f = row.cellForColumn(factorColumn).Value
if (f != null) {
values.add(f.toString())
}
})
} catch (ex : java.lang.NullPointerException) {
// if any of the objects was null
values = {}
}
_cache.put(cacheKey, values)
}
return values
}
/**
* Returns code itself.
* @see gw.rating.rtm.valueprovider.RateTableCellValueProvider#valueByCode(KeyableBean, String)
*/
override function valueByCode(adapter : PersistenceAdapter, code : String) : String {
return code
}
/**
* Always return false.
* @see gw.rating.rtm.valueprovider.RateTableCellValueProvider#HasCodedValue
*/
override property get HasCodedValue() : boolean {
return false
}
override function getValueMap(args : String[]) : Map {
return {}
}
override property get ArgumentsHelpText() : String {
return DisplayKey.get("Web.Rating.RateTableDefinition.ValueProvider.HelpText.ReferenceFactorValueProvider")
}
}