Changeset 5117


Ignore:
Timestamp:
05/02/14 09:09:56 (10 years ago)
Author:
Twan Goosen
Message:

Using collator for comparison when sorting by value in facet field values provider
Fixes #544

Location:
vlo/trunk/vlo-web-app/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProvider.java

    r4950 r5117  
    2323import eu.clarin.cmdi.vlo.pojo.FieldValuesFilter;
    2424import eu.clarin.cmdi.vlo.pojo.FieldValuesOrder;
     25import java.text.Collator;
    2526import java.util.Collection;
    2627import java.util.Iterator;
    2728import java.util.List;
     29import java.util.Locale;
    2830import org.apache.solr.client.solrj.response.FacetField;
    2931import org.apache.solr.client.solrj.response.FacetField.Count;
     32import org.apache.wicket.Session;
     33import org.apache.wicket.WicketRuntimeException;
    3034import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
    3135import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvider;
    3236import org.apache.wicket.model.IModel;
    3337import org.apache.wicket.model.Model;
     38import org.slf4j.Logger;
     39import org.slf4j.LoggerFactory;
    3440
    3541/**
     
    4450public class FacetFieldValuesProvider extends SortableDataProvider<FacetField.Count, FieldValuesOrder> {
    4551
     52    private final static Logger logger = LoggerFactory.getLogger(FacetFieldValuesProvider.class);
    4653    private final IModel<FacetField> model;
    4754    private final int maxNumberOfItems;
     
    169176        final Ordering ordering;
    170177        if (getSort().getProperty() == FieldValuesOrder.COUNT) {
    171             ordering = COUNT_ORDERING;
     178            ordering = countOrdering;
    172179        } else if (getSort().getProperty() == FieldValuesOrder.NAME) {
    173             ordering = NAME_ORDERING;
     180            ordering = nameOrdering;
    174181        } else {
    175182            ordering = Ordering.natural();
     
    183190    }
    184191
    185     private static Ordering<FacetField.Count> COUNT_ORDERING = new Ordering<FacetField.Count>() {
     192    private final Ordering<FacetField.Count> countOrdering = new Ordering<FacetField.Count>() {
    186193
    187194        @Override
     
    191198    };
    192199
    193     private static Ordering<FacetField.Count> NAME_ORDERING = new Ordering<FacetField.Count>() {
     200    private final Ordering<FacetField.Count> nameOrdering = new Ordering<FacetField.Count>() {
     201        private final Collator collator;
     202
     203        {
     204            collator = Collator.getInstance(getLocale());
     205            collator.setStrength(Collator.PRIMARY);
     206        }
    194207
    195208        @Override
    196209        public int compare(Count arg0, Count arg1) {
    197             // TODO: From old VLO:
    198             return arg0.getName().compareToIgnoreCase(arg1.getName());
     210            return collator.compare(arg0.getName(), arg1.getName());
    199211        }
    200212    };
     213
     214    protected Locale getLocale() {
     215        try {
     216            final Session session = Session.get();
     217            if (session != null) {
     218                return session.getLocale();
     219            }
     220        } catch (WicketRuntimeException ex) {
     221            logger.info("No session available, falling back to JVM default locale");
     222        }
     223        return Locale.getDefault();
     224    }
    201225
    202226    /**
  • vlo/trunk/vlo-web-app/src/test/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProviderTest.java

    r4951 r5117  
    2222import java.util.Collection;
    2323import java.util.Iterator;
     24import java.util.Locale;
     25import java.util.Locale;
    2426import org.apache.solr.client.solrj.response.FacetField;
    2527import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
     
    188190        valueCount = result.next();
    189191        assertEquals("first value", valueCount.getName());
     192
     193        assertFalse(result.hasNext());
     194    }
     195
     196    /**
     197     * Test of iterator method, of class FacetFieldValuesProvider.
     198     */
     199    @Test
     200    public void testIteratorNameOrderCollation() {
     201        facetField = new FacetField("field");
     202        facetField.add("a value", 1);
     203        facetField.add("some other value", 1);
     204        facetField.add("à€œà€Ÿà€€", 1);
     205        facetField.add("Etwas anderes", 1);
     206        facetField.add("één nederlandse waarde", 1);
     207
     208        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, true)) {
     209
     210            @Override
     211            protected Locale getLocale() {
     212                return Locale.ENGLISH;
     213            }
     214
     215        };
     216
     217        final long first = 0;
     218        final long count = 100;
     219        final Iterator<? extends FacetField.Count> result = instance.iterator(first, count);
     220
     221        //sorted by name (ascending)
     222        assertTrue(result.hasNext());
     223        assertEquals("a value", result.next().getName());
     224
     225        // diacritics
     226        assertTrue(result.hasNext());
     227        assertEquals("één nederlandse waarde", result.next().getName());
     228
     229        // capitalisation
     230        assertTrue(result.hasNext());
     231        assertEquals("Etwas anderes", result.next().getName());
     232
     233        assertTrue(result.hasNext());
     234        assertEquals("some other value", result.next().getName());
     235
     236        // other scripts
     237        assertTrue(result.hasNext());
     238        assertEquals("à€œà€Ÿà€€", result.next().getName());
    190239
    191240        assertFalse(result.hasNext());
Note: See TracChangeset for help on using the changeset viewer.