package net.petrikainulainen.spring.datasolr.todo.service;
import net.petrikainulainen.spring.datasolr.todo.document.TodoDocument;
import net.petrikainulainen.spring.datasolr.todo.model.Todo;
import net.petrikainulainen.spring.datasolr.todo.repository.solr.TodoDocumentRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @author Petri Kainulainen
*/
@Service
public class RepositoryTodoIndexService implements TodoIndexService {
private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryTodoIndexService.class);
protected static final String QUERY_METHOD_METHOD_NAME = "methodName";
protected static final String QUERY_METHOD_NAMED_QUERY = "namedQuery";
protected static final String QUERY_METHOD_QUERY_ANNOTATION = "queryAnnotation";
@Resource
private TodoDocumentRepository repository;
@Value("${solr.repository.query.method.type}")
private String queryMethodType;
@Transactional
@Override
public void addToIndex(Todo todoEntry) {
LOGGER.debug("Saving a todo entry with information: {}", todoEntry);
TodoDocument document = TodoDocument.getBuilder(todoEntry.getId(), todoEntry.getTitle())
.description(todoEntry.getDescription())
.build();
LOGGER.debug("Saving document with information: {}", document);
repository.save(document);
}
@Transactional
@Override
public void deleteFromIndex(Long id) {
LOGGER.debug("Deleting an existing document with id: {}", id);
repository.delete(id.toString());
}
@Override
public List<TodoDocument> search(String searchTerm) {
LOGGER.debug("Searching documents with search term: {}", searchTerm);
return findDocuments(searchTerm);
}
@Transactional
@Override
public void update(Todo todoEntry) {
LOGGER.debug("Updating the information of a todo entry: {}", todoEntry);
repository.update(todoEntry);
}
private List<TodoDocument> findDocuments(String searchTerm) {
if (queryMethodType != null) {
if (queryMethodType.equals(QUERY_METHOD_METHOD_NAME)) {
LOGGER.debug("Finding todo entries by using query generation from method name.");
return repository.findByTitleContainsOrDescriptionContains(searchTerm, searchTerm, sortByIdDesc());
}
else if (queryMethodType.equals(QUERY_METHOD_NAMED_QUERY)) {
LOGGER.debug("Finding todo entries by using named queries.");
return repository.findByNamedQuery(searchTerm, sortByIdDesc());
}
else if (queryMethodType.equals(QUERY_METHOD_QUERY_ANNOTATION)) {
LOGGER.debug("Finding todo entries by using @Query annotation.");
return repository.findByQueryAnnotation(searchTerm, sortByIdDesc());
}
}
LOGGER.debug("Unknown query method type: {}. Returning empty list.", queryMethodType);
return new ArrayList<TodoDocument>();
}
private Sort sortByIdDesc() {
return new Sort(Sort.Direction.DESC, TodoDocument.FIELD_ID);
}
}