All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.commerce.discount.internal.search.CommerceDiscountIndexer Maven / Gradle / Ivy

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 */

package com.liferay.commerce.discount.internal.search;

import com.liferay.commerce.discount.model.CommerceDiscount;
import com.liferay.commerce.discount.model.CommerceDiscountAccountRel;
import com.liferay.commerce.discount.model.CommerceDiscountCommerceAccountGroupRel;
import com.liferay.commerce.discount.service.CommerceDiscountAccountRelLocalService;
import com.liferay.commerce.discount.service.CommerceDiscountCommerceAccountGroupRelLocalService;
import com.liferay.commerce.discount.service.CommerceDiscountLocalService;
import com.liferay.commerce.discount.target.CommerceDiscountOrderTarget;
import com.liferay.commerce.discount.target.CommerceDiscountProductTarget;
import com.liferay.commerce.discount.target.CommerceDiscountTarget;
import com.liferay.commerce.discount.target.CommerceDiscountTargetRegistry;
import com.liferay.commerce.model.CommerceOrder;
import com.liferay.commerce.product.model.CPDefinition;
import com.liferay.commerce.product.model.CommerceChannel;
import com.liferay.commerce.product.model.CommerceChannelRel;
import com.liferay.commerce.product.service.CPDefinitionLocalService;
import com.liferay.commerce.product.service.CommerceChannelLocalService;
import com.liferay.commerce.product.service.CommerceChannelRelLocalService;
import com.liferay.commerce.service.CommerceOrderLocalService;
import com.liferay.portal.kernel.dao.orm.IndexableActionableDynamicQuery;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.search.BaseIndexer;
import com.liferay.portal.kernel.search.BooleanClauseOccur;
import com.liferay.portal.kernel.search.BooleanQuery;
import com.liferay.portal.kernel.search.Document;
import com.liferay.portal.kernel.search.Field;
import com.liferay.portal.kernel.search.IndexWriterHelper;
import com.liferay.portal.kernel.search.Indexer;
import com.liferay.portal.kernel.search.SearchContext;
import com.liferay.portal.kernel.search.Summary;
import com.liferay.portal.kernel.search.filter.BooleanFilter;
import com.liferay.portal.kernel.search.filter.Filter;
import com.liferay.portal.kernel.search.filter.MissingFilter;
import com.liferay.portal.kernel.search.filter.TermFilter;
import com.liferay.portal.kernel.search.filter.TermsFilter;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.workflow.WorkflowConstants;
import com.liferay.portal.search.filter.FilterBuilders;
import com.liferay.portal.search.filter.TermsSetFilterBuilder;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.LongStream;
import java.util.stream.Stream;

import javax.portlet.PortletRequest;
import javax.portlet.PortletResponse;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.component.annotations.ReferencePolicy;
import org.osgi.service.component.annotations.ReferencePolicyOption;

/**
 * @author Marco Leo
 * @author Alessio Antonio Rendina
 */
@Component(immediate = true, service = Indexer.class)
public class CommerceDiscountIndexer extends BaseIndexer {

	public static final String CLASS_NAME = CommerceDiscount.class.getName();

	public static final String FIELD_ACTIVE = "active";

	public static final String FIELD_COUPON_CODE = "couponCode";

	public static final String FIELD_GROUP_IDS = "groupIds";

	public static final String FIELD_TARGET_TYPE = "targetType";

	public static final String FIELD_USE_COUPON_CODE = "useCouponCode";

	public CommerceDiscountIndexer() {
		setDefaultSelectedFieldNames(
			Field.COMPANY_ID, Field.ENTRY_CLASS_NAME, Field.ENTRY_CLASS_PK,
			Field.MODIFIED_DATE, Field.NAME, Field.UID);
		setFilterSearch(true);
		setPermissionAware(true);
	}

	@Override
	public String getClassName() {
		return CLASS_NAME;
	}

