Skip to content

Commit

Permalink
Implement method for finding coarsest ZonedTimeGrain
Browse files Browse the repository at this point in the history
  • Loading branch information
QubitPi committed Apr 5, 2017
1 parent e78d748 commit fd99497
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,19 @@

import com.yahoo.bard.webservice.config.SystemConfig;
import com.yahoo.bard.webservice.config.SystemConfigProvider;
import com.yahoo.bard.webservice.data.time.ZonedTimeGrain;
import com.yahoo.bard.webservice.druid.model.query.Granularity;
import com.yahoo.bard.webservice.table.resolver.GranularityComparator;

import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Interval;
import org.joda.time.base.AbstractInterval;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collection;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
Expand All @@ -30,6 +35,9 @@
*/
public class IntervalUtils {

private static final Logger LOG = LoggerFactory.getLogger(IntervalUtils.class);
private static final GranularityComparator GRANULARITY_COMPARATOR = GranularityComparator.getInstance();

public static final SystemConfig SYSTEM_CONFIG = SystemConfigProvider.getInstance();

public static final String ALIGNMENT_EPOCH_STRING = SYSTEM_CONFIG.getStringProperty(
Expand Down Expand Up @@ -209,4 +217,20 @@ public static Optional<DateTime> firstMoment(Collection<? extends Collection<Int
.map(Interval::getStart)
.reduce(Utils::getMinValue);
}

/**
* Returns the coarsest ZonedTimeGrain among a set of ZonedTimeGrains.
* <p>
* If the set of ZonedTimeGrains is empty, return null.
*
* @param zonedTimeGrains A set of ZonedTimeGrains among which the coarsest ZonedTimeGrain is to be returned.
*
* @return the coarsest ZonedTimeGrain among a set of ZonedTimeGrains
*/
public static ZonedTimeGrain getCoarsestTimeGrain(Collection<ZonedTimeGrain> zonedTimeGrains) {
return zonedTimeGrains.stream()
.sorted(Comparator.comparing(ZonedTimeGrain::getEstimatedDuration))
.findFirst()
.orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@ import static com.yahoo.bard.webservice.data.time.DefaultTimeGrain.MONTH
import static com.yahoo.bard.webservice.data.time.DefaultTimeGrain.WEEK
import static com.yahoo.bard.webservice.data.time.DefaultTimeGrain.YEAR

import com.yahoo.bard.webservice.data.time.ZonedTimeGrain
import com.yahoo.bard.webservice.druid.model.query.AllGranularity
import com.yahoo.bard.webservice.druid.model.query.Granularity

import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import org.joda.time.Duration
import org.joda.time.Interval

import spock.lang.Specification
Expand Down Expand Up @@ -326,6 +328,32 @@ class IntervalUtilsSpec extends Specification {
DAY | ["2012-02-03/2017-04-04"] | ["2012-02-03/2012-05-04", "2017-02-03/2017-04-04"]
}
@Unroll
def "getCoarsestTimeGrain returns duration of #expected among #duration1, #duration2, #duration3"() {
given:
ZonedTimeGrain zonedTimeGrain1 = Mock(ZonedTimeGrain)
ZonedTimeGrain zonedTimeGrain2 = Mock(ZonedTimeGrain)
ZonedTimeGrain zonedTimeGrain3 = Mock(ZonedTimeGrain)
zonedTimeGrain1.getEstimatedDuration() >> new Duration(duration1)
zonedTimeGrain2.getEstimatedDuration() >> new Duration(duration2)
zonedTimeGrain3.getEstimatedDuration() >> new Duration(duration3)
expect:
IntervalUtils.getCoarsestTimeGrain([zonedTimeGrain1, zonedTimeGrain2, zonedTimeGrain3]).getEstimatedDuration().equals(new Duration(expected))
where:
duration1 | duration2 | duration3 | expected
1 | 2 | 3 | 1
1 | 1 | 3 | 1
3 | 3 | 3 | 3
}
def "getCoarsestTimeGrain returns null on empty input time grain collections"() {
expect:
IntervalUtils.getCoarsestTimeGrain(Collections.emptyList()) == null
}
/**
* Returns the instant at which this year began.
*
Expand Down

0 comments on commit fd99497

Please sign in to comment.