package uk.ac.ebi.ep.data.repositories;
import java.util.List;
import java.util.concurrent.Future;
import java.util.stream.Stream;
import javax.persistence.QueryHint;
import static org.hibernate.jpa.QueryHints.HINT_FETCH_SIZE;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.EntityGraph;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.QueryHints;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.annotation.Transactional;
import uk.ac.ebi.ep.data.domain.UniprotEntry;
/**
*
* @author joseph
*/
//@RepositoryRestResource(excerptProjection = ProjectedSpecies.class)
@RepositoryRestResource(itemResourceRel = "uniprotEntry", collectionResourceRel = "uniprotEntry", path = "uniprotEntry")
public interface UniprotEntryRepository extends JpaRepository<UniprotEntry, Long>, QueryDslPredicateExecutor<UniprotEntry>, JpaSpecificationExecutor<UniprotEntry>, UniprotEntryRepositoryCustom {
default UniprotEntry findByUniprotAccession(String acc) {
return findByAccession(acc);
}
UniprotEntry findByAccession(String accession);
@Transactional(readOnly = true)
@Query(value = "SELECT DISTINCT /*+ PARALLEL(auto) */ * FROM UNIPROT_ENTRY WHERE ACCESSION = :ACCESSION ", nativeQuery = true)
UniprotEntry findEnzymeByAccession(@Param("ACCESSION") String accession);
// @Transactional(readOnly = true)
// @Query(value = "SELECT u FROM UniprotEntry u WHERE u.accession = :accession")
// CompletableFuture<UniprotEntry> findEnzymeByAccessionAsync(@Param("accession") String accession);
@Query(value = "SELECT ACCESSION FROM UNIPROT_ENTRY WHERE ACCESSION IS NOT NULL", nativeQuery = true)
List<String> findAccessions();
@Query(value = "SELECT ACCESSION FROM UNIPROT_ENTRY WHERE ENTRY_TYPE=0 AND ACCESSION IS NOT NULL", nativeQuery = true)
List<String> findSwissProtAccessions();
@Transactional(readOnly = true)
@Query(value = "SELECT /*+ PARALLEL(auto) */ * FROM UNIPROT_ENTRY", nativeQuery = true)
List<UniprotEntry> findUniprotEntries();
@Transactional(readOnly = true)
//@Query(value = "SELECT * from UNIPROT_ENTRY u JOIN ENZYME_PORTAL_EC_NUMBERS e ON u.ACCESSION=e.UNIPROT_ACCESSION WHERE e.EC_NUMBER= :EC_NUMBER", nativeQuery = true)
@Query(value = "SELECT * FROM UNIPROT_ENTRY u, ENZYME_PORTAL_EC_NUMBERS ec WHERE u.ACCESSION = ec.UNIPROT_ACCESSION AND ec.EC_NUMBER = :EC_NUMBER", nativeQuery = true)
List<UniprotEntry> findEnzymesByEc(@Param("EC_NUMBER") String ecNumber);
@Transactional(readOnly = true)
@Query(value = "SELECT CATALYTIC_ACTIVITY FROM ENZYME_CATALYTIC_ACTIVITY WHERE UNIPROT_ACCESSION = :UNIPROT_ACCESSION", nativeQuery = true)
List<String> findCatalyticActivitiesByAccession(@Param("UNIPROT_ACCESSION") String accession);
@Transactional(readOnly = true)
@Query(value = "SELECT DISTINCT * FROM UNIPROT_ENTRY WHERE ACCESSION IN (:ACCESSION)", nativeQuery = true)
List<UniprotEntry> findSummariesByAccessions(@Param("ACCESSION") List<String> accession);
@Transactional(readOnly = true)
Page<UniprotEntry> findByAccessionIn(List<String> accessions, Pageable pageable);
@Transactional(readOnly = true)
@EntityGraph(value = "UniprotEntryEntityGraph", type = EntityGraph.EntityGraphType.LOAD)
@Query(value = "SELECT u FROM UniprotEntry u WHERE u.accession = :accession")
List<UniprotEntry> findEnzymePortalByAccession(@Param("accession") String accession);
@Transactional(readOnly = true)
@Query(value = "SELECT DISTINCT /*+ FIRST_ROWS(1000) PARALLEL(4) */ ACCESSION FROM UNIPROT_ENTRY WHERE ACCESSION IN (:ACCESSION)", nativeQuery = true)
List<String> filterEnzymesFromAccessions(@Param("ACCESSION") List<String> accession);
@Transactional(readOnly = true)
@Query(value = "SELECT u FROM UniprotEntry u WHERE u.accession IN (:ACCESSION)")
Stream<List<UniprotEntry>> findStreamedSummariesByAccessions(@Param("ACCESSION") List<String> accessions, Pageable pageable);
@Query(value = "SELECT u FROM UniprotEntry u WHERE u.accession IN (:ACCESSION)")
Slice<UniprotEntry> findSlicedSummariesByAccessions(@Param("ACCESSION") List<String> accessions, Pageable pageable);
@Query(value = "SELECT u FROM UniprotEntry u WHERE u.accession IN (:ACCESSION)")
@Async
Future<List<UniprotEntry>> findFutureSummariesByAccessions(@Param("ACCESSION") List<String> accessions);
@Transactional(readOnly = true)
@Query(value = "SELECT e FROM UniprotEntry e "
+ "left join e.enzymePortalEcNumbersSet ec "
+ "WHERE ec.uniprotAccession = e.accession "
+ "AND ec.ecNumber = :ecNumber order by e.entryType ASC")
Page<UniprotEntry> findEnzymesByEcNumber(@Param("ecNumber") String ecNumber, Pageable pageable);
@Query(value = "SELECT DISTINCT e FROM UniprotEntry e "
+ "left join e.enzymePortalEcNumbersSet ec "
+ "WHERE ec.uniprotAccession = e.accession "
+ "AND ec.ecNumber = :ecNumber order by e.entryType ASC")
Slice<UniprotEntry> findSlicedEnzymesByEcNumber(@Param("ecNumber") String ecNumber, Pageable pageable);
@Transactional(readOnly = true)
@Query(value = "select ACCESSION from enzyme_portal_ec_numbers_mv where ec_number = :EC_NUMBER", nativeQuery = true)
List<String> findAccessionViewByEc(@Param("EC_NUMBER") String ec);
@Transactional(readOnly = true)
@Query(value = "select ACCESSION from enzyme_portal_ec_numbers_mv where ec_number = :EC_NUMBER and SCIENTIFIC_NAME in (:SCIENTIFIC_NAME)", nativeQuery = true)
List<String> findAccessionViewByEcAndSpecies(@Param("EC_NUMBER") String ec, @Param("SCIENTIFIC_NAME") List<String> species);
@Modifying(clearAutomatically = true)
@Transactional(readOnly = true)
@Query(value = "UPDATE UNIPROT_ENTRY SET EXP_EVIDENCE_FLAG = 1 WHERE ACCESSION IN (SELECT distinct accession from SP_ENZYME_EVIDENCE)", nativeQuery = true)
void updateExpEvidenceFlag();
@Query(value = "SELECT * from UNIPROT_ENTRY u JOIN ENZYME_PORTAL_EC_NUMBERS e ON u.ACCESSION=e.UNIPROT_ACCESSION WHERE e.EC_NUMBER= :EC_NUMBER AND u.ENTRY_TYPE=0", nativeQuery = true)
List<UniprotEntry> findSwissprotEnzymesByEc(@Param("EC_NUMBER") String ecNumber);
@Transactional(readOnly = true)
@Query(value = "SELECT e FROM UniprotEntry e "
+ "left join e.enzymePortalEcNumbersSet ec "
+ "WHERE ec.uniprotAccession = e.accession "
+ "AND ec.ecNumber = :ecNumber AND e.entryType =0")
Stream<List<UniprotEntry>> findStreamedSwissprotEnzymesByEc(@Param("ecNumber") String ecNumber);
@Transactional(readOnly = true)
@Query(value = "SELECT /*+ PARALLEL(auto) */ * FROM UNIPROT_ENTRY ORDER BY ENTRY_TYPE ASC", nativeQuery = true)
List<UniprotEntry> findUniprotEntriesOrderedByEntryType();
//@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "" + 0))
@QueryHints(value = {
@QueryHint(name = "org.hibernate.ScrollMode", value = "FORWARD_ONLY"),
@QueryHint(name = HINT_FETCH_SIZE, value = "" + 0)
// @QueryHint(name = "org.hibernate.cacheMode", value = "NORMAL"),
// @QueryHint(name = "org.hibernate.cacheRegion", value = "myCacheRegion")
})
@Query(value = "SELECT e FROM UniprotEntry e")
Stream<UniprotEntry> streamEnzymes();
@Transactional(readOnly = true)
@Query(value = "SELECT /*+ PARALLEL(auto) */ COUNT(*) FROM UNIPROT_ENTRY", nativeQuery = true)
Long countUniprotEntries();
}