	@Override
	public void postProcessContextBooleanFilter(
			BooleanFilter contextBooleanFilter, SearchContext searchContext)
		throws Exception {

		int[] statuses = GetterUtil.getIntegerValues(
			searchContext.getAttribute(Field.STATUS), null);

		if (ArrayUtil.isEmpty(statuses)) {
			int status = GetterUtil.getInteger(
				searchContext.getAttribute(Field.STATUS),
				WorkflowConstants.STATUS_APPROVED);

			statuses = new int[] {status};
		}

		if (!ArrayUtil.contains(statuses, WorkflowConstants.STATUS_ANY)) {
			TermsFilter statusesTermsFilter = new TermsFilter(Field.STATUS);

			statusesTermsFilter.addValues(ArrayUtil.toStringArray(statuses));

			contextBooleanFilter.add(
				statusesTermsFilter, BooleanClauseOccur.MUST);
		}
		else {
			contextBooleanFilter.addTerm(
				Field.STATUS, String.valueOf(WorkflowConstants.STATUS_IN_TRASH),
				BooleanClauseOccur.MUST_NOT);
		}

		boolean skipCommerceAccountGroupValidation = GetterUtil.getBoolean(
			searchContext.getAttribute("skipCommerceAccountGroupValidation"));

		if (!skipCommerceAccountGroupValidation) {
			long[] commerceAccountGroupIds = GetterUtil.getLongValues(
				searchContext.getAttribute("commerceAccountGroupIds"), null);

			if (commerceAccountGroupIds == null) {
				commerceAccountGroupIds = new long[0];
			}

			TermsSetFilterBuilder termsSetFilterBuilder =
				_filterBuilders.termsSetFilterBuilder();

			termsSetFilterBuilder.setFieldName("commerceAccountGroupIds");
			termsSetFilterBuilder.setMinimumShouldMatchField(
				"commerceAccountGroupIds_required_matches");

			List values = new ArrayList<>(
				commerceAccountGroupIds.length);

			for (long commerceAccountGroupId : commerceAccountGroupIds) {
				values.add(String.valueOf(commerceAccountGroupId));
			}

			termsSetFilterBuilder.setValues(values);

			Filter termFilter = new TermFilter(
				"commerceAccountGroupIds_required_matches", "0");

			BooleanFilter fieldBooleanFilter = new BooleanFilter();

			fieldBooleanFilter.add(termFilter, BooleanClauseOccur.SHOULD);
			fieldBooleanFilter.add(
				termsSetFilterBuilder.build(), BooleanClauseOccur.SHOULD);

			contextBooleanFilter.add(
				fieldBooleanFilter, BooleanClauseOccur.MUST);
		}

		long[] groupIds = GetterUtil.getLongValues(
			searchContext.getAttribute(FIELD_GROUP_IDS), null);

		if ((groupIds != null) && (groupIds.length > 0)) {
			BooleanFilter groupBooleanFilter = new BooleanFilter();

			for (long groupId : groupIds) {
				Filter termFilter = new TermFilter(
					FIELD_GROUP_IDS, String.valueOf(groupId));

				groupBooleanFilter.add(termFilter, BooleanClauseOccur.SHOULD);
			}

			groupBooleanFilter.add(
				new MissingFilter(FIELD_GROUP_IDS), BooleanClauseOccur.SHOULD);

			contextBooleanFilter.add(
				groupBooleanFilter, BooleanClauseOccur.MUST);
		}

		boolean active = GetterUtil.getBoolean(
			searchContext.getAttribute(FIELD_ACTIVE));

		if (active) {
			contextBooleanFilter.addRequiredTerm(
				FIELD_ACTIVE, String.valueOf(active));
		}

		String targetType = GetterUtil.getString(
			searchContext.getAttribute("targetType"), null);

		if (Validator.isNotNull(targetType)) {
			contextBooleanFilter.addRequiredTerm(FIELD_TARGET_TYPE, targetType);
		}

		String couponCode = GetterUtil.getString(
			searchContext.getAttribute(FIELD_COUPON_CODE), null);

		if (Validator.isNotNull(couponCode)) {
			BooleanFilter booleanFilter = new BooleanFilter();

			BooleanFilter booleanFilterCoupon = new BooleanFilter();

			booleanFilterCoupon.addRequiredTerm(FIELD_COUPON_CODE, couponCode);
			booleanFilterCoupon.addRequiredTerm(
				FIELD_USE_COUPON_CODE, Boolean.TRUE.toString());

			booleanFilter.add(booleanFilterCoupon);

			booleanFilter.addTerm(
				FIELD_USE_COUPON_CODE, Boolean.FALSE.toString());

			contextBooleanFilter.add(booleanFilter);
		}

		long cpDefinitionId = GetterUtil.getLong(
			searchContext.getAttribute("cpDefinitionId"));

		if (cpDefinitionId > 0) {
			CPDefinition cpDefinition =
				_cpDefinitionLocalService.getCPDefinition(cpDefinitionId);

			for (CommerceDiscountProductTarget commerceDiscountProductTarget :
					_commerceDiscountProductTargets) {

				commerceDiscountProductTarget.postProcessContextBooleanFilter(
					contextBooleanFilter, cpDefinition);
			}
		}

		long commerceOrderId = GetterUtil.getLong(
			searchContext.getAttribute("commerceOrderId"));

		if (commerceOrderId > 0) {
			CommerceOrder commerceOrder =
				_commerceOrderLocalService.getCommerceOrder(commerceOrderId);

			for (CommerceDiscountOrderTarget commerceDiscountOrderTarget :
					_commerceDiscountOrderTargets) {

				commerceDiscountOrderTarget.postProcessContextBooleanFilter(
					contextBooleanFilter, commerceOrder);
			}
		}
	}

