use of com.adobe.cq.wcm.core.components.models.Search in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class SearchImplTest method testSearchProperties.
@Test
void testSearchProperties() {
Search search = getSearchUnderTest(SEARCH_PAGE + "/jcr:content/search");
assertEquals(10, search.getResultsSize());
assertEquals(3, search.getSearchTermMinimumLength());
assertEquals("/jcr:content/search", search.getRelativePath());
assertEquals("core/wcm/components/search/v1/search", search.getExportedType());
assertEquals("/content/en/search", search.getSearchRootPagePath());
assertSame(search.getSearchRootPagePath(), search.getSearchRootPagePath());
Utils.testJSONExport(search, Utils.getTestExporterJSONPath(TEST_BASE, "search"));
}
use of com.adobe.cq.wcm.core.components.models.Search in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class SearchImplTest method testSearchProperties_noPath.
@Test
void testSearchProperties_noPath() {
Search search = getSearchUnderTest(SEARCH_PAGE_DE + "/jcr:content/search");
assertEquals(10, search.getResultsSize());
assertEquals(3, search.getSearchTermMinimumLength());
assertEquals("/jcr:content/search", search.getRelativePath());
assertEquals("core/wcm/components/search/v1/search", search.getExportedType());
assertEquals(SEARCH_PAGE_DE, search.getSearchRootPagePath());
assertSame(search.getSearchRootPagePath(), search.getSearchRootPagePath());
Utils.testJSONExport(search, Utils.getTestExporterJSONPath(TEST_BASE, "search2"));
}
use of com.adobe.cq.wcm.core.components.models.Search in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class SearchResultServlet method getResults.
/**
* Gets the search results.
*
* @param request The search request.
* @param searchComponent The search component.
* @param pageManager A PageManager.
* @return List of search results.
*/
@NotNull
private List<ListItem> getResults(@NotNull final SlingHttpServletRequest request, @NotNull final Search searchComponent, @NotNull final PageManager pageManager) {
List<ListItem> results = new ArrayList<>();
String fulltext = request.getParameter(PARAM_FULLTEXT);
if (fulltext == null || fulltext.length() < searchComponent.getSearchTermMinimumLength()) {
return results;
}
long resultsOffset = Optional.ofNullable(request.getParameter(PARAM_RESULTS_OFFSET)).map(Long::parseLong).orElse(0L);
Map<String, String> predicatesMap = new HashMap<>();
predicatesMap.put(FulltextPredicateEvaluator.FULLTEXT, fulltext);
predicatesMap.put(PathPredicateEvaluator.PATH, searchComponent.getSearchRootPagePath());
predicatesMap.put(TypePredicateEvaluator.TYPE, NameConstants.NT_PAGE);
PredicateGroup predicates = PredicateConverter.createPredicates(predicatesMap);
ResourceResolver resourceResolver = request.getResource().getResourceResolver();
Query query = queryBuilder.createQuery(predicates, resourceResolver.adaptTo(Session.class));
if (searchComponent.getResultsSize() != 0) {
query.setHitsPerPage(searchComponent.getResultsSize());
}
if (resultsOffset != 0) {
query.setStart(resultsOffset);
}
SearchResult searchResult = query.getResult();
LinkHandler linkHandler = request.adaptTo(LinkHandler.class);
// Query builder has a leaking resource resolver, so the following work around is required.
ResourceResolver leakingResourceResolver = null;
try {
Iterator<Resource> resourceIterator = searchResult.getResources();
while (resourceIterator.hasNext()) {
Resource resource = resourceIterator.next();
// Get a reference to QB's leaking resource resolver
if (leakingResourceResolver == null) {
leakingResourceResolver = resource.getResourceResolver();
}
Optional.of(resource).map(res -> resourceResolver.getResource(res.getPath())).map(pageManager::getContainingPage).map(page -> new PageListItemImpl(linkHandler, page, searchComponent.getId(), null)).ifPresent(results::add);
}
} finally {
if (leakingResourceResolver != null) {
leakingResourceResolver.close();
}
}
return results;
}
use of com.adobe.cq.wcm.core.components.models.Search in project aem-core-wcm-components by Adobe-Marketing-Cloud.
the class SearchResultServlet method doGet.
@Override
protected void doGet(@NotNull final SlingHttpServletRequest request, @NotNull final SlingHttpServletResponse response) throws IOException {
Page currentPage = Optional.ofNullable(request.getResourceResolver().adaptTo(PageManager.class)).map(pm -> pm.getContainingPage(request.getResource())).orElse(null);
if (currentPage != null) {
SlingBindings bindings = new SlingBindings();
bindings.setSling(new ScriptHelper(bundleContext, null, request, response));
request.setAttribute(SlingBindings.class.getName(), bindings);
Search searchComponent = getSearchComponent(request, currentPage);
try {
List<ListItem> results = getResults(request, searchComponent, currentPage.getPageManager());
response.setContentType("application/json");
response.setCharacterEncoding(StandardCharsets.UTF_8.name());
new ObjectMapper().writeValue(response.getWriter(), results);
} catch (NumberFormatException e) {
response.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
}
Aggregations