You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@myfaces.apache.org by "Kamran Kashanian (JIRA)" <de...@myfaces.apache.org> on 2009/11/04 02:11:32 UTC
[jira] Updated: (TRINIDAD-1620) New APIs for Trinidad
CollectionModel and TreeModel to better deal with large data sets
[ https://issues.apache.org/jira/browse/TRINIDAD-1620?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Kamran Kashanian updated TRINIDAD-1620:
---------------------------------------
Status: Patch Available (was: Open)
> New APIs for Trinidad CollectionModel and TreeModel to better deal with large data sets
> ----------------------------------------------------------------------------------------
>
> Key: TRINIDAD-1620
> URL: https://issues.apache.org/jira/browse/TRINIDAD-1620
> Project: MyFaces Trinidad
> Issue Type: New Feature
> Components: Components
> Affects Versions: 1.2.12-core
> Environment: All
> Reporter: Kamran Kashanian
>
> Submitting a proposal for a new set of APIs for Trinidad CollectionModel and TreeModel. The new APIs are intended to enable a model user (usually the renderer) to better deal with large data sets (large models) and provide the user more control over API calls that can cause a potentially expensive data fetch in the model.
> The issue with the existing CollectionModel APIs is that APIs such as setRowKey/setRowIndex/isRowAvailable can force the model to perform a data fetch.
> For large models, the renderer may need to optimize it's rendering and delay fetching data if a range of rows are not locally available. Also sometimes the client needs to convert row indices to a row keys (setRowIndex followed by getRowKey) without forcing a potentially expensive data fetch.
> Proposing the following new APIs:
>
> 1) Add a new interface called LocalRowKeyIndex (modeled after the existing org.apache.myfaces.trinidad.model.RowKeyIndex interface) which provides a set of local APIs. The "local" APIs allow a client to query the model and determine if a set of rows are locally available. "Locally available" can mean the model has the given set of rows in a local cache and can honor a fetch request efficiently (for example, without performing a SQL query).
> package org.apache.myfaces.trinidad.model;
> public interface LocalRowKeyIndex
> {
> /**
> * Given a row index, check if a row is locally available
> * @param rowIndex index of row to check
> * @return true if row is locally available
> */
> public boolean isRowLocallyAvailable(int rowIndex);
> /**
> * Given a row key, check if a row is locally available
> * @param rowKey row key for the row to check
> * @return true if row is locally available
> */
> public boolean isRowLocallyAvailable(Object rowKey);
> /**
> * Check if a range of rows is locally available starting from a row index
> * @param startIndex staring index for the range
> * @param rowCount number of rows in the range
> * @return true if range of rows is locally available
> */
> public boolean isRangeLocallyAvailable(int startIndex, int rowCount);
> /**
> * Check if a range of rows is locally available starting from a row key
> * @param rowKey staring row key for the range
> * @param rowCount number of rows in the range
> * @return true if range of rows is locally available
> */
> public boolean isRangeLocallyAvailable(Object rowKey, int rowCount);
>
> /**
> * Convenient API to return a row count estimate. This method can be optimized
> * to avoid a data fetch which may be required to return an exact row count
> * @return estimated row count
> */
> public int getEstimatedRowCount();
> /**
> * Helper API to determine if the row count returned from {@link #getEstimatedRowCount}
> * is EXACT, or an ESTIMATE
> */
> public Confidence getEstimatedRowCountConfidence();
>
> /**
> * Enum used in the {@link #getEstimatedRowCountConfidence} API to determine
> * if the row count is exact or an estimate
> */
> public enum Confidence
> {
> /**
> * The row count returned by {@link #getEstimatedRowCount} is exact
> */
> EXACT,
> /**
> * The row count returned by {@link #getEstimatedRowCount} is an estimate
> */
> ESTIMATE
> }
> }
> 2) Enhance the APIs in the existing org.apache.myfaces.trinidad.model.RowKeyIndex interface to add support for:
> a) Row key - based APIs so the client does not have to perform row key to row index conversion (and potentially cause unnecessary data fetch)
> b) Provide new APIs to enable the client to check for availability of a range of rows without having to loop over the rows and call the existing isRowAvailable API.
> Add the following methods to the existing org.apache.myfaces.trinidad.model.RowKeyIndex interface:
> /**
> * Check for an available row by row key.
> * @param rowKey the row key for the row to check.
> * @return true if a value exists; false otherwise.
> */
> public boolean isRowAvailable(Object rowKey);
> /**
> * Get row data by row key.
> * @param rowKey the row key for the row to get data.
> * @return row data
> */
> public Object getRowData(Object rowKey);
> /**
> * Check if a range of rows is available starting from the current position
> * @param rowCount number of rows to check
> * @return true if all rows in range are available
> */
> public boolean isRangeAvailable(int rowCount);
> /**
> * Check if a range of rows is available from a starting index without
> * requiring the client to iterate over the rows
> * @param startIndex the starting index for the range
> * @param rowCount number of rows to check
> * @return true if all rows in range are available
> */
> public boolean isRangeAvailable(int startIndex, int rowCount) ;
> /**
> * Check if a range of rows is available from a starting row key without
> * requiring the client to iterate over the rows
> * @param rowKey the starting row key for the range
> * @param rowCount number of rows to check
> * @return true if all rows in range are available
> */
> public boolean isRangeAvailable(Object rowKey, int rowCount) ;
> 3) Provide local APIs in org.apache.myfaces.trinidad.model.TreeModel for example to check if data for a child collection is locally available:
> /**
> * Indicates whether data for a child model (children of the current node) is
> * locally available. Locally available means no data fetch is required
> * as a result of a call to {@link #enterContainer}. The default
> * implementation returns true if the current node is a container.
> * Override to optimize for the case where child data is not locally available
> * @return true if child data is locally available
> */
> public boolean isChildCollectionLocallyAvailable()
> {
> return isContainer();
> }
> /**
> * Indicates whether child data for the node with the given index is
> * locally available. This method first checks to see if the parent node
> * at the given index is locally available by calling {@link #isRowLocallyAvailable(int}.
> * If the parent node is locally available, this method moves the model to the
> * parent node and calls {@link #isChildCollectionLocallyAvailable()}
> * The current row does not change after this call
> * @param index
> * @return true if child data is available, false otherwise
> */
> public boolean isChildCollectionLocallyAvailable(int index)
> {
> if (isRowLocallyAvailable(index))
> {
> int oldIndex = getRowIndex();
> try
> {
> setRowIndex(index);
> return isChildCollectionLocallyAvailable();
> }
> finally
> {
> setRowIndex(oldIndex);
> }
> }
> else
> {
> return false;
> }
> }
> /**
> * Indicates whether child data for the node with the given row key is
> * locally available. This method first checks to see if the parent node
> * with the given row key is locally available by calling {@link #isRowLocallyAvailable(Object)}.
> * If the parent node is locally available, this method moves the model to the
> * parent node and calls {@link #isChildCollectionLocallyAvailable()}
> * The current row does not change after this call
> * @param rowKey
> * @return true if child data is available, false otherwise
> */
> public boolean isChildCollectionLocallyAvailable(Object rowKey)
> {
> if (isRowLocallyAvailable(rowKey))
> {
> Object oldKey = getRowKey();
> try
> {
> setRowKey(rowKey);
> return isChildCollectionLocallyAvailable();
> }
> finally
> {
> setRowKey(oldKey);
> }
> }
> else
> {
> return false;
> }
> }
> The following changes will be required to support the above APIs:
> 1) Add the new LocalRowKeyIndex interface to the org.apache.myfaces.trinidad.model. package
> 2) org.apache.myfaces.trinidad.model.CollectionModel will implement the new LocalRowKeyIndex interface and will provide default implementation for the local APIs. The default implementation of local APIs will just call the existing non-local APIs
> 3) UIXIterator and UIXHierarchy will implement the new LocalRowKeyIndex interface and provide the component level implementations for the local APIs. The component level implementations just delegate to the model
> 4) Provide trivial implementation for the new APIs in org.apache.myfaces.trinidad.model.CollectionModelDecorator
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.