	@Override
	public void postProcessSearchQuery(
			BooleanQuery searchQuery, BooleanFilter fullQueryBooleanFilter,
			SearchContext searchContext)
		throws Exception {

		addSearchTerm(searchQuery, searchContext, Field.ENTRY_CLASS_PK, false);
		addSearchTerm(searchQuery, searchContext, Field.NAME, false);
		addSearchTerm(searchQuery, searchContext, Field.USER_NAME, false);

		LinkedHashMap params =
			(LinkedHashMap)searchContext.getAttribute("params");

		if (params != null) {
			String expandoAttributes = (String)params.get("expandoAttributes");

			if (Validator.isNotNull(expandoAttributes)) {
				addSearchExpando(searchQuery, searchContext, expandoAttributes);
			}
		}
	}

	@Override
	protected void doDelete(CommerceDiscount commerceDiscount)
		throws Exception {

		deleteDocument(
			commerceDiscount.getCompanyId(),
			commerceDiscount.getCommerceDiscountId());
	}

	@Override
	protected Document doGetDocument(CommerceDiscount commerceDiscount)
		throws Exception {

		if (_log.isDebugEnabled()) {
			_log.debug("Indexing discount " + commerceDiscount);
		}

		CommerceDiscountTarget commerceDiscountTarget =
			_commerceDiscountTargetRegistry.getCommerceDiscountTarget(
				commerceDiscount.getTarget());

		CommerceDiscountTarget.Type commerceDiscountTargetType =
			commerceDiscountTarget.getType();

		Document document = getBaseModelDocument(CLASS_NAME, commerceDiscount);

		document.addText(Field.TITLE, commerceDiscount.getTitle());

		document.addText(
			FIELD_TARGET_TYPE, commerceDiscountTargetType.toString());
		document.addText(Field.USER_NAME, commerceDiscount.getUserName());
		document.addKeyword(FIELD_ACTIVE, commerceDiscount.isActive());
		document.addKeyword(
			FIELD_COUPON_CODE, commerceDiscount.getCouponCode());
		document.addKeyword(
			FIELD_USE_COUPON_CODE, commerceDiscount.isUseCouponCode());

		List commerceDiscountAccountRels =
			_commerceDiscountAccountRelLocalService.
				getCommerceDiscountAccountRels(
					commerceDiscount.getCommerceDiscountId(), QueryUtil.ALL_POS,
					QueryUtil.ALL_POS, null);

		Stream commerceDiscountAccountRelStream =
			commerceDiscountAccountRels.stream();

		LongStream commerceAccountIdStream =
			commerceDiscountAccountRelStream.mapToLong(
				CommerceDiscountAccountRel::getCommerceAccountId);

		long[] commerceAccountIds = commerceAccountIdStream.toArray();

		document.addNumber("commerceAccountId", commerceAccountIds);

		List
			commerceDiscountCommerceAccountGroupRels =
				_commerceDiscountCommerceAccountGroupRelLocalService.
					getCommerceDiscountCommerceAccountGroupRels(
						commerceDiscount.getCommerceDiscountId(),
						QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);

		Stream
			commerceDiscountCommerceAccountGroupRelStream =
				commerceDiscountCommerceAccountGroupRels.stream();

		LongStream commerceAccountGroupIdStream =
			commerceDiscountCommerceAccountGroupRelStream.mapToLong(
				CommerceDiscountCommerceAccountGroupRel::
					getCommerceAccountGroupId);

		long[] commerceAccountGroupIds = commerceAccountGroupIdStream.toArray();

		document.addNumber("commerceAccountGroupIds", commerceAccountGroupIds);
		document.addNumber(
			"commerceAccountGroupIds_required_matches",
			commerceAccountGroupIds.length);

		List channelIdList = new ArrayList<>();
		List groupIdList = new ArrayList<>();

		List commerceChannelRels =
			_commerceChannelRelLocalService.getCommerceChannelRels(
				commerceDiscount.getModelClassName(),
				commerceDiscount.getCommerceDiscountId(), QueryUtil.ALL_POS,
				QueryUtil.ALL_POS, null);

		for (CommerceChannelRel commerceChannelRel : commerceChannelRels) {
			CommerceChannel commerceChannel =
				_commerceChannelLocalService.fetchCommerceChannel(
					commerceChannelRel.getCommerceChannelId());

			if (commerceChannel == null) {
				continue;
			}

			channelIdList.add(commerceChannel.getCommerceChannelId());
			groupIdList.add(commerceChannel.getGroupId());
		}

		Stream channelIdStream = channelIdList.stream();

		long[] channelIds = channelIdStream.mapToLong(
			l -> l
		).toArray();

		document.addNumber("commerceChannelId", channelIds);

		Stream groupIdStream = groupIdList.stream();

		long[] groupIds = groupIdStream.mapToLong(
			l -> l
		).toArray();

		document.addNumber(FIELD_GROUP_IDS, groupIds);

		if (_log.isDebugEnabled()) {
			_log.debug(
				"Document " + commerceDiscount + " indexed successfully");
		}

		if (commerceDiscountTarget instanceof CommerceDiscountProductTarget) {
			CommerceDiscountProductTarget commerceDiscountProductTarget =
				(CommerceDiscountProductTarget)commerceDiscountTarget;

			commerceDiscountProductTarget.contributeDocument(
				document, commerceDiscount);
		}

		if (commerceDiscountTarget instanceof CommerceDiscountOrderTarget) {
			CommerceDiscountOrderTarget commerceDiscountOrderTarget =
				(CommerceDiscountOrderTarget)commerceDiscountTarget;

			commerceDiscountOrderTarget.contributeDocument(
				document, commerceDiscount);
		}

		return document;
	}

