<commit_before>package nl.wiegman.home.service;

import nl.wiegman.home.model.Energiecontract;
import nl.wiegman.home.model.Energiesoort;
import nl.wiegman.home.model.Verbruik;
import nl.wiegman.home.repository.EnergiecontractRepository;
import nl.wiegman.home.repository.MeterstandRepository;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Service
public class VerbruikServiceCached {

    private static final int KOSTEN_SCALE = 2;

    @Autowired
    MeterstandRepository meterstandRepository;

    @Autowired
    EnergiecontractRepository energiecontractRepository;

    @Cacheable(cacheNames = "stroomVerbruikInPeriode")
    public Verbruik getPotentiallyCachedVerbruikInPeriode(Energiesoort energiesoort, long vanMillis, long totEnMetMillis) {
        return getVerbruikInPeriode(energiesoort, vanMillis, totEnMetMillis);
    }

    public Verbruik getVerbruikInPeriode(Energiesoort energiesoort, long periodeVan, long periodeTotEnMet) {
        BigDecimal totaalKosten = BigDecimal.ZERO;
        BigDecimal totaalVerbruik = null;

        if (periodeVan < System.currentTimeMillis()) {

            long queryPeriodeVan = periodeVan;
            long queryPeriodeTotEnMet = periodeTotEnMet;
            if (energiesoort == Energiesoort.GAS) {
                // Gas is registered once every hour, in the hour after it actually is used. Compensate for that tho make the query return the correct values.
                queryPeriodeVan -= DateUtils.MILLIS_PER_HOUR;
                queryPeriodeTotEnMet -= DateUtils.MILLIS_PER_HOUR;
            }

            List<Energiecontract> energiecontractInPeriod = energiecontractRepository.findAllInInPeriod(queryPeriodeVan, queryPeriodeTotEnMet);

            if (CollectionUtils.isNotEmpty(energiecontractInPeriod)) {

                for (Energiecontract energiecontract : energiecontractInPeriod) {
                    long subVanMillis = energiecontract.getVan();
                    if (subVanMillis < periodeVan) {
                        subVanMillis = periodeVan;
                    }
                    long subTotEnMetMillis = energiecontract.getTotEnMet();
                    if (subTotEnMetMillis > periodeTotEnMet) {
                        subTotEnMetMillis = periodeTotEnMet;
                    }

                    BigDecimal verbruik = getVerbruik(energiesoort, subVanMillis, subTotEnMetMillis);

                    if (verbruik != null) {
                        if (totaalVerbruik == null) {
                            totaalVerbruik = BigDecimal.ZERO;
                        }
                        totaalKosten = totaalKosten.add(energiecontract.getKosten(energiesoort).multiply(verbruik));
                        totaalVerbruik = totaalVerbruik.add(verbruik);
                    }
                }
            } else {
                BigDecimal verbruik = getVerbruik(energiesoort, periodeVan, periodeTotEnMet);
                if (verbruik != null) {
                    totaalVerbruik = verbruik;
                }
            }
        }

        Verbruik verbruik = new Verbruik();
        verbruik.setVerbruik(totaalVerbruik);
        if (totaalVerbruik == null) {
            verbruik.setKosten(null);
        } else {
            verbruik.setKosten(totaalKosten.setScale(KOSTEN_SCALE, RoundingMode.CEILING));
        }
        return verbruik;
    }

    private BigDecimal getVerbruik(Energiesoort energiesoort, long periodeVan, long periodeTotEnMet) {
        switch (energiesoort) {
            case GAS:
                return meterstandRepository.getGasVerbruikInPeriod(periodeVan, periodeTotEnMet);
            case STROOM:
                return meterstandRepository.getStroomVerbruikInPeriod(periodeVan, periodeTotEnMet);
            default:
                throw new UnsupportedOperationException("Unexpected energiesoort: " + energiesoort.name());
        }

    }
}
<commit_msg>Fix gas usage by taking into account it is only reported once every hour (in the hour after the hour it is actually used)<commit_after>package nl.wiegman.home.service;

