diff --git a/config/alfresco/model/solrFacetModel.xml b/config/alfresco/model/solrFacetModel.xml index 356a89c89e..7ed3d04200 100644 --- a/config/alfresco/model/solrFacetModel.xml +++ b/config/alfresco/model/solrFacetModel.xml @@ -46,6 +46,16 @@ false + + Field Display Control + d:text + true + + false + false + false + + Maximum Filters d:int @@ -127,6 +137,16 @@ false + + Is Default (loaded from a properties file) + d:boolean + true + + false + false + false + + @@ -135,4 +155,4 @@ cm:folder - \ No newline at end of file + \ No newline at end of file diff --git a/config/alfresco/subsystems/Search/solr/facet/solr-facets-config.properties b/config/alfresco/subsystems/Search/solr/facet/solr-facets-config.properties index f5b49cdca7..4c630e6571 100644 --- a/config/alfresco/subsystems/Search/solr/facet/solr-facets-config.properties +++ b/config/alfresco/subsystems/Search/solr/facet/solr-facets-config.properties @@ -6,6 +6,7 @@ # Field-Facet-Qname => cm:content.mimetype default.cm\:content.mimetype.filterID=filter_mimetype default.cm\:content.mimetype.displayName=faceted-search.facet-menu.facet.formats +default.cm\:content.mimetype.displayControl=alfresco/search/FacetFilters default.cm\:content.mimetype.maxFilters=5 default.cm\:content.mimetype.hitThreshold=1 default.cm\:content.mimetype.minFilterValueLength=4 @@ -18,6 +19,7 @@ default.cm\:content.mimetype.isEnabled=true # Field-Facet-Qname => cm:description.__ default.cm\:description.__.filterID=filter_description default.cm\:description.__.displayName=faceted-search.facet-menu.facet.description +default.cm\:description.__.displayControl=alfresco/search/FacetFilters default.cm\:description.__.maxFilters=5 default.cm\:description.__.hitThreshold=1 default.cm\:description.__.minFilterValueLength=4 @@ -30,6 +32,7 @@ default.cm\:description.__.isEnabled=true # Field-Facet-Qname => cm:creator.__.u default.cm\:creator.__.u.filterID=filter_creator default.cm\:creator.__.u.displayName=faceted-search.facet-menu.facet.creator +default.cm\:creator.__.u.displayControl=alfresco/search/FacetFilters default.cm\:creator.__.u.maxFilters=5 default.cm\:creator.__.u.hitThreshold=1 default.cm\:creator.__.u.minFilterValueLength=4 @@ -42,6 +45,7 @@ default.cm\:creator.__.u.isEnabled=true # Field-Facet-Qname => cm:modifier.__.u default.cm\:modifier.__.u.filterID=filter_modifier default.cm\:modifier.__.u.displayName=faceted-search.facet-menu.facet.modifier +default.cm\:modifier.__.u.displayControl=alfresco/search/FacetFilters default.cm\:modifier.__.u.maxFilters=5 default.cm\:modifier.__.u.hitThreshold=1 default.cm\:modifier.__.u.minFilterValueLength=4 @@ -54,6 +58,7 @@ default.cm\:modifier.__.u.isEnabled=true # Field-Facet-Qname => cm:created default.cm\:created.filterID=filter_created default.cm\:created.displayName=faceted-search.facet-menu.facet.created +default.cm\:created.displayControl=alfresco/search/FacetFilters default.cm\:created.blockIncludeFacetRequest=true default.cm\:created.maxFilters=5 default.cm\:created.hitThreshold=1 @@ -67,6 +72,7 @@ default.cm\:created.isEnabled=true # Field-Facet-Qname => cm:modified default.cm\:modified.filterID=filter_modified default.cm\:modified.displayName=faceted-search.facet-menu.facet.modified +default.cm\:modified.displayControl=alfresco/search/FacetFilters default.cm\:modified.blockIncludeFacetRequest=true default.cm\:modified.maxFilters=5 default.cm\:modified.hitThreshold=1 @@ -80,6 +86,7 @@ default.cm\:modified.isEnabled=true # Field-Facet-Qname => cm:content.size default.cm\:content.size.filterID=filter_content_size default.cm\:content.size.displayName=faceted-search.facet-menu.facet.size +default.cm\:content.size.displayControl=alfresco/search/FacetFilters default.cm\:content.size.blockIncludeFacetRequest=true default.cm\:content.size.maxFilters=5 default.cm\:content.size.hitThreshold=1 diff --git a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetConfig.java b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetConfig.java index 45dfef7eb5..1c4f1a2a54 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetConfig.java +++ b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetConfig.java @@ -178,6 +178,7 @@ public class SolrFacetConfig extends AbstractLifecycleBean QName fieldQName = resolveToQName(namespaceService, field); String filterID = propValues.get(ValueName.PROP_FILTER_ID.getPropValueName(field)); String displayName = propValues.get(ValueName.PROP_DISPLAY_NAME.getPropValueName(field)); + String displayControl = propValues.get(ValueName.PROP_DISPLAY_CONTROL.getPropValueName(field)); int maxFilters = getIntegerValue(propValues.get(ValueName.PROP_MAX_FILTERS.getPropValueName(field))); int hitThreshold = getIntegerValue(propValues.get(ValueName.PROP_HIT_THRESHOLD.getPropValueName(field))); int minFilterValueLength = getIntegerValue(propValues.get(ValueName.PROP_MIN_FILTER_VALUE_LENGTH.getPropValueName(field))); @@ -192,6 +193,7 @@ public class SolrFacetConfig extends AbstractLifecycleBean .filterID(filterID) .facetQName(fieldQName) .displayName(displayName) + .displayControl(displayControl) .maxFilters(maxFilters) .hitThreshold(hitThreshold) .minFilterValueLength(minFilterValueLength) @@ -199,6 +201,7 @@ public class SolrFacetConfig extends AbstractLifecycleBean .scope(scope) .index(index) .isEnabled(isEnabled) + .isDefault(true) .scopedSites(scopedSites).build(); facetProperties.put(filterID, fp); @@ -309,7 +312,7 @@ public class SolrFacetConfig extends AbstractLifecycleBean { PROP_FILTER_ID("filterID"), PROP_DISPLAY_NAME("displayName"), PROP_MAX_FILTERS("maxFilters"), PROP_HIT_THRESHOLD("hitThreshold"), PROP_MIN_FILTER_VALUE_LENGTH("minFilterValueLength"), PROP_SORTBY("sortBy"), PROP_SCOPE("scope"), PROP_SCOPED_SITES("scopedSites"), - PROP_INDEX("index"), PROP_IS_ENABLED("isEnabled"); + PROP_INDEX("index"), PROP_IS_ENABLED("isEnabled"), PROP_DISPLAY_CONTROL("displayControl"); private ValueName(String propValueName) { diff --git a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetModel.java b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetModel.java index 440e20ab24..1e0d597262 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetModel.java +++ b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetModel.java @@ -37,6 +37,8 @@ public interface SolrFacetModel public static final QName PROP_FIELD_LABEL = QName.createQName(SOLR_FACET_MODEL_URL, "fieldLabel"); + public static final QName PROP_DISPLAY_CONTROL = QName.createQName(SOLR_FACET_MODEL_URL, "displayControl"); + public static final QName PROP_MAX_FILTERS = QName.createQName(SOLR_FACET_MODEL_URL, "maxFilters"); public static final QName PROP_HIT_THRESHOLD = QName.createQName(SOLR_FACET_MODEL_URL, "hitThreshold"); @@ -52,4 +54,6 @@ public interface SolrFacetModel public static final QName PROP_INDEX = QName.createQName(SOLR_FACET_MODEL_URL, "index"); public static final QName PROP_IS_ENABLED = QName.createQName(SOLR_FACET_MODEL_URL, "isEnabled"); + + public static final QName PROP_IS_DEFAULT = QName.createQName(SOLR_FACET_MODEL_URL, "isDefault"); } diff --git a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetProperties.java b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetProperties.java index 6661f2ec66..b2f03fc997 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetProperties.java +++ b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetProperties.java @@ -31,11 +31,12 @@ import org.alfresco.service.namespace.QName; * * @author Jamal Kaabi-Mofrad */ -public class SolrFacetProperties +public class SolrFacetProperties implements Comparable { private final String filterID; private final QName facetQName; private final String displayName; + private final String displayControl; private final int maxFilters; private final int hitThreshold; private final int minFilterValueLength; @@ -44,6 +45,7 @@ public class SolrFacetProperties private final Set scopedSites; private final int index; private final boolean isEnabled; + private final boolean isDefault; // is loaded from properties files? /** * Initialises a newly created SolrFacetProperty object @@ -55,6 +57,7 @@ public class SolrFacetProperties this.filterID = builder.filterID; this.facetQName = builder.facetQName; this.displayName = builder.displayName; + this.displayControl = builder.displayControl; this.maxFilters = builder.maxFilters; this.hitThreshold = builder.hitThreshold; this.minFilterValueLength = builder.minFilterValueLength; @@ -62,6 +65,7 @@ public class SolrFacetProperties this.scope = builder.scope; this.index = builder.index; this.isEnabled = builder.isEnabled; + this.isDefault = builder.isDefault; this.scopedSites = (builder.scopedSites == null) ? null :Collections.unmodifiableSet(new HashSet(builder.scopedSites)); } @@ -89,6 +93,14 @@ public class SolrFacetProperties return this.displayName; } + /** + * @return the displayControl + */ + public String getDisplayControl() + { + return this.displayControl; + } + /** * @return the maxFilters */ @@ -159,6 +171,16 @@ public class SolrFacetProperties return this.isEnabled; } + /** + * Whether the facet is a default facet (loaded from a configuration file) or not + * + * @return true if the facet is default, false otherwise + */ + public boolean isDefault() + { + return this.isDefault; + } + /* * @see java.lang.Object#hashCode() */ @@ -204,21 +226,31 @@ public class SolrFacetProperties return true; } + /* + * @see java.lang.Comparable#compareTo(T) + */ + @Override + public int compareTo(SolrFacetProperties that) + { + return Integer.compare(this.index, that.index); + } + /* * @see java.lang.Object#toString() */ @Override public String toString() { - StringBuilder builder2 = new StringBuilder(270); - builder2.append("FacetProperty [filterID=").append(this.filterID).append(", facetQName=") - .append(this.facetQName).append(", displayName=").append(this.displayName).append(", maxFilters=") + StringBuilder sb = new StringBuilder(320); + sb.append("FacetProperty [filterID=").append(this.filterID).append(", facetQName=") + .append(this.facetQName).append(", displayName=").append(this.displayName) + .append(", displayControl=").append(this.displayControl).append(", maxFilters=") .append(this.maxFilters).append(", hitThreshold=").append(this.hitThreshold) .append(", minFilterValueLength=").append(this.minFilterValueLength).append(", sortBy=") .append(this.sortBy).append(", scope=").append(this.scope).append(", scopedSites=") .append(this.scopedSites).append(", index=").append(this.index).append(", isEnabled=").append(this.isEnabled) - .append("]"); - return builder2.toString(); + .append(", isDefault=").append(this.isDefault).append("]"); + return sb.toString(); } public static class Builder @@ -226,6 +258,7 @@ public class SolrFacetProperties private String filterID; private QName facetQName; private String displayName; + private String displayControl; private int maxFilters; private int hitThreshold; private int minFilterValueLength; @@ -234,6 +267,7 @@ public class SolrFacetProperties private Set scopedSites; private int index; private boolean isEnabled; + private boolean isDefault; public Builder filterID(String filterID) { @@ -253,6 +287,12 @@ public class SolrFacetProperties return this; } + public Builder displayControl(String displayControl) + { + this.displayControl = displayControl; + return this; + } + public Builder maxFilters(int maxFilters) { this.maxFilters = maxFilters; @@ -301,6 +341,12 @@ public class SolrFacetProperties return this; } + public Builder isDefault(boolean isDefault) + { + this.isDefault = isDefault; + return this; + } + public SolrFacetProperties build() { return new SolrFacetProperties(this); diff --git a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetServiceImpl.java b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetServiceImpl.java index d37f28be21..dfa1d514a7 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetServiceImpl.java +++ b/source/java/org/alfresco/repo/search/impl/solr/facet/SolrFacetServiceImpl.java @@ -21,7 +21,6 @@ package org.alfresco.repo.search.impl.solr.facet; import java.io.Serializable; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -54,6 +53,7 @@ import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.util.ParameterCheck; +import org.alfresco.util.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationEvent; @@ -196,7 +196,8 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF @Override public Map getFacets() { - return Collections.unmodifiableMap(facetsMap); + Map sortedMap = CollectionUtils.sortMapByValue(facetsMap); + return sortedMap; } @Override @@ -254,6 +255,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF String filterID = (String) properties.get(ContentModel.PROP_NAME); QName fieldQName = (QName) properties.get(SolrFacetModel.PROP_FIELD_TYPE); String displayName = (String) properties.get(SolrFacetModel.PROP_FIELD_LABEL); + String displayControl = (String) properties.get(SolrFacetModel.PROP_DISPLAY_CONTROL); int maxFilters = (Integer) properties.get(SolrFacetModel.PROP_MAX_FILTERS); int hitThreshold = (Integer) properties.get(SolrFacetModel.PROP_HIT_THRESHOLD); int minFilterValueLength = (Integer) properties.get(SolrFacetModel.PROP_MIN_FILTER_VALUE_LENGTH); @@ -261,6 +263,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF String scope = (String) properties.get(SolrFacetModel.PROP_SCOPE); int index = (Integer) properties.get(SolrFacetModel.PROP_INDEX); boolean isEnabled = (Boolean) properties.get(SolrFacetModel.PROP_IS_ENABLED); + boolean isDefault = (Boolean) properties.get(SolrFacetModel.PROP_IS_DEFAULT); @SuppressWarnings("unchecked") List scSites = (List) properties.get(SolrFacetModel.PROP_SCOPED_SITES); Set scopedSites = (scSites == null) ? null : new HashSet<>(scSites); @@ -270,6 +273,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF .filterID(filterID) .facetQName(fieldQName) .displayName(displayName) + .displayControl(displayControl) .maxFilters(maxFilters) .hitThreshold(hitThreshold) .minFilterValueLength(minFilterValueLength) @@ -277,6 +281,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF .scope(scope) .index(index) .isEnabled(isEnabled) + .isDefault(isDefault) .scopedSites(scopedSites).build(); return fp; @@ -404,7 +409,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF throw new SolrFacetConfigException("Filter Id cannot be null."); } - Map properties = new HashMap(11); + Map properties = new HashMap(14); if (withFilterId) { @@ -412,6 +417,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF } properties.put(SolrFacetModel.PROP_FIELD_TYPE, facetProperties.getFacetQName()); properties.put(SolrFacetModel.PROP_FIELD_LABEL, facetProperties.getDisplayName()); + properties.put(SolrFacetModel.PROP_DISPLAY_CONTROL, facetProperties.getDisplayControl()); properties.put(SolrFacetModel.PROP_MAX_FILTERS, facetProperties.getMaxFilters()); properties.put(SolrFacetModel.PROP_HIT_THRESHOLD, facetProperties.getHitThreshold()); properties.put(SolrFacetModel.PROP_MIN_FILTER_VALUE_LENGTH, facetProperties.getMinFilterValueLength()); @@ -421,6 +427,9 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF properties.put(SolrFacetModel.PROP_INDEX, facetProperties.getIndex()); properties.put(SolrFacetModel.PROP_IS_ENABLED, facetProperties.isEnabled()); + SolrFacetProperties fp = facetConfig.getDefaultFacets().get(facetProperties.getFilterID()); + properties.put(SolrFacetModel.PROP_IS_DEFAULT, (fp == null) ? false : fp.isDefault()); + return properties; } @@ -531,6 +540,7 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF { SolrFacetProperties fp = getFacetProperties(childAssocRef.getChildRef()); this.facetsMap.put(fp.getFilterID(), fp); + this.facetNodeRefCache.put(fp.getFilterID(), childAssocRef.getChildRef()); } @Override @@ -538,5 +548,6 @@ public class SolrFacetServiceImpl extends AbstractLifecycleBean implements SolrF { String filterID = (String) nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); this.facetsMap.remove(filterID); + this.facetNodeRefCache.remove(filterID); } }