/*
* Copyright (C) 2016 Lorand Bendig All rights reserved.
*
* Licensed 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.
*/
package gobblin.util;
import java.util.LinkedHashMap;
import java.util.Map;
import org.joda.time.DateTime;
import org.joda.time.DateTimeFieldType;
/**
* Temporal granularity types for writing ({@link gobblin.writer.partitioner.TimeBasedWriterPartitioner}) and reading
* ({@link gobblin.source.DatePartitionedAvroFileSource}) date partitioned data.
*
* @author Lorand Bendig
*
*/
public enum DatePartitionType {
YEAR("yyyy", DateTimeFieldType.year()),
MONTH("yyyy/MM", DateTimeFieldType.monthOfYear()),
DAY("yyyy/MM/dd", DateTimeFieldType.dayOfMonth()),
HOUR("yyyy/MM/dd/HH", DateTimeFieldType.hourOfDay()),
MINUTE("yyyy/MM/dd/HH/mm", DateTimeFieldType.minuteOfHour());
private static final Map<String, DateTimeFieldType> lookupByPattern = new LinkedHashMap<>();
static {
lookupByPattern.put("s", DateTimeFieldType.secondOfMinute());
lookupByPattern.put("m", DateTimeFieldType.minuteOfHour());
lookupByPattern.put("h", DateTimeFieldType.hourOfDay());
lookupByPattern.put("H", DateTimeFieldType.hourOfDay());
lookupByPattern.put("K", DateTimeFieldType.hourOfDay());
lookupByPattern.put("d", DateTimeFieldType.dayOfMonth());
lookupByPattern.put("D", DateTimeFieldType.dayOfMonth());
lookupByPattern.put("e", DateTimeFieldType.dayOfMonth());
lookupByPattern.put("w", DateTimeFieldType.weekOfWeekyear());
lookupByPattern.put("M", DateTimeFieldType.monthOfYear());
lookupByPattern.put("y", DateTimeFieldType.year());
lookupByPattern.put("Y", DateTimeFieldType.year());
}
private DateTimeFieldType dateTimeField;
private String dateTimePattern;
private DatePartitionType(String dateTimePattern, DateTimeFieldType dateTimeField) {
this.dateTimeField = dateTimeField;
this.dateTimePattern = dateTimePattern;
}
/**
* @param pattern full partitioning pattern
* @return a DateTimeFieldType corresponding to the smallest temporal unit in the pattern.
* E.g for yyyy/MM/dd {@link DateTimeFieldType#dayOfMonth()}
*/
public static DateTimeFieldType getLowestIntervalUnit(String pattern) {
DateTimeFieldType intervalUnit = null;
for (Map.Entry<String, DateTimeFieldType> pat : lookupByPattern.entrySet()) {
if (pattern.contains(pat.getKey())) {
intervalUnit = pat.getValue();
break;
}
}
return intervalUnit;
}
public DateTimeFieldType getDateTimeFieldType() {
return dateTimeField;
}
public int getField(DateTime dateTime) {
return dateTime.get(this.dateTimeField);
}
public String getDateTimePattern() {
return dateTimePattern;
}
}