From f57fa3352202cc439b4f6b373e5a7dac8db170ca Mon Sep 17 00:00:00 2001 From: andyjk15 Date: Sat, 1 Feb 2020 00:29:53 +0000 Subject: [PATCH] [01.02.20] Additional functions and mapping for endpoints --- .../me/graphql/jpa/entity/CryptoPrice.java | 14 +++-- .../graphql/mutation/CryptoPriceMutation.java | 4 +- .../me/graphql/query/CryptoPriceQuery.java | 31 +++++++++-- .../graphql/service/CryptoPriceService.java | 52 ++++++++++++++----- .../me/helpers/functionalMapping.java | 14 +++++ .../resources/graphql/cryptoPriceQL.graphqls | 6 +-- 6 files changed, 91 insertions(+), 30 deletions(-) create mode 100644 src/main/java/cryptosky/me/helpers/functionalMapping.java diff --git a/src/main/java/cryptosky/me/graphql/jpa/entity/CryptoPrice.java b/src/main/java/cryptosky/me/graphql/jpa/entity/CryptoPrice.java index beeda42..0195007 100644 --- a/src/main/java/cryptosky/me/graphql/jpa/entity/CryptoPrice.java +++ b/src/main/java/cryptosky/me/graphql/jpa/entity/CryptoPrice.java @@ -8,8 +8,6 @@ import java.time.LocalDate; @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PRIVATE) @ToString -@Getter -@Setter @Builder @Data @EqualsAndHashCode @@ -28,21 +26,21 @@ public class CryptoPrice { private String type; @Column(name = "av_price", nullable = false) - private Long average_price; + private float average_price; @Column(name = "h_price", nullable = false) - private Long high_price; + private float high_price; @Column(name = "l_price", nullable = false) - private Long low_price; + private float low_price; @Column(name = "c_price") - private Long close_price; + private float close_price; @Column(name = "volume") - private Long volume; + private float volume; - private transient String formattedDate; + private transient String formattedDate; public String getFormattedDate() { return getTimestamp().toString(); diff --git a/src/main/java/cryptosky/me/graphql/mutation/CryptoPriceMutation.java b/src/main/java/cryptosky/me/graphql/mutation/CryptoPriceMutation.java index a031843..4f46d56 100644 --- a/src/main/java/cryptosky/me/graphql/mutation/CryptoPriceMutation.java +++ b/src/main/java/cryptosky/me/graphql/mutation/CryptoPriceMutation.java @@ -12,8 +12,8 @@ public class CryptoPriceMutation implements GraphQLMutationResolver { @Autowired private CryptoPriceService cryptoPriceService; - public CryptoPrice createPrice( final String createdDate, final String type, final Long av_price, - final Long h_price, final Long l_price, final Long c_price, final Long volume ) { + public CryptoPrice createPrice(final String createdDate, final String type, final float av_price, + final float h_price, final float l_price, final float c_price, final float volume ) { return this.cryptoPriceService.createPrice(createdDate, type, av_price, h_price, l_price, c_price, volume); } } diff --git a/src/main/java/cryptosky/me/graphql/query/CryptoPriceQuery.java b/src/main/java/cryptosky/me/graphql/query/CryptoPriceQuery.java index 9b93eb2..d26be42 100644 --- a/src/main/java/cryptosky/me/graphql/query/CryptoPriceQuery.java +++ b/src/main/java/cryptosky/me/graphql/query/CryptoPriceQuery.java @@ -13,13 +13,34 @@ import java.util.Optional; public class CryptoPriceQuery implements GraphQLQueryResolver { @Autowired - private CryptoPriceService vehicleService; + private CryptoPriceService cryptoPriceService; - public List getVehicles(final int count) { - return this.vehicleService.getAllPrices(count); + public List getAllPrices(final int count) { + return this.cryptoPriceService.getAllPrices(count); } - public Optional getVehicle(final int id) { - return this.vehicleService.getVehicle(id); + public List getLimitPricesByType( final int count, final String type ) { + return this.cryptoPriceService.getLimitPricesByType(count, type); } + + public List getAllByType( final String type ) { + return this.cryptoPriceService.getAllByType(type); + } + + public Optional getLatestByType( final String type ) { + return this.cryptoPriceService.getLatestByType(type); + } + + public List getAllLatest() { + return this.cryptoPriceService.getAllLatest(); + } + + public Optional getPriceByCreatedDateForType( final String type, final String createdDate ) { + return this.cryptoPriceService.getPriceByCreatedDateForType(type, createdDate); + } + + public Optional getPriceBetweenCreatedDatesForType( final String type, final String startDate, final String endDate ) { + return this.cryptoPriceService.getPriceBetweenCreatedDatesForType(type, startDate, endDate); + } + } diff --git a/src/main/java/cryptosky/me/graphql/service/CryptoPriceService.java b/src/main/java/cryptosky/me/graphql/service/CryptoPriceService.java index df58108..82c9cf5 100644 --- a/src/main/java/cryptosky/me/graphql/service/CryptoPriceService.java +++ b/src/main/java/cryptosky/me/graphql/service/CryptoPriceService.java @@ -6,25 +6,30 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; +import static cryptosky.me.helpers.functionalMapping.distinctByKey; + @Service public class CryptoPriceService { private final CryptoPriceRepository cryptoPriceRepository; - public CryptoPriceService(final CryptoPriceRepository cryptoPriceRepository) { + DateTimeFormatter format = DateTimeFormatter.ofPattern("dd-MM-yy"); + + public CryptoPriceService( final CryptoPriceRepository cryptoPriceRepository ) { this.cryptoPriceRepository = cryptoPriceRepository; } @Transactional - public CryptoPrice createPrice( final String createdDate, final String type, final Long av_price, - final Long h_price, final Long l_price, final Long c_price, final Long volume ) { + public CryptoPrice createPrice(final String createdDate, final String type, final float av_price, + final float h_price, final float l_price, final float c_price, final float volume ) { final CryptoPrice cryptoPrice = CryptoPrice.builder() - .timestamp(LocalDate.parse(createdDate)) + .timestamp(LocalDate.parse(createdDate, format)) .type(type) .average_price(av_price) .high_price(h_price) @@ -37,14 +42,14 @@ public class CryptoPriceService { } @Transactional(readOnly = true) - public List getAllPrices(final int count) { + public List getAllPrices( final int count ) { return this.cryptoPriceRepository.findAll().stream() .limit(count) .collect(Collectors.toList()); } @Transactional(readOnly = true) - public List getAllPricesByType(final int count, final String type) { + public List getLimitPricesByType( final int count, final String type ) { return this.cryptoPriceRepository.findAll().stream() .filter(typeList -> typeList.getType().equals(type)) .limit(count) @@ -52,18 +57,41 @@ public class CryptoPriceService { } @Transactional(readOnly = true) - public Optional getVehicle(final int id) { - return this.cryptoPriceRepository.findById(id); + public List getAllByType( final String type ) { + return this.cryptoPriceRepository.findAll().stream() + .filter(typeList -> typeList.getType().equals(type)) + .collect(Collectors.toList()); } @Transactional(readOnly = true) - public Optional getPriceByCreatedDate(final String type, final String createdDate) { + public Optional getLatestByType( final String type ) { return this.cryptoPriceRepository.findAll().stream() .filter(typeList -> typeList.getType().equals(type)) - .filter(createdDateList -> createdDateList.getTimestamp().equals(createdDate)) + .limit(1) .findFirst(); } -// @Transactional(readOnly = true) -// public Optional getprice + @Transactional(readOnly = true) + public List getAllLatest() { + return this.cryptoPriceRepository.findAll().stream() + .filter(distinctByKey(CryptoPrice::getType)) + .collect(Collectors.toList()); + } + + @Transactional(readOnly = true) + public Optional getPriceByCreatedDateForType( final String type, final String createdDate ) { + return this.cryptoPriceRepository.findAll().stream() + .filter(typeList -> typeList.getType().equals(type)) + .filter(createdDateList -> createdDateList.getTimestamp().equals(LocalDate.parse(createdDate))) + .findFirst(); + } + + @Transactional(readOnly = true) + public Optional getPriceBetweenCreatedDatesForType( final String type, final String startDate, final String endDate ) { + return this.cryptoPriceRepository.findAll().stream() + .filter(typeList -> typeList.getType().equals(type)) + .filter(createdDateList -> createdDateList.getTimestamp().isBefore(LocalDate.parse(endDate))) + .filter(createdDateList -> createdDateList.getTimestamp().isAfter(LocalDate.parse(startDate))) + .findFirst(); + } } diff --git a/src/main/java/cryptosky/me/helpers/functionalMapping.java b/src/main/java/cryptosky/me/helpers/functionalMapping.java new file mode 100644 index 0000000..d4162e5 --- /dev/null +++ b/src/main/java/cryptosky/me/helpers/functionalMapping.java @@ -0,0 +1,14 @@ +package cryptosky.me.helpers; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; + +public class functionalMapping { + + public static Predicate distinctByKey(Function keyExtractor) { + Map seen = new ConcurrentHashMap<>(); + return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; + } +} diff --git a/src/main/resources/graphql/cryptoPriceQL.graphqls b/src/main/resources/graphql/cryptoPriceQL.graphqls index 36435ed..12a56b5 100644 --- a/src/main/resources/graphql/cryptoPriceQL.graphqls +++ b/src/main/resources/graphql/cryptoPriceQL.graphqls @@ -10,10 +10,10 @@ type CryptoPrice { } type Query { - vehicles(count: Int):[CryptoPrice] - vehicle(id: ID):CryptoPrice + allPrices(count: Int):[CryptoPrice], + allLatest:[CryptoPrice] } type Mutation { - createVehicle(type: String!, average_price: Float!, high_price: Float, low_price: Float, close_price: Float, volume: Float):CryptoPrice + createPrice(createdDate: String!, type: String!, average_price: Float!, high_price: Float, low_price: Float, close_price: Float, volume: Float):CryptoPrice } \ No newline at end of file