blob: 63c94409b13a48a011c8197fb6de6b95161bcbf1 [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 org.apache.drill.exec.util;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.exec.ExecConstants;
import org.apache.drill.exec.server.options.OptionManager;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.function.BiFunction;
/**
* This class is responsible for formatting ValueVector elements.
* Specific format templates are taken from the options.
* It creates and reuses the concrete formatter instances for performance purposes.
*/
public class ValueVectorElementFormatter {
private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ValueVectorElementFormatter.class);
private final OptionManager options;
private DateTimeFormatter timestampFormatter;
private DateTimeFormatter dateFormatter;
private DateTimeFormatter timeFormatter;
public ValueVectorElementFormatter(OptionManager options) {
this.options = options;
}
/**
* Formats ValueVector elements in accordance with it's minor type.
*
* @param value ValueVector element to format
* @param minorType the minor type of the element
* @return the formatted value, null if failed
*/
public String format(Object value, TypeProtos.MinorType minorType) {
switch (minorType) {
case TIMESTAMP:
if (value instanceof LocalDateTime) {
return format((LocalDateTime) value,
options.getString(ExecConstants.WEB_DISPLAY_FORMAT_TIMESTAMP),
(v, p) -> v.format(getTimestampFormatter(p)));
}
case DATE:
if (value instanceof LocalDate) {
return format((LocalDate) value,
options.getString(ExecConstants.WEB_DISPLAY_FORMAT_DATE),
(v, p) -> v.format(getDateFormatter(p)));
}
case TIME:
if (value instanceof LocalTime) {
return format((LocalTime) value,
options.getString(ExecConstants.WEB_DISPLAY_FORMAT_TIME),
(v, p) -> v.format(getTimeFormatter(p)));
}
case VARBINARY:
if (value instanceof byte[]) {
byte[] bytes = (byte[]) value;
return org.apache.drill.common.util.DrillStringUtils.toBinaryString(bytes);
}
default:
return value.toString();
}
}
/**
* Formats ValueVector elements using given function.
*
* @param value ValueVector element to format, casted to it's actual type.
* @param formatPattern pattern used for the formatting. If empty then value.toString() will be returned.
* @param formatFunction function that takes ValueVector element and format pattern as arguments and returns the formatted string.
* @param <T> actual type of the ValueVector element.
* @return the formatted value, null if failed
*/
private <T> String format(T value, String formatPattern, BiFunction<T, String, String> formatFunction) {
if (formatPattern.isEmpty()) {
return value.toString();
}
String formattedValue = null;
try {
formattedValue = formatFunction.apply(value, formatPattern);
} catch (Exception e) {
logger.debug(String.format("Could not format the value '%s' with the pattern '%s': %s", value, formatPattern, e.getMessage()));
}
return formattedValue;
}
private DateTimeFormatter getTimestampFormatter(String formatPattern) {
if (timestampFormatter == null) {
timestampFormatter = DateTimeFormatter.ofPattern(formatPattern);
}
return timestampFormatter;
}
private DateTimeFormatter getDateFormatter(String formatPattern) {
if (dateFormatter == null) {
dateFormatter = DateTimeFormatter.ofPattern(formatPattern);
}
return dateFormatter;
}
private DateTimeFormatter getTimeFormatter(String formatPattern) {
if (timeFormatter == null) {
timeFormatter = DateTimeFormatter.ofPattern(formatPattern);
}
return timeFormatter;
}
}