	@Override
	protected Summary doGetSummary(
		Document document, Locale locale, String snippet,
		PortletRequest portletRequest, PortletResponse portletResponse) {

		Summary summary = createSummary(
			document, Field.ENTRY_CLASS_PK, Field.NAME);

		summary.setMaxContentLength(200);

		return summary;
	}

	@Override
	protected void doReindex(CommerceDiscount commerceDiscount)
		throws Exception {

		_indexWriterHelper.updateDocument(
			getSearchEngineId(), commerceDiscount.getCompanyId(),
			getDocument(commerceDiscount), isCommitImmediately());
	}

	@Override
	protected void doReindex(String className, long classPK) throws Exception {
		doReindex(_commerceDiscountLocalService.getCommerceDiscount(classPK));
	}

	@Override
	protected void doReindex(String[] ids) throws Exception {
		long companyId = GetterUtil.getLong(ids[0]);

		reindexCommerceDiscounts(companyId);
	}

	@Reference(
		cardinality = ReferenceCardinality.MULTIPLE,
		policy = ReferencePolicy.DYNAMIC,
		policyOption = ReferencePolicyOption.GREEDY,
		service = CommerceDiscountOrderTarget.class
	)
	protected void registerCommerceDiscountOrderTarget(
		CommerceDiscountOrderTarget commerceDiscountOrderTarget) {

		_commerceDiscountOrderTargets.add(commerceDiscountOrderTarget);
	}

