Happens :D

I wonder, who came up with this (from TLD):
     <attribute>
        <name>sortColumn</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
        <description>
Value reference to a model property that gives the current sort column name. The target String property is set to the "columnName" of whichever column has been chosen to sort by, and the method which is bound to the "value" attribute of this table (ie which provides the DataModel used) is expected to use this
               property to determine how to sort the DataModel's contents.
           </description>
     </attribute>

Column has NO name property (this has meaning only for sortheader)

Zdenek

Mike Kienenberger napsal(a):

[Oops -- I forgot to hit send....]


If you're trying to say that the current sorting code is a bit odd,
I'd agree :-)

I think it needs to be rethought and rewritten.

Some of the things I suspect:
- You cannot have a sorted display without creating user-clickable
sortable headers.
- You cannot specify a list of sort criteria, even though the API
indicates it takes a list.

On 3/30/07, Zdeněk Sochor <[EMAIL PROTECTED]> wrote:

Not a problem having discussion here, Mike ;)

By looking on HtmlDataTable i found weird thing dealing with sorting:

setSortProperty method is NOT called with sortColumn property ->
if (isSortable && getSortProperty() != null) fails for table w/o column
with defaultSorted [line 877]->
NO SortCriterion ever made ->

NOT SORTED data in model :(

The same goes for iteration in encodeBegin(FacesContext).

Zdenek


Mike Kienenberger napsal(a):

> If possible, let's talk about the general concept on the existing
> MyFaces-dev thread.   Discussions in JIRA clog up the issue and have a
> much lower visibility than the dev mailing list.  I'd like to keep the
> JIRA issue focused on the changes (we can add summaries of any
> discussion points as well if they seem relevent).
>
> On 3/30/07, Zdenek Sochor (JIRA) <[email protected]> wrote:
>
>>
>>     [
>> https://issues.apache.org/jira/browse/TOMAHAWK-952?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12485561
>> ]
>>
>> Zdenek Sochor commented on TOMAHAWK-952:
>> ----------------------------------------
>>
>> Hi,
>>   do u really have to set sort order in JSF (if only read-only)?
>> I think it's way too slower to do sorting in dataTable's internal
>> model than using custom comparator on collection in backing bean.
>> We're using Collections.sort(List, Comparator) method in bean to
>> achieve sorted data in table.
>>
>> Regards,
>>   Zdenek
>>
>> > Provide cleaner, consistent sorting for dataTable and selectItems
>> > -----------------------------------------------------------------
>> >
>> >                 Key: TOMAHAWK-952
>> >                 URL:
>> https://issues.apache.org/jira/browse/TOMAHAWK-952
>> >             Project: MyFaces Tomahawk
>> >          Issue Type: New Feature
>> >          Components: Extended Datatable, Extended SelectItems, New
>> Component
>> >    Affects Versions: 1.1.6-SNAPSHOT
>> >            Reporter: Mike Kienenberger
>> >         Assigned To: Mike Kienenberger
>> >            Priority: Minor
>> >
>> > My requirements in most cases are to specify a sort order in the
>> page code, not to allow end-users to manipulate the sort
>> > order.    From what I can tell, there's no easy way to do this. I
>> documented the most effective method I could find on the wiki under a
>> "static sorting" subheading, but even that method leaves unnecessary
>> links in the column headers.
>> > At the same time, I looked into what it would take to make sorting
>> cleaner and more user-friendly.
>> > I came up with a subclass of extended dataTable and a replacement
>> SortableModel that did what I wanted for the most part:
>> > <my:sortableDataTable
>> >        preserveDataModel="true"
>> >        value="#{bean.carList}"
>> >        var="car"
>> >        >
>> >        <f:facet name="comparator">
>> >                <my:propertyComparator
>> >                        property="style.color"
>> >                        descending="true" />
>> >        </f:facet>
>> > </my:sortableDataTable>
>> > This is based in part on reusing my components for sorting
>> selectItem lists.   For some reason, couldn't make this work without
>> using preserveDataModel.   [Strangely enough, doing the same thing
>> with the current t:dataTable sort attributes didn't require
>> preserveDataModel.]
>> > In any case, a comparator component can be any UIComponent that
>> implements a ComparatorSource interface (ie, public Comparator
>> getComparator()), which provides a great deal of flexibility.
>> > The propertyComparator implementation basically does the same thing
>> as the internal guts of the current SortableModel, but is pluggable.
>> I used beanutils in my comparator rather than EL to process the
>> property expression, which also eliminates the "rowObjectGet" hack.
>> An "EL comparator" could be implemented if the EL processing features
>> were needed.
>> > I think it would be worthwhile to replace the current SortableModel
>> with a more generic pluggable one.   A good start would be to pull
>> all of the property-resolving/comparison out of it, and stick it into
>> a comparator like I did.   setSortCriteria(List criteria) appears to
>> be misnomer since only the first item in the list is used -- using a
>> comparator would also solve that issue as you can create
>> MultipleComparator that takes a list of other comparators and goes
>> through them in order.
>> > Following is what DataTable looks like to make this work.  Note
>> that this doesn't handle the current sorting options.
>> >    protected DataModel createDataModel()
>> >    {
>> >        DataModel dataModel = super.createDataModel();
>> >        UIComponent comparatorUIComponent = getComparator();
>> >        Comparator comparator = null;
>> >        if (null != comparatorUIComponent)
>> >        {
>> > if (comparatorUIComponent instanceof ComparatorSource)
>> >                {
>> >                        comparator =
>> > ((ComparatorSource)comparatorUIComponent).getComparator();
>> >                }
>> >                else
>> >                {
>> >                        // TODO: need log error instead
>> >                        throw new
>> RuntimeException("comparatorUIComponent should
>> > implement ComparatorSource");
>> >                }
>> >        }
>> >        boolean isSortable = null != comparator;
>> >        if (isSortable)
>> >        {
>> >            if (!(dataModel instanceof BaseSortableModel))
>> >            {
>> >                dataModel = new BaseSortableModel(dataModel);
>> >            }
>> > ((BaseSortableModel)dataModel).setComparator(comparator);
>> >        }
>> >        return dataModel;
>> >    }
>> > After stripping out the comparator stuff from SortableModel, these
>> are the major changes:
>> >        public void setComparator(Comparator _comparator) {
>> >                this._comparator = _comparator;
>> >                _sort();
>> >        }
>> >    private void _sort()
>> >    {
>> >        if (null == _comparator)
>> >        {
>> >            // restore unsorted order:
>> >            _baseIndicesList = _sortedIndicesList = null;
>> >                return;
>> >        }
>> >        //TODO: support -1 for rowCount:
>> >        int sz = getRowCount();
>> >        if ((_baseIndicesList == null) || (_baseIndicesList.size()
>> != sz))
>> >        {
>> >            // we do not want to mutate the original data.
>> >            // however, instead of copying the data and sorting the
>> copy,
>> >            // we will create a list of indices into the original
>> data, and
>> >            // sort the indices. This way, when certain rows are
>> made current
>> >            // in this Collection, we can make them current in the
>> underlying
>> >            // DataModel as well.
>> >            _baseIndicesList = new IntList(sz);
>> >        }
>> >        final int rowIndex = _model.getRowIndex();
>> >        _model.setRowIndex(0);
>> >        // Make sure the model has that row 0! (It could be empty.)
>> >        if (_model.isRowAvailable())
>> >        {
>> >            Collections.sort(_baseIndicesList, new
>> > RowDataComparator(_comparator, _model));
>> >            _sortedIndicesList = null;
>> >        }
>> >        _model.setRowIndex(rowIndex);
>> >    }
>> >    protected class RowDataComparator implements Comparator
>> >    {
>> >                private Comparator dataComparator = null;
>> >                private DataModel dataModel = null;
>> >                public RowDataComparator(Comparator comparator,
>> DataModel model)
>> >                {
>> >                        this.dataComparator = comparator;
>> >                        this.dataModel = model;
>> >                }
>> >                public int compare(Object arg1, Object arg2) {
>> >                        Integer r1 = (Integer)arg1;
>> >                        Integer r2 = (Integer)arg2;
>> >                        dataModel.setRowIndex(r1.intValue());
>> >                Object rowData1 = _model.getRowData();
>> >                dataModel.setRowIndex(r2.intValue());
>> >                Object rowData2 = _model.getRowData();
>> >                return dataComparator.compare(rowData1, rowData2);
>> >                }
>> >    }
>> > Also, here's how I'd like to improve t:selectItems.  I've had a
>> custom subclass of f:selectItems of this working for awhile.  Notice
>> how we can reuse the same propertyComparator component.  This
>> particular implementation can take a list of comparator children and
>> implicitly wraps them in a MultipleComparator.   That's not really
>> possible with a dataTable facet, so we'd want to provide a
>> MultipleComparator component.
>> > <my:orderedSelectItems value="#{bean.carList}">
>> >    <my:propertyComparator
>> >         property="style.color"
>> >         descending="false" />
>> > </my:orderedSelectItems>
>>
>> --
>> This message is automatically generated by JIRA.
>> -
>> You can reply to this email to add a comment to the issue online.
>>
>>
>
>



Reply via email to