mirror of
https://github.com/Alfresco/SearchServices.git
synced 2026-09-16 18:12:56 +00:00
Merge pull request #1353 from Alfresco/feature/MNT-22410_FixFTSReport
MNT-22410 Update FTS report to use correct field. (cherry picked from commit 74f0a34de3cd337fe2c6bd86cd2ab9bdea5fd20c)
This commit is contained in:
+12
-16
@@ -373,11 +373,11 @@ public class SolrInformationServer implements InformationServer
|
||||
public static final String AND = " AND ";
|
||||
public static final String OR = " OR ";
|
||||
|
||||
private static final String REQUEST_HANDLER_NATIVE = "/native";
|
||||
static final String REQUEST_HANDLER_NATIVE = "/native";
|
||||
|
||||
static final String REQUEST_HANDLER_GET = "/get";
|
||||
static final String RESPONSE_DEFAULT_ID = "doc";
|
||||
private static final String RESPONSE_DEFAULT_IDS = "response";
|
||||
static final String RESPONSE_DEFAULT_IDS = "response";
|
||||
|
||||
static final String PREFIX_ERROR = "ERROR-";
|
||||
|
||||
@@ -712,11 +712,10 @@ public class SolrInformationServer implements InformationServer
|
||||
{
|
||||
ModifiableSolrParams params =
|
||||
new ModifiableSolrParams(request.getParams())
|
||||
.set(CommonParams.Q, "*:*")
|
||||
.set(CommonParams.FQ, FIELD_DOC_TYPE + ":" + DOC_TYPE_NODE)
|
||||
.set(CommonParams.Q, FIELD_DOC_TYPE + ":" + DOC_TYPE_NODE + " AND " + LATEST_APPLIED_CONTENT_VERSION_ID + ":*")
|
||||
.set(CommonParams.ROWS, 0)
|
||||
.set(FacetParams.FACET, true)
|
||||
.add(FacetParams.FACET_QUERY, "{!key='OUTDATED'}LATEST_APPLIED_CONTENT_VERSION_ID:{-10 TO -10}");
|
||||
.set(FacetParams.FACET, "on")
|
||||
.add(FacetParams.FACET_QUERY, "{!key='OUTDATED'}" + LAST_INCOMING_CONTENT_VERSION_ID + ":\"" + CONTENT_OUTDATED_MARKER + "\"");
|
||||
|
||||
SolrQueryResponse response = cloud.getResponse(nativeRequestHandler, request, params);
|
||||
|
||||
@@ -2625,7 +2624,7 @@ public class SolrInformationServer implements InformationServer
|
||||
* - Do we have an entry in the local content store for the document X?
|
||||
* - If we didn't have that entry then FTSSTATUS was set to New
|
||||
*
|
||||
* FTSSTatus = DIRTY
|
||||
* FTSSTATUS = DIRTY
|
||||
*
|
||||
* When a node, which requires content, arrived here for being indexed, the "Dirty" status was set if
|
||||
*
|
||||
@@ -2637,7 +2636,7 @@ public class SolrInformationServer implements InformationServer
|
||||
* something is different between the local document and the document which is in Solr".
|
||||
*
|
||||
* The content store allowed to workaround the problem: the code was deserializing the entry corresponding to the
|
||||
* incoming node (which teoretically corresponded to the document indexed in Solr) so both versions were available
|
||||
* incoming node (which theoretically corresponded to the document indexed in Solr) so both versions were available
|
||||
* for making decisions
|
||||
*
|
||||
* ------------------
|
||||
@@ -2646,7 +2645,7 @@ public class SolrInformationServer implements InformationServer
|
||||
* about
|
||||
*
|
||||
* - the "INSERT" or "UPDATE" nature of the indexing operation that is going to be executed
|
||||
* - the values of fields of a given document indeded in Solr
|
||||
* - the values of fields of a given document indexed in Solr
|
||||
*
|
||||
* In order to indicate to the ContentTracker which documents will require the content update, we added two
|
||||
* additional fields in the schema:
|
||||
@@ -2656,8 +2655,8 @@ public class SolrInformationServer implements InformationServer
|
||||
* LATEST_APPLIED_CONTENT_VERSION_ID: as the name suggests, this is the latest DOCID applied to this document (again, not the lucene docid)
|
||||
* </li>
|
||||
* <li>
|
||||
* LAST_INCOMING_CONTENT_VERSION_ID: a field that will contains "-10" if the content is outdated, otherwise it will have the same value
|
||||
* of LATEST_APPLIED_CONTENT_VERSION_ID.
|
||||
* LAST_INCOMING_CONTENT_VERSION_ID: this call will set the field to "-10" as the content is outdated. The content tracker will then set it
|
||||
* to have same value as LATEST_APPLIED_CONTENT_VERSION_ID.
|
||||
* </li>
|
||||
* </ul>
|
||||
*
|
||||
@@ -2667,11 +2666,8 @@ public class SolrInformationServer implements InformationServer
|
||||
{
|
||||
ofNullable(value)
|
||||
.map(ContentPropertyValue::getId)
|
||||
.ifPresentOrElse(
|
||||
id -> {
|
||||
document.setField(LATEST_APPLIED_CONTENT_VERSION_ID, id);
|
||||
document.setField(LAST_INCOMING_CONTENT_VERSION_ID, Map.of("removeregex", "^(?!"+id+"$).*$"));},
|
||||
() -> document.setField(LAST_INCOMING_CONTENT_VERSION_ID, CONTENT_OUTDATED_MARKER));
|
||||
.ifPresent(id -> document.setField(LATEST_APPLIED_CONTENT_VERSION_ID, id));
|
||||
document.setField(LAST_INCOMING_CONTENT_VERSION_ID, CONTENT_OUTDATED_MARKER);
|
||||
}
|
||||
|
||||
private void addContentProperty(
|
||||
|
||||
+52
-8
@@ -27,6 +27,7 @@
|
||||
package org.alfresco.solr;
|
||||
|
||||
import static java.util.Optional.ofNullable;
|
||||
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.ANY;
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.ASSOC_REF;
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.BOOLEAN;
|
||||
@@ -45,6 +46,10 @@ import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.PATH;
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.PERIOD;
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.QNAME;
|
||||
import static org.alfresco.service.cmr.dictionary.DataTypeDefinition.TEXT;
|
||||
import static org.alfresco.solr.SolrInformationServer.REQUEST_HANDLER_GET;
|
||||
import static org.alfresco.solr.SolrInformationServer.REQUEST_HANDLER_NATIVE;
|
||||
import static org.alfresco.solr.SolrInformationServer.RESPONSE_DEFAULT_ID;
|
||||
import static org.alfresco.solr.SolrInformationServer.RESPONSE_DEFAULT_IDS;
|
||||
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_DAY_FIELD_SUFFIX;
|
||||
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_HOUR_FIELD_SUFFIX;
|
||||
import static org.alfresco.solr.SolrInformationServer.UNIT_OF_TIME_MINUTE_FIELD_SUFFIX;
|
||||
@@ -57,6 +62,8 @@ import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertNull;
|
||||
import static org.junit.Assert.assertSame;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -76,12 +83,15 @@ import org.alfresco.solr.client.SOLRAPIClient;
|
||||
import org.apache.solr.common.SolrDocument;
|
||||
import org.apache.solr.common.SolrInputDocument;
|
||||
import org.apache.solr.common.params.CommonParams;
|
||||
import org.apache.solr.common.util.NamedList;
|
||||
import org.apache.solr.common.util.SimpleOrderedMap;
|
||||
import org.apache.solr.core.SolrCore;
|
||||
import org.apache.solr.core.SolrResourceLoader;
|
||||
import org.apache.solr.request.SolrQueryRequest;
|
||||
import org.apache.solr.request.SolrRequestHandler;
|
||||
import org.apache.solr.response.BasicResultContext;
|
||||
import org.apache.solr.response.SolrQueryResponse;
|
||||
import org.apache.solr.search.DocList;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
@@ -124,6 +134,8 @@ public class SolrInformationServerTest
|
||||
public void setUp()
|
||||
{
|
||||
when(core.getResourceLoader()).thenReturn(resourceLoader);
|
||||
when(core.getRequestHandler(REQUEST_HANDLER_GET)).thenReturn(handler);
|
||||
when(core.getRequestHandler(REQUEST_HANDLER_NATIVE)).thenReturn(handler);
|
||||
when(resourceLoader.getCoreProperties()).thenReturn(new Properties());
|
||||
infoServer = new SolrInformationServer(adminHandler, core, client)
|
||||
{
|
||||
@@ -145,15 +157,14 @@ public class SolrInformationServerTest
|
||||
SolrDocument state = new SolrDocument();
|
||||
|
||||
SimpleOrderedMap<SolrDocument> responseContent = new SimpleOrderedMap<>();
|
||||
responseContent.add(SolrInformationServer.RESPONSE_DEFAULT_ID, state);
|
||||
responseContent.add(RESPONSE_DEFAULT_ID, state);
|
||||
|
||||
when(response.getValues()).thenReturn(responseContent);
|
||||
when(core.getRequestHandler(SolrInformationServer.REQUEST_HANDLER_GET)).thenReturn(handler);
|
||||
|
||||
SolrDocument document = infoServer.getState(core, request, id);
|
||||
|
||||
assertEquals(id, request.getParams().get(CommonParams.ID));
|
||||
verify(core).getRequestHandler(SolrInformationServer.REQUEST_HANDLER_GET);
|
||||
verify(core).getRequestHandler(REQUEST_HANDLER_GET);
|
||||
verify(response).getValues();
|
||||
|
||||
assertSame(state, document);
|
||||
@@ -313,15 +324,14 @@ public class SolrInformationServerTest
|
||||
String id = String.valueOf(System.currentTimeMillis());
|
||||
|
||||
SimpleOrderedMap<Object> responseContent = new SimpleOrderedMap<>();
|
||||
responseContent.add(SolrInformationServer.RESPONSE_DEFAULT_ID, null);
|
||||
responseContent.add(RESPONSE_DEFAULT_ID, null);
|
||||
|
||||
when(response.getValues()).thenReturn(responseContent);
|
||||
when(core.getRequestHandler(SolrInformationServer.REQUEST_HANDLER_GET)).thenReturn(handler);
|
||||
|
||||
SolrDocument document = infoServer.getState(core, request, id);
|
||||
|
||||
assertEquals(id, request.getParams().get(CommonParams.ID));
|
||||
verify(core).getRequestHandler(SolrInformationServer.REQUEST_HANDLER_GET);
|
||||
verify(core).getRequestHandler(REQUEST_HANDLER_GET);
|
||||
verify(response).getValues();
|
||||
|
||||
assertNull(document);
|
||||
@@ -417,5 +427,39 @@ public class SolrInformationServerTest
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/** Check that the FTS report is derived from the correct parts of the Solr response. */
|
||||
@Test
|
||||
public void testAddContentOutdatedAndUpdatedCounts()
|
||||
{
|
||||
// Pretend that there are three documents in total.
|
||||
NamedList<Object> responseContent = new SimpleOrderedMap<>();
|
||||
DocList docList = mock(DocList.class);
|
||||
when(docList.matches()).thenReturn(3);
|
||||
BasicResultContext basicResultContext = mock(BasicResultContext.class);
|
||||
when(basicResultContext.getDocList()).thenReturn(docList);
|
||||
responseContent.add(RESPONSE_DEFAULT_IDS, basicResultContext);
|
||||
|
||||
// Set the facet to say one document is outdated.
|
||||
NamedList<Number> facetQueries = new SimpleOrderedMap<>();
|
||||
facetQueries.add("OUTDATED", 1);
|
||||
NamedList<NamedList<Number>> facetCounts = new SimpleOrderedMap<>();
|
||||
facetCounts.add("facet_queries", facetQueries);
|
||||
responseContent.add("facet_counts", facetCounts);
|
||||
|
||||
// Set up the request handler to return the fake response.
|
||||
doAnswer(invocation -> {
|
||||
SolrQueryResponse solrQueryResponse = invocation.getArgument(1);
|
||||
solrQueryResponse.setAllValues(responseContent);
|
||||
return null;
|
||||
}).when(handler).handleRequest(any(SolrQueryRequest.class), any(SolrQueryResponse.class));
|
||||
|
||||
// Call the method under test.
|
||||
NamedList<Object> report = new NamedList<>();
|
||||
infoServer.addContentOutdatedAndUpdatedCounts(report);
|
||||
|
||||
// Check the report.
|
||||
assertEquals("Expected two content nodes to be in sync.", report.get("Node count whose content is in sync"), 2L);
|
||||
assertEquals("Expected one content node to need an update.", report.get("Node count whose content needs to be updated"), 1L);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user