Expand my Community achievements bar.

SOLVED

Querybuilder using stream

Avatar

Level 8

Hello Everyone,

 

I have few pages under: /content/abc/us/en  which is having node property:  article value as blog

Now, I need to find out list of pages under:  /content/abc/us/en where  property "article" has the value: blog.

How can I write the query using Java Stream option. Output will be list of pages. i mean List<myPage> = .......

Note: I have sling model: class myPage    which is having the member variables, necessary to hold the page properties.

Can someone, help me to write Querybuilder?

Was searching here: https://kiransg.com/2021/11/22/aem-with-java-streams/

 

Thanks

1 Accepted Solution

Avatar

Correct answer by
Level 4

Hi @Mahesh_Gunaje You can use the QueryBuilder API in AEM to achieve this. Here's an example of how you can write the query using Java Stream:

 

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

import java.util.List;
import java.util.stream.Stream;

@Component
public class MyQueryBuilder {

@Reference
private ResourceResolverFactory resourceResolverFactory;

public List<myPage> getPagesWithArticleProperty() {
ResourceResolver resourceResolver = resourceResolverFactory.getResourceResolver(null);
Resource rootResource = resourceResolver.getResource("/content/abc/us/en");

QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class);
Query query = queryBuilder.createQuery(PredicateGroup.create(
predicate("article", "blog")
), queryBuilder.getResourceFactory());

SearchResult result = query.execute();
Stream<Resource> resourceStream = StreamSupport.stream(result.getResources().spliterator(), false);

return resourceStream
.map(resource -> resource.adaptTo(myPage.class))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}

In this example, we first get the ResourceResolver instance and then get the root resource using the path /content/abc/us/en. We then create a QueryBuilder instance and define a query using the PredicateGroup API. In this case, we're searching for resources that have a property named "article" with a value of "blog".

We then execute the query and get the search result. We use the StreamSupport class to convert the Resource iterator to a Stream. We then map each Resource to an instance of myPage using the adaptTo method, filter out any null values, and collect the results into a list.

Note that you'll need to inject the ResourceResolverFactory instance using the @Reference annotation, and also make sure that you have the necessary dependencies in your project's pom file.

View solution in original post

2 Replies

Avatar

Community Advisor

Hi @Mahesh_Gunaje 
Here is an example of using QueryBuilder in Java to retrieve article pages with a specific property value. You can write the following query, and if needed, you can use Java Streams to filter, map, or transform the results.

Example Query 

path=/content/abc/us/en
type=cq:Page
property=jcr:content/article
property.value=blog
p.limit=-1


Sample Java cpde
https://github.com/arunpatidar02/aemaacs-aemlab/blob/master/core/src/main/java/com/community/aemlab/... 




Arun Patidar

Avatar

Correct answer by
Level 4

Hi @Mahesh_Gunaje You can use the QueryBuilder API in AEM to achieve this. Here's an example of how you can write the query using Java Stream:

 

import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

import java.util.List;
import java.util.stream.Stream;

@Component
public class MyQueryBuilder {

@Reference
private ResourceResolverFactory resourceResolverFactory;

public List<myPage> getPagesWithArticleProperty() {
ResourceResolver resourceResolver = resourceResolverFactory.getResourceResolver(null);
Resource rootResource = resourceResolver.getResource("/content/abc/us/en");

QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class);
Query query = queryBuilder.createQuery(PredicateGroup.create(
predicate("article", "blog")
), queryBuilder.getResourceFactory());

SearchResult result = query.execute();
Stream<Resource> resourceStream = StreamSupport.stream(result.getResources().spliterator(), false);

return resourceStream
.map(resource -> resource.adaptTo(myPage.class))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
}

In this example, we first get the ResourceResolver instance and then get the root resource using the path /content/abc/us/en. We then create a QueryBuilder instance and define a query using the PredicateGroup API. In this case, we're searching for resources that have a property named "article" with a value of "blog".

We then execute the query and get the search result. We use the StreamSupport class to convert the Resource iterator to a Stream. We then map each Resource to an instance of myPage using the adaptTo method, filter out any null values, and collect the results into a list.

Note that you'll need to inject the ResourceResolverFactory instance using the @Reference annotation, and also make sure that you have the necessary dependencies in your project's pom file.