package com.genpt.nsight.v4.service.impl; import com.datastax.driver.core.*; import com.genpt.nsight.NSightCache; import com.genpt.nsight.config.DeliveryTypes; import com.genpt.nsight.config.NSightProperties; import com.genpt.nsight.v1.model.LeadTimes; import com.genpt.nsight.v2.SplunkLogger; import com.genpt.nsight.v3.service.AvailabilityServiceContextV3; import com.genpt.nsight.v3.service.LeadTimesServiceV3; import com.genpt.nsight.v4.AvailabilityServiceContextV4; import com.genpt.nsight.v4.service.LeadTimesServiceV4; import com.google.common.util.concurrent.Futures; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.*; import java.util.stream.Collectors; /** * Created by robin on 10/5/2020. */ @Service("LeadTimesServiceV4") public class LeadTimesServiceV4Impl implements LeadTimesServiceV4 { private static final Logger LOGGER = LoggerFactory.getLogger(LeadTimesServiceV4Impl.class); @Autowired DeliveryTypes deliveryTypes; @Autowired private Session session; @Autowired NSightCache nSightCache; @Autowired NSightProperties nSightProperties; PreparedStatement leadTimePS; @PostConstruct public void init() { leadTimePS = session.prepare("select ship_from_site_identifier, delivery_service_type, reason_code, day_of_week, lead_time, service_duration_designator from site_delivery_lead_time where ship_from_site_identifier = ?;"); leadTimePS.setConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM); } public ResultSetFuture queryLeadTimes(UUID fromSiteId) { BoundStatement boundStatement = leadTimePS.bind(fromSiteId); return session.executeAsync(boundStatement); } @Override public void getLeadTimes(Set fromSiteList , AvailabilityServiceContextV4 availabilityServiceContextV3) { final List resultSetFutureList = new ArrayList<>(); fromSiteList.stream().forEach(siteId -> { ResultSetFuture resultSetFuture = queryLeadTimes(UUID.fromString(siteId)); resultSetFutureList.add(resultSetFuture); }); if(availabilityServiceContextV3.getLeadTimeFutures() == null) availabilityServiceContextV3.setLeadTimeFutures(new ArrayList<>()); availabilityServiceContextV3.getLeadTimeFutures().addAll(Futures.inCompletionOrder(resultSetFutureList)); } @Override public void setLeadTimesFutures(AvailabilityServiceContextV4 availabilityServiceContextV3) { getLeadTimes(availabilityServiceContextV3.getFromSiteIds(), availabilityServiceContextV3); } @Override public void setLeadTimesBySite(AvailabilityServiceContextV4 availabilityServiceContextV3) { SplunkLogger splunkLogger = new SplunkLogger(availabilityServiceContextV3.getRequest().getHeaderRequest()); Map> leadTimesBySite = availabilityServiceContextV3.getLeadTimeFutures().stream().flatMap(resultSetListenableFuture -> { ResultSet resultSet = null; List leadTimesList = new ArrayList<>(); try { resultSet = resultSetListenableFuture.get(); while (!resultSet.isExhausted()) { Row row = resultSet.one(); LeadTimes leadTimes = new LeadTimes(); leadTimes.setSiteId(row.getUUID("ship_from_site_identifier").toString()); leadTimes.setDayOfTheWeek(row.getString("day_of_week")); leadTimes.setLeadTime(row.getInt("lead_time")); leadTimes.setDurationDesignator(row.getString("service_duration_designator")); leadTimes.setReason(row.getString("reason_code")); leadTimes.setDeliveryServiceType(row.getString("delivery_service_type")); leadTimesList.add(leadTimes); } } catch (Exception ex) { LOGGER.info(splunkLogger.toString() + " Exception in lead Times {} ", ex.getStackTrace()); } ; return leadTimesList.stream(); }).collect(Collectors.groupingBy(leadtime -> leadtime.getSiteId())); availabilityServiceContextV3.setLeadTimeBySite(leadTimesBySite); } }