/** * Merges a list of @ServiceDocumentQueryResult that were already <b>sorted</b> on <i>documentLink</i>. * The merge will be done in linear time. * * @param dataSources A list of @ServiceDocumentQueryResult <b>sorted</b> on <i>documentLink</i>. * @param isAscOrder Whether the document links are sorted in ascending order. * @return The merging result. */ public static void mergeQueryResults( List<ServiceDocumentQueryResult> dataSources, boolean isAscOrder, ServiceDocumentQueryResult result) { mergeQueryResults(dataSources, isAscOrder, EnumSet.noneOf(QueryOption.class), result); }
/** * Process the query task results for a broadcast query or a query with read * after write semantics (which uses a broadcast query under the covers) * @param host The service host on which the query was invoked * @param dataSources A list of @ServiceDocumentQueryResult <b>sorted</b> on <i>documentLink</i>. * @param isAscOrder Whether the document links are sorted in ascending order. * @param queryOptions Query options on the original query * @param nodeGroupResponse Node group response obtained as part of the broadcast query * @param result Result object to populate * @param onCompletion Consumer to invoke once processing is complete */ public static void processQueryResults(ServiceHost host, List<ServiceDocumentQueryResult> dataSources, boolean isAscOrder, EnumSet<QueryOption> queryOptions, NodeGroupBroadcastResponse nodeGroupResponse, ServiceDocumentQueryResult result, BiConsumer<ServiceDocumentQueryResult, Throwable> onCompletion) { if (queryOptions != null && queryOptions.contains(QueryOption.READ_AFTER_WRITE_CONSISTENCY)) { mergeForReadAfterWriteConsistency(host, dataSources, isAscOrder, queryOptions, nodeGroupResponse, result, onCompletion); } else { mergeQueryResults(dataSources, isAscOrder, queryOptions, result); onCompletion.accept(result, null); } } /**
@Test public void testMergeQueryResultsWhenCountOptions() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 9, 7, 5, 4, 3, 1 }); result1.documentLinks.clear(); result1.documents.clear(); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 9, 6, 5, 4, 3, 2, 10 }); result2.documentLinks.clear(); result2.documents.clear(); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 8, 4, 3, 2, 10, 1 }); result3.documentLinks.clear(); result3.documents.clear(); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, false, EnumSet.of(QueryOption.COUNT), mergeResult); assertEquals(result2.documentCount, mergeResult.documentCount); }
@Test public void testMergeQueryResultsWhenCountOptions() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 9, 7, 5, 4, 3, 1 }); result1.documentLinks.clear(); result1.documents.clear(); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 9, 6, 5, 4, 3, 2, 10 }); result2.documentLinks.clear(); result2.documents.clear(); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 8, 4, 3, 2, 10, 1 }); result3.documentLinks.clear(); result3.documents.clear(); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, false, EnumSet.of(QueryOption.COUNT), mergeResult); assertEquals(result2.documentCount, mergeResult.documentCount); }
@Test public void testMergeQueryResultsWithAllEmpty() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult(new int[] {}); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult(new int[] {}); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult(new int[] {}); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] {})); }
@Test public void testMergeQueryResultsWithEmptySet() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 3, 4, 5, 7, 8, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 10, 2, 3, 4, 5, 6, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult(new int[] {}); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }
@Test public void testMergeQueryResultsWithAllEmpty() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult(new int[] {}); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult(new int[] {}); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult(new int[] {}); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] {})); }
@Test public void testMergeQueryResultsWithEmptySet() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 3, 4, 5, 7, 8, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 10, 2, 3, 4, 5, 6, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult(new int[] {}); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }
@Test public void testMergeQueryResultsWithDifferentData() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 3, 4, 5, 7, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 10, 2, 3, 4, 5, 6, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 8 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }
@Test public void testMergeQueryResultsInDescOrder() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 9, 7, 5, 4, 3, 1 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 9, 6, 5, 4, 3, 2, 10 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 8, 4, 3, 2, 10, 1 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, false, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10, 1 })); }
@Test public void testMergeQueryResultsWithSameData() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }
@Test public void testMergeQueryResultsWithSameData() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }
@Test public void testMergeQueryResultsInDescOrder() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 9, 7, 5, 4, 3, 1 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 9, 6, 5, 4, 3, 2, 10 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 8, 4, 3, 2, 10, 1 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, false, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10, 1 })); }
@Test public void testMergeQueryResultsWithDifferentData() { ServiceDocumentQueryResult result1 = createServiceDocumentQueryResult( new int[] { 1, 3, 4, 5, 7, 9 }); ServiceDocumentQueryResult result2 = createServiceDocumentQueryResult( new int[] { 10, 2, 3, 4, 5, 6, 9 }); ServiceDocumentQueryResult result3 = createServiceDocumentQueryResult( new int[] { 1, 10, 2, 3, 4, 8 }); List<ServiceDocumentQueryResult> resultsToMerge = Arrays.asList(result1, result2, result3); ServiceDocumentQueryResult mergeResult = new ServiceDocumentQueryResult(); QueryTaskUtils.mergeQueryResults(resultsToMerge, true, mergeResult); assertTrue(verifyMergeResult(mergeResult, new int[] { 1, 10, 2, 3, 4, 5, 6, 7, 8, 9 })); }