Гибкий поиск и ограничения в SAP Hybris (Commerce)
Flexible Search — это язык поиска, встроенный в SAP Hybris(Commerce). Он позволяет выполнять поиск типов и элементов SAP Hybris(Commerce) с использованием синтаксиса на основе SQL.
Выполнение оператора FlexibleSearch происходит в два этапа:
- Предварительный анализ в оператор, совместимый с SQL: преобразует синтаксис FlexibleSearch в SQL-запрос.
- Выполнение этого оператора в базе данных: выполняется 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, но он отвечает пустым результатом? Вы можете попробовать отключить ограничения:
- Назначение сеанса пользователю-администратору: ограничения не распространяются на пользователей-администраторов.
Назначение сеанса пользователю-администратору имеет побочный эффект предоставления сеансу доступа к каждой версии каталога в 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
Создание ограничений
- Создание ограничений через 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
Поставьте лайк этому сообщению и подпишитесь на мой блог, если он будет вам полезен.