Skip to content

Commit

Permalink
NXP-30360: allow to use sort infos when using a quick filter
Browse files Browse the repository at this point in the history
  • Loading branch information
troger committed Jun 8, 2021
1 parent 5e178bb commit 3fc09d0
Show file tree
Hide file tree
Showing 5 changed files with 197 additions and 14 deletions.
Expand Up @@ -175,12 +175,11 @@ public List<Map<String, Serializable>> getCurrentPage() {
}

protected void buildQuery() {
List<SortInfo> sort = null;
List<SortInfo> sort = new ArrayList<>();
List<QuickFilter> quickFilters = getQuickFilters();
String quickFiltersClause = "";

if (quickFilters != null && !quickFilters.isEmpty()) {
sort = new ArrayList<>();
for (QuickFilter quickFilter : quickFilters) {
String clause = quickFilter.getClause();
if (!quickFiltersClause.isEmpty() && clause != null) {
Expand All @@ -190,15 +189,14 @@ protected void buildQuery() {
}
sort.addAll(quickFilter.getSortInfos());
}
} else if (sortInfos != null) {
sort = sortInfos;
}

SortInfo[] sortArray = null;
if (sort != null) {
sortArray = sort.toArray(new SortInfo[] {});
if (sortInfos != null) {
sort.addAll(sortInfos);
}

SortInfo[] sortArray = sort.toArray(SortInfo[]::new);

String newQuery;
PageProviderDefinition def = getDefinition();
WhereClauseDefinition whereClause = def.getWhereClause();
Expand Down
Expand Up @@ -199,12 +199,11 @@ public List<DocumentModel> getCurrentPage() {
}

protected void buildQuery(CoreSession coreSession) {
List<SortInfo> sort = null;
List<SortInfo> sort = new ArrayList<>();
List<QuickFilter> quickFilters = getQuickFilters();
String quickFiltersClause = "";

if (quickFilters != null && !quickFilters.isEmpty()) {
sort = new ArrayList<>();
for (QuickFilter quickFilter : quickFilters) {
String clause = quickFilter.getClause();
if (clause != null) {
Expand All @@ -216,15 +215,14 @@ protected void buildQuery(CoreSession coreSession) {
}
sort.addAll(quickFilter.getSortInfos());
}
} else if (sortInfos != null) {
sort = sortInfos;
}

SortInfo[] sortArray = null;
if (sort != null) {
sortArray = sort.toArray(new SortInfo[] {});
if (sortInfos != null) {
sort.addAll(sortInfos);
}

SortInfo[] sortArray = sort.toArray(SortInfo[]::new);

String newQuery;
PageProviderDefinition def = getDefinition();
WhereClauseDefinition whereClause = def.getWhereClause();
Expand Down
Expand Up @@ -20,10 +20,12 @@

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;

import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

Expand All @@ -32,6 +34,7 @@
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.SortInfo;
import org.nuxeo.ecm.core.test.CoreFeature;
import org.nuxeo.ecm.core.test.annotations.Granularity;
import org.nuxeo.ecm.core.test.annotations.RepositoryConfig;
Expand All @@ -43,6 +46,7 @@
import org.nuxeo.runtime.test.runner.Deploy;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.TransactionalFeature;

/**
* @since 9.3 see NXP-23092
Expand All @@ -59,6 +63,9 @@ public class TestPageProviderCurrentPage {

protected static final int SECOND_PAGE_NUM_DOCS = 25;

@Inject
protected TransactionalFeature transactionalFeature;

@Inject
protected PageProviderService pps;

Expand Down Expand Up @@ -129,4 +136,102 @@ public void testPageProviderCurrentPageWithoutPageSize() {
assertEquals(prevId, ((DocumentModel) page.get(0)).getId());
}

// NXP-30360
@Deploy("org.nuxeo.ecm.platform.query.api.test:test-pageprovider-quick-filter-contrib.xml")
@Test
@SuppressWarnings("unchecked")
public void testPageProviderSortAndQuickFilter() {
DocumentModel rootFolder = session.createDocumentModel("/", "rootFolder", "Folder");
rootFolder = session.createDocument(rootFolder);
DocumentModel folder = session.createDocumentModel("/rootFolder", "folder", "Folder");
folder.setPropertyValue("dc:title", "Folder");
session.createDocument(folder);
DocumentModel file1 = session.createDocumentModel("/rootFolder", "file1", "File");
file1.setPropertyValue("dc:title", "File 1");
session.createDocument(file1);
DocumentModel file2 = session.createDocumentModel("/rootFolder", "file2", "File");
file2.setPropertyValue("dc:title", "File 2");
session.createDocument(file2);
transactionalFeature.nextTransaction();

var props = Map.of(CoreQueryDocumentPageProvider.CORE_SESSION_PROPERTY, (Serializable) session);
// default sort infos, no quick filter
PageProvider<?> pp = pps.getPageProvider("test_quick_filter", null, 0L, 0L, props, rootFolder.getId());
assertNotNull(pp);
List<DocumentModel> docs = (List<DocumentModel>) pp.getCurrentPage();
assertEquals(3, docs.size());
assertEquals("File 1", docs.get(0).getTitle());
assertEquals("File 2", docs.get(1).getTitle());
assertEquals("Folder", docs.get(2).getTitle());

// custom sort infos, no quick filter
var sortInfos = List.of(new SortInfo("dc:title", false));
pp = pps.getPageProvider("test_quick_filter", sortInfos, 0L, 0L, props, rootFolder.getId());
assertNotNull(pp);
docs = (List<DocumentModel>) pp.getCurrentPage();
assertEquals(3, docs.size());
assertEquals("Folder", docs.get(0).getTitle());
assertEquals("File 2", docs.get(1).getTitle());
assertEquals("File 1", docs.get(2).getTitle());

// custom sort infos, quick filter
var ppd = pps.getPageProviderDefinition("test_quick_filter");
pp = pps.getPageProvider("test_quick_filter", sortInfos, 0L, 0L, props, null, ppd.getQuickFilters(),
rootFolder.getId());
assertNotNull(pp);
docs = (List<DocumentModel>) pp.getCurrentPage();
assertEquals(2, docs.size());
assertEquals("File 2", docs.get(0).getTitle());
assertEquals("File 1", docs.get(1).getTitle());
}

// NXP-30360
@Deploy("org.nuxeo.ecm.platform.query.api.test:test-pageprovider-quick-filter-contrib.xml")
@Test
@SuppressWarnings("unchecked")
public void testPageProviderSortAndQuickFilterWithQueryAndFetch() {
DocumentModel rootFolder = session.createDocumentModel("/", "rootFolder", "Folder");
rootFolder = session.createDocument(rootFolder);
DocumentModel folder = session.createDocumentModel("/rootFolder", "folder", "Folder");
folder.setPropertyValue("dc:title", "Folder");
session.createDocument(folder);
DocumentModel file1 = session.createDocumentModel("/rootFolder", "file1", "File");
file1.setPropertyValue("dc:title", "File 1");
session.createDocument(file1);
DocumentModel file2 = session.createDocumentModel("/rootFolder", "file2", "File");
file2.setPropertyValue("dc:title", "File 2");
session.createDocument(file2);
transactionalFeature.nextTransaction();

var props = Map.of(CoreQueryDocumentPageProvider.CORE_SESSION_PROPERTY, (Serializable) session);
// default sort infos, no quick filter
PageProvider<?> pp = pps.getPageProvider("test_quick_filter_fetch", null, 0L, 0L, props, rootFolder.getId());
assertNotNull(pp);
List<Map<String, Serializable>> res = (List<Map<String, Serializable>>) pp.getCurrentPage();
assertEquals(3, res.size());
assertEquals("File 1", res.get(0).get("dc:title"));
assertEquals("File 2", res.get(1).get("dc:title"));
assertEquals("Folder", res.get(2).get("dc:title"));

// custom sort infos, no quick filter
var sortInfos = List.of(new SortInfo("dc:title", false));
pp = pps.getPageProvider("test_quick_filter_fetch", sortInfos, 0L, 0L, props, rootFolder.getId());
assertNotNull(pp);
res = (List<Map<String, Serializable>>) pp.getCurrentPage();
assertEquals(3, res.size());
assertEquals("Folder", res.get(0).get("dc:title"));
assertEquals("File 2", res.get(1).get("dc:title"));
assertEquals("File 1", res.get(2).get("dc:title"));

// custom sort infos, quick filter
var ppd = pps.getPageProviderDefinition("test_quick_filter_fetch");
pp = pps.getPageProvider("test_quick_filter_fetch", sortInfos, 0L, 0L, props, null, ppd.getQuickFilters(),
rootFolder.getId());
assertNotNull(pp);
res = (List<Map<String, Serializable>>) pp.getCurrentPage();
assertEquals(2, res.size());
assertEquals("File 2", res.get(0).get("dc:title"));
assertEquals("File 1", res.get(1).get("dc:title"));
}

}
@@ -0,0 +1,37 @@
<?xml version="1.0"?>

<component name="org.nuxeo.ecm.platform.query.api.PageProviderservice.quick.filter.testContrib">

<extension target="org.nuxeo.ecm.platform.query.api.PageProviderService"
point="providers">

<coreQueryPageProvider name="test_quick_filter">
<pattern>
SELECT * FROM Document WHERE ecm:parentId = ?
</pattern>
<sort column="dc:title" ascending="true" />
<quickFilters>
<quickFilter name="noFolder">
<clause>ecm:mixinType != 'Folderish'</clause>
</quickFilter>
</quickFilters>
<pageSize>20</pageSize>
</coreQueryPageProvider>

<genericPageProvider name="test_quick_filter_fetch"
class="org.nuxeo.ecm.platform.query.nxql.CoreQueryAndFetchPageProvider">
<pattern>
SELECT dc:title FROM Document WHERE ecm:parentId = ?
</pattern>
<sort column="dc:title" ascending="true" />
<quickFilters>
<quickFilter name="noFolder">
<clause>ecm:mixinType != 'Folderish'</clause>
</quickFilter>
</quickFilters>
<pageSize>20</pageSize>
</genericPageProvider>

</extension>

</component>
Expand Up @@ -48,6 +48,7 @@
import org.nuxeo.runtime.api.Framework;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.TransactionalFeature;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
Expand All @@ -68,6 +69,9 @@ public class SearchTest extends BaseTest {
@Inject
protected CoreFeature coreFeature;

@Inject
protected TransactionalFeature transactionalFeature;

protected static final String QUERY_EXECUTE_PATH = "search/lang/NXQL/execute";

protected static final String SAVED_SEARCH_PATH = "search/saved";
Expand Down Expand Up @@ -349,6 +353,47 @@ public void iCanUseAssociativeQuickFilter() throws IOException {
}
}

@Test
public void iCanPerformPageProviderWithQuickFilterAndSortInfo() throws IOException {
DocumentModel rootFolder = RestServerInit.getFolder(1, session);
DocumentModel folder = session.createDocumentModel(rootFolder.getPathAsString(), "folder", "Folder");
folder.setPropertyValue("dc:title", "Folder");
session.createDocument(folder);
transactionalFeature.nextTransaction();

MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl();
queryParams.add("ecm_path", "[\"" + rootFolder.getPathAsString() + "\"]");
queryParams.add("sortBy", "dc:title");
queryParams.add("sortOrder", "desc");
try (CloseableClientResponse response = getResponse(RequestType.GET,
getSearchPageProviderExecutePath("default_search"), queryParams)) {
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
JsonNode node = mapper.readTree(response.getEntityInputStream());
List<JsonNode> entries = getLogEntries(node);
assertEquals(6, entries.size());
assertEquals("Note 4", entries.get(0).get("title").textValue());
assertEquals("Note 3", entries.get(1).get("title").textValue());
assertEquals("Note 2", entries.get(2).get("title").textValue());
assertEquals("Note 1", entries.get(3).get("title").textValue());
assertEquals("Note 0", entries.get(4).get("title").textValue());
assertEquals("Folder", entries.get(5).get("title").textValue());
}

queryParams.add("quickFilters", "noFolder");
try (CloseableClientResponse response = getResponse(RequestType.GET,
getSearchPageProviderExecutePath("default_search"), queryParams)) {
assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
JsonNode node = mapper.readTree(response.getEntityInputStream());
List<JsonNode> entries = getLogEntries(node);
assertEquals(5, entries.size());
assertEquals("Note 4", entries.get(0).get("title").textValue());
assertEquals("Note 3", entries.get(1).get("title").textValue());
assertEquals("Note 2", entries.get(2).get("title").textValue());
assertEquals("Note 1", entries.get(3).get("title").textValue());
assertEquals("Note 0", entries.get(4).get("title").textValue());
}
}

@Test
public void iCanPerformPageProviderWithNamedParametersInvalid() throws Exception {
try (CloseableClientResponse response = getResponse(RequestType.GET,
Expand Down

0 comments on commit 3fc09d0

Please sign in to comment.