| /** |
| * 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()); |
| } |
| } |
| } |