	@Reference(
		cardinality = ReferenceCardinality.MULTIPLE,
		policy = ReferencePolicy.DYNAMIC,
		policyOption = ReferencePolicyOption.GREEDY,
		service = CommerceDiscountProductTarget.class
	)
	protected void registerCommerceDiscountProductTarget(
		CommerceDiscountProductTarget commerceDiscountProductTarget) {

		_commerceDiscountProductTargets.add(commerceDiscountProductTarget);
	}

	protected void reindexCommerceDiscounts(long companyId)
		throws PortalException {

		final IndexableActionableDynamicQuery indexableActionableDynamicQuery =
			_commerceDiscountLocalService.getIndexableActionableDynamicQuery();

		indexableActionableDynamicQuery.setCompanyId(companyId);
		indexableActionableDynamicQuery.setPerformActionMethod(
			(CommerceDiscount commerceDiscount) -> {
				try {
					indexableActionableDynamicQuery.addDocuments(
						getDocument(commerceDiscount));
				}
				catch (PortalException pe) {
					if (_log.isWarnEnabled()) {
						_log.warn(
							"Unable to index commerce discount " +
								commerceDiscount.getCommerceDiscountId(),
							pe);
					}
				}
			});
		indexableActionableDynamicQuery.setSearchEngineId(getSearchEngineId());

		indexableActionableDynamicQuery.performActions();
	}

	protected void unregisterCommerceDiscountOrderTarget(
		CommerceDiscountOrderTarget commerceDiscountOrderTarget) {

		_commerceDiscountOrderTargets.remove(commerceDiscountOrderTarget);
	}

	protected void unregisterCommerceDiscountProductTarget(
		CommerceDiscountProductTarget commerceDiscountProductTarget) {

		_commerceDiscountProductTargets.remove(commerceDiscountProductTarget);
	}

	private static final Log _log = LogFactoryUtil.getLog(
		CommerceDiscountIndexer.class);

	@Reference
	private CommerceChannelLocalService _commerceChannelLocalService;

	@Reference
	private CommerceChannelRelLocalService _commerceChannelRelLocalService;

	@Reference
	private CommerceDiscountAccountRelLocalService
		_commerceDiscountAccountRelLocalService;

	@Reference
	private CommerceDiscountCommerceAccountGroupRelLocalService
		_commerceDiscountCommerceAccountGroupRelLocalService;

	@Reference
	private CommerceDiscountLocalService _commerceDiscountLocalService;

	private final List
		_commerceDiscountOrderTargets = new CopyOnWriteArrayList<>();
	private final List
		_commerceDiscountProductTargets = new CopyOnWriteArrayList<>();

	@Reference
	private CommerceDiscountTargetRegistry _commerceDiscountTargetRegistry;

	@Reference
	private CommerceOrderLocalService _commerceOrderLocalService;

	@Reference
	private CPDefinitionLocalService _cpDefinitionLocalService;

	@Reference
	private FilterBuilders _filterBuilders;

	@Reference
	private IndexWriterHelper _indexWriterHelper;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy