use of com.day.cq.search.Query 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.day.cq.search.Query in project acs-aem-commons by Adobe-Consulting-Services.
the class LastModifiedOperationImpl method getLastModifiedQuery.
private List<Resource> getLastModifiedQuery(final ResourceResolver resourceResolver, final String userId, final String relativeDateRange, final String nodeType, final String dateProperty, final int limit) {
final List<Resource> resources = new ArrayList<Resource>();
final Map<String, String> map = new HashMap<String, String>();
map.put("path", "/content");
map.put("type", nodeType);
map.put("1_property", NameConstants.PN_PAGE_LAST_MOD_BY);
map.put("1_property.value", userId);
map.put("relativedaterange.property", dateProperty);
map.put("relativedaterange.lowerBound", relativeDateRange);
map.put("orderby", dateProperty);
map.put("orderby.sort", "desc");
map.put("p.limit", String.valueOf(limit));
map.put("p.guessTotal", "true");
try {
log.debug("Lastmod QueryBuilder Map: {}", new JSONObject(map).toString(2));
} catch (JSONException e) {
// no-op
}
final Query query = queryBuilder.createQuery(PredicateGroup.create(map), resourceResolver.adaptTo(Session.class));
final SearchResult result = query.getResult();
for (final Hit hit : result.getHits()) {
try {
resources.add(hit.getResource());
} catch (RepositoryException e) {
log.error("Error resolving Hit to Resource [ {} ]. " + "Likely issue with lucene index being out of sync.", hit.toString());
}
}
return resources;
}
use of com.day.cq.search.Query in project acs-aem-commons by Adobe-Consulting-Services.
the class OnDeployScriptBaseTest method testSearchAndUpdateResourceTypeWhenNoNodesFound.
@Test
public void testSearchAndUpdateResourceTypeWhenNoNodesFound() throws RepositoryException {
Query query = mock(Query.class);
SearchResult result = mock(SearchResult.class);
when(result.getNodes()).thenReturn(Collections.EMPTY_LIST.iterator());
when(query.getResult()).thenReturn(result);
when(queryBuilder.createQuery(any(PredicateGroup.class), any(Session.class))).thenReturn(query);
onDeployScript.searchAndUpdateResourceType("mysite/type/old", "mysite/type/new");
assertLogText("No nodes found with resource type: mysite/type/old");
}
use of com.day.cq.search.Query in project acs-aem-commons by Adobe-Consulting-Services.
the class OnDeployScriptBaseTest method testSearchAndUpdateResourceType.
@Test
public void testSearchAndUpdateResourceType() throws RepositoryException {
Node contentRoot = resourceResolver.getResource("/content").adaptTo(Node.class);
Node node1 = contentRoot.addNode("search-and-update-node1");
node1.setProperty("sling:resourceType", "mysite/type/old");
Node node2 = contentRoot.addNode("search-and-update-node2");
node2.setProperty("sling:resourceType", "mysite/type/old");
final Query query = mock(Query.class);
SearchResult result = mock(SearchResult.class);
when(result.getNodes()).thenReturn(Arrays.asList(node1, node2).iterator());
when(query.getResult()).thenReturn(result);
when(queryBuilder.createQuery(any(PredicateGroup.class), any(Session.class))).then(new Answer<Query>() {
@Override
public Query answer(InvocationOnMock invocationOnMock) throws Throwable {
PredicateGroup pg = invocationOnMock.getArgumentAt(0, PredicateGroup.class);
assertEquals("-1", pg.getParameters().get("limit"));
assertEquals("path", pg.get(0).getType());
assertEquals("/content", pg.get(0).getParameters().get("path"));
assertEquals("property", pg.get(1).getType());
assertEquals("sling:resourceType", pg.get(1).getParameters().get("property"));
assertEquals("mysite/type/old", pg.get(1).getParameters().get("value"));
return query;
}
});
onDeployScript.searchAndUpdateResourceType("mysite/type/old", "mysite/type/new");
assertEquals("mysite/type/new", node1.getProperty("sling:resourceType").getString());
assertEquals("mysite/type/new", node2.getProperty("sling:resourceType").getString());
}
use of com.day.cq.search.Query in project acs-aem-commons by Adobe-Consulting-Services.
the class QueryBuilderViewHandler method createQuery.
@Override
protected ViewQuery createQuery(SlingHttpServletRequest slingRequest, Session session, String queryString) throws Exception {
final ResourceResolver resolver = slingRequest.getResourceResolver();
final QueryBuilder qb = resolver.adaptTo(QueryBuilder.class);
Map<String, String> map;
if (GQLToQueryBuilderConverter.convertToQueryBuilder(slingRequest)) {
map = this.convertToQueryBuilderParams(slingRequest, queryString);
log.debug("Forced QueryBuilder Parameter Map: {}", map);
} else {
map = this.getQueryBuilderParams(slingRequest, queryString);
log.debug("Converted QueryBuilder Parameter Map: {}", map);
}
final Query query = qb.createQuery(PredicateGroup.create(map), session);
return new QueryBuilderViewQuery(query);
}
Aggregations