From fc1cb0841fe719fefd5165a9b768ae90c91b17c2 Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Tue, 17 Mar 2015 09:39:28 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud) 99486: Merged DEREK/BM-0004 (5.1.0.BM4) to HEAD-BUG-FIX (5.1/Cloud) 98804: Part 2: ACE-1021 SOLR 4 - Sharding/Replication/Cluster/Cloud - SOLR 4 - support multiple stores requested via search parameters - explicit federation over a specified set of stores and related SOLR 4 indexes git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@99545 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../repo/search/SearcherComponent.java | 4 ++-- .../querymodel/impl/db/DBQueryEngine.java | 5 ++++ .../search/impl/solr/SolrQueryHTTPClient.java | 23 +++++++++++++++++++ .../search/impl/solr/SolrSearchService.java | 4 ++-- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/source/java/org/alfresco/repo/search/SearcherComponent.java b/source/java/org/alfresco/repo/search/SearcherComponent.java index eb25c05bd9..db6a62469c 100644 --- a/source/java/org/alfresco/repo/search/SearcherComponent.java +++ b/source/java/org/alfresco/repo/search/SearcherComponent.java @@ -68,9 +68,9 @@ public class SearcherComponent extends AbstractSearcherComponent public ResultSet query(SearchParameters searchParameters) { - if(searchParameters.getStores().size() != 1) + if(searchParameters.getStores().size() == 0) { - throw new IllegalStateException("Only one store can be searched at present"); + throw new IllegalStateException("At least one store must be defined to search"); } StoreRef storeRef = searchParameters.getStores().get(0); SearchService searcher = indexerAndSearcherFactory.getSearcher(storeRef, !searchParameters.excludeDataInTheCurrentTransaction()); diff --git a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java index 8f4bf9d84a..187a49b911 100644 --- a/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java +++ b/source/java/org/alfresco/repo/search/impl/querymodel/impl/db/DBQueryEngine.java @@ -156,6 +156,11 @@ public class DBQueryEngine implements QueryEngine Map, ResultSet> answer = new HashMap, ResultSet>(); DBQuery dbQuery = (DBQuery)query; + if(options.getStores().size() > 1) + { + throw new QueryModelException("Multi-store queries are not supported"); + } + // MT StoreRef storeRef = options.getStores().get(0); storeRef = storeRef != null ? tenantService.getName(storeRef) : null; diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java b/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java index 65e36da78e..330a92e804 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java +++ b/source/java/org/alfresco/repo/search/impl/solr/SolrQueryHTTPClient.java @@ -343,6 +343,29 @@ public class SolrQueryHTTPClient implements BeanFactoryAware url.append("?wt=").append(encoder.encode("json", "UTF-8")); url.append("&fl=").append(encoder.encode("DBID,score", "UTF-8")); + if(searchParameters.getStores().size() > 1) + { + boolean requiresSeparator = false; + url.append("&shards="); + for(StoreRef storeRef : searchParameters.getStores()) + { + if(requiresSeparator) + { + url.append(','); + } + else + { + requiresSeparator = true; + } + SolrStoreMapping shard = extractMapping(storeRef); + HttpClient client = httpClients.get(storeRef); + url.append(client.getHostConfiguration().getHost()); + url.append(':'); + url.append(client.getHostConfiguration().getPort()); + url.append(shard.getBaseUrl()); + } + } + // Emulate old limiting behaviour and metadata final LimitBy limitBy; int maxResults = -1; diff --git a/source/java/org/alfresco/repo/search/impl/solr/SolrSearchService.java b/source/java/org/alfresco/repo/search/impl/solr/SolrSearchService.java index e15c133f3e..c9dbf73756 100644 --- a/source/java/org/alfresco/repo/search/impl/solr/SolrSearchService.java +++ b/source/java/org/alfresco/repo/search/impl/solr/SolrSearchService.java @@ -317,9 +317,9 @@ public class SolrSearchService implements SearchService @Override public ResultSet query(SearchParameters searchParameters) { - if (searchParameters.getStores().size() != 1) + if(searchParameters.getStores().size() == 0) { - throw new IllegalStateException("Only one store can be searched at present"); + throw new IllegalStateException("At least one store must be defined to search"); } String parameterisedQueryString;