Гибкий поиск и ограничения в SAP Hybris (Commerce)

Flexible Search — это язык поиска, встроенный в SAP Hybris(Commerce). Он позволяет выполнять поиск типов и элементов SAP Hybris(Commerce) с использованием синтаксиса на основе SQL.

Выполнение оператора FlexibleSearch происходит в два этапа:

  1. Предварительный анализ в оператор, совместимый с SQL: преобразует синтаксис FlexibleSearch в SQL-запрос.
  2. Выполнение этого оператора в базе данных: выполняется SQL-запрос.

SAP Hybris(Commerce) выполняет запросы FlexibleSearch в контексте определенной учетной записи пользователя, используя сеанс. Поскольку разные учетные записи пользователей имеют доступ к разным элементам в SAP Hybris (Commerce), количество результатов поиска зависит от учетной записи пользователя (здесь ограничения играют большую роль).

Синтракс

Запрос FlexibleSearch состоит из:

  • Обязательный параметр selects для предложения SELECT.
  • Обязательный параметр ‹types› для предложения FROM.
  • Необязательное поле «условия» для предложения WHERE.
  • Необязательное предложение ORDER BY.

Базовый синтаксис запроса FlexibleSearch выглядит следующим образом:

SELECT <selects> FROM <types> (WHERE <conditions>)? (ORDER BY <order>)?

Пример:

Select * from {Customer} - this query returns all columns and rows of a Customer item type.

По умолчанию подтипы элементов также будут возвращены в результате. Поскольку B2BCustomer является подтипом Customer, экземпляры B2BCustomer также будут возвращены.

С помощью восклицательного знака (!) мы можем исключить подтипы:

Select * from {Customer!}

Пример с условием:

SELECT * FROM {Customer} WHERE {name} IS NOT NULL

Выполнение гибких поисковых запросов с использованием API

final Map<String, Object> params = new HashMap<String, Object>();
String query =”SELECT * FROM {Customer AS c} WHERE {c:name} LIKE ?name”
params.put("name",”Test”);
// Flexible search service injected by Spring
final SearchResult<ProductModel> searchResult = flexibleSearchService.search(query, params);

Примечание. Чтобы вызвать оператор FlexibleSearch с помощью API, используйте flexibleSearchService , который всегда доступен через Spring и должен быть правильно внедрен

Ограничения

Ограничения позволяют ограничивать результаты поиска в зависимости от того, какой тип ищется и какой пользователь в данный момент вошел в систему.

SAP Hybris(Commerce) автоматически использует предложения WHERE всех применимых операторов FlexibleSearch и тем самым ограничивает количество результатов поиска этих операторов из-за этих дополнительных условий поиска.

Ограничение всегда применяется к указанному типу и его подтипам.

Отключение ограничений

Вы пытаетесь получить какие-то данные с помощью FlexibleSearchQuery, но он отвечает пустым результатом? Вы можете попробовать отключить ограничения:

  1. Назначение сеанса пользователю-администратору: ограничения не распространяются на пользователей-администраторов.

Назначение сеанса пользователю-администратору имеет побочный эффект предоставления сеансу доступа к каждой версии каталога в SAP Haybris(Commerce).

Пример:

import de.hybris.platform.servicelayer.user.UserService;
						...
						@Autowired
						private UserService userService;
						...
						userService.setCurrentUser(userService.getAdminUser())

2. Включение или отключение ограничений поиска:

Пример:

import de.hybris.platform.search.restriction.SearchRestrictionService;
						...
						// Disable search restrictions
						searchRestrictionService.disableSearchRestrictions();
						// some query goes here
						
						// Enable search restrictions
						searchRestrictionService.enableSearchRestrictions();
                        // some query goes here

Создание ограничений

  1. Создание ограничений через SAP Hybris(Commerce) API
final SearchRestrictionModel search = modelService.create(SearchRestrictionModel.class);

        search.setPrincipal(user);

        final SearchRestrictionModel searchRestriction = modelService.create(SearchRestrictionModel.class);
        searchRestriction.setActive(Boolean.TRUE);
        searchRestriction.setGenerate(Boolean.TRUE);
        searchRestriction.setCode("not_Jacksons");
        searchRestriction.setPrincipal(user);
        searchRestriction.setQuery("{" + PrincipalGroupModel.UID + "} NOT IN ( 'Jacksons' )");
        searchRestriction.setRestrictedType(typeService.getComposedTypeForClass(PrincipalGroupModel.class));

        modelService.save(searchRestriction);

2. Создание ограничений через расширение ImpEx

INSERT_UPDATESearchRestriction;code[unique=true];name[lang=en];query;principal(UID);restrictedType(code);active;generate
;employee_restriction;Restrict employees visibility;EXISTS ({{ SELECT {pk} FROM {PrincipalGroupRelation} WHERE {source}={item:pk} AND {target} IN ( ?session.branch ) }} ) AND ( {item:active} = 1 OR EXISTS ( {{ select {ug:PK} from {UserGroup as ug} where {ug:PK} IN (?session.user.groups) and {ug:uid} = 'b2badmingroup' }} ));b2bgroup;B2BCustomer;true;true

Подробнее о гибком поиске

Подробнее об ограничениях

Поставьте лайк этому сообщению и подпишитесь на мой блог, если он будет вам полезен.