diff options
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java')
-rw-r--r-- | exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java index 9781e1c99..21ac093f1 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/PrimitiveColumnMetadata.java @@ -24,6 +24,15 @@ import org.apache.drill.common.types.Types; import org.apache.drill.exec.expr.TypeHelper; import org.apache.drill.exec.record.MaterializedField; import org.apache.drill.exec.vector.accessor.ColumnConversionFactory; +import org.joda.time.Period; + +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; /** * Primitive (non-map) column. Describes non-nullable, nullable and array types @@ -42,12 +51,16 @@ import org.apache.drill.exec.vector.accessor.ColumnConversionFactory; public class PrimitiveColumnMetadata extends AbstractColumnMetadata { + private static final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PrimitiveColumnMetadata.class); + /** * Expected (average) width for variable-width columns. */ private int expectedWidth; + private String formatValue; + /** * Default value to use for filling a vector when no real data is * available, such as for columns added in new files but which does not @@ -135,6 +148,16 @@ public class PrimitiveColumnMetadata extends AbstractColumnMetadata { } @Override + public void setFormatValue(String value) { + formatValue = value; + } + + @Override + public String formatValue() { + return formatValue; + } + + @Override public void setDefaultValue(Object value) { defaultValue = value; } @@ -143,6 +166,16 @@ public class PrimitiveColumnMetadata extends AbstractColumnMetadata { public Object defaultValue() { return defaultValue; } @Override + public void setDefaultFromString(String value) { + this.defaultValue = valueFromString(value); + } + + @Override + public String defaultStringValue() { + return valueToString(defaultValue); + } + + @Override public void setTypeConverter(ColumnConversionFactory factory) { shimFactory = factory; } @@ -226,4 +259,86 @@ public class PrimitiveColumnMetadata extends AbstractColumnMetadata { return builder.toString(); } + /** + * Converts value in string literal form into Object instance based on {@link MinorType} value. + * Returns null in case of error during parsing or unsupported type. + * + * @param value value in string literal form + * @return Object instance + */ + private Object valueFromString(String value) { + if (value == null) { + return null; + } + try { + switch (type) { + case INT: + return Integer.parseInt(value); + case BIGINT: + return Long.parseLong(value); + case FLOAT4: + return Float.parseFloat(value); + case FLOAT8: + return Double.parseDouble(value); + case VARDECIMAL: + return new BigDecimal(value); + case BIT: + return Boolean.parseBoolean(value); + case VARCHAR: + case VARBINARY: + return value; + case TIME: + DateTimeFormatter timeFormatter = formatValue == null + ? DateTimeFormatter.ISO_TIME.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return LocalTime.parse(value, timeFormatter); + case DATE: + DateTimeFormatter dateFormatter = formatValue == null + ? DateTimeFormatter.ISO_DATE.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return LocalDate.parse(value, dateFormatter); + case TIMESTAMP: + DateTimeFormatter dateTimeFormatter = formatValue == null + ? DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return ZonedDateTime.parse(value, dateTimeFormatter); + case INTERVAL: + case INTERVALDAY: + case INTERVALYEAR: + return Period.parse(value); + default: + logger.warn("Unsupported type {} for default value {}, ignore and return null", type, value); + return null; + } + } catch (IllegalArgumentException | DateTimeParseException e) { + logger.warn("Error while parsing type {} default value {}, ignore and return null", type, value, e); + return null; + } + } + + /** + * Converts given value instance into String literal representation based on column metadata type. + * + * @param value value instance + * @return value in string literal representation + */ + private String valueToString(Object value) { + if (value == null) { + return null; + } + switch (type) { + case TIME: + DateTimeFormatter timeFormatter = formatValue == null + ? DateTimeFormatter.ISO_TIME.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return timeFormatter.format((LocalTime) value); + case DATE: + DateTimeFormatter dateFormatter = formatValue == null + ? DateTimeFormatter.ISO_DATE.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return dateFormatter.format((LocalDate) value); + case TIMESTAMP: + DateTimeFormatter dateTimeFormatter = formatValue == null + ? DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC) : DateTimeFormatter.ofPattern(formatValue); + return dateTimeFormatter.format((ZonedDateTime) value); + default: + return value.toString(); + } + } + } |