Changeset 6005


Ignore:
Timestamp:
02/23/15 08:18:26 (9 years ago)
Author:
Twan Goosen
Message:

Values provider uses converted field value when sorting
Refs #553

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

Legend:

Unmodified
Added
Removed
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AllFacetValuesPanel.java

    r6002 r6005  
    2727import eu.clarin.cmdi.vlo.wicket.model.BridgeOuterModel;
    2828import eu.clarin.cmdi.vlo.wicket.provider.FacetFieldValuesProvider;
     29import eu.clarin.cmdi.vlo.wicket.provider.FieldValueConverterProvider;
    2930import java.util.Collections;
    3031import org.apache.solr.client.solrj.response.FacetField;
     
    4950import org.apache.wicket.model.Model;
    5051import org.apache.wicket.model.PropertyModel;
     52import org.apache.wicket.spring.injection.annot.SpringBean;
    5153
    5254/**
     
    5961 */
    6062public abstract class AllFacetValuesPanel extends GenericPanel<FacetField> {
     63
     64    @SpringBean
     65    private FieldValueConverterProvider fieldValueConverterProvider;
    6166
    6267    private final FacetFieldValuesProvider valuesProvider;
     
    8994
    9095        // create a provider that shows all values and is sorted by name by default
    91         valuesProvider = new FacetFieldValuesProvider(model, Integer.MAX_VALUE, FieldValueOrderSelector.NAME_SORT) {
     96        valuesProvider = new FacetFieldValuesProvider(model, Integer.MAX_VALUE, FieldValueOrderSelector.NAME_SORT, fieldValueConverterProvider) {
    9297
    9398            @Override
     
    226231    }
    227232
    228 
    229233    private class UpdateOptionsFormBehavior extends OnChangeAjaxBehavior {
    230234
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetValuesPanel.java

    r6002 r6005  
    2828import eu.clarin.cmdi.vlo.wicket.pages.AllFacetValuesPage;
    2929import eu.clarin.cmdi.vlo.wicket.provider.FacetFieldValuesProvider;
     30import eu.clarin.cmdi.vlo.wicket.provider.FieldValueConverterProvider;
    3031import java.util.Collection;
    3132import java.util.Collections;
     
    5455import org.apache.wicket.model.PropertyModel;
    5556import org.apache.wicket.request.cycle.RequestCycle;
     57import org.apache.wicket.spring.injection.annot.SpringBean;
    5658
    5759/**
     
    7274    private final IModel<String> fieldNameModel;
    7375
     76    @SpringBean
     77    private FieldValueConverterProvider fieldValueConverterProvider;
    7478    /**
    7579     * Creates a new panel with selectable values for a single facet
     
    150154     */
    151155    private DataView createValuesView(String id) {
    152         final FacetFieldValuesProvider valuesProvider = new FacetFieldValuesProvider(getModel(), MAX_NUMBER_OF_FACETS_TO_SHOW, LOW_PRIORITY_VALUES) {
     156        final FacetFieldValuesProvider valuesProvider = new FacetFieldValuesProvider(getModel(), MAX_NUMBER_OF_FACETS_TO_SHOW, LOW_PRIORITY_VALUES, fieldValueConverterProvider){
    153157
    154158            @Override
  • vlo/trunk/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProvider.java

    r5154 r6005  
    3838import org.apache.wicket.model.IModel;
    3939import org.apache.wicket.model.Model;
     40import org.apache.wicket.util.convert.IConverter;
    4041import org.slf4j.Logger;
    4142import org.slf4j.LoggerFactory;
     
    4950 */
    5051public class FacetFieldValuesProvider extends SortableDataProvider<FacetField.Count, FieldValuesOrder> implements ListProvider<FacetField.Count> {
    51 
     52   
    5253    private final static Logger logger = LoggerFactory.getLogger(FacetFieldValuesProvider.class);
    5354    private final IModel<FacetField> model;
    5455    private final int maxNumberOfItems;
    5556    private final Collection<String> lowPriorityValues;
     57    private final FieldValueConverterProvider fieldValueConverterProvider;
    5658
    5759    /**
     
    7173     * @param lowPriorityValues values that should with low priority (e.g.
    7274     * unknown, unspecified)
    73      */
    74     public FacetFieldValuesProvider(IModel<FacetField> model, Collection<String> lowPriorityValues) {
    75         this(model, Integer.MAX_VALUE, lowPriorityValues);
     75     * @param fieldValueConverterProvider
     76     */
     77    public FacetFieldValuesProvider(IModel<FacetField> model, Collection<String> lowPriorityValues, FieldValueConverterProvider fieldValueConverterProvider) {
     78        this(model, Integer.MAX_VALUE, lowPriorityValues, fieldValueConverterProvider);
    7679    }
    7780
     
    8184     * @param max maximum number of values to show
    8285     * @param lowPriorityValues (e.g. unknown, unspecified)
    83      */
    84     public FacetFieldValuesProvider(IModel<FacetField> model, int max, Collection<String> lowPriorityValues) {
    85         this(model, max, lowPriorityValues, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false));
    86     }
    87 
    88     public FacetFieldValuesProvider(IModel<FacetField> model, int max, SortParam<FieldValuesOrder> sort) {
    89         this(model, max, null, sort);
     86     * @param fieldValueConverterProvider
     87     */
     88    public FacetFieldValuesProvider(IModel<FacetField> model, int max, Collection<String> lowPriorityValues, FieldValueConverterProvider fieldValueConverterProvider) {
     89        this(model, max, lowPriorityValues, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false), fieldValueConverterProvider);
     90    }
     91   
     92    public FacetFieldValuesProvider(IModel<FacetField> model, int max, SortParam<FieldValuesOrder> sort, FieldValueConverterProvider fieldValueConverterProvider) {
     93        this(model, max, null, sort, fieldValueConverterProvider);
    9094    }
    9195
     
    97101     * @param lowPriorityValues (e.g. unknown, unspecified)
    98102     * @param sort initial sort property and order
    99      */
    100     public FacetFieldValuesProvider(IModel<FacetField> model, int max, Collection<String> lowPriorityValues, SortParam<FieldValuesOrder> sort) {
     103     * @param fieldValueConverterProvider
     104     */
     105    public FacetFieldValuesProvider(IModel<FacetField> model, int max, Collection<String> lowPriorityValues, SortParam<FieldValuesOrder> sort, FieldValueConverterProvider fieldValueConverterProvider) {
    101106        this.model = model;
    102107        this.maxNumberOfItems = max;
    103108        this.lowPriorityValues = lowPriorityValues;
     109        this.fieldValueConverterProvider = fieldValueConverterProvider;
    104110        setSort(sort);
    105111    }
     
    113119        return null;
    114120    }
    115 
     121   
    116122    @Override
    117123    public Iterator<? extends FacetField.Count> iterator(long first, long count) {
     
    119125        return getList().listIterator((int) first);
    120126    }
    121 
     127   
    122128    @Override
    123129    public List<? extends FacetField.Count> getList() {
     
    132138        }
    133139    }
    134 
     140   
    135141    @Override
    136142    public long size() {
     
    140146        return size;
    141147    }
    142 
     148   
    143149    @Override
    144150    public IModel<FacetField.Count> model(FacetField.Count object) {
     
    161167        }
    162168    }
    163 
     169   
    164170    private Iterable<Count> getFilteredValues() {
    165171        if (filtered == null) {
     
    170176        return filtered;
    171177    }
    172 
     178   
    173179    private long getSize() {
    174180        if (hasFilter()) {
     
    182188        }
    183189    }
    184 
     190   
    185191    private boolean hasFilter() {
    186192        return getFilterModel() != null && getFilterModel().getObject() != null && !getFilterModel().getObject().isEmpty();
     
    200206        }
    201207    }
    202 
     208   
    203209    private Ordering getBaseOrdering() {
    204210        final Ordering ordering;
     
    206212            ordering = new CountOrdering();
    207213        } else if (getSort().getProperty() == FieldValuesOrder.NAME) {
    208             ordering = new NameOrdering(getLocale());
     214            ordering = new NameOrdering(getLocale(), fieldValueConverterProvider.getConverter(model.getObject().getName()));
    209215        } else {
    210216            ordering = Ordering.natural();
    211217        }
    212 
     218       
    213219        if (getSort().isAscending()) {
    214220            return ordering;
     
    217223        }
    218224    }
    219 
     225   
    220226    protected Locale getLocale() {
    221227        try {
     
    229235        return Locale.getDefault();
    230236    }
    231 
     237   
    232238    private final static class CountOrdering extends Ordering<FacetField.Count> {
    233 
     239       
    234240        @Override
    235241        public int compare(Count arg0, Count arg1) {
     
    237243        }
    238244    };
    239 
     245   
    240246    private final static class NameOrdering extends Ordering<FacetField.Count> implements Serializable {
    241 
     247       
    242248        private final Collator collator;
    243 
    244         public NameOrdering(Locale locale) {
     249        private final IConverter<String> converter;
     250        private final Locale locale;
     251       
     252        public NameOrdering(Locale locale, IConverter<String> converter) {
    245253            collator = Collator.getInstance(locale);
    246254            collator.setStrength(Collator.PRIMARY);
    247         }
    248 
     255            this.converter = converter;
     256            this.locale = locale;
     257        }
     258       
    249259        @Override
    250260        public int compare(Count arg0, Count arg1) {
    251             return collator.compare(arg0.getName(), arg1.getName());
     261            if (converter == null) {
     262                return collator.compare(arg0.getName(), arg1.getName());
     263            } else {
     264                return collator.compare(
     265                        converter.convertToString(arg0.getName(), locale),
     266                        converter.convertToString(arg1.getName(), locale));
     267            }
    252268        }
    253269    };
     
    258274     */
    259275    private static class PriorityOrdering extends Ordering<FacetField.Count> {
    260 
     276       
    261277        private final Collection<String> lowPriorityValues;
    262 
     278       
    263279        public PriorityOrdering(Collection<String> lowPriorityValues) {
    264280            this.lowPriorityValues = lowPriorityValues;
    265281        }
    266 
     282       
    267283        @Override
    268284        public int compare(Count arg0, Count arg1) {
    269 
     285           
    270286            if (lowPriorityValues.contains(arg0.getName())) {
    271287                if (!lowPriorityValues.contains(arg1.getName())) {
     
    281297            return 0;
    282298        }
    283 
     299       
    284300    };
    285 
     301   
    286302    @Override
    287303    public void detach() {
  • vlo/trunk/vlo-web-app/src/test/java/eu/clarin/cmdi/vlo/wicket/provider/FacetFieldValuesProviderTest.java

    r5129 r6005  
    2323import java.util.Iterator;
    2424import java.util.Locale;
    25 import java.util.Locale;
    2625import org.apache.solr.client.solrj.response.FacetField;
    2726import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
    2827import org.apache.wicket.model.IModel;
    2928import org.apache.wicket.model.Model;
     29import org.apache.wicket.util.convert.ConversionException;
     30import org.apache.wicket.util.convert.converter.AbstractConverter;
     31import org.jmock.Expectations;
     32import org.jmock.Mockery;
     33import org.jmock.integration.junit4.JUnit4Mockery;
     34import org.junit.Assert;
    3035import static org.junit.Assert.*;
    3136import org.junit.Before;
     
    4045    public final static Collection<String> LOW_PRIORITY_VALUES = ImmutableSet.of("Xlow priority");
    4146
     47    private final Mockery context = new JUnit4Mockery();
    4248    private FacetField facetField;
     49    private FieldValueConverterProvider valueConverterProvider;
    4350
    4451    @Before
     
    5057        facetField.add("third value", 103);
    5158        facetField.add("FOURTH value", 104); //intentional upper case, sort and filter should be case insensitive
     59
     60        valueConverterProvider = context.mock(FieldValueConverterProvider.class);
     61        context.checking(new Expectations() {
     62            {
     63                allowing(valueConverterProvider).getConverter(with(any(String.class)));
     64                will(returnValue(new AbstractConverter<String>() {
     65
     66                    @Override
     67                    protected Class<String> getTargetType() {
     68                        return String.class;
     69                    }
     70
     71                    @Override
     72                    public String convertToObject(String value, Locale locale) throws ConversionException {
     73                        Assert.fail("convertToObject should not get called on the Field Value converter");
     74                        return null;
     75                    }
     76                }));
     77            }
     78        });
    5279    }
    5380
     
    5784    @Test
    5885    public void testIteratorCountOrder() {
    59         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, true));
     86        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, true), valueConverterProvider);
    6087
    6188        long first = 0;
     
    93120    @Test
    94121    public void testIteratorCountOrderDescending() {
    95         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false));
     122        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false), valueConverterProvider);
    96123
    97124        long first = 0;
     
    129156    @Test
    130157    public void testIteratorCountOrderDefaultPriority() {
    131         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false));
     158        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, false), valueConverterProvider);
    132159
    133160        long first = 0;
     
    164191    @Test
    165192    public void testIteratorNameOrderDescending() {
    166         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false));
     193        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false), valueConverterProvider);
    167194
    168195        final long first = 0;
     
    206233        facetField.add("één nederlandse waarde", 1);
    207234
    208         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, true)) {
     235        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, true), valueConverterProvider) {
    209236
    210237            @Override
     
    246273    @Test
    247274    public void testIteratorOffset() {
    248         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, true));
     275        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.COUNT, true), valueConverterProvider);
    249276
    250277        final long first = 2;
     
    265292        // potential is lower than limit
    266293        {
    267             final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false));
     294            final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false), valueConverterProvider);
    268295            // actual number is returned
    269296            assertEquals(5, instance.size());
     
    271298        // potential is higher than limit
    272299        {
    273             final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 2, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false));
     300            final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 2, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, false), valueConverterProvider);
    274301            // maximum number is returned (result is capped)
    275302            assertEquals(2, instance.size());
     
    285312        filterModel.getObject().setName("th");
    286313
    287         final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, true)) {
     314        final FacetFieldValuesProvider instance = new FacetFieldValuesProvider(Model.of(facetField), 10, LOW_PRIORITY_VALUES, new SortParam<FieldValuesOrder>(FieldValuesOrder.NAME, true), valueConverterProvider) {
    288315
    289316            @Override
     
    308335
    309336        assertFalse(result.hasNext());
    310        
     337
    311338        instance.detach();
    312339        // add minimal occurences condition to filter
Note: See TracChangeset for help on using the changeset viewer.