Spring Boot and RESTful API(13)Spring Data SOLR and Partial Update

Spring Boot and RESTful API(13)Spring Data SOLR and Partial Update

How to use Spring Data SOLR to query on SOLR7 Cloud

Because cloud has different Collection name, so I need another POJO to host the Annotation
package com.sillycat.jobsmonitorapi.domain;

import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;

@SolrDocument(solrCoreName = "allJobs")
public class JobCloud {

    @Id
    @Field
    private String id;

    @Field("source_id")
    private Integer sourceID;

    @Field("campaign_id")
    private Integer campaignID;

    @Field("job_reference")
    private String jobReference;

    private Boolean paused;

    @Field("daily_capped")
    private Boolean dailyCapped;

    private Boolean deduped;

    private Boolean expired;

    public JobCloud() {

    }

    public JobCloud(String id, Integer sourceID, Integer campaignID, String jobReference, Boolean paused,
            Boolean dailyCapped, Boolean deduped, Boolean expired) {
        this.id = id;
        this.sourceID = sourceID;
        this.campaignID = campaignID;
        this.jobReference = jobReference;
        this.paused = paused;
        this.dailyCapped = dailyCapped;
        this.deduped = deduped;
        this.expired = expired;
    }

    …snip… getter and setter

    @Override
    public String toString() {
        return "JobCloud [id=" + id + ", sourceID=" + sourceID + ", campaignID=" + campaignID + ", jobReference="
                + jobReference + ", paused=" + paused + ", dailyCapped=" + dailyCapped + ", deduped=" + deduped
                + ", expired=" + expired + "]";
    }

}

Then the interface will work for us
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;

import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;
import org.springframework.stereotype.Repository;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

@Repository
public interface JobCloudRepositorySolr extends SolrCrudRepository<JobCloud, String> {

    @Query(fields = { "id", "source_id", "campaign_id", "job_reference", "paused", "daily_capped", "deduped",
            "expired" })
    List<JobCloud> findBySourceID(Integer sourceID);
   
    @Query(fields = { "id", "source_id", "campaign_id", "job_reference", "paused", "daily_capped", "deduped",
            "expired" })
    List<JobCloud> findByCampaignID(Integer campaignID);

    @Query
    int countByCampaignID(Integer campaignID);

}

Then the unit test can run that
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;
import org.apache.http.util.Asserts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.Assert;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

/**
*
* mvn -Dspring.profiles.active=cloud -Dtest=JobCloudRepositorySolrTest test
*
* @author carl
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class JobCloudRepositorySolrTest {

    @Autowired
    JobCloudRepositorySolr jobCloudRepositorySolr;

    @Test
    public void dummy() {
        Asserts.notEmpty("Good", "Good dummy.");
    }

    @Test
    public void queryBySourceID() throws Exception {
        List<JobCloud> jobs = jobCloudRepositorySolr.findBySourceID(529);
        Assert.notEmpty(jobs, "Fail to queryBySourceID from SOLR");
        List<JobCloud> jobEmptys = jobCloudRepositorySolr.findBySourceID(9529);
        Assert.isTrue(jobEmptys.isEmpty(), "Fail to filter out other sourceID");
    }

}

Partial Update
We need to implement the interface ourself.
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

public interface JobCloudPartialRepositorySolr {

public void update(JobCloud job, Boolean commit);

public void updateAll(List<JobCloud> jobs, Boolean commit);
}

The implementation is easy in DATA-SOLR
package com.sillycat.jobsmonitorapi.repository;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.PartialUpdate;
import org.springframework.stereotype.Repository;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

@Repository
public class JobCloudPartialRepositorySolrImpl implements JobCloudPartialRepositorySolr {

    private static final String COLLECTION_NAME = "allJobs";

    @Resource
    private SolrTemplate solrTemplate;

    public void update(JobCloud job, Boolean commit) {
        PartialUpdate update = new PartialUpdate("id", job.getId());

        update.add("source_id", job.getSourceID());
        update.add("campaign_id", job.getCampaignID());
        update.add("job_reference", job.getJobReference());
        update.add("paused", job.getPaused());
        update.add("daily_capped", job.getDailyCapped());
        update.add("deduped", job.getDeduped());
        update.add("expired", job.getExpired());

        solrTemplate.saveBean(COLLECTION_NAME, update);
        if (commit) {
solrTemplate.commit(COLLECTION_NAME);
        }
    }

    public void updateAll(List<JobCloud> jobs, Boolean commit) {
        List<PartialUpdate> updates = new ArrayList<PartialUpdate>();
        for (int i = 0; i < jobs.size(); i++) {
            JobCloud job = jobs.get(i);
            PartialUpdate update = new PartialUpdate("id", job.getId());
            update.add("source_id", job.getSourceID());
            update.add("campaign_id", job.getCampaignID());
            update.add("job_reference", job.getJobReference());
            update.add("paused", job.getPaused());
            update.add("daily_capped", job.getDailyCapped());
            update.add("deduped", job.getDeduped());
            update.add("expired", job.getExpired());
            updates.add(update);
        }
        solrTemplate.saveBeans(COLLECTION_NAME, updates);
        if (commit) {
solrTemplate.commit(COLLECTION_NAME);
        }
    }

}

This unit test can cover that.
package com.sillycat.jobsmonitorapi.repository;

import org.apache.http.util.Asserts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

/**
*
* mvn -Dspring.profiles.active=cloud -Dtest=JobCloudPartialRepositorySolrTest
* test
*
* @author carl
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class JobCloudPartialRepositorySolrTest {

    @Autowired
    JobCloudPartialRepositorySolr jobCloudPartialRepositorySolr;

    @Test
    public void dummy() {
        Asserts.notEmpty("Good", "Good dummy.");
    }

    @Test
    public void save() {
        JobCloud jobCloud = new JobCloud("4689886470", 5639, 9240, "248b74f29637014594709f3358f201ce", false, false, false, false);
        jobCloudPartialRepositorySolr.update(jobCloud, true);
    }
}


References:
http://sillycat.iteye.com/blog/2379731 Spring Boot and Spring Data SOLR

https://github.com/spring-projects/spring-data-solr/blob/master/README.md

https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-crud-almost/
https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-adding-custom-methods-to-a-single-repository/
https://lucene.apache.org/solr/guide/7_1/updating-parts-of-documents.html

猜你喜欢

转载自sillycat.iteye.com/blog/2404509