myfaces-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Mike Kienenberger" <mkien...@gmail.com>
Subject Re: [jira] Commented: (TOMAHAWK-952) Provide cleaner, consistent sorting for dataTable and selectItems
Date Fri, 30 Mar 2007 18:54:42 GMT
[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 <zdenek.sochor@ataco.cz> 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) <dev@myfaces.apache.org> 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.
> >>
> >>
> >
> >
>
>
Mime
View raw message