package org.gbif.checklistbank.service.mybatis; import org.gbif.api.model.checklistbank.NameUsage; import org.gbif.checklistbank.service.UsageService; import org.gbif.checklistbank.service.mybatis.mapper.NameUsageMapper; import org.gbif.checklistbank.service.mybatis.mapper.UsageMapper; import org.gbif.checklistbank.service.mybatis.postgres.IntArrayPgWriter; import java.sql.Connection; import java.util.Date; import java.util.List; import java.util.UUID; import javax.sql.DataSource; import com.google.inject.Inject; import com.zaxxer.hikari.pool.ProxyConnection; import org.postgresql.PGConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Implements the UsageService using MyBatis. * All PagingResponses will not have the count set as it can be too costly sometimes. */ public class UsageServiceMyBatis implements UsageService { private static final Logger LOG = LoggerFactory.getLogger(UsageServiceMyBatis.class); private final NameUsageMapper mapper; private final UsageMapper usageMapper; @Inject private DataSource ds; @Inject UsageServiceMyBatis(NameUsageMapper mapper, UsageMapper usageMapper) { this.mapper = mapper; this.usageMapper = usageMapper; } @Override public List<Integer> listAll() { try (Connection con = ds.getConnection()){ ProxyConnection hikari = (ProxyConnection) con; PGConnection pgcon = hikari.unwrap(PGConnection.class); IntArrayPgWriter intMapper = new IntArrayPgWriter(); pgcon.getCopyAPI().copyOut("copy (SELECT id FROM name_usage WHERE deleted IS NULL) TO STDOUT WITH NULL '' ", intMapper); return intMapper.result(); } catch (Exception e) { LOG.error("Failed to load all usage ids", e); throw new RuntimeException("Exception while loading usage ids", e); } } @Override public Integer maxUsageKey(UUID datasetKey) { return mapper.maxUsageKey(datasetKey); } @Override public List<NameUsage> listRange(int usageKeyStart, int usageKeyEnd) { return mapper.listRange(usageKeyStart, usageKeyEnd); } @Override public List<Integer> listParents(int usageKey) { return usageMapper.listParents(usageKey); } @Override public List<Integer> listOldUsages(UUID datasetKey, Date before) { return usageMapper.listByDatasetAndDate(datasetKey, before); } }