package pl.edu.icm.saos.search.indexing;
import java.util.List;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import pl.edu.icm.saos.persistence.model.CourtCase;
import pl.edu.icm.saos.persistence.model.CourtType;
import pl.edu.icm.saos.persistence.model.Judge;
import pl.edu.icm.saos.persistence.model.Judge.JudgeRole;
import pl.edu.icm.saos.persistence.model.Judgment;
import pl.edu.icm.saos.persistence.model.JudgmentReferencedRegulation;
import pl.edu.icm.saos.persistence.model.LawJournalEntry;
import pl.edu.icm.saos.persistence.model.ReferencedCourtCase;
import pl.edu.icm.saos.search.config.model.JudgmentIndexField;
import com.google.common.collect.Lists;
/**
* Fills {@link SolrInputDocument} with fields from {@link Judgment}.
* @author madryk
*/
public abstract class JudgmentIndexFieldsFiller {
protected SolrFieldAdder<JudgmentIndexField> fieldAdder;
//------------------------ LOGIC --------------------------
/**
* Checks if this {@link JudgmentIndexFieldsFiller} can be used with
* {@link Judgment judgments} whose {@link CourtType} is provided as argument.
* @param judgmentClass
* @return
*/
public abstract boolean isApplicable(CourtType courtType);
/**
* Fills {@link SolrInputDocument} with fields from {@link Judgment}.
* Use it only for applicable {@link Judgment judgments} ({@link #isApplicable(CourtType)} returns true)
* @param doc
* @param judgment
*/
public void fillFields(SolrInputDocument doc, JudgmentIndexingData judgmentData) {
Judgment judgment = judgmentData.getJudgment();
fillIds(doc, judgment);
fillSourceCode(doc, judgment);
fillCourtType(doc, judgment);
fillCourtCases(doc, judgment);
fillJudges(doc, judgment);
fillLegalBases(doc, judgment);
fillReferencedRegulations(doc, judgment);
fillReferencedCourtCases(doc, judgment);
fillJudgmentDate(doc, judgment);
fillJudgmentType(doc, judgment);
fillMeansOfAppeal(doc, judgment);
fillJudgmentResult(doc, judgment);
fillContent(doc, judgment);
fillMaxMoneyAmount(doc, judgment);
fillReferencingCount(doc, judgmentData);
}
//------------------------ PRIVATE --------------------------
private void fillIds(SolrInputDocument doc, Judgment judgment) {
fieldAdder.addField(doc, JudgmentIndexField.DATABASE_ID, judgment.getId());
}
private void fillSourceCode(SolrInputDocument doc, Judgment judgment) {
if (judgment.getSourceInfo() != null && judgment.getSourceInfo().getSourceCode() != null) {
fieldAdder.addField(doc, JudgmentIndexField.SOURCE_CODE, judgment.getSourceInfo().getSourceCode().name());
}
}
private void fillCourtType(SolrInputDocument doc, Judgment judgment) {
fieldAdder.addField(doc, JudgmentIndexField.COURT_TYPE, judgment.getCourtType().name());
}
private void fillCourtCases(SolrInputDocument doc, Judgment judgment) {
for (CourtCase courtCase : judgment.getCourtCases()) {
fieldAdder.addField(doc, JudgmentIndexField.CASE_NUMBER, courtCase.getCaseNumber());
}
}
private void fillJudges(SolrInputDocument doc, Judgment judgment) {
for (Judge judge : judgment.getJudges()) {
List<JudgeRole> roles = judge.getSpecialRoles();
List<String> judgeCompositeField = Lists.newArrayList(judge.getName());
roles.stream().map(JudgeRole::name).forEach(judgeCompositeField::add);
fieldAdder.addCompositeField(doc, JudgmentIndexField.JUDGE, judgeCompositeField);
fieldAdder.addField(doc, JudgmentIndexField.JUDGE_NAME, judge.getName());
if (roles.isEmpty()) {
fieldAdder.addField(doc, JudgmentIndexField.JUDGE_WITH_ROLE, "NO_ROLE", judge.getName());
} else {
roles.forEach(role -> fieldAdder.addField(doc, JudgmentIndexField.JUDGE_WITH_ROLE, role.name(), judge.getName()));
}
}
}
private void fillLegalBases(SolrInputDocument doc, Judgment judgment) {
for (String legalBase : judgment.getLegalBases()) {
fieldAdder.addField(doc, JudgmentIndexField.LEGAL_BASE, legalBase);
}
}
private void fillReferencedRegulations(SolrInputDocument doc, Judgment judgment) {
for (JudgmentReferencedRegulation referencedRegulation : judgment.getReferencedRegulations()) {
fieldAdder.addField(doc, JudgmentIndexField.REFERENCED_REGULATION, referencedRegulation.getRawText());
LawJournalEntry lawJournalEntry = referencedRegulation.getLawJournalEntry();
if (lawJournalEntry != null) {
fieldAdder.addField(doc, JudgmentIndexField.LAW_JOURNAL_ENTRY_ID, lawJournalEntry.getId());
fieldAdder.addField(doc, JudgmentIndexField.LAW_JOURNAL_ENTRY_CODE, lawJournalEntry.getEntryCode());
}
}
}
private void fillReferencedCourtCases(SolrInputDocument doc, Judgment judgment) {
for (ReferencedCourtCase referencedCourtCase : judgment.getReferencedCourtCases()) {
for (long referencedJudgmentId : referencedCourtCase.getJudgmentIds()) {
fieldAdder.addField(doc, JudgmentIndexField.REFERENCED_COURT_CASE_ID, referencedJudgmentId);
}
}
}
private void fillJudgmentDate(SolrInputDocument doc, Judgment judgment) {
fieldAdder.addDateField(doc, JudgmentIndexField.JUDGMENT_DATE, judgment.getJudgmentDate());
}
private void fillJudgmentType(SolrInputDocument doc, Judgment judgment) {
if (judgment.getJudgmentType() != null) {
fieldAdder.addField(doc, JudgmentIndexField.JUDGMENT_TYPE, judgment.getJudgmentType().name());
}
}
private void fillMeansOfAppeal(SolrInputDocument doc, Judgment judgment) {
if (judgment.getMeansOfAppeal() != null) {
fieldAdder.addField(doc, JudgmentIndexField.ALL, judgment.getMeansOfAppeal().getName());
}
}
private void fillJudgmentResult(SolrInputDocument doc, Judgment judgment) {
if (judgment.getJudgmentResult() != null) {
fieldAdder.addField(doc, JudgmentIndexField.ALL, judgment.getJudgmentResult().getText());
}
}
private void fillContent(SolrInputDocument doc, Judgment judgment) {
fieldAdder.addField(doc, JudgmentIndexField.CONTENT, judgment.getRawTextContent());
}
private void fillMaxMoneyAmount(SolrInputDocument doc, Judgment judgment) {
if (judgment.getMaxMoneyAmount() != null) {
fieldAdder.addCurrencyField(doc, JudgmentIndexField.MAXIMUM_MONEY_AMOUNT, judgment.getMaxMoneyAmount().getAmount());
}
}
private void fillReferencingCount(SolrInputDocument doc, JudgmentIndexingData judgmentData) {
fieldAdder.addField(doc, JudgmentIndexField.REFERENCING_JUDGMENTS_COUNT, judgmentData.getReferencingCount());
}
//------------------------ SETTERS --------------------------
@Autowired
public void setFieldAdder(SolrFieldAdder<JudgmentIndexField> fieldAdder) {
this.fieldAdder = fieldAdder;
}
}