Metrics.java

117 lines | 3.611 kB Blame History Raw Download
package br.ufrgs.inf.prosoft.aplcache.flowchart.metrics;

import br.ufrgs.inf.prosoft.aplcache.metadata.Occurrence;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashSet;
import java.util.Set;

public class Metrics {

    //exactly same method calls
    private long sameOccurrences;

    //number of same method calls with different return
    private long differentReturnOccurrences;
    private long sameOccurrencesExecutionTime;

    private long amountOfIdentifiedSameOccurences;
    private final Set<String> uniqueUsers;

    public Metrics() {
        sameOccurrences = 0L;
        differentReturnOccurrences = 0L;
        sameOccurrencesExecutionTime = 0L;
        amountOfIdentifiedSameOccurences = 0L;
        uniqueUsers = new HashSet<>();
    }

    public void addSameOccurrence(Occurrence occurrence) {
        sameOccurrences++;
        addSameOccurrencesTotalExecutionTime(occurrence.getExecutionTime());

        if (occurrence.getUserId() != null && !occurrence.getUserId().equals("Anonymous")) {
            uniqueUsers.add(occurrence.getUserId());
            addIdentifiedSameOccurence();
        }
    }

    public void addDifferentReturnOccurrence() {
        differentReturnOccurrences++;
    }

    private void addSameOccurrencesTotalExecutionTime(Long executionTime) {
        sameOccurrencesExecutionTime += executionTime;
    }

    private void addIdentifiedSameOccurence() {
        amountOfIdentifiedSameOccurences++;
    }

    public long getSameOccurrencesTotalExecutionTime() {
        return sameOccurrencesExecutionTime;
    }

    public double getSameOccurrencesAverageExecutionTime() {
        return new BigDecimal(getSameOccurrencesTotalExecutionTime())
                .divide(new BigDecimal(sameOccurrences), 5, RoundingMode.HALF_UP)
                .doubleValue();
    }

    public Long getNumberOfOccurrences() {
        return sameOccurrences + differentReturnOccurrences;
    }

    public Long getNumberOfSameOccurrences() {
        return sameOccurrences;
    }

    public Long getNumberOfDifferentReturnOccurrences() {
        return differentReturnOccurrences;
    }

    //from 0% to 100%
    public double getHitRatio() {
        BigDecimal bd = new BigDecimal(getNumberOfSameOccurrences() * 100);
        return bd.divide(new BigDecimal(getNumberOfOccurrences()), 5, RoundingMode.HALF_UP).doubleValue();
    }

    //from 0% to 100%
    public double getMissRatio() {
        BigDecimal bd = new BigDecimal(getNumberOfDifferentReturnOccurrences() * 100);
        return bd.divide(new BigDecimal(getNumberOfOccurrences()), 5, RoundingMode.HALF_UP).doubleValue();
    }

    public double getShareability() {
        Long amountOfIdentifiedSameOccurences = getAmountOfIdentifiedSameOccurences();
        if (amountOfIdentifiedSameOccurences == 0) {
            return 100;
        }
        BigDecimal bd = new BigDecimal(getAmountOfUniqueIdentifiedSameOccurences() * 100);
        return bd.divide(new BigDecimal(amountOfIdentifiedSameOccurences), 5, RoundingMode.HALF_UP).doubleValue();
    }

    public Long getAmountOfIdentifiedSameOccurences() {
        return amountOfIdentifiedSameOccurences;
    }

    public int getAmountOfUniqueIdentifiedSameOccurences() {
        return uniqueUsers.size();
    }

    public Long getAmountOfAnonymousSameOccurences() {
        return sameOccurrences - amountOfIdentifiedSameOccurences;
    }

    @Override
    public String toString() {
        return "{"
                + "\"hitRatio\":" + getHitRatio() + ","
                + "\"missRatio\":" + getMissRatio() + ","
                + "\"shareability\":" + getShareability()
                + "}";
    }

}