/** * Copyright 2008 The University of North Carolina at Chapel Hill * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package edu.unc.lib.dl.ui.service; import static edu.unc.lib.dl.util.ContentModelHelper.Model.COLLECTION; import static edu.unc.lib.dl.util.ContentModelHelper.Model.CONTAINER; import static edu.unc.lib.dl.util.ContentModelHelper.Model.SIMPLE; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; import edu.unc.lib.dl.acl.util.AccessGroupSet; import edu.unc.lib.dl.search.solr.model.BriefObjectMetadata; import edu.unc.lib.dl.search.solr.model.SearchRequest; import edu.unc.lib.dl.search.solr.model.SearchResultResponse; import edu.unc.lib.dl.search.solr.model.SearchState; import edu.unc.lib.dl.search.solr.util.SolrSettings; /** * @author bbpennel * @date Jan 23, 2015 */ public class ChildrenCountTest extends AbstractSolrQueryLayerTest { @Test public void countChildren() throws Exception { int numCollections = 500; int numFolders = 4; SearchResultResponse resp = getResult(numCollections, numFolders, 0); queryLayer.getChildrenCounts(resp.getResultList(), new AccessGroupSet("public")); BriefObjectMetadata collections = getResultByPID(COLLECTIONS_PID, resp.getResultList()); assertEquals("Incorrect child count on collections object", numCollections + numCollections * numFolders, collections.getCountMap().get("child").intValue()); for (int i = 0; i < numCollections; i++) { BriefObjectMetadata coll = getResultByPID("uuid:" + i, resp.getResultList()); assertEquals("Incorrect child count on a collection object", numFolders, coll.getCountMap().get("child") .intValue()); } } @Test public void countWithFiles() throws Exception { int numCollections = 100; int numFolders = 4; int numFiles = 5; SearchResultResponse resp = getResult(numCollections, numFolders, numFiles); queryLayer.getChildrenCounts(resp.getResultList(), new AccessGroupSet("public")); BriefObjectMetadata collections = getResultByPID(COLLECTIONS_PID, resp.getResultList()); assertEquals("Incorrect child count on collections object", numCollections + numCollections * numFolders + numCollections * numFolders * numFiles, collections.getCountMap().get("child").intValue()); for (int i = 0; i < numCollections; i++) { BriefObjectMetadata coll = getResultByPID("uuid:" + i, resp.getResultList()); assertEquals("Incorrect child count on a collection object", numFolders + numFolders * numFiles, coll.getCountMap().get("child").intValue()); } } @Test public void countContainers() throws Exception { int numCollections = 100; int numFolders = 4; int numFiles = 5; SearchResultResponse resp = getResult(numCollections, numFolders, numFiles); queryLayer.getChildrenCounts(resp.getResultList(), new AccessGroupSet("public"), "containers", "contentModel:" + SolrSettings.sanitize(CONTAINER.toString()), null); BriefObjectMetadata collections = getResultByPID(COLLECTIONS_PID, resp.getResultList()); assertEquals("Incorrect child count on collections object", numCollections + numCollections * numFolders, collections.getCountMap().get("containers").intValue()); for (int i = 0; i < numCollections; i++) { BriefObjectMetadata coll = getResultByPID("uuid:" + i, resp.getResultList()); assertEquals("Incorrect child count on a collection object", numFolders, coll .getCountMap().get("containers").intValue()); } } private BriefObjectMetadata getResultByPID(String pid, List<BriefObjectMetadata> results) { for (BriefObjectMetadata meta : results) { if (meta.getId().equals(pid)) { return meta; } } return null; } private SearchResultResponse getResult(int numCollections, int numFolders, int numFiles) throws Exception { server.add(populate(numCollections, numFolders, numFiles)); server.commit(); SearchRequest request = new SearchRequest(); AccessGroupSet groups = new AccessGroupSet("public"); request.setAccessGroups(groups); SearchState state = new SearchState(); state.setRowsPerPage(100000); request.setSearchState(state); request.setRootPid(COLLECTIONS_PID); return queryLayer.getSearchResults(request); } private List<SolrInputDocument> populate(int numCollections, int numFolders, int numFiles) { List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>(); SolrInputDocument newDoc = new SolrInputDocument(); newDoc.addField("title", "Collections"); newDoc.addField("id", COLLECTIONS_PID); newDoc.addField("rollup", COLLECTIONS_PID); newDoc.addField("roleGroup", "public"); newDoc.addField("readGroup", "public"); newDoc.addField("ancestorIds", ""); newDoc.addField("resourceType", "Folder"); newDoc.addField("contentModel", Arrays.asList(CONTAINER.toString())); docs.add(newDoc); for (int i = 0; i < numCollections; i++) { newDoc = new SolrInputDocument(); String collUUID = "uuid:" + i; String collName = "collection " + i; newDoc.addField("title", collName); newDoc.addField("id", collUUID); newDoc.addField("rollup", collUUID); newDoc.addField("roleGroup", "public admin"); newDoc.addField("readGroup", "public"); newDoc.addField("ancestorIds", "/" + COLLECTIONS_PID + "/" + collUUID); newDoc.addField("ancestorPath", Arrays.asList("1," + COLLECTIONS_PID)); newDoc.addField("resourceType", "Collection"); newDoc.addField("contentModel", Arrays.asList(CONTAINER.toString(), COLLECTION.toString())); docs.add(newDoc); for (int j = 0; j < numFolders; j++) { newDoc = new SolrInputDocument(); String id = i + "-" + j; newDoc.addField("title", "folder " + id); newDoc.addField("id", "uuid:" + id); newDoc.addField("rollup", "uuid:" + id); newDoc.addField("roleGroup", "public admin"); newDoc.addField("readGroup", "public"); newDoc.addField("ancestorIds", "/" + COLLECTIONS_PID + "/" + collUUID + "/uuid:" + id); newDoc.addField("ancestorPath", Arrays.asList("1," + COLLECTIONS_PID, "2," + collUUID)); newDoc.addField("resourceType", "Folder"); newDoc.addField("contentModel", Arrays.asList(CONTAINER.toString())); docs.add(newDoc); for (int k = 0; k < numFiles; k++) { newDoc = new SolrInputDocument(); String fid = i + "-" + j + "-" + k; newDoc.addField("title", "file " + fid); newDoc.addField("id", "uuid:" + fid); newDoc.addField("rollup", "uuid:" + fid); newDoc.addField("roleGroup", "public admin"); newDoc.addField("readGroup", "public"); newDoc.addField("ancestorIds", "/" + COLLECTIONS_PID + "/" + collUUID + "/uuid:" + id); newDoc.addField("ancestorPath", Arrays.asList("1," + COLLECTIONS_PID, "2," + collUUID)); newDoc.addField("resourceType", "File"); newDoc.addField("contentModel", Arrays.asList(SIMPLE.toString())); docs.add(newDoc); } } } return docs; } }