Package org.lilyproject.indexer.batchbuild.test

Source Code of org.lilyproject.indexer.batchbuild.test.MultiRepositoryIntegrationTest

package org.lilyproject.indexer.batchbuild.test;

import static com.google.common.collect.ImmutableMap.of;
import static org.junit.Assert.assertEquals;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.CORE1;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.CORE2;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.MINS15;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.PRIMARY_INDEX;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.SECUNDARY_INDEX;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.fieldtype;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.linkField;
import static org.lilyproject.indexer.batchbuild.test.IndexerIntegrationTestUtil.rectype;

import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.params.MapSolrParams;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.lilyproject.lilyservertestfw.LilyProxy;
import org.lilyproject.repository.api.LRepository;
import org.lilyproject.repository.api.Link;
import org.lilyproject.repository.api.RecordId;



public class MultiRepositoryIntegrationTest {

    private static IndexerIntegrationTestUtil util;
    private static LilyProxy lilyProxy;

    @BeforeClass
    public static void startLily() throws Exception{
        lilyProxy = new LilyProxy(null, null, null, true);
        util = new IndexerIntegrationTestUtil(lilyProxy);
    }

    @AfterClass
    public static void stopLily() throws Exception{
        util.stop();
    }


    //junit 4.10 or (better yet) testng have facilities to specify the order of tests
    //until then...
    @Test
    public void testWrapper() throws Exception{
        testCreateOneRecordInEachRepo();
        testBatchReindexWorks();
        testWithReferences();
    }


    public void testCreateOneRecordInEachRepo() throws Exception{
        createRecord(util.primaryRepo, "testId", "name1");
        createRecord(util.secundaryRepo, "testId", "name2");
        waitForSepAndCommitSolr();
        assertEquals("One document per repository", 1, countDocsInRepo(CORE1));
        assertEquals("One document per repository", 1, countDocsInRepo(CORE2));
        verifyFieldValue(getAllDocs(CORE1), "USER.testId", "name1");
        verifyFieldValue(getAllDocs(CORE2), "USER.testId", "name2");
    }


    public void testBatchReindexWorks() throws Exception{
        wipeSolr(CORE1);
        wipeSolr(CORE2);
        lilyProxy.getLilyServerProxy().batchBuildIndex(PRIMARY_INDEX, MINS15);
        lilyProxy.getLilyServerProxy().batchBuildIndex(SECUNDARY_INDEX, MINS15);
        lilyProxy.getSolrProxy().commit();
        assertEquals("One document per repository", 1, countDocsInRepo(CORE1));
        assertEquals("One document per repository", 1, countDocsInRepo(CORE2));
        verifyFieldValue(getAllDocs(CORE1), "USER.testId", "name1");
        verifyFieldValue(getAllDocs(CORE2), "USER.testId", "name2");
    }

    public void testWithReferences() throws Exception{
        createRecord(util.primaryRepo, "subRec", "name3");
        createRecord(util.secundaryRepo, "subRec", "name4");
        linkToOtherRecord(util.primaryRepo);
        linkToOtherRecord(util.secundaryRepo);
        waitForSepAndCommitSolr();
        SolrDocumentList primaryDocs = getAllDocs(CORE1);
        assertEquals(2, primaryDocs.getNumFound());
        verifyDeref(primaryDocs, "USER.testId", "name3");
        SolrDocumentList secundaryDocs = getAllDocs(CORE2);
        assertEquals(2, secundaryDocs.getNumFound());
        verifyDeref(secundaryDocs, "USER.testId", "name4");
    }

    private void verifyFieldValue(SolrDocumentList docs, String recordId, String fieldValue){
        verifyDocumentValue(docs, recordId, "field1", fieldValue);
    }

    private void verifyDeref(SolrDocumentList docs, String parentRecordId, String derefFieldValue) {
        verifyDocumentValue(docs, parentRecordId, "derefField", derefFieldValue);
    }

    private void verifyDocumentValue(SolrDocumentList docs, String recordId, String fieldName, String derefFieldValue) {
        for (SolrDocument doc : docs) {
            if (doc.getFieldValue("lily.id").equals(recordId)){
                assertEquals(derefFieldValue, doc.getFieldValue(fieldName));
            }
        }
    }

    private void linkToOtherRecord(LRepository repository) throws Exception {
        RecordId id = lilyProxy.getLilyServerProxy().getClient().getDefaultRepository()
                .getIdGenerator().fromString("USER.subRec");
        repository.getDefaultTable().recordBuilder().id("testId").field(linkField, new Link(id)).update();
    }

    private void wipeSolr(String coreName) throws Exception{
        SolrServer server = lilyProxy.getSolrProxy().getSolrServer(coreName);
        server.deleteByQuery("*:*");
        server.commit();
        assertEquals(0, countDocsInRepo(coreName));
    }

    private long countDocsInRepo(String coreName) throws SolrServerException {
        SolrDocumentList results = getAllDocs(coreName);
        return results.getNumFound();
    }

    private SolrDocumentList getAllDocs(String coreName) throws SolrServerException {
        SolrServer server = lilyProxy.getSolrProxy().getSolrServer(coreName);
        QueryResponse queryResponse = server.query(new MapSolrParams(of("q", "*:*")));
        return queryResponse.getResults();
    }

    private void createRecord(LRepository repo, String recId, String fieldData) throws Exception {
        repo.getDefaultTable().recordBuilder()
                .id(recId)
                .recordType(rectype)
                .field(fieldtype, fieldData)
                .create();
    }

    private void waitForSepAndCommitSolr() throws Exception {
        lilyProxy.getHBaseProxy().waitOnSepIdle(300000);
        lilyProxy.getSolrProxy().commit();
    }
}
TOP

Related Classes of org.lilyproject.indexer.batchbuild.test.MultiRepositoryIntegrationTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.