All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.intelie.pipes.time.PeriodList Maven / Gradle / Ivy

There is a newer version: 0.25.5
Show newest version
package net.intelie.pipes.time;

import net.intelie.pipes.util.Iterables;

import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;

import static net.intelie.pipes.util.Preconditions.checkArgument;

public class PeriodList implements Period {
    private final List periods;

    public PeriodList(Period... periods) {
        this(Arrays.asList(periods));
    }

    public PeriodList(List periods) {
        checkArgument(periods.size() > 0, "PeriodList must have at least one period");
        this.periods = periods;
    }

    public static Period of(Period... periods) {
        return of(Arrays.asList(periods));
    }

    public static Period of(List periods) {
        if (periods.size() == 1)
            return periods.iterator().next();
        else
            return new PeriodList(periods);
    }

    @Override
    public PeriodList forceZone(ZoneId zone) {
        return new PeriodList(periods.stream().map(x -> x.forceZone(zone)).collect(Collectors.toList()));
    }

    @Override
    public Map simple() {
        List> list = new ArrayList<>(periods.size());
        for (Period period : periods)
            list.add(period.simple());

        Map map = new HashMap<>();
        map.put("type", "list");
        map.put("value", list);
        return map;
    }

    @Override
    public long add(long timestamp) {
        for (Period period : periods)
            timestamp = period.add(timestamp);

        return timestamp;
    }

    @Override
    public long sub(long timestamp) {
        for (Period period : periods)
            timestamp = period.sub(timestamp);

        return timestamp;
    }

    @Override
    public long floor(long timestamp) {
        checkArgument(supportsFloor(),
                "PeriodList with multiple periods doesn't support 'floor' operation.");
        return periods.get(0).floor(timestamp);
    }

    @Override
    public boolean supportsFloor() {
        return periods.size() == 1 && periods.get(0).supportsFloor();
    }

    @Override
    public long estimateMillis() {
        long sum = 0;
        for (Period period : periods)
            sum += period.estimateMillis();
        return sum;
    }

    @Override
    public String toString() {
        return toString(true);
    }

    @Override
    public PeriodList multiply(int amount) {
        List newPeriods = new ArrayList<>(periods.size());
        for (Period period : periods)
            newPeriods.add(period.multiply(amount));
        return new PeriodList(newPeriods);
    }

    @Override
    public String toString(boolean includeOne) {
        if (periods.size() == 1)
            return periods.get(0).toString(includeOne);

        return Iterables.joinWithLast(", ", " and ", periods);
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof PeriodList)) return false;

        PeriodList that = (PeriodList) o;

        return Objects.equals(this.periods, that.periods);
    }

    @Override
    public int hashCode() {
        return Objects.hash(periods);
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy