HashtagsXRep/hashtagsxrep

View on GitHub
src/main/java/cat/xarxarepublicana/hashtagsxrep/infrastructure/repository/jdbc/JdbcTwitterExtractionRepository.java

Summary

Maintainability
A
1 hr
Test Coverage
package cat.xarxarepublicana.hashtagsxrep.infrastructure.repository.jdbc;

import cat.xarxarepublicana.hashtagsxrep.domain.extraction.TwitterExtraction;
import cat.xarxarepublicana.hashtagsxrep.domain.extraction.TwitterExtractionFactory;
import cat.xarxarepublicana.hashtagsxrep.domain.extraction.TwitterExtractionRepository;
import cat.xarxarepublicana.hashtagsxrep.domain.monitor.Monitor;
import cat.xarxarepublicana.hashtagsxrep.domain.monitor.MonitorRepository;
import cat.xarxarepublicana.hashtagsxrep.domain.twitter.SearchTweetsResult;
import cat.xarxarepublicana.hashtagsxrep.domain.twitter.Tweet;
import cat.xarxarepublicana.hashtagsxrep.domain.user.User;
import cat.xarxarepublicana.hashtagsxrep.domain.user.UserFactory;
import cat.xarxarepublicana.hashtagsxrep.domain.user.UserRepository;
import cat.xarxarepublicana.hashtagsxrep.infrastructure.repository.jdbc.mapper.TwitterExtractionMapper;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.dao.DuplicateKeyException;

public class JdbcTwitterExtractionRepository implements TwitterExtractionRepository {

  private static final Logger LOG = Logger.getLogger(JdbcTwitterExtractionRepository.class.getName());

  private final MonitorRepository monitorRepository;
  private final UserRepository userRepository;
  private final UserFactory userFactory;
  private final TwitterExtractionFactory twitterExtractionFactory;
  private final TwitterExtractionMapper twitterExtractionMapper;

  public JdbcTwitterExtractionRepository(
      MonitorRepository monitorRepository,
      UserRepository userRepository,
      UserFactory userFactory,
      TwitterExtractionFactory twitterExtractionFactory,
      TwitterExtractionMapper twitterExtractionMapper) {
    this.monitorRepository = monitorRepository;
    this.userRepository = userRepository;
    this.userFactory = userFactory;
    this.twitterExtractionFactory = twitterExtractionFactory;
    this.twitterExtractionMapper = twitterExtractionMapper;
  }

  @Override
  public boolean save(Monitor monitor, SearchTweetsResult searchTweetsResult, boolean ranked) {
    Set<String> updatedUserIds = new HashSet<>();
    User user;
    TwitterExtraction twitterExtraction;
    boolean existingDataReached = false;
    for (Tweet tweet : searchTweetsResult.getStatuses()) {
      if (!updatedUserIds.contains(tweet.getUser().getIdStr())) {
        user = userFactory.createFromTwitterExtractedUser(tweet.getUser());
        userRepository.saveExtractedUser(user);
        updatedUserIds.add(user.getId());
      }
      twitterExtraction = twitterExtractionFactory.createFromMonitorExtractedTweet(monitor, tweet);
      try {
        twitterExtractionMapper.insert(twitterExtraction, ranked);
      } catch (DuplicateKeyException e) {
        if (LOG.isLoggable(Level.FINE)) {
          LOG.log(Level.FINE, "Existing data reached: " + e.getMessage());
          existingDataReached = true;
          break;
        }
      }
    }
    String nextQueryString = searchTweetsResult.getSearchMetadata().getNextResults();
    monitorRepository.updateCursor(monitor, existingDataReached ? null : nextQueryString);
    return existingDataReached;
  }

  @Override
  public void deleteMonitorData(Monitor monitor) {
    twitterExtractionMapper.deleteDataByMonitorId(monitor.getId());
  }
}