/* * 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. * See the License for the specific language governing permissions and * limitations under the License. */ package com.facebook.presto.raptor; import com.facebook.presto.spi.session.PropertyMetadata; import com.facebook.presto.spi.type.TypeManager; import com.facebook.presto.spi.type.TypeSignatureParameter; import com.google.common.collect.ImmutableList; import javax.inject.Inject; import java.util.List; import java.util.Map; import java.util.OptionalInt; import static com.facebook.presto.spi.session.PropertyMetadata.booleanSessionProperty; import static com.facebook.presto.spi.session.PropertyMetadata.integerSessionProperty; import static com.facebook.presto.spi.type.StandardTypes.ARRAY; import static com.facebook.presto.spi.type.VarcharType.createUnboundedVarcharType; import static java.util.Locale.ENGLISH; import static java.util.stream.Collectors.toList; public class RaptorTableProperties { public static final String ORDERING_PROPERTY = "ordering"; public static final String TEMPORAL_COLUMN_PROPERTY = "temporal_column"; public static final String BUCKET_COUNT_PROPERTY = "bucket_count"; public static final String BUCKETED_ON_PROPERTY = "bucketed_on"; public static final String DISTRIBUTION_NAME_PROPERTY = "distribution_name"; public static final String ORGANIZED_PROPERTY = "organized"; private final List<PropertyMetadata<?>> tableProperties; @Inject public RaptorTableProperties(TypeManager typeManager) { tableProperties = ImmutableList.<PropertyMetadata<?>>builder() .add(stringListSessionProperty( typeManager, ORDERING_PROPERTY, "Sort order for each shard of the table")) .add(lowerCaseStringSessionProperty( TEMPORAL_COLUMN_PROPERTY, "Temporal column of the table")) .add(integerSessionProperty( BUCKET_COUNT_PROPERTY, "Number of buckets into which to divide the table", null, false)) .add(stringListSessionProperty( typeManager, BUCKETED_ON_PROPERTY, "Table columns on which to bucket the table")) .add(lowerCaseStringSessionProperty( DISTRIBUTION_NAME_PROPERTY, "Shared distribution name for colocated tables")) .add(booleanSessionProperty( ORGANIZED_PROPERTY, "Keep the table organized using the sort order", null, false)) .build(); } public List<PropertyMetadata<?>> getTableProperties() { return tableProperties; } public static List<String> getSortColumns(Map<String, Object> tableProperties) { return stringList(tableProperties.get(ORDERING_PROPERTY)); } public static String getTemporalColumn(Map<String, Object> tableProperties) { return (String) tableProperties.get(TEMPORAL_COLUMN_PROPERTY); } public static OptionalInt getBucketCount(Map<String, Object> tableProperties) { Integer value = (Integer) tableProperties.get(BUCKET_COUNT_PROPERTY); return (value != null) ? OptionalInt.of(value) : OptionalInt.empty(); } public static List<String> getBucketColumns(Map<String, Object> tableProperties) { return stringList(tableProperties.get(BUCKETED_ON_PROPERTY)); } public static String getDistributionName(Map<String, Object> tableProperties) { return (String) tableProperties.get(DISTRIBUTION_NAME_PROPERTY); } public static boolean isOrganized(Map<String, Object> tableProperties) { Boolean value = (Boolean) tableProperties.get(ORGANIZED_PROPERTY); return (value == null) ? false : value; } public static PropertyMetadata<String> lowerCaseStringSessionProperty(String name, String description) { return new PropertyMetadata<>( name, description, createUnboundedVarcharType(), String.class, null, false, value -> ((String) value).toLowerCase(ENGLISH), value -> value); } private static PropertyMetadata<?> stringListSessionProperty(TypeManager typeManager, String name, String description) { return new PropertyMetadata<>( name, description, typeManager.getParameterizedType(ARRAY, ImmutableList.of(TypeSignatureParameter.of(createUnboundedVarcharType().getTypeSignature()))), List.class, ImmutableList.of(), false, value -> ImmutableList.copyOf(stringList(value).stream() .map(s -> s.toLowerCase(ENGLISH)) .collect(toList())), value -> value); } @SuppressWarnings("unchecked") private static List<String> stringList(Object value) { return (value == null) ? ImmutableList.of() : ((List<String>) value); } }