Changeset 6494
- Timestamp:
- 09/10/15 09:03:11 (9 years ago)
- Location:
- vlo/branches/vlo-3.3-oeaw/vlo-web-app/src
- Files:
-
- 1 added
- 1 deleted
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/pojo/FacetSelection.java
r6486 r6494 52 52 53 53 public FacetSelection(FacetSelectionType selectionType, Collection<String> values) { 54 this.selectionType = selectionType;54 this.selectionType = values.size() > 1? FacetSelectionType.OR : FacetSelectionType.AND; 55 55 // always store as array list, which is modifiable and serialisable 56 56 if (values instanceof ArrayList) { … … 78 78 } 79 79 80 public void mergeValues( FacetSelection facetSel){81 if( facetSel == null || this.equals(facetSel))80 public void mergeValues(Collection<String> values){ 81 if(values == null || values.isEmpty()) 82 82 return; 83 for(String val: facetSel.values){84 this.values.add(val);85 }83 for(String val: values) 84 if(!this.values.contains(val)) 85 this.values.add(val); 86 86 87 87 //change type of selection to OR if more values are selected … … 91 91 } 92 92 93 public void removeValues( FacetSelection facetSel){94 if( facetSel != null && facetSel.values!= null){95 for(String val: facetSel.values){93 public void removeValues(Collection<String> valuesToBeRemoved){ 94 if(valuesToBeRemoved != null){ 95 for(String val: valuesToBeRemoved){ 96 96 this.values.remove(val); 97 97 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/pojo/QueryFacetsSelection.java
r6457 r6494 17 17 package eu.clarin.cmdi.vlo.pojo; 18 18 19 import com.google.common.collect.Maps;20 19 import java.io.Serializable; 20 import java.util.ArrayList; 21 21 import java.util.Collection; 22 22 import java.util.HashMap; 23 23 import java.util.Map; 24 24 import java.util.Map.Entry; 25 26 import com.google.common.collect.Maps; 25 27 26 28 /** … … 115 117 } 116 118 119 117 120 public void selectValues(String facet, FacetSelection values) { 121 // allow multi value selection for single facet only if user has selected one value 118 122 if (values == null || values.isEmpty()) { 119 123 selection.remove(facet); 124 125 switch(selection.size()){ 126 case 0: 127 excludedFacet = null; 128 break; 129 case 1: 130 excludedFacet = selection.keySet().iterator().next(); //set it to the only element 131 break; 132 } 120 133 } else { 121 134 if (values instanceof Serializable) { … … 124 137 selection.put (facet, values); 125 138 } 139 140 if(selection.size() == 1) 141 excludedFacet = facet; 142 else 143 excludedFacet = null; 126 144 } 127 145 } 128 146 129 public void addNewFacetValue(String facet, FacetSelectionvalues){147 public void addNewFacetValue(String facet, Collection<String> values){ 130 148 FacetSelection curSel = selection.get(facet); 131 149 if(curSel != null){ 132 150 curSel.mergeValues(values); 133 151 }else{ 134 curSel = values; 135 excludedFacet = facet; 152 curSel = new FacetSelection(values); 136 153 } 154 137 155 selectValues(facet, curSel); 138 156 } 139 157 140 public void removeFacetValue(String facet, FacetSelection values){158 public void removeFacetValue(String facet, Collection<String> valuestoBeRemoved){ 141 159 FacetSelection curSel = selection.get(facet); 142 160 if (curSel != null){ 143 curSel.removeValues(values); 144 145 //if it was the last one, reset the value 146 if(curSel.getValues().isEmpty()){ 147 excludedFacet = null; 148 } 161 curSel.removeValues(valuestoBeRemoved); 149 162 } 150 163 //to remove facet from map if does not have any value -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/FacetFieldsService.java
r4932 r6494 45 45 */ 46 46 long getFacetFieldCount(List<String> facets); 47 48 49 /** 50 * 51 * @param facet 52 * @return the total number of documents that don't have specified value for this facet 53 */ 54 55 long getNullCount(String facet, QueryFacetsSelection selection); 47 56 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/SolrFacetQueryFactory.java
r6456 r6494 48 48 /* query that returns complete list of values for specified facet */ 49 49 SolrQuery createExludedFacetQuery(QueryFacetsSelection selection, String facet, int valueLimit); 50 51 /* query that returns number of documents that have unspecified value for given facet */ 52 SolrQuery createNullQuery(String facet, QueryFacetsSelection selection); 50 53 51 54 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrFacetFieldsService.java
r6465 r6494 47 47 @Override 48 48 public List<FacetField> getFacetFields(QueryFacetsSelection selection, List<String> facets, int valueLimit) { 49 //if excluded facet exists and it is equal to selected fire additional queryand do it only for single facet queries50 return (selection.getExcludedFacet() != null && facets.size() == 1 && selection.getExcludedFacet().equals(facets.get(0)))?49 //if excluded facet exists and it is equal to the selected then fire additional query //and do it only for single facet queries 50 return (selection.getExcludedFacet() != null)? //&& facets.size() == 1 51 51 searchResultsDao.getFacets(queryFatory.createFacetQuery(selection, facets, valueLimit), 52 52 queryFatory.createExludedFacetQuery(selection, selection.getExcludedFacet(), valueLimit)) : … … 58 58 return (long) searchResultsDao.getFacets(queryFatory.createCountFacetsQuery(facets)).size(); 59 59 } 60 61 @Override 62 public long getNullCount(String facet, QueryFacetsSelection selection) { 63 return searchResultsDao.getFacets(queryFatory.createNullQuery(facet, selection)).get(0).getValueCount(); 64 } 60 65 61 66 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/service/solr/impl/SolrFacetQueryFactoryImpl.java
r6457 r6494 73 73 return query; 74 74 } 75 76 public SolrQuery createNullQuery(String facet, QueryFacetsSelection selection){ 77 SolrQuery query = baseQuery.getCopy(); 78 addQueryFacetParameters(query, selection, false); 79 query.setQuery("-(" + facet + ":*)"); 80 return query; 81 } 75 82 76 83 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/FacetExpansionStateModel.java
r4606 r6494 30 30 public class FacetExpansionStateModel implements IModel<ExpansionState> { 31 31 32 private final IModel< FacetField> facetModel;32 private final IModel<String> facetName; 33 33 private final IModel<Map<String, ExpansionState>> expansionStateMapModel; 34 34 … … 38 38 * @param expansionStateMapModel model that holds the map of expansion states 39 39 */ 40 public FacetExpansionStateModel(IModel< FacetField> facetModel, IModel<Map<String, ExpansionState>> expansionStateMapModel) {41 this.facet Model = facetModel;40 public FacetExpansionStateModel(IModel<String> facetName, IModel<Map<String, ExpansionState>> expansionStateMapModel) { 41 this.facetName = facetName; 42 42 this.expansionStateMapModel = expansionStateMapModel; 43 43 } … … 45 45 @Override 46 46 public ExpansionState getObject() { 47 final String facet = facet Model.getObject().getName();47 final String facet = facetName.getObject(); 48 48 final ExpansionState state = expansionStateMapModel.getObject().get(facet); 49 49 if (state == null) { … … 56 56 @Override 57 57 public void setObject(ExpansionState object) { 58 final String facet = facet Model.getObject().getName();58 final String facet = facetName.getObject(); 59 59 expansionStateMapModel.getObject().put(facet, object); 60 60 } … … 62 62 @Override 63 63 public void detach() { 64 facetModel.detach();64 facetName.detach(); 65 65 expansionStateMapModel.detach(); 66 66 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/FacetFieldModel.java
r4869 r6494 22 22 import java.util.List; 23 23 import org.apache.solr.client.solrj.response.FacetField; 24 import org.apache.wicket.model.AbstractReadOnlyModel; 24 25 import org.apache.wicket.model.IModel; 25 26 import org.apache.wicket.model.LoadableDetachableModel; … … 38 39 * @author twagoo 39 40 */ 40 public class FacetFieldModel extends LoadableDetachableModel<FacetField> {41 public class FacetFieldModel extends AbstractReadOnlyModel<FacetField> { 41 42 42 43 //todo: can probably be made more efficient/elegant than wrapping fields model 43 44 private final FacetFieldsModel fieldsModel; 45 private final transient String facetName; 44 46 45 /** 46 * 47 * @param facetField facet field to provide 48 * @param selectionModel model that provides current query/selection 49 */ 50 public FacetFieldModel(FacetFieldsService service, FacetField facetField, IModel<QueryFacetsSelection> selectionModel) { 51 super(facetField); 52 fieldsModel = new FacetFieldsModel(service, Collections.singletonList(facetField.getName()), selectionModel, -1); 53 } 54 47 55 48 /** 56 49 * … … 59 52 * @param selectionModel model that provides current query/selection 60 53 */ 61 public FacetFieldModel(FacetFieldsService service, String facet, IModel<QueryFacetsSelection> selectionModel, int valueLimit) { 62 fieldsModel = new FacetFieldsModel(service, Collections.singletonList(facet), selectionModel, valueLimit); 54 public FacetFieldModel(String facet, FacetFieldsService service, IModel<QueryFacetsSelection> selectionModel) { 55 this(facet, new FacetFieldsModel(service, Collections.singletonList(facet), selectionModel, -1)); 56 } 57 58 public FacetFieldModel(String facetName, FacetFieldsModel fieldsModel){ 59 this.fieldsModel = fieldsModel; 60 this.facetName = facetName; 63 61 } 64 62 65 63 @Override 66 protected FacetField load() { 67 final List<FacetField> fieldsList = fieldsModel.getObject(); 68 if (fieldsList == null || fieldsList.isEmpty()) { 69 return null; 70 } else { 71 return fieldsList.get(0); 72 } 64 public FacetField getObject() { 65 return fieldsModel.getFacetField(facetName); 73 66 } 74 67 75 @Override 76 public void detach() { 77 super.detach(); 78 fieldsModel.detach(); 68 69 public void detachFacetFieldsModel(){ 70 fieldsModel.detach(); 79 71 } 72 73 80 74 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/FacetFieldSelectionModel.java
r6246 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.model; 18 18 19 import eu.clarin.cmdi.vlo.pojo.FacetFieldSelection;20 import eu.clarin.cmdi.vlo.pojo.FacetSelection;21 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;22 19 import java.util.Collection; 23 20 import java.util.Collections; 24 21 import java.util.List; 25 22 import java.util.concurrent.CopyOnWriteArrayList; 23 26 24 import org.apache.solr.client.solrj.response.FacetField; 27 25 import org.apache.wicket.model.AbstractReadOnlyModel; 28 26 import org.apache.wicket.model.IModel; 27 28 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 29 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 29 30 30 31 /** … … 34 35 * @author twagoo 35 36 */ 36 public class FacetFieldSelectionModel extends AbstractReadOnlyModel<Facet FieldSelection> implements FacetFieldSelection{37 public class FacetFieldSelectionModel extends AbstractReadOnlyModel<FacetSelection> { 37 38 38 39 private final IModel<QueryFacetsSelection> selectionModel; … … 49 50 } 50 51 51 @Override 52 53 //@Override 54 public IModel<FacetField> getFacetFieldAsModel() { 55 return facetFieldModel; 56 } 57 58 59 //@Override 52 60 public FacetField getFacetField() { 53 61 return facetFieldModel.getObject(); 54 62 } 63 55 64 56 @Override 65 66 // @Override 57 67 public List<String> getFacetValues() { 58 final String facetName = getFacetField().getName(); 59 final FacetSelection selection = getSelection().getSelectionValues(facetName); 68 final FacetSelection selection = getObject(); 60 69 if (selection == null) { 61 70 return Collections.emptyList(); … … 69 78 } 70 79 } 80 81 71 82 72 @Override 83 //@Override 84 public IModel<QueryFacetsSelection> getSelectionAsModel() { 85 return selectionModel; 86 } 87 88 89 //@Override 73 90 public QueryFacetsSelection getSelection() { 74 91 return selectionModel.getObject(); … … 76 93 77 94 @Override 78 public FacetFieldSelection getObject() { 79 return this; 95 public FacetSelection getObject() { 96 final String facetName = getFacetField().getName(); 97 return getSelection().getSelectionValues(facetName); 80 98 } 81 99 … … 90 108 return String.format("[Field: %s; Selection: %s]", facetFieldModel.getObject().getName(), selectionModel.getObject().toString()); 91 109 } 92 110 111 93 112 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/model/FacetFieldsModel.java
r4943 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.model; 18 18 19 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;20 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService;21 19 import java.util.List; 20 22 21 import org.apache.solr.client.solrj.response.FacetField; 23 22 import org.apache.wicket.model.IModel; 24 23 import org.apache.wicket.model.LoadableDetachableModel; 24 25 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 26 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 27 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 25 28 26 29 /** … … 41 44 private final IModel<QueryFacetsSelection> selectionModel; 42 45 private final int valueLimit; 46 47 48 /** 49 * now we are returning all facets and model is shared between facetValuesPanel and FacetsPagePanel 50 * 51 * @param service service to use for facet field retrieval 52 * @param facets facets to include 53 * @param selectionModel model that provides current query/selection 54 */ 55 public FacetFieldsModel(FacetFieldsService service, List<String> facets, IModel<QueryFacetsSelection> selectionModel) { 56 this(service, facets, selectionModel, -1); 57 } 43 58 44 59 /** … … 56 71 this.valueLimit = valueLimit; 57 72 } 73 74 75 58 76 59 77 @Override … … 67 85 selectionModel.detach(); 68 86 } 87 88 public FacetField getFacetField(String facetName){ 89 List<FacetField> facetList = getObject(); 90 if(facetList != null) 91 for(FacetField facet: facetList) 92 if(facet.getName().equals(facetName)) 93 return removeSelected(facet, selectionModel.getObject().getSelectionValues(facetName)); 94 95 return null; 96 } 97 98 private FacetField removeSelected(FacetField facetField, FacetSelection selection){ 99 FacetField filtered = new FacetField(facetField.getName()); 100 if(selection != null) 101 for(FacetField.Count value: facetField.getValues()) 102 if(selection.getValues().contains(value.getName())) 103 continue; 104 else 105 filtered.add(value.getName(), value.getCount()); 106 else 107 filtered = facetField; 108 109 return filtered; 110 } 69 111 70 112 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/AllFacetValuesPage.java
r6412 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.pages; 18 18 19 import eu.clarin.cmdi.vlo.config.VloConfig; 20 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 21 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 22 import eu.clarin.cmdi.vlo.service.FacetParameterMapper; 23 import eu.clarin.cmdi.vlo.service.PageParametersConverter; 24 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 25 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel; 26 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 27 import eu.clarin.cmdi.vlo.wicket.panels.search.AllFacetValuesPanel; 28 import eu.clarin.cmdi.vlo.wicket.panels.BreadCrumbPanel; 19 import java.util.Collection; 20 29 21 import org.apache.solr.client.solrj.response.FacetField; 30 22 import org.apache.wicket.RestartResponseException; … … 39 31 import org.apache.wicket.spring.injection.annot.SpringBean; 40 32 import org.apache.wicket.util.string.StringValue; 33 34 import eu.clarin.cmdi.vlo.config.VloConfig; 35 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 36 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 37 import eu.clarin.cmdi.vlo.service.FacetParameterMapper; 38 import eu.clarin.cmdi.vlo.service.PageParametersConverter; 39 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 40 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel; 41 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 42 import eu.clarin.cmdi.vlo.wicket.panels.BreadCrumbPanel; 43 import eu.clarin.cmdi.vlo.wicket.panels.search.AllFacetValuesPanel; 41 44 42 45 /** … … 73 76 if (vloConfig.getAllFacetFields().contains(facet)) { 74 77 // create a new model so that all values will be retrieved 75 setModel(new FacetFieldModel(facetFieldsService, facet, selectionModel, -1)); // gets all facet values 78 79 setModel(new FacetFieldModel(facet, facetFieldsService, selectionModel)); // gets all facet values 76 80 } 77 81 if (getModelObject() == null) { … … 97 101 98 102 @Override 99 protected void onValuesSelected( String facet, FacetSelectionvalues, AjaxRequestTarget target) {103 protected void onValuesSelected(Collection<String> values, AjaxRequestTarget target) { 100 104 // Create updated selection state 101 105 final QueryFacetsSelection newSelection; … … 105 109 newSelection = new QueryFacetsSelection(); 106 110 } 107 newSelection.selectValues( facet, values);111 newSelection.selectValues(getModelObject().getName(), new FacetSelection(values)); 108 112 109 113 // Redirect to search page with updated model -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/FacetedSearchPage.java
r6480 r6494 51 51 private Component navigation; 52 52 private Component searchForm; 53 54 55 IModel<List<String>> facetNamesModel; 56 FacetFieldsModel fieldsModel; 57 58 53 59 54 60 public FacetedSearchPage(IModel<QueryFacetsSelection> queryModel) { 55 61 super(queryModel); 62 createModels(); 56 63 addComponents(); 57 64 } … … 63 70 final IModel<QueryFacetsSelection> queryModel = new Model<QueryFacetsSelection>(selection); 64 71 setModel(queryModel); 72 createModels(); 65 73 addComponents(); 74 } 75 76 77 private void createModels(){ 78 facetNamesModel = new FacetNamesModel(vloConfig.getFacetFields()); 79 fieldsModel = new FacetFieldsModel(facetFieldsService, facetNamesModel.getObject(), getModel(), -1); 66 80 } 67 81 … … 142 156 enclosure.setOutputMarkupId(true); 143 157 if (vloConfig.getCollectionFacet() != null) { 144 final FacetPanel panel = new SingleFacetPanel("collectionsFacet", getModel(), vloConfig.getCollectionFacet(), facetFieldsService, 3) {158 final FacetPanel panel = new SingleFacetPanel("collectionsFacet", vloConfig.getCollectionFacet(), getModel(), facetFieldsService, 3) { 145 159 146 160 @Override … … 161 175 162 176 private Panel createFacetsPanel(final String id) { 163 final IModel<QueryFacetsSelection> queryModel = getModel(); 164 final IModel<List<FacetField>> facetFieldsModel = new FacetFieldsModel(facetFieldsService, vloConfig.getFacetFields(), queryModel, FacetValuesPanel.MAX_NUMBER_OF_FACETS_TO_SHOW); 165 final IModel<List<String>> facetNamesModel = new FacetNamesModel(vloConfig.getFacetFields()); 166 final FacetsPanel panel = new FacetsPanel(id, facetNamesModel, facetFieldsModel, queryModel) { 177 178 //final FacetsPanel panel = new FacetsPanel(id, facetNamesModel, facetFieldsService, getModel(), FacetValuesPanel.MAX_NUMBER_OF_FACETS_TO_SHOW) { 179 final FacetsPanel panel = new FacetsPanel(id, facetNamesModel, fieldsModel, getModel()) { 167 180 168 181 @Override … … 176 189 177 190 private void updateSelection(AjaxRequestTarget target) { 191 192 //detach facetFieldsModel when selection is changed 193 fieldsModel.detach(); 194 178 195 // selection changed, update facets and search results 179 196 if (target != null) { // null if JavaScript disabled -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/pages/SimpleSearchPage.java
r6350 r6494 93 93 // collection facet is optional... 94 94 if (vloConfig.getCollectionFacet() != null) { 95 return new SingleFacetPanel(id, getModel(), vloConfig.getCollectionFacet(), facetFieldsService, 3) {95 return new SingleFacetPanel(id, vloConfig.getCollectionFacet(), getModel(), facetFieldsService, 3) { 96 96 97 97 @Override -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/SingleFacetPanel.java
r5140 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.panels; 18 18 19 import org.apache.wicket.model.IModel; 20 import org.apache.wicket.model.Model; 21 19 22 import eu.clarin.cmdi.vlo.pojo.ExpansionState; 20 23 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 21 24 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 22 25 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel; 23 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldSelectionModel;24 26 import eu.clarin.cmdi.vlo.wicket.panels.search.FacetPanel; 25 import org.apache.wicket.model.IModel;26 import org.apache.wicket.model.Model;27 27 28 28 /** … … 31 31 */ 32 32 public abstract class SingleFacetPanel extends FacetPanel { 33 34 //public FacetPanel(String id, IModel<String> facetName, IModel<FacetFieldSelection> selectionModel, IModel<ExpansionState> expansionState, int subListSize) { 33 35 34 public SingleFacetPanel(String id, IModel<QueryFacetsSelection> queryModel, String facetName,FacetFieldsService facetFieldsService, int subListSize) {36 public SingleFacetPanel(String id, String facetName, IModel<QueryFacetsSelection> queryModel, FacetFieldsService facetFieldsService, int subListSize) { 35 37 //TODO: Limit to number of items shown while keeping 'more' function? 36 super(id, new FacetFieldSelectionModel(new FacetFieldModel(facetFieldsService, facetName, queryModel, -1), queryModel), Model.of(ExpansionState.COLLAPSED), subListSize); 38 super(id, 39 new Model(facetName), 40 new FacetFieldModel(facetName, facetFieldsService, queryModel), 41 queryModel, 42 Model.of(ExpansionState.COLLAPSED), 43 subListSize); 37 44 } 38 45 -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AdvancedSearchOptionsPanel.html
r6486 r6494 34 34 <input wicket:id="collection" type="checkbox" id="onlycollections"/> 35 35 <label for="onlycollections">Only include collection resources</label> 36 </li> 37 <li> 38 <input wicket:id="unspecified_values" type="checkbox" id="only_unspecified_values"/> 39 <label for="only_unspecified_values">Show unspecified values for each facet</label> 40 </li> 36 </li> 41 37 </ul> 42 38 <input type="submit" value="Apply" class="nonjsfallback" /> -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/AllFacetValuesPanel.java
r6005 r6494 28 28 import eu.clarin.cmdi.vlo.wicket.provider.FacetFieldValuesProvider; 29 29 import eu.clarin.cmdi.vlo.wicket.provider.FieldValueConverterProvider; 30 31 import java.util.Collection; 30 32 import java.util.Collections; 31 33 import org.apache.solr.client.solrj.response.FacetField; … … 143 145 // call callback 144 146 onValuesSelected( 145 item.getModelObject().getFacetField().getName(),146 147 // for now only single values can be selected 147 new FacetSelection(Collections.singleton(item.getModelObject().getName())),148 Collections.singleton(item.getModelObject().getName()), 148 149 target); 149 150 } … … 256 257 * Callback triggered when values have been selected on this facet 257 258 * 258 * @param facet name of the facet this panel represents259 259 * @param values selected values 260 260 * @param target Ajax target allowing for a partial update. May be null 261 261 * (fallback)! 262 262 */ 263 protected abstract void onValuesSelected( String facet, FacetSelectionvalues, AjaxRequestTarget target);263 protected abstract void onValuesSelected(Collection<String> values, AjaxRequestTarget target); 264 264 265 265 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetPanel.java
r6486 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.panels.search; 18 18 19 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldDescriptionModel;20 import eu.clarin.cmdi.vlo.pojo.ExpansionState;21 import eu.clarin.cmdi.vlo.pojo.FacetFieldSelection;22 import eu.clarin.cmdi.vlo.pojo.FacetSelection;23 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;24 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel;25 import eu.clarin.cmdi.vlo.wicket.panels.ExpandablePanel;26 19 import java.util.Collection; 27 import java.util.HashSet; 20 28 21 import org.apache.solr.client.solrj.response.FacetField; 29 22 import org.apache.wicket.ajax.AjaxRequestTarget; … … 31 24 import org.apache.wicket.markup.html.basic.Label; 32 25 import org.apache.wicket.model.IModel; 33 import org.apache.wicket.model.PropertyModel;34 26 import org.slf4j.Logger; 35 27 import org.slf4j.LoggerFactory; 28 29 import eu.clarin.cmdi.vlo.pojo.ExpansionState; 30 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 31 import eu.clarin.cmdi.vlo.wicket.model.SelectionModel; 32 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldDescriptionModel; 33 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 34 import eu.clarin.cmdi.vlo.wicket.panels.ExpandablePanel; 36 35 37 36 /** … … 43 42 * @author twagoo 44 43 */ 45 public abstract class FacetPanel extends ExpandablePanel< FacetFieldSelection> {44 public abstract class FacetPanel extends ExpandablePanel<String> { 46 45 private final static Logger logger = LoggerFactory.getLogger(FacetPanel.class); 47 46 … … 49 48 private final FacetValuesPanel facetValuesPanel; 50 49 51 public FacetPanel(String id, IModel< FacetFieldSelection> selectionModel, IModel<ExpansionState> expansionState) {52 this(id, selectionModel, expansionState, 0);50 public FacetPanel(String id, IModel<String> facetNameModel, IModel<FacetField> facetFieldModel, final IModel<QueryFacetsSelection> selectionModel, IModel<ExpansionState> expansionState) { 51 this(id, facetNameModel, facetFieldModel, selectionModel, expansionState, 0); 53 52 } 54 53 55 public FacetPanel(String id, IModel< FacetFieldSelection> selectionModel, IModel<ExpansionState> expansionState, int subListSize) {56 super(id, selectionModel, expansionState);54 public FacetPanel(String id, IModel<String> facetNameModel, IModel<FacetField> facetFieldModel, final IModel<QueryFacetsSelection> selectionModel, IModel<ExpansionState> expansionState, int subListSize) { 55 super(id, facetNameModel, expansionState); 57 56 58 57 // panel showing values for selection 59 facetValuesPanel = createFacetValuesPanel("facetValues", subListSize);58 facetValuesPanel = createFacetValuesPanel("facetValues", facetNameModel.getObject(), facetFieldModel, selectionModel, subListSize); 60 59 add(facetValuesPanel); 61 60 62 61 // panel showing current selection, allowing for deselection 63 selectedFacetPanel = createSelectedFacetPanel("facetSelection" );62 selectedFacetPanel = createSelectedFacetPanel("facetSelection", facetNameModel.getObject(), selectionModel); 64 63 add(selectedFacetPanel); 65 64 } … … 67 66 @Override 68 67 protected Label createTitleLabel(String id) { 69 final IModel<String> facetNameModel = new PropertyModel<>(getModel(), "facetField.name"); 70 final Label label = new Label(id, new SolrFieldNameModel(facetNameModel)); 71 label.add(new AttributeAppender("title", new SolrFieldDescriptionModel(facetNameModel))); 68 final Label label = new Label(id, new SolrFieldNameModel(getModel())); 69 label.add(new AttributeAppender("title", new SolrFieldDescriptionModel(getModel()))); 72 70 return label; 73 71 } … … 76 74 protected void onConfigure() { 77 75 super.onConfigure(); 76 77 facetValuesPanel.setVisible((expansionModel.getObject() == ExpansionState.COLLAPSED)? false : true); 78 78 79 final boolean valuesSelected = !getModelObject().getFacetValues().isEmpty(); 80 81 selectedFacetPanel.setVisible(valuesSelected); 82 83 facetValuesPanel.setVisible((!valuesSelected && expansionModel.getObject() == ExpansionState.COLLAPSED)? false : true); 84 85 // hide this entire panel is no values are selectable 86 setVisible(!isHideIfNoValues() || valuesSelected || getModelObject().getFacetField().getValueCount() > 0); 79 // hide this entire panel if nothing is selected or there is nothing to be selected 80 setVisible(!isHideIfNoValues() || !selectedFacetPanel.getModelObject().isEmpty() || facetValuesPanel.getModelObject().getValueCount() > 0); 87 81 } 88 82 … … 97 91 } 98 92 99 private FacetValuesPanel createFacetValuesPanel(String id, int subListSize) { 100 return new FacetValuesPanel(id, 101 new PropertyModel<FacetField>(getModel(), "facetField"), 102 new PropertyModel<QueryFacetsSelection>(getModel(), "selection"), subListSize) { 93 private FacetValuesPanel createFacetValuesPanel(String id, final String facetName, IModel<FacetField> facetFieldModel, final IModel<QueryFacetsSelection> selectionModel, int subListSize) { 94 return new FacetValuesPanel(id, facetFieldModel, selectionModel, subListSize) { 103 95 @Override 104 public void onValuesSelected( String facet, FacetSelection value, AjaxRequestTarget target) {96 public void onValuesSelected(Collection<String> values, AjaxRequestTarget target) { 105 97 // A value has been selected on this facet's panel, update the model! 106 FacetPanel.this.getModelObject().getSelection().addNewFacetValue(facet, value);107 //FacetPanel.this.getModelObject().getSelection().selectValues(facet, value);108 98 selectionModel.getObject().addNewFacetValue(facetName, values); 99 100 if (target != null) { 109 101 // reload entire page for now 110 102 selectionChanged(target); … … 114 106 } 115 107 116 private SelectedFacetPanel createSelectedFacetPanel(String id ) {117 return new SelectedFacetPanel(id, getModel()) {108 private SelectedFacetPanel createSelectedFacetPanel(String id, final String facetName, final IModel<QueryFacetsSelection> selectionModel) { 109 return new SelectedFacetPanel(id, facetName, new SelectionModel(facetName, selectionModel)) { 118 110 @Override 119 public void onValuesUnselected(String facet, Collection<String> valuesRemoved, AjaxRequestTarget target) { 120 final QueryFacetsSelection selection = getModelObject().getSelection(); 111 public void onValuesUnselected(Collection<String> valuesRemoved, AjaxRequestTarget target) { 112 // Values have been removed, calculate remainder 113 selectionModel.getObject().removeFacetValue(facetName, valuesRemoved); 121 114 122 // Values have been removed, calculate remainder 123 124 final FacetSelection facetSelection = selection.getSelectionValues(facet); 125 // final Collection<String> currentSelection = facetSelection.getValues(); 126 // final Collection<String> newSelection = new HashSet<String>(currentSelection); 127 // newSelection.removeAll(valuesRemoved); 128 129 // Update model (keep selection type) 130 // selection.selectValues(facet, new FacetSelection(facetSelection.getSelectionType(), newSelection)); 131 132 FacetSelection fSelToRemove = new FacetSelection(facetSelection.getSelectionType(), valuesRemoved); 133 selection.removeFacetValue(facet, fSelToRemove); 134 135 //collapse if tha last value from selection has been removed 136 if(selection.getExcludedFacet() == null){ 115 //collapse if the last value from selection has been removed 116 if(selectionModel.getObject().getExcludedFacet() == null){ 137 117 expansionModel.setObject(ExpansionState.COLLAPSED); 138 118 } -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetValuesPanel.java
r6456 r6494 25 25 import eu.clarin.cmdi.vlo.wicket.components.FieldValueLabel; 26 26 import eu.clarin.cmdi.vlo.wicket.provider.PartitionedDataProvider; 27 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel; 27 28 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 28 29 import eu.clarin.cmdi.vlo.wicket.pages.AllFacetValuesPage; … … 202 203 // call callback 203 204 onValuesSelected( 204 item.getModelObject().getFacetField().getName(),205 205 // for now only single values can be selected 206 new FacetSelection(Collections.singleton(item.getModelObject().getName())),206 Collections.singleton(item.getModelObject().getName()), 207 207 target); 208 208 } … … 242 242 super.onConfigure(); 243 243 // only show if there actually are more values! 244 setVisible(getModel ().getObject().getValueCount() > MAX_NUMBER_OF_FACETS_TO_SHOW);244 setVisible(getModelObject().getValueCount() > MAX_NUMBER_OF_FACETS_TO_SHOW); 245 245 } 246 246 … … 270 270 271 271 @Override 272 protected void onValuesSelected( String facet, FacetSelectionvalues, AjaxRequestTarget target) {272 protected void onValuesSelected(Collection<String> values, AjaxRequestTarget target) { 273 273 if (target != null) { 274 274 // target can be null if selection link was opened in a new tab 275 275 window.close(target); 276 276 } 277 FacetValuesPanel.this.onValuesSelected( facet,values, target);277 FacetValuesPanel.this.onValuesSelected(values, target); 278 278 } 279 279 }; … … 288 288 filterModel.detach(); 289 289 } 290 290 291 291 292 /** … … 297 298 * (fallback)! 298 299 */ 299 protected abstract void onValuesSelected(String facet, FacetSelection values, AjaxRequestTarget target); 300 protected abstract void onValuesSelected(Collection<String> values, AjaxRequestTarget target); 301 302 @Override 303 protected void onConfigure() { 304 // TODO Auto-generated method stub 305 super.onConfigure(); 306 } 300 307 301 308 @Override -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/FacetsPanel.java
r6480 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.panels.search; 18 18 19 import eu.clarin.cmdi.vlo.JavaScriptResources;20 import eu.clarin.cmdi.vlo.pojo.ExpansionState;21 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection;22 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService;23 import eu.clarin.cmdi.vlo.wicket.model.FacetExpansionStateModel;24 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel;25 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldSelectionModel;26 19 import java.util.HashMap; 27 20 import java.util.List; 28 21 import java.util.Map; 29 import org.apache.solr.client.solrj.response.FacetField; 22 30 23 import org.apache.wicket.Component; 31 24 import org.apache.wicket.ajax.AjaxRequestTarget; … … 40 33 import org.apache.wicket.model.IModel; 41 34 import org.apache.wicket.model.util.MapModel; 42 import org.apache.wicket.spring.injection.annot.SpringBean; 35 36 import eu.clarin.cmdi.vlo.JavaScriptResources; 37 import eu.clarin.cmdi.vlo.pojo.ExpansionState; 38 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 39 import eu.clarin.cmdi.vlo.wicket.model.FacetExpansionStateModel; 40 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldModel; 41 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldsModel; 43 42 44 43 /** … … 52 51 public abstract class FacetsPanel extends GenericPanel<List<String>> { 53 52 54 @SpringBean55 private FacetFieldsService facetFieldsService;56 53 private MapModel<String, ExpansionState> expansionModel; 57 54 … … 64 61 * selection state 65 62 */ 66 public FacetsPanel(final String id, final IModel<List<String>> facetNamesModel, final IModel<List<FacetField>> facetsModel, final IModel<QueryFacetsSelection> selectionModel) {63 public FacetsPanel(final String id, final IModel<List<String>> facetNamesModel, final FacetFieldsModel fieldsModel, final IModel<QueryFacetsSelection> selectionModel) { 67 64 super(id, facetNamesModel); 68 65 69 66 final Map<String, ExpansionState> expansionStateMap = new HashMap<String, ExpansionState>(); 70 67 expansionModel = new MapModel<String, ExpansionState>(expansionStateMap); 71 72 final ListView< FacetField> facetsView = new ListView<FacetField>("facets", facetsModel) {68 69 final ListView<String> facetsView = new ListView<String>("facets", facetNamesModel) { 73 70 74 71 @Override 75 protected void populateItem(ListItem< FacetField> item) {76 72 protected void populateItem(ListItem<String> item) { 73 // Create a facet field model which does a lookup by name, 77 74 // making it dynamic in case the selection and therefore 78 75 // set of available values changes 79 76 // TODO: Limit to number of items shown while keeping 'more' function? 80 final IModel<FacetField> facetFieldModel = new FacetFieldModel(facetFieldsService, item.getModelObject(), selectionModel);81 77 item.add( 82 new FacetPanel("facet", 83 new FacetFieldSelectionModel(facetFieldModel, selectionModel), 84 new FacetExpansionStateModel(facetFieldModel, expansionModel)) { 78 new FacetPanel("facet", 79 item.getModel(), 80 new FacetFieldModel(item.getModelObject(), fieldsModel), 81 selectionModel, 82 new FacetExpansionStateModel(item.getModel(), expansionModel)) { 85 83 86 84 @Override -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SelectedFacetPanel.java
r6002 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.panels.search; 18 18 19 import eu.clarin.cmdi.vlo.pojo.FacetFieldSelection; 20 import eu.clarin.cmdi.vlo.wicket.components.FieldValueLabel; 19 import java.util.ArrayList; 21 20 import java.util.Collection; 22 21 import java.util.Collections; 23 22 import java.util.List; 23 import java.util.concurrent.CopyOnWriteArrayList; 24 24 25 import org.apache.wicket.ajax.AjaxRequestTarget; 25 26 import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxFallbackLink; … … 27 28 import org.apache.wicket.markup.html.list.ListView; 28 29 import org.apache.wicket.markup.html.panel.GenericPanel; 30 import org.apache.wicket.model.AbstractReadOnlyModel; 29 31 import org.apache.wicket.model.IModel; 30 import org.apache.wicket.model.PropertyModel; 32 import org.apache.wicket.model.Model; 33 34 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 35 import eu.clarin.cmdi.vlo.wicket.components.FieldValueLabel; 31 36 32 37 /** … … 36 41 * @author twagoo 37 42 */ 38 public abstract class SelectedFacetPanel extends GenericPanel<Facet FieldSelection> {43 public abstract class SelectedFacetPanel extends GenericPanel<FacetSelection> { 39 44 40 public SelectedFacetPanel(String id, final IModel<FacetFieldSelection> model) {45 public SelectedFacetPanel(String id, String facetName, final IModel<FacetSelection> model) { 41 46 super(id, model); 42 47 43 48 // Add removers for all selected values for collapsed state 44 add(createSelectionRemovers("facetValueRemover" ));49 add(createSelectionRemovers("facetValueRemover", facetName)); 45 50 // Add selected items to expanded state 46 add(createSelectionRemovers("selectedItem" ));51 add(createSelectionRemovers("selectedItem", facetName)); 47 52 } 48 49 private ListView<String> createSelectionRemovers(String id) { 53 54 @Override 55 protected void onConfigure() { 56 super.onConfigure(); 57 setVisible(!getModelObject().isEmpty()); 58 } 59 60 private ListView<String> createSelectionRemovers(String id, String facetName) { 50 61 // Model of the list of selected values in this facet 51 final PropertyModel<List<String>> propertyModel = new PropertyModel<List<String>>(getModel(), "facetValues"); 52 final PropertyModel<String> fieldNameModel = new PropertyModel(getModel(), "facetField.name"); 62 63 List<String> selectedValues; 64 if (getModelObject().getValues() != null) 65 selectedValues = new CopyOnWriteArrayList<String>(getModelObject().getValues()); 66 else 67 selectedValues = Collections.emptyList(); 68 69 70 final IModel<List<String>> propertyModel = new AbstractReadOnlyModel<List<String>>() { 71 72 @Override 73 public List<String> getObject() { 74 return new ArrayList(SelectedFacetPanel.this.getModelObject().getValues()); 75 } 76 77 }; 78 final IModel<String> fieldNameModel = new Model<String>(facetName); 79 //final PropertyModel<List<String>> propertyModel= new PropertyModel<List<String>>(getModel(), "facetValues"); 80 //final PropertyModel<String> fieldNameModel = new PropertyModel(getModel(), "facetField.name"); 81 82 53 83 // Repeating container of value + unselection links 54 84 final ListView<String> listView = new ListView<String>(id, propertyModel) { … … 79 109 * (fallback)! 80 110 */ 81 protected abstract void onValuesUnselected( String facet,Collection<String> valuesRemoved, AjaxRequestTarget target);111 protected abstract void onValuesUnselected(Collection<String> valuesRemoved, AjaxRequestTarget target); 82 112 83 113 public class RemoveLink extends IndicatingAjaxFallbackLink { … … 94 124 // Remove a single value 95 125 // Call callback 96 onValuesUnselected( 97 SelectedFacetPanel.this.getModelObject().getFacetField().getName(), 98 Collections.singleton(valueModel.getObject()), target); 126 onValuesUnselected(Collections.singleton(valueModel.getObject()), target); 99 127 } 100 128 -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/main/java/eu/clarin/cmdi/vlo/wicket/panels/search/SimpleSearchBrowsePanel.java
r6248 r6494 17 17 package eu.clarin.cmdi.vlo.wicket.panels.search; 18 18 19 import eu.clarin.cmdi.vlo.config.VloConfig; 20 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 21 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 22 import eu.clarin.cmdi.vlo.service.PageParametersConverter; 23 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 24 import eu.clarin.cmdi.vlo.service.solr.SolrDocumentService; 25 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldsModel; 26 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldDescriptionModel; 27 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 28 import eu.clarin.cmdi.vlo.wicket.pages.FacetedSearchPage; 29 import eu.clarin.cmdi.vlo.wicket.pages.SimpleSearchPage; 19 import java.util.Collection; 20 30 21 import org.apache.solr.client.solrj.response.FacetField; 31 22 import org.apache.wicket.ajax.AjaxRequestTarget; … … 44 35 import org.apache.wicket.model.StringResourceModel; 45 36 import org.apache.wicket.spring.injection.annot.SpringBean; 37 38 import eu.clarin.cmdi.vlo.config.VloConfig; 39 import eu.clarin.cmdi.vlo.pojo.FacetSelection; 40 import eu.clarin.cmdi.vlo.pojo.QueryFacetsSelection; 41 import eu.clarin.cmdi.vlo.service.PageParametersConverter; 42 import eu.clarin.cmdi.vlo.service.solr.FacetFieldsService; 43 import eu.clarin.cmdi.vlo.service.solr.SolrDocumentService; 44 import eu.clarin.cmdi.vlo.wicket.model.FacetFieldsModel; 45 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldDescriptionModel; 46 import eu.clarin.cmdi.vlo.wicket.model.SolrFieldNameModel; 47 import eu.clarin.cmdi.vlo.wicket.pages.FacetedSearchPage; 48 import eu.clarin.cmdi.vlo.wicket.pages.SimpleSearchPage; 46 49 47 50 /** … … 125 128 126 129 @Override 127 protected void onValuesSelected( String facet, FacetSelectionvalues, AjaxRequestTarget target) {130 protected void onValuesSelected(Collection<String> values, AjaxRequestTarget target) { 128 131 // value selected, make a new selection (in this panel we do not want to change the existing selection)... 129 132 final QueryFacetsSelection newSelection = selectionModel.getObject().getCopy(); 130 newSelection.selectValues( facet, values);133 newSelection.selectValues(getModelObject().getName(), new FacetSelection(values)); 131 134 // ...then submit to search page 132 135 setResponsePage(FacetedSearchPage.class, paramsConverter.toParameters(newSelection)); -
vlo/branches/vlo-3.3-oeaw/vlo-web-app/src/test/java/eu/clarin/cmdi/vlo/wicket/model/FacetFieldModelTest.java
r4932 r6494 58 58 @Test 59 59 public void testGetObject() { 60 final FacetFieldModel instance = new FacetFieldModel( service, "facet4", selectionModel, 20);60 final FacetFieldModel instance = new FacetFieldModel("facet4", new FacetFieldsModel(service, ImmutableList.of("facet4"), selectionModel, 20)); 61 61 62 62 context.checking(new Expectations() { … … 83 83 @Test 84 84 public void testGetObjectNotIncluded() { 85 final FacetFieldModel instance = new FacetFieldModel( service, "facet4", selectionModel, 20);85 final FacetFieldModel instance = new FacetFieldModel("facet4", new FacetFieldsModel(service, ImmutableList.of("facet4"), selectionModel, 20)); 86 86 87 87 context.checking(new Expectations() {
Note: See TracChangeset
for help on using the changeset viewer.