import nl.wiegman.home.model.Energiecontract;
import nl.wiegman.home.model.Energiesoort;
import nl.wiegman.home.model.Verbruik;
import nl.wiegman.home.repository.EnergiecontractRepository;
import nl.wiegman.home.repository.MeterstandRepository;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

@Service
public class VerbruikServiceCached {

    private static final int KOSTEN_SCALE = 2;

    @Autowired
    MeterstandRepository meterstandRepository;

    @Autowired
    EnergiecontractRepository energiecontractRepository;

    @Cacheable(cacheNames = "stroomVerbruikInPeriode")
    public Verbruik getPotentiallyCachedVerbruikInPeriode(Energiesoort energiesoort, long vanMillis, long totEnMetMillis) {
        return getVerbruikInPeriode(energiesoort, vanMillis, totEnMetMillis);
    }

    public Verbruik getVerbruikInPeriode(Energiesoort energiesoort, long periodeVan, long periodeTotEnMet) {
        BigDecimal totaalKosten = BigDecimal.ZERO;
        BigDecimal totaalVerbruik = null;

        if (periodeVan < System.currentTimeMillis()) {

            List<Energiecontract> energiecontractInPeriod = energiecontractRepository.findAllInInPeriod(periodeVan, periodeTotEnMet);

            if (CollectionUtils.isNotEmpty(energiecontractInPeriod)) {

                for (Energiecontract energiecontract : energiecontractInPeriod) {
                    long subVanMillis = energiecontract.getVan();
                    if (subVanMillis < periodeVan) {
                        subVanMillis = periodeVan;
                    }
                    long subTotEnMetMillis = energiecontract.getTotEnMet();
                    if (subTotEnMetMillis > periodeTotEnMet) {
                        subTotEnMetMillis = periodeTotEnMet;
                    }

                    BigDecimal verbruik = getVerbruik(energiesoort, subVanMillis, subTotEnMetMillis);

                    if (verbruik != null) {
                        if (totaalVerbruik == null) {
                            totaalVerbruik = BigDecimal.ZERO;
                        }
                        totaalKosten = totaalKosten.add(energiecontract.getKosten(energiesoort).multiply(verbruik));
                        totaalVerbruik = totaalVerbruik.add(verbruik);
                    }
                }
            } else {
                BigDecimal verbruik = getVerbruik(energiesoort, periodeVan, periodeTotEnMet);
                if (verbruik != null) {
                    totaalVerbruik = verbruik;
                }
            }
        }

        Verbruik verbruik = new Verbruik();
        verbruik.setVerbruik(totaalVerbruik);
        if (totaalVerbruik == null) {
            verbruik.setKosten(null);
        } else {
            verbruik.setKosten(totaalKosten.setScale(KOSTEN_SCALE, RoundingMode.CEILING));
        }
        return verbruik;
    }

    private BigDecimal getVerbruik(Energiesoort energiesoort, long periodeVan, long periodeTotEnMet) {
        switch (energiesoort) {
            case GAS:
                // Gas is registered once every hour, in the hour after it actually is used. Compensate for that tho make the query return the correct values.
                return meterstandRepository.getGasVerbruikInPeriod(periodeVan - DateUtils.MILLIS_PER_HOUR, periodeTotEnMet - DateUtils.MILLIS_PER_HOUR);
            case STROOM:
                return meterstandRepository.getStroomVerbruikInPeriod(periodeVan, periodeTotEnMet);
            default:
                throw new UnsupportedOperationException("Unexpected energiesoort: " + energiesoort.name());
        }

    }
}

{'fraction_non_alphanumeric': 0.07030111704711024, 'fraction_numerical': 0.00048567265662943174, 'mean_word_length': 2.4667508417508417, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5563087', 'n_tokens_mistral': 2499, 'n_tokens_neox': 2380, 'n_words': 426}