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: *

*

* 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") } }