/* * Copyright (C) 2008-2011 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.server.itests.scalability; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import ome.model.IObject; import ome.model.containers.Dataset; import ome.model.containers.DatasetImageLink; import ome.model.containers.Project; import ome.model.containers.ProjectDatasetLink; import ome.model.core.Image; import ome.parameters.Filter; import ome.parameters.Parameters; import ome.server.itests.AbstractManagedContextTest; import ome.testing.Report; import org.testng.annotations.Test; @Test(groups = { "integration" }) public class PaginationTest extends AbstractManagedContextTest { static int BIG_BATCH = 50;// 0; static int BIG_SIZE = 250;// 00; @Test public void testLotsOfSaves() { List<Long> ids = null; IObject[] objs = null; for (int j = 0; j < 5; j++) { Image[] images = new Image[10000]; for (int i = 0; i < images.length; i++) { images[i] = new Image(); images[i].setName("__bigtest__"); } ids = iUpdate.saveAndReturnIds(images); //objs = iUpdate.saveAndReturnArray(images); } System.out.println(new Report().toString()); //System.out.println(Arrays.toString(ids)); //System.out.println(Arrays.toString(objs)); } @Test(enabled = false) public void testGetImagesFromDatasetPagination() { Parameters po = new Parameters().leaves();// .exp(exp); Dataset d = loadOrCreateDataset(BIG_BATCH, BIG_SIZE); Set<Long> datasetIds = Collections.singleton(d.getId()); runGetImagesTest(Dataset.class, datasetIds, po, BIG_SIZE, 5); } @Test(enabled = false) public void testGetImagesFromProjectPagination() { Parameters po = new Parameters().leaves();// .exp(exp); Project p = loadOrCreateProject(BIG_BATCH, BIG_SIZE); Set<Long> projectIds = Collections.singleton(p.getId()); runGetImagesTest(Project.class, projectIds, po, BIG_SIZE, 5); } // Helpers // =========================================================== private void runGetImagesTest(Class kls, Set<Long> containerIds, Parameters po, int size, int pages) { long start; start = System.currentTimeMillis(); Set<Image> images = iContainer.getImages(kls, containerIds, po); assertTrue(images.size() + " items", images.size() >= size); long getImagesTime = System.currentTimeMillis() - start; // For checking Set<Long> allImageIds = new HashSet<Long>(); for (Image img : images) { allImageIds.add(img.getId()); } Set<Long> pagedImageIds = new HashSet<Long>(); // Try with pagination long[] pageTimes = new long[pages]; assertTrue(size % pages == 0); int page_size = size / pages; for (int i = 0; i < pages; i++) { po.paginate(i * page_size, page_size); start = System.currentTimeMillis(); images = iContainer.getImages(kls, containerIds, po); pageTimes[i] = System.currentTimeMillis() - start; assertTrue(images.size() + " items", images.size() == page_size); for (Image img : images) { assertTrue(img + " - extra", allImageIds.contains(img.getId())); pagedImageIds.add(img.getId()); } } // Make sure we found all of them. Set<Long> test = new HashSet<Long>(allImageIds); test.removeAll(pagedImageIds); assertTrue("Remainder:" + test.toString(), test.size() == 0); } private Dataset loadOrCreateDataset(int batch, int size) { int loops = size / batch; Dataset d = (Dataset) iQuery.findByQuery("select d from Dataset d " + "join fetch d.imageLinks " + "where size(d.imageLinks) = " + size, new Parameters(new Filter().page(0, 1))); if (d == null) { d = new Dataset("big dataset"); d = iUpdate.saveAndReturnObject(d); for (int i = 0; i < loops; i++) { DatasetImageLink[] links = new DatasetImageLink[batch]; for (int j = 0; j < batch; j++) { links[j] = new DatasetImageLink(); links[j].link(d.proxy(), new Image( "image in big dataset " + i * i)); } iUpdate.saveArray(links); } } return d; } private Project loadOrCreateProject(int batch, int size) { int loops = size / batch; Project p = (Project) iQuery.findByQuery( "select p from Project p join p.datasetLinks pdl join pdl.child d " + "join d.imageLinks " + "where size(p.datasetLinks) = " + batch + " and size(d.imageLinks) = " + size, new Parameters( new Filter().page(0, 1))); if (p == null) { p = new Project("big project"); p = iUpdate.saveAndReturnObject(p); for (int i = 0; i < loops; i++) { Dataset d = new Dataset("dataset in big project"); ProjectDatasetLink pdl = new ProjectDatasetLink(p.proxy(), d); pdl = iUpdate.saveAndReturnObject(pdl); d = pdl.child(); DatasetImageLink[] links = new DatasetImageLink[batch]; for (int j = 0; j < batch; j++) { links[j] = new DatasetImageLink(); links[j].link(d.proxy(), new Image( "image in big project " + i * i)); } iUpdate.saveArray(links); } } return p; } }