From 7f6eebd6ae48878d72fdd1e934a0c3e91de4f494 Mon Sep 17 00:00:00 2001 From: Andrei Rebegea Date: Thu, 15 Jun 2017 11:13:39 +0000 Subject: [PATCH] Merged 5.2.N (5.2.2) to HEAD (5.2) 137039 gjames: Merged searchrep (5.2.1) to 5.2.N (5.2.1) 136676 gjames: SEARCH-441: Adding a "history" scope that uses a fake store mapping to call a /solr/history index git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@137554 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../search/context/SearchRequestContext.java | 11 +++++ .../rest/api/search/impl/ResultMapper.java | 13 ++++- .../rest/api/search/impl/SearchMapper.java | 15 ++++-- .../rest/api/search/impl/StoreMapper.java | 9 ++++ .../rest/api/search/ResultMapperTests.java | 3 +- .../rest/api/search/SearchMapperTests.java | 48 +++++++++++++++++-- 6 files changed, 89 insertions(+), 10 deletions(-) diff --git a/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java b/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java index 737b711a22..83b3a04db9 100644 --- a/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java +++ b/source/java/org/alfresco/rest/api/search/context/SearchRequestContext.java @@ -33,11 +33,14 @@ import org.alfresco.rest.api.search.model.Query; import org.alfresco.rest.api.search.model.SearchQuery; import org.alfresco.service.cmr.search.IntervalParameters; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -52,12 +55,15 @@ public class SearchRequestContext private final Query query; private final boolean includeRequest; private final Map pivotKeys; + private final Set stores; private SearchRequestContext(Query query, boolean includeRequest) { this.query = query; this.includeRequest = includeRequest; this.pivotKeys = new HashMap<>(); + this.stores = new HashSet<>(); + /** this.facetQueries = facetQueries!=null?Collections.unmodifiableList(facetQueries): Collections.emptyList(); this.facetFields = new FacetFields(facetFields!=null?Collections.unmodifiableList(facetFields.getFacets()):Collections.emptyList()); @@ -87,4 +93,9 @@ public class SearchRequestContext { return pivotKeys; } + public Set getStores() + { + return stores; + } + } diff --git a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java index a818c820ef..f78126b705 100644 --- a/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/ResultMapper.java @@ -27,6 +27,7 @@ package org.alfresco.rest.api.search.impl; import static org.alfresco.rest.api.search.impl.StoreMapper.DELETED; +import static org.alfresco.rest.api.search.impl.StoreMapper.HISTORY; import static org.alfresco.rest.api.search.impl.StoreMapper.LIVE_NODES; import static org.alfresco.rest.api.search.impl.StoreMapper.VERSIONS; import org.alfresco.repo.search.impl.lucene.SolrJSONResultSet; @@ -148,10 +149,11 @@ public class ResultMapper Map mapUserInfo = new HashMap<>(10); Map>>> hightLighting = results.getHighlighting(); int notFound = 0; + boolean isHistory = searchRequestContext.getStores().contains(StoreMapper.HISTORY); for (ResultSetRow row:results) { - Node aNode = getNode(row, params, mapUserInfo); + Node aNode = getNode(row, params, mapUserInfo, isHistory); if (aNode != null) { @@ -201,20 +203,27 @@ public class ResultMapper /** * Builds a node representation based on a ResultSetRow; + * @param searchRequestContext * @param aRow * @param params * @param mapUserInfo + * @param isHistory * @return Node */ - public Node getNode(ResultSetRow aRow, Params params, Map mapUserInfo) + public Node getNode(ResultSetRow aRow, Params params, Map mapUserInfo, boolean isHistory) { String nodeStore = storeMapper.getStore(aRow.getNodeRef()); + if (isHistory) nodeStore = HISTORY; Node aNode = null; + switch (nodeStore) { case LIVE_NODES: aNode = nodes.getFolderOrDocument(aRow.getNodeRef(), null, null, params.getInclude(), mapUserInfo); break; + case HISTORY: + aNode = nodes.getFolderOrDocument(aRow.getNodeRef(), null, null, params.getInclude(), mapUserInfo); + break; case VERSIONS: Map properties = serviceRegistry.getNodeService().getProperties(aRow.getNodeRef()); NodeRef frozenNodeRef = ((NodeRef) properties.get(Version2Model.PROP_QNAME_FROZEN_NODE_REF)); diff --git a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java index 78b68690ca..8d90a8c835 100644 --- a/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/SearchMapper.java @@ -119,7 +119,7 @@ public class SearchMapper fromSpellCheck(sp, searchQuery.getSpellcheck()); fromHighlight(sp, searchQuery.getHighlight()); fromFacetIntervals(sp, searchQuery.getFacetIntervals()); - fromScope(sp, searchQuery.getScope()); + fromScope(sp, searchQuery.getScope(), searchRequestContext); fromLimits(sp, searchQuery.getLimits()); return sp; @@ -445,10 +445,11 @@ public class SearchMapper /** * SearchParameters from Scope object - * @param sp SearchParameters * @param Scope scope + * @param sp SearchParameters + * @param searchRequestContext */ - public void fromScope(SearchParameters sp, Scope scope) + public void fromScope(SearchParameters sp, Scope scope, SearchRequestContext searchRequestContext) { if (scope != null) { @@ -457,6 +458,8 @@ public class SearchMapper { //First reset the stores then add them. sp.getStores().clear(); + + searchRequestContext.getStores().addAll(stores); for (String aStore:stores) { try @@ -469,6 +472,12 @@ public class SearchMapper new Object[] { aStore }); } } + + if (stores.contains(StoreMapper.HISTORY) && (stores.size() > 1)) + { + throw new InvalidArgumentException(InvalidArgumentException.DEFAULT_MESSAGE_ID, + new Object[] { ": scope 'history' can only be used on its own" }); + } } } } diff --git a/source/java/org/alfresco/rest/api/search/impl/StoreMapper.java b/source/java/org/alfresco/rest/api/search/impl/StoreMapper.java index df39e2bc0a..fd9352fb68 100644 --- a/source/java/org/alfresco/rest/api/search/impl/StoreMapper.java +++ b/source/java/org/alfresco/rest/api/search/impl/StoreMapper.java @@ -43,10 +43,12 @@ public class StoreMapper public static final String LIVE_NODES = "nodes"; public static final String VERSIONS = "versions"; public static final String DELETED = "deleted-nodes"; + public static final String HISTORY = "history"; private static Log logger = LogFactory.getLog(StoreMapper.class); public static final StoreRef STORE_REF_VERSION2_SPACESSTORE = new StoreRef("workspace", Version2Model.STORE_ID); + public static final StoreRef STORE_REF_HISTORY = new StoreRef("workspace", "history"); /** * Work out which StoreRef this store belongs to. @@ -65,6 +67,8 @@ public class StoreMapper return STORE_REF_VERSION2_SPACESSTORE; case DELETED: return StoreRef.STORE_REF_ARCHIVE_SPACESSTORE; + case HISTORY: + return STORE_REF_HISTORY; } } throw new InvalidArgumentException(InvalidArgumentException.DEFAULT_MESSAGE_ID, @@ -94,6 +98,11 @@ public class StoreMapper { return DELETED; } + + if (STORE_REF_HISTORY.equals(nodeRef.getStoreRef())) + { + return HISTORY; + } } logger.warn("Unknown store ref: "+nodeRef); diff --git a/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java b/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java index fbfc0b357f..b0ad6f12c1 100644 --- a/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/ResultMapperTests.java @@ -249,7 +249,8 @@ public class ResultMapperTests @Test public void testNoResults() throws Exception { - CollectionWithPagingInfo collection = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, null, null, new EmptyResultSet()); + SearchRequestContext searchRequest = SearchRequestContext.from(SearchQuery.EMPTY); + CollectionWithPagingInfo collection = mapper.toCollectionWithPagingInfo(EMPTY_PARAMS, searchRequest, null, new EmptyResultSet()); assertNotNull(collection); assertFalse(collection.hasMoreItems()); assertTrue(collection.getTotalItems() < 1); diff --git a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java index f9ec510fdb..c20c1ded4c 100644 --- a/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java +++ b/source/test-java/org/alfresco/rest/api/search/SearchMapperTests.java @@ -445,17 +445,18 @@ public class SearchMapperTests { SearchParameters searchParameters = new SearchParameters(); searchMapper.setDefaults(searchParameters); + SearchRequestContext searchRequestContext = SearchRequestContext.from(minimalQuery()); //Doesn't error, has default store - searchMapper.fromScope(searchParameters, null); + searchMapper.fromScope(searchParameters, null, searchRequestContext); assertEquals(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE,searchParameters.getStores().get(0)); - searchMapper.fromScope(searchParameters, new Scope(null)); + searchMapper.fromScope(searchParameters, new Scope(null), searchRequestContext); assertEquals(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE,searchParameters.getStores().get(0)); try { - searchMapper.fromScope(searchParameters, new Scope(Arrays.asList("nonsense"))); + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList("nonsense")), searchRequestContext); fail(); } catch (InvalidArgumentException iae) @@ -464,11 +465,50 @@ public class SearchMapperTests assertNotNull(iae); } - searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.DELETED, StoreMapper.LIVE_NODES, StoreMapper.VERSIONS))); + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.DELETED, StoreMapper.LIVE_NODES, StoreMapper.VERSIONS)), + searchRequestContext); assertEquals(3 ,searchParameters.getStores().size()); assertEquals(StoreRef.STORE_REF_ARCHIVE_SPACESSTORE.toString(),searchParameters.getStores().get(0).toString()); assertEquals(StoreRef.STORE_REF_WORKSPACE_SPACESSTORE.toString(),searchParameters.getStores().get(1).toString()); assertEquals(StoreMapper.STORE_REF_VERSION2_SPACESSTORE.toString(),searchParameters.getStores().get(2).toString()); + + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.HISTORY)), searchRequestContext); + assertEquals(1 ,searchParameters.getStores().size()); + assertEquals(StoreMapper.STORE_REF_HISTORY.toString(),searchParameters.getStores().get(0).toString()); + + try + { + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.HISTORY, StoreMapper.DELETED)), searchRequestContext); + fail(); + } + catch (InvalidArgumentException iae) + { + //Must be a valid scope with history + assertNotNull(iae); + } + + + try + { + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.HISTORY, StoreMapper.LIVE_NODES)), searchRequestContext); + fail(); + } + catch (InvalidArgumentException iae) + { + //Must be a valid scope with history + assertNotNull(iae); + } + + try + { + searchMapper.fromScope(searchParameters, new Scope(Arrays.asList(StoreMapper.HISTORY, StoreMapper.VERSIONS)), searchRequestContext); + fail(); + } + catch (InvalidArgumentException iae) + { + //Must be a valid scope with history + assertNotNull(iae); + } } @Test