package org.exist.storage.structural; import org.easymock.EasyMock; import org.exist.dom.persistent.DocumentImpl; import org.exist.dom.persistent.DocumentSet; import org.junit.Test; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import static org.easymock.EasyMock.*; import static org.junit.Assert.assertEquals; /** * @author Adam Retter <adam.retter@googlemail.com> */ public class NativeStructuralIndexWorkerTest { @Test public void getDocIdRanges_singleContiguous() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(1,2,3,4,5,6)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(1, ranges.size()); assertEquals(1, ranges.get(0).start); assertEquals(6, ranges.get(0).end); } @Test public void getDocIdRanges_multipleContiguous() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(1,2,3,4,5,6, 88,89, 3,4,5,6, 77, 10,11,12)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(5, ranges.size()); assertEquals(1, ranges.get(0).start); assertEquals(6, ranges.get(0).end); assertEquals(88, ranges.get(1).start); assertEquals(89, ranges.get(1).end); assertEquals(3, ranges.get(2).start); assertEquals(6, ranges.get(2).end); assertEquals(77, ranges.get(3).start); assertEquals(77, ranges.get(3).end); assertEquals(10, ranges.get(4).start); assertEquals(12, ranges.get(4).end); } @Test public void getDocIdRanges_singleId() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(6574)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(1, ranges.size()); assertEquals(6574, ranges.get(0).start); assertEquals(6574, ranges.get(0).end); } @Test public void getDocIdRanges_singleId_followed_by_continguousIds() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(6574, 11,12,13,14,15)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(2, ranges.size()); assertEquals(6574, ranges.get(0).start); assertEquals(6574, ranges.get(0).end); assertEquals(11, ranges.get(1).start); assertEquals(15, ranges.get(1).end); } @Test public void getDocIdRanges_contiguousIds_followed_by_single() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(11,12,13,14,15, 6574)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(2, ranges.size()); assertEquals(11, ranges.get(0).start); assertEquals(15, ranges.get(0).end); assertEquals(6574, ranges.get(1).start); assertEquals(6574, ranges.get(1).end); } @Test public void getDocIdRanges_multiple_singleIds() { final NativeStructuralIndexWorker indexWorker = new NativeStructuralIndexWorker(null); final DocumentSet docs = documentIdSet(Arrays.asList(6574, 200, 12, 24)); final List<NativeStructuralIndexWorker.Range> ranges = indexWorker.getDocIdRanges(docs); assertEquals(4, ranges.size()); assertEquals(6574, ranges.get(0).start); assertEquals(6574, ranges.get(0).end); assertEquals(200, ranges.get(1).start); assertEquals(200, ranges.get(1).end); assertEquals(12, ranges.get(2).start); assertEquals(12, ranges.get(2).end); assertEquals(24, ranges.get(3).start); assertEquals(24, ranges.get(3).end); } private DocumentSet documentIdSet(final List<Integer> documentIds) { final DocumentSet mockDocumentSet = createMock(DocumentSet.class); final List<DocumentImpl> docs = documentIds.stream().map(id -> { final DocumentImpl mockDocument = createMock(DocumentImpl.class); expect(mockDocument.getDocId()).andReturn(id).anyTimes(); return mockDocument; }).collect(Collectors.toList()); expect(mockDocumentSet.getDocumentIterator()).andReturn(docs.iterator()); replay(mockDocumentSet); docs.forEach(EasyMock::replay); return mockDocumentSet; } }