001
014
015 package com.liferay.portal.kernel.search.facet;
016
017 import com.liferay.portal.kernel.json.JSONArray;
018 import com.liferay.portal.kernel.json.JSONFactoryUtil;
019 import com.liferay.portal.kernel.json.JSONObject;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.search.BooleanClause;
023 import com.liferay.portal.kernel.search.BooleanClauseFactoryUtil;
024 import com.liferay.portal.kernel.search.BooleanClauseOccur;
025 import com.liferay.portal.kernel.search.BooleanQuery;
026 import com.liferay.portal.kernel.search.BooleanQueryFactoryUtil;
027 import com.liferay.portal.kernel.search.Field;
028 import com.liferay.portal.kernel.search.Indexer;
029 import com.liferay.portal.kernel.search.IndexerPostProcessor;
030 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
031 import com.liferay.portal.kernel.search.SearchContext;
032 import com.liferay.portal.kernel.search.SearchEngineUtil;
033 import com.liferay.portal.kernel.search.facet.config.FacetConfiguration;
034 import com.liferay.portal.kernel.util.GetterUtil;
035 import com.liferay.portal.kernel.util.StringUtil;
036
037
040 public class AssetEntriesFacet extends MultiValueFacet {
041
042 public AssetEntriesFacet(SearchContext searchContext) {
043 super(searchContext);
044
045 setFieldName(Field.ENTRY_CLASS_NAME);
046
047 initFacetClause();
048 }
049
050 @Override
051 public void setFacetConfiguration(FacetConfiguration facetConfiguration) {
052 super.setFacetConfiguration(facetConfiguration);
053
054 initFacetClause();
055 }
056
057 @Override
058 protected BooleanClause doGetFacetClause() {
059 SearchContext searchContext = getSearchContext();
060
061 String[] entryClassNames = searchContext.getEntryClassNames();
062
063 BooleanQuery facetQuery = BooleanQueryFactoryUtil.create(searchContext);
064
065 for (String entryClassName : entryClassNames) {
066 Indexer indexer = IndexerRegistryUtil.getIndexer(entryClassName);
067
068 if (indexer == null) {
069 continue;
070 }
071
072 String searchEngineId = searchContext.getSearchEngineId();
073
074 if (!searchEngineId.equals(indexer.getSearchEngineId())) {
075 continue;
076 }
077
078 try {
079 BooleanQuery indexerBooleanQuery = indexer.getFacetQuery(
080 entryClassName, searchContext);
081
082 if ((indexerBooleanQuery == null) ||
083 !indexerBooleanQuery.hasClauses()) {
084
085 continue;
086 }
087
088 BooleanQuery entityQuery = BooleanQueryFactoryUtil.create(
089 searchContext);
090
091 entityQuery.add(indexerBooleanQuery, BooleanClauseOccur.MUST);
092
093 indexer.postProcessContextQuery(entityQuery, searchContext);
094
095 for (IndexerPostProcessor indexerPostProcessor :
096 indexer.getIndexerPostProcessors()) {
097
098 indexerPostProcessor.postProcessContextQuery(
099 entityQuery, searchContext);
100 }
101
102 if (indexer.isStagingAware()) {
103 if (!searchContext.isIncludeLiveGroups() &&
104 searchContext.isIncludeStagingGroups()) {
105
106 entityQuery.addRequiredTerm(Field.STAGING_GROUP, true);
107 }
108 else if (searchContext.isIncludeLiveGroups() &&
109 !searchContext.isIncludeStagingGroups()) {
110
111 entityQuery.addRequiredTerm(Field.STAGING_GROUP, false);
112 }
113 }
114
115 if (entityQuery.hasClauses()) {
116 facetQuery.add(entityQuery, BooleanClauseOccur.SHOULD);
117 }
118 }
119 catch (Exception e) {
120 _log.error(e, e);
121 }
122 }
123
124 if (!facetQuery.hasClauses()) {
125 return null;
126 }
127
128 return BooleanClauseFactoryUtil.create(
129 searchContext, facetQuery, BooleanClauseOccur.MUST.getName());
130 }
131
132 protected void initFacetClause() {
133 SearchContext searchContext = getSearchContext();
134
135 FacetConfiguration facetConfiguration = getFacetConfiguration();
136
137 JSONObject dataJSONObject = facetConfiguration.getData();
138
139 String[] entryClassNames = null;
140
141 if (dataJSONObject.has("values")) {
142 JSONArray valuesJSONArray = dataJSONObject.getJSONArray("values");
143
144 entryClassNames = new String[valuesJSONArray.length()];
145
146 for (int i = 0; i < valuesJSONArray.length(); i++) {
147 entryClassNames[i] = valuesJSONArray.getString(i);
148 }
149 }
150
151 if ((entryClassNames == null) || (entryClassNames.length == 0)) {
152 entryClassNames = searchContext.getEntryClassNames();
153 }
154
155 if (!isStatic()) {
156 String[] entryClassNameParam = StringUtil.split(
157 GetterUtil.getString(
158 searchContext.getAttribute(getFieldName())));
159
160 if ((entryClassNameParam != null) &&
161 (entryClassNameParam.length > 0)) {
162
163 entryClassNames = entryClassNameParam;
164 }
165 }
166
167 if ((entryClassNames == null) || (entryClassNames.length == 0)) {
168 entryClassNames = SearchEngineUtil.getEntryClassNames();
169
170 if (!dataJSONObject.has("values")) {
171 JSONArray entriesJSONArray = JSONFactoryUtil.createJSONArray();
172
173 for (String entryClassName : entryClassNames) {
174 entriesJSONArray.put(entryClassName);
175 }
176
177 dataJSONObject.put("values", entriesJSONArray);
178 }
179 }
180
181 searchContext.setEntryClassNames(entryClassNames);
182 }
183
184 private static Log _log = LogFactoryUtil.getLog(AssetEntriesFacet.class);
185
186 }