blob: 5570ca0baf495a7135234c5f08252a984b2de1ae [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.datatorrent.lib.appdata.schemas;
import java.util.Collections;
import java.util.Comparator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import com.google.common.base.Preconditions;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
/**
* This enum represents a TimeBucket that is supported by AppData
* <br/>
* <br/>
* The currently supported buckets are:
* <ul>
* <li>s - second</li>
* <li>m - minute</li>
* <li>h - hour</li>
* <li>d - day</li>
* </ul>
* <br/>
* <br/>
* Buckets supported in the future will be:
* <ul>
* <li>s - second</li>
* <li>w - week</li>
* <li>M - month</li>
* <li>q - quarter</li>
* <li>y - year</li>
* </ul>
* @since 3.0.0
*/
public enum TimeBucket
{
//DO NOT change order of enums. Ordinal is used as id for storage.
/**
* No time bucketing.
*/
ALL("all", null, null),
/**
* Second time bucketing.
*/
SECOND("1s", TimeUnit.SECONDS, "s"),
/**
* Minute time bucketing.
*/
MINUTE("1m", TimeUnit.MINUTES, "m"),
/**
* Hour time bucketing.
*/
HOUR("1h", TimeUnit.HOURS, "h"),
/**
* Day time bucketing.
*/
DAY("1d", TimeUnit.DAYS, "d");
public static final String TIME_BUCKET_NAME_REGEX = "1[a-zA-Z]+";
public static final Pattern TIME_BUCKET_NAME_PATTERN = Pattern.compile(TIME_BUCKET_NAME_REGEX);
public static final Set<String> SUFFIXES;
public static final Map<String, TimeBucket> SUFFIX_TO_TIME_BUCKET;
/**
* A map from the test/name of the bucket to the {@link TimeBucket}.
*/
public static final Map<String, TimeBucket> BUCKET_TO_TYPE;
/**
* A map from a {@link TimeUnit} to the corresponding {@link TimeBucket}.
*/
public static final Map<TimeUnit, TimeBucket> TIME_UNIT_TO_TIME_BUCKET;
static {
Map<String, TimeBucket> bucketToType = Maps.newHashMap();
Map<TimeUnit, TimeBucket> timeUnitToTimeBucket = Maps.newHashMap();
for (TimeBucket timeBucket : TimeBucket.values()) {
timeUnitToTimeBucket.put(timeBucket.getTimeUnit(), timeBucket);
bucketToType.put(timeBucket.getText(), timeBucket);
}
BUCKET_TO_TYPE = Collections.unmodifiableMap(bucketToType);
TIME_UNIT_TO_TIME_BUCKET = Collections.unmodifiableMap(timeUnitToTimeBucket);
Set<String> suffixes = Sets.newHashSet();
Map<String, TimeBucket> suffixToTimeBucket = Maps.newHashMap();
for (TimeBucket timeBucket: TimeBucket.values()) {
suffixes.add(timeBucket.getSuffix());
suffixToTimeBucket.put(timeBucket.getSuffix(), timeBucket);
}
SUFFIXES = Sets.newHashSet(suffixes);
SUFFIX_TO_TIME_BUCKET = Maps.newHashMap(suffixToTimeBucket);
}
private final String suffix;
private String text;
private TimeUnit timeUnit;
/**
* Create a time bucket with the given corresponding text and {@link TimeUnit}
* @param text The text or name corresponding to the TimeBucket.
* @param timeUnit The {@link TimeUnit} that the TimeBucket represents.
* @param suffix The suffix used to denote this {@link TimeBucket}
*/
TimeBucket(String text, TimeUnit timeUnit, String suffix)
{
setText(text);
setTimeUnit(timeUnit);
this.suffix = suffix;
}
/**
* Sets the name or text corresponding to a TimeBucket.
* @param text The name or text corresponding to a TimeBucket.
*/
private void setText(String text)
{
Preconditions.checkNotNull(text);
this.text = text;
}
/**
* The {@link TimeUnit} that a TimeBucket represents.
* @param timeUnit The {@link TimeUnit} that a TimeBucket represents.
*/
private void setTimeUnit(TimeUnit timeUnit)
{
this.timeUnit = timeUnit;
}
/**
* This method gets the suffix for the {@link TimeBucket}.
* @return The suffix for this {@link TimeBucket}.
*/
public String getSuffix()
{
return this.suffix;
}
/**
* Gets the name or text corresponding to this TimeBucket.
* @return The name or text corresponding to this TimeBucket.
*/
public String getText()
{
return text;
}
/**
* Gets the {@link TimeUnit} corresponding to this TimeBucket.
* @return The {@link TimeUnit} corresponding to this TimeBucket.
*/
public TimeUnit getTimeUnit()
{
return timeUnit;
}
/**
* Rounds down the given time stamp to the nearest {@link TimeUnit} corresponding
* to this TimeBucket.
* @param timestamp The timestamp to round down.
* @return The rounded down timestamp.
*/
public long roundDown(long timestamp)
{
if (timeUnit == null) {
return 0;
}
long millis = timeUnit.toMillis(1L);
return (timestamp / millis) * millis;
}
/**
* Gets the TimeBucket with the corresponding text or name. Returns null if there is no
* TimeBucket with the corresponding text or name.
* @param name The text or name of the TimeBucket to retrieve.
* @return The TimeBucket with the corresponding text or name, or null if there is no TimeBucket with
* corresponding test or name.
*/
public static TimeBucket getBucket(String name)
{
return BUCKET_TO_TYPE.get(name);
}
/**
* Gets the TimeBucket with the corresponding text or name. An IllegalArgumentException is thrown if there is no
* TimeBucket with the corresponding text or name.
* @param name The text or name of the TimeBucket to retrieve.
* @return The TimeBucket with the corresponding text or name, or an IllegalArgumentException is thrown if there is no TimeBucket with
* corresponding test or name.
*/
public static TimeBucket getBucketEx(String name)
{
TimeBucket bucket = getBucket(name);
Preconditions.checkArgument(bucket != null, name + " is not a valid bucket type.");
return bucket;
}
public static TimeBucket getTimeBucketForSuffixEx(String suffix)
{
Preconditions.checkNotNull(suffix);
Preconditions.checkArgument(SUFFIXES.contains(suffix));
return SUFFIX_TO_TIME_BUCKET.get(suffix);
}
public static class TimeBucketComparator implements Comparator<TimeBucket>
{
public static final TimeBucketComparator INSTANCE = new TimeBucketComparator();
private TimeBucketComparator()
{
}
@Override
public int compare(TimeBucket timeBucketA, TimeBucket timeBucketB)
{
return timeBucketA.getTimeUnit().compareTo(timeBucketB.getTimeUnit());
}
}
}