001/* 002 * Copyright 2018 Anyware Services 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.ametys.web.frontoffice.search.metamodel; 017 018import java.util.LinkedHashMap; 019import java.util.Map; 020import java.util.stream.Stream; 021 022import org.ametys.cms.search.SortOrder; 023import org.ametys.cms.search.model.SystemProperty; 024import org.ametys.runtime.i18n.I18nizableText; 025import org.ametys.web.frontoffice.search.metamodel.impl.CommonPertinenceSortDefinition; 026import org.ametys.web.frontoffice.search.metamodel.impl.CommonPseudoContentTypeFacetDefinition; 027import org.ametys.web.frontoffice.search.metamodel.impl.CommonSystemPropertyBasedSortDefinition; 028import org.ametys.web.frontoffice.search.metamodel.impl.CommonTitleSortDefinition; 029import org.ametys.web.frontoffice.search.metamodel.impl.SiteCriterionDefinition; 030import org.ametys.web.frontoffice.search.metamodel.impl.TitleOrWordingCriterionDefinition; 031import org.ametys.web.frontoffice.search.metamodel.impl.WordingCriterionDefinition; 032import org.ametys.web.frontoffice.search.metamodel.impl.WordingCriterionDefinition.WordingType; 033 034/** 035 * Common implementations for criteria, facets, sorts... 036 */ 037public final class SearchServiceCommonImpls 038{ 039 private static final String __COMMON_PREFIX = "common$"; 040 /** The prefix for the ids of wording criterion definitions */ 041 private static final String __WORDING_CRITERION_DEFINITIONS_PREFIX_NAME = __COMMON_PREFIX + "wording$"; 042 /** The prefix for the ids of title or wording criterion definitions */ 043 private static final String __TITLE_OR_WORDING_CRITERION_DEFINITIONS_PREFIX_NAME = __COMMON_PREFIX + "titleorwording$"; 044 /** The ids of site criterion definition */ 045 private static final String __SITE_CRITERION_DEFINITION_NAME = __COMMON_PREFIX + "site"; 046 047 private SearchServiceCommonImpls() 048 { 049 // Nothing 050 } 051 052 static Map<String, SearchServiceCriterionDefinition> getCommonCriterionDefinitions(SearchServiceCreationHelper helper) 053 { 054 Map<String, SearchServiceCriterionDefinition> criterionDefs = new LinkedHashMap<>(); 055 056 // "Wording" (based on "full text" indexation) 057 _getWordingCriteria() 058 .forEach(c -> criterionDefs.put(c.getName(), c)); 059 060 // "Title or Wording" (based on "full text" indexation) 061 _getTitleOrWordingCriteria() 062 .forEach(c -> criterionDefs.put(c.getName(), c)); 063 064 // "Site" common criterion 065 SearchServiceCriterionDefinition<String> siteCriterionDef = new SiteCriterionDefinition(); 066 siteCriterionDef.setName(__SITE_CRITERION_DEFINITION_NAME); 067 siteCriterionDef.setPluginName("web"); 068 siteCriterionDef.setLabel(new I18nizableText("plugin.web", "PLUGINS_WEB_SERVICE_SEARCH_COMMON_CRITERION_SITE")); 069 siteCriterionDef.setEnumerator(helper._siteEnumerator); 070 criterionDefs.put(__SITE_CRITERION_DEFINITION_NAME, siteCriterionDef); 071 072 return criterionDefs; 073 } 074 075 076 private static Stream<SearchServiceCriterionDefinition> _getWordingCriteria() 077 { 078 SearchServiceCriterionDefinition<String> wordingCriteria = new WordingCriterionDefinition(WordingType.TEXTFIELD); 079 wordingCriteria.setName(__WORDING_CRITERION_DEFINITIONS_PREFIX_NAME + "textfield"); 080 wordingCriteria.setPluginName("web"); 081 wordingCriteria.setLabel(new I18nizableText("plugin.web", "PLUGINS_WEB_SERVICE_SEARCH_COMMON_CRITERION_FULL_TEXT")); 082 083 return Stream.of(new SearchServiceCriterionDefinition[] {wordingCriteria}); 084 } 085 086 private static Stream<SearchServiceCriterionDefinition> _getTitleOrWordingCriteria() 087 { 088 SearchServiceCriterionDefinition<String> titleOrWordingCriteria = new TitleOrWordingCriterionDefinition(WordingType.TEXTFIELD); 089 titleOrWordingCriteria.setName(__TITLE_OR_WORDING_CRITERION_DEFINITIONS_PREFIX_NAME + "textfield"); 090 titleOrWordingCriteria.setPluginName("web"); 091 titleOrWordingCriteria.setLabel(new I18nizableText("plugin.web", "PLUGINS_WEB_SERVICE_SEARCH_COMMON_CRITERION_TITLE_OR_FULL_TEXT")); 092 093 return Stream.of(new SearchServiceCriterionDefinition[] {titleOrWordingCriteria}); 094 } 095 096 static Map<String, SearchServiceFacetDefinition> getCommonFacetDefinitions(SearchServiceCreationHelper helper) 097 { 098 Map<String, SearchServiceFacetDefinition> facetDefs = new LinkedHashMap<>(); 099 100 CommonPseudoContentTypeFacetDefinition pseudoContentTypeFacetDefinition = new CommonPseudoContentTypeFacetDefinition(helper._cTypeEP); 101 facetDefs.put(pseudoContentTypeFacetDefinition.getName(), pseudoContentTypeFacetDefinition); 102 103 return facetDefs; 104 } 105 106 static Map<String, SearchServiceSortDefinition> getCommonSortDefinitions(SearchServiceCreationHelper helper) 107 { 108 Map<String, SearchServiceSortDefinition> sortDefs = new LinkedHashMap<>(); 109 110 CommonPertinenceSortDefinition pertinenceSort = new CommonPertinenceSortDefinition(); 111 sortDefs.put(pertinenceSort.getName(), pertinenceSort); 112 CommonTitleSortDefinition titleSort = new CommonTitleSortDefinition(); 113 sortDefs.put(titleSort.getName(), titleSort); 114 115 // Only DESC order is allowed for this kind of dates (last/first validation/modification) because ASC order is irrelevant (in 99% of the time) for search engine 116 SortOrder[] dateOrders = new SortOrder[] {SortOrder.DESC}; 117 118 SystemProperty lastValidationSystemProp = helper._systemPropertyEP.getExtension("lastValidation"); 119 CommonSystemPropertyBasedSortDefinition lastValidationSort = new CommonSystemPropertyBasedSortDefinition(lastValidationSystemProp, dateOrders); 120 sortDefs.put(lastValidationSort.getName(), lastValidationSort); 121 122 SystemProperty firstValidationSystemProp = helper._systemPropertyEP.getExtension("firstValidation"); 123 CommonSystemPropertyBasedSortDefinition firstValidationSort = new CommonSystemPropertyBasedSortDefinition(firstValidationSystemProp, dateOrders); 124 sortDefs.put(firstValidationSort.getName(), firstValidationSort); 125 126 SystemProperty lastModifiedSystemProp = helper._systemPropertyEP.getExtension("lastModified"); 127 CommonSystemPropertyBasedSortDefinition lastModificationSort = new CommonSystemPropertyBasedSortDefinition(lastModifiedSystemProp, dateOrders); 128 sortDefs.put(lastModificationSort.getName(), lastModificationSort); 129 130 SystemProperty lastMajorValidationSystemProp = helper._systemPropertyEP.getExtension("lastMajorValidation"); 131 CommonSystemPropertyBasedSortDefinition lastMajorValidationSort = new CommonSystemPropertyBasedSortDefinition(lastMajorValidationSystemProp, dateOrders); 132 sortDefs.put(lastMajorValidationSort.getName(), lastMajorValidationSort); 133 134 return sortDefs; 135 } 136}