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.

Note

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.

Note

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.

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.

Note

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.

  • IlvPathPartitionerFactory partitions according to a string value, interpreting the string as a path, composed of path components separated through a given set of separators.

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

IlvUniformScalePartitionerFactory

IlvIntervalClusterId

IlvCustomScalePartitionerFactory

IlvIntervalClusterId

IlvDatePartitionerFactory

IlvDateClusterId

IlvStringPartitionerFactory

IlvStringClusterId

IlvPathPartitionerFactory

IlvPathClusterId

IlvURLPartitionerFactory

IlvPathClusterId

IlvFilenamePartitionerFactory

IlvPathClusterId

IlvHostnamePartitionerFactory

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);