Transforming Data Models
Describes how data models can be transformed into different models referring to the same data.
Describes the three types of transform grouped in the IlvTreeTableDataSource data source.
Describes the adapters that are used to transform your model.
The IlvTreeTableDataSource data source
The IlvTreeTableDataSource is the basic data source that can be displayed by a treemap chart. It groups together three types of transforms in an easy-to-use API: filtering, sorting and partitioning. These transforms are optional.
The IlvTreeTableDataSource can be connected to one of the instances of IlvModelWithColumns:
The IlvTreeTableDataSource can filter, sort and partition the data. In all cases, the resulting IlvTreeListModel, accessible through getTreeModel, is the result of these model operations. It is the IlvTreeListModel that is displayed by the treemap chart renderer.
Filtering
The filtering transform hides some model objects from the resulting model. You can set a filter object by means of the method setFilterCriterion. This filter object defines the objects that are available in the resulting model. In a tree model, when a tree node is hidden, the entire tree branch below is hidden as well.
Filtering is not available when the input model is an IlvFlatTableModel.
Sorting
The sorting transform sorts the objects according to a specific criterion. In the case of a tree model, it sorts also the children set of each tree node. The sort criterion is set by means of setSortCriterion and enabled through setSorting.
Sorting is not available when the input model is an IlvFlatTableModel.
The package ilog.views.chart.datax.adapter.sort contains several Comparator implementations that are useful in this context, like the following ones.
-
IlvColumnValueComparator compares two objects by looking at the value in a specified column.
-
IlvLexicographicComparator compares two objects through multiple criteria, in a "sort by ... then by ..." way.
-
IlvUniversalComparator is able to compare any type of objects. This is useful if the given objects do not implement the Comparable interface.
Partitioning
The partitioning transform turns a flat model into a tree model, according to one or several rules that describe which objects should be grouped together and at which level. Such a rule is known as partitioner. Partitioners can be set by means of setPartitionerFactories.
Partitioning is currently not available when the input model is already a tree model. This limitation may be lifted in a future release.
The package ilog.views.chart.datax.adapter.partition contains several IlvPartitionerFactory implementations that are useful in this context. They all partition according to the value of the object in a given column, but act differently, depending on the value type and meaning.
-
IlvUniformScalePartitionerFactory partitions according to a numerical value, dividing the range into intervals of equal size.
-
IlvCustomScalePartitionerFactory partitions according to a numerical value, dividing the range into intervals at given threshold points.
-
IlvDatePartitionerFactory partitions according to a date value.
-
IlvStringPartitionerFactory partitions according to a string value.
-
IlvPathPartitionerFactory partitions according to a string value, interpreting the string as a path, composed of path components separated through a given set of separators.
-
IlvURLPartitionerFactory partitions according to a string value, interpreting the string as a URL.
-
IlvFilenamePartitionerFactory partitions according to a string value, interpreting the string as a file name.
-
IlvHostnamePartitionerFactory partitions according to a string value, interpreting the string as an Internet host name.
Here is an example showing the connection of an IlvFlatListModel to an IlvTreeTableDataSource, that groups the objects by country, sorts them alphabetically, and filters them to keep only those with positive performance.
final IlvFlatListModel model = ...;
IlvDataColumnInfo nameColumn = model.getColumn(0);
IlvDataColumnInfo countryColumn = IlvColumnUtilities.getColumnByName(model, "Country");
final int performanceColumnIndex = IlvColumnUtilities.getColumnIndexByName(model, "Performance");
// Create the data source.
IlvTreeTableDataSource dataSource = new IlvTreeTableDataSource();
dataSource.setUnderlyingModel(model);
// Activate filtering.
dataSource.setFilterCriterion(new IlvAbstractFilter() {
public boolean evaluate(Object object) {
return model.getDoubleAt(object, performanceColumnIndex) >= 0;
}
});
// Activate sorting.
dataSource.setSortCriterion(new IlvColumnValueComparator(model, nameColumn, null, false));
dataSource.setSorting(true);
// Activate partitioning.
dataSource.setPartitionerFactories(new IlvPartitionerFactory[] {
new IlvStringPartitionerFactory(countryColumn)
});
Model adapters
The IlvTreeTableDataSource uses some of the filtering, partitioning, and sorting adapters to perform the filtering, partitioning and sorting, as needed. However, sometimes it can be useful to perform these operations separately.
This can be the case when:
-
You need two filtering passes: one before partitioning and one after partitioning.
-
Your input model is not one of the five extended data models, but a Swing model.
To transform your model, you can use one of the following adapters:
All these adapters are located in the package ilog.views.chart.datax.adapter.
Model Adapters Relationships
Adapters that Convert Models
The adapter listed in the table below convert one type of model into models of another type, as faithfully as possible.
Adapters from IlvTreeListModel |
IlvTreeListToTreeSetModel IlvTreeListToFlatListModel IlvTreeListToFlatTableModel IlvTreeListToTreeTableModelFactory IlvTreeListToTreeModel |
Adapters from IlvTreeSetModel |
None |
Adapters from IlvFlatListModel |
IlvFlatListToFlatSetModel IlvFlatListToFlatTableModel |
Adapters from IlvFlatSetModel |
IlvFlatSetToFlatTableModel |
Adapters from IlvFlatTableModel |
IlvFlatTableToFlatListModel IlvFlatTableToTableModel IlvFlatTableToListModel |
Adapters from IlvDataSource |
IlvDataSourceToFlatTableModel |
Adapters from Swing TreeTableModel |
IlvTreeTableToTreeListModel |
Adapters from Swing TreeModel |
IlvTreeToTreeListModel IlvTreeToFlatTableModel |
Adapters from Swing TableModel |
IlvTableToFlatTableModel |
Adapters from Swing ListModel |
IlvListToFlatTableModel IlvListToFlatListModel |
Adapters for Filtering
These adapters perform the filtering transform of models, as discussed in the section Filtering.
These adapters select a branch of a tree model.
Adapters for Sorting
These adapters perform the sorting transform of models, as discussed in the section Sorting.
Adapters for Partitioning
These adapters perform the partitioning transform of models, as discussed in the section Partitioning.
The partitioning transform introduces extra nodes in the resulting tree model. These extra nodes represent a group (cluster) of nodes and that were not present in the original model. These nodes are of the type IlvClusterNode. By means of the method getId you can retrieve information about the common properties of the cluster. This information is of the type IlvClusterId. Each partitioner has a particular flavor of IlvClusterId, as shown in the following table:
Partitioner |
The IlvClusterId Class |
IlvIntervalClusterId |
|
IlvIntervalClusterId |
|
IlvDateClusterId |
|
IlvStringClusterId |
|
IlvPathClusterId |
|
IlvPathClusterId |
|
IlvPathClusterId |
|
IlvPathClusterId |
Here is an example showing how to convert a Swing TableModel to an IlvTreeListModel, that groups the rows by country, sorts them alphabetically, and filters them to keep only those with positive performance.
TableModel model = ...;
final int nameColumnIndex = 0;
final int countryColumnIndex = 2;
final int performanceColumnIndex = 3;
// Convert the model to a list of objects.
IlvFlatTableModel tableModel =
new IlvTableToFlatTableModel(model,
new IlvDataColumnInfo[] {
new IlvDefaultDataColumnInfo("Name", String.class),
new IlvDefaultDataColumnInfo("Founded", Date.class),
new IlvDefaultDataColumnInfo("Country", String.class),
new IlvDefaultDataColumnInfo("Performance", Double.class)
});
IlvDataColumnInfo nameColumn =
tableModel.getColumn(nameColumnIndex);
IlvDataColumnInfo countryColumn =
tableModel.getColumn(countryColumnIndex);
IlvFlatListModel listModel =
new IlvFlatTableToFlatListModel(tableModel);
// Add a filter.
IlvFlatListModel filteredModel =
new IlvFilteredFlatListModel(listModel,
new IlvAbstractFilter() {
public boolean evaluate(Object object) {
return model.getDoubleAt(object, performanceColumnIndex) >= 0;
}
});
// Add sorting.
IlvFlatListModel sortedModel =
new IlvSortedFlatListModel(filteredModel,
new IlvColumnValueComparator(sortedModel, nameColumn,
null, false));
// Add partitioning.
IlvTreeListModel partitionedModel =
new IlvFlatListToTreeListModel(sortedModel,
new IlvStringPartitionerFactory(countryColumn),
null, 1);