package de.ph87.data.view; import de.ph87.data.point.Point; import de.ph87.data.point.PointService; import de.ph87.data.series.SeriesRepository; import de.ph87.data.view.tree.View; import de.ph87.data.view.tree.ViewBinary; import de.ph87.data.view.tree.ViewSeries; import de.ph87.data.view.tree.ViewUnary; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class ViewService { private static final long DEMO_SERIES_POWER_BALANCE = 8L; private static final long DEMO_SERIES_POWER_PRODUCED = 26L; private static final String DEMO_POWER_CONSUMED = "__DEMO_POWER_CONSUMED__"; private final ViewRepository viewRepository; private final PointService pointService; private final SeriesRepository seriesRepository; @Transactional @EventListener(ApplicationReadyEvent.class) public void init() { if (!viewRepository.existsByName(DEMO_POWER_CONSUMED)) { final View powerBalance = new ViewSeries(seriesRepository.findById(DEMO_SERIES_POWER_BALANCE).orElseThrow()); final View powerBalance2 = new ViewBinary(ViewBinary.Operation.PLUS, powerBalance, powerBalance); final View powerPurchased = new ViewUnary(ViewUnary.Operation.NOT_NEG, powerBalance2); final View powerProduced = new ViewSeries(seriesRepository.findById(DEMO_SERIES_POWER_PRODUCED).orElseThrow()); final View powerConsumed = viewRepository.save(new ViewBinary(ViewBinary.Operation.PLUS, powerPurchased, powerProduced)); powerConsumed.setName(DEMO_POWER_CONSUMED); log.warn("DEMO VIEW CREATED: {} \"{}\"", powerConsumed.getUuid(), powerConsumed.getName()); } } @Transactional(readOnly = true) public List getPoints(@NonNull final ViewPointRequest request) { final ViewScope scope = new ViewScope(pointService, request); final View view = viewRepository.findById(request.viewUuid).orElseThrow(); return view.getPoints(scope); } }