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.JSONObject;
019 import com.liferay.portal.kernel.log.Log;
020 import com.liferay.portal.kernel.log.LogFactoryUtil;
021 import com.liferay.portal.kernel.search.BooleanClause;
022 import com.liferay.portal.kernel.search.BooleanClauseFactoryUtil;
023 import com.liferay.portal.kernel.search.BooleanClauseOccur;
024 import com.liferay.portal.kernel.search.Field;
025 import com.liferay.portal.kernel.search.SearchContext;
026 import com.liferay.portal.kernel.search.facet.config.FacetConfiguration;
027 import com.liferay.portal.kernel.search.filter.BooleanFilter;
028 import com.liferay.portal.kernel.search.filter.Filter;
029 import com.liferay.portal.kernel.search.filter.TermsFilter;
030 import com.liferay.portal.kernel.util.ArrayUtil;
031 import com.liferay.portal.kernel.util.GetterUtil;
032 import com.liferay.portal.kernel.util.Validator;
033 import com.liferay.portal.model.Group;
034 import com.liferay.portal.model.Layout;
035 import com.liferay.portal.service.GroupLocalServiceUtil;
036 import com.liferay.portal.service.LayoutLocalServiceUtil;
037
038 import java.util.ArrayList;
039 import java.util.List;
040
041
044 public class ScopeFacet extends MultiValueFacet {
045
046 public ScopeFacet(SearchContext searchContext) {
047 super(searchContext);
048
049 setFieldName(Field.GROUP_ID);
050 }
051
052 protected long[] addScopeGroup(long groupId) {
053 try {
054 List<Long> groupIds = new ArrayList<>();
055
056 groupIds.add(groupId);
057
058 List<Layout> publicLayouts =
059 LayoutLocalServiceUtil.getScopeGroupLayouts(groupId, false);
060
061 for (Layout layout :publicLayouts) {
062 Group group = layout.getScopeGroup();
063
064 groupIds.add(group.getGroupId());
065 }
066
067 List<Layout> privateLayouts =
068 LayoutLocalServiceUtil.getScopeGroupLayouts(groupId, true);
069
070 for (Layout layout : privateLayouts) {
071 Group group = layout.getScopeGroup();
072
073 groupIds.add(group.getGroupId());
074 }
075
076 return ArrayUtil.toLongArray(groupIds);
077 }
078 catch (Exception e) {
079 _log.error(e, e);
080 }
081
082 return new long[] {groupId};
083 }
084
085 @Override
086 protected BooleanClause<Filter> doGetFacetFilterBooleanClause() {
087 SearchContext searchContext = getSearchContext();
088
089 FacetConfiguration facetConfiguration = getFacetConfiguration();
090
091 JSONObject dataJSONObject = facetConfiguration.getData();
092
093 long[] groupIds = null;
094
095 if (dataJSONObject.has("values")) {
096 JSONArray valuesJSONArray = dataJSONObject.getJSONArray("values");
097
098 groupIds = new long[valuesJSONArray.length()];
099
100 for (int i = 0; i < valuesJSONArray.length(); i++) {
101 groupIds[i] = valuesJSONArray.getLong(i);
102 }
103 }
104
105 if (ArrayUtil.isEmpty(groupIds)) {
106 groupIds = searchContext.getGroupIds();
107 }
108
109 String groupIdParam = GetterUtil.getString(
110 searchContext.getAttribute("groupId"));
111
112 if (Validator.isNotNull(groupIdParam)) {
113 long groupId = GetterUtil.getLong(groupIdParam);
114
115 groupIds = addScopeGroup(groupId);
116 }
117
118 if (ArrayUtil.isEmpty(groupIds) ||
119 ((groupIds.length == 1) && (groupIds[0] == 0))) {
120
121 return null;
122 }
123
124 BooleanFilter facetBooleanFilter = new BooleanFilter();
125
126 long ownerUserId = searchContext.getOwnerUserId();
127
128 if (ownerUserId > 0) {
129 facetBooleanFilter.addRequiredTerm(Field.USER_ID, ownerUserId);
130 }
131
132 TermsFilter groupIdsTermsFilter = new TermsFilter(Field.GROUP_ID);
133 TermsFilter scopeGroupIdsTermsFilter = new TermsFilter(
134 Field.SCOPE_GROUP_ID);
135
136 for (int i = 0; i < groupIds.length; i ++) {
137 long groupId = groupIds[i];
138
139 if (groupId <= 0) {
140 continue;
141 }
142
143 try {
144 Group group = GroupLocalServiceUtil.getGroup(groupId);
145
146 if (!group.isActive()) {
147 continue;
148 }
149
150 long parentGroupId = groupId;
151
152 if (group.isLayout()) {
153 parentGroupId = group.getParentGroupId();
154 }
155
156 groupIdsTermsFilter.addValue(String.valueOf(parentGroupId));
157
158 groupIds[i] = parentGroupId;
159
160 if (group.isLayout() || searchContext.isScopeStrict()) {
161 scopeGroupIdsTermsFilter.addValue(String.valueOf(groupId));
162 }
163 }
164 catch (Exception e) {
165 if (_log.isDebugEnabled()) {
166 _log.debug(e, e);
167 }
168 }
169 }
170
171 searchContext.setGroupIds(groupIds);
172
173 if (!groupIdsTermsFilter.isEmpty()) {
174 facetBooleanFilter.add(
175 groupIdsTermsFilter, BooleanClauseOccur.MUST);
176 }
177
178 if (!scopeGroupIdsTermsFilter.isEmpty()) {
179 facetBooleanFilter.add(
180 scopeGroupIdsTermsFilter, BooleanClauseOccur.MUST);
181 }
182
183 return BooleanClauseFactoryUtil.createFilter(
184 searchContext, facetBooleanFilter, BooleanClauseOccur.MUST);
185 }
186
187 private static final Log _log = LogFactoryUtil.getLog(ScopeFacet.class);
188
189 }