/*
* 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.redis;
import com.facebook.presto.decoder.DecoderColumnHandle;
import com.facebook.presto.decoder.DecoderRegistry;
import com.facebook.presto.decoder.FieldDecoder;
import com.facebook.presto.decoder.RowDecoder;
import com.facebook.presto.spi.ColumnHandle;
import com.facebook.presto.spi.ConnectorSession;
import com.facebook.presto.spi.ConnectorSplit;
import com.facebook.presto.spi.RecordSet;
import com.facebook.presto.spi.connector.ConnectorRecordSetProvider;
import com.facebook.presto.spi.connector.ConnectorTransactionHandle;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import javax.inject.Inject;
import java.util.List;
import static com.facebook.presto.redis.RedisHandleResolver.convertColumnHandle;
import static com.facebook.presto.redis.RedisHandleResolver.convertSplit;
import static java.util.Objects.requireNonNull;
/**
* Factory for Redis specific {@link RecordSet} instances.
*/
public class RedisRecordSetProvider
implements ConnectorRecordSetProvider
{
private final RedisJedisManager jedisManager;
private final DecoderRegistry registry;
@Inject
public RedisRecordSetProvider(DecoderRegistry registry, RedisJedisManager jedisManager)
{
this.registry = requireNonNull(registry, "registry is null");
this.jedisManager = requireNonNull(jedisManager, "jedisManager is null");
}
@Override
public RecordSet getRecordSet(ConnectorTransactionHandle transaction, ConnectorSession session, ConnectorSplit split, List<? extends ColumnHandle> columns)
{
RedisSplit redisSplit = convertSplit(split);
ImmutableList.Builder<DecoderColumnHandle> handleBuilder = ImmutableList.builder();
ImmutableMap.Builder<DecoderColumnHandle, FieldDecoder<?>> keyFieldDecoderBuilder = ImmutableMap.builder();
ImmutableMap.Builder<DecoderColumnHandle, FieldDecoder<?>> valueFieldDecoderBuilder = ImmutableMap.builder();
RowDecoder keyDecoder = registry.getRowDecoder(redisSplit.getKeyDataFormat());
RowDecoder valueDecoder = registry.getRowDecoder(redisSplit.getValueDataFormat());
for (ColumnHandle handle : columns) {
RedisColumnHandle columnHandle = convertColumnHandle(handle);
handleBuilder.add(columnHandle);
if (!columnHandle.isInternal()) {
if (columnHandle.isKeyDecoder()) {
FieldDecoder<?> fieldDecoder = registry.getFieldDecoder(
redisSplit.getKeyDataFormat(),
columnHandle.getType().getJavaType(),
columnHandle.getDataFormat());
keyFieldDecoderBuilder.put(columnHandle, fieldDecoder);
}
else {
FieldDecoder<?> fieldDecoder = registry.getFieldDecoder(
redisSplit.getValueDataFormat(),
columnHandle.getType().getJavaType(),
columnHandle.getDataFormat());
valueFieldDecoderBuilder.put(columnHandle, fieldDecoder);
}
}
}
ImmutableList<DecoderColumnHandle> handles = handleBuilder.build();
ImmutableMap<DecoderColumnHandle, FieldDecoder<?>> keyFieldDecoders = keyFieldDecoderBuilder.build();
ImmutableMap<DecoderColumnHandle, FieldDecoder<?>> valueFieldDecoders = valueFieldDecoderBuilder.build();
return new RedisRecordSet(redisSplit, jedisManager, handles, keyDecoder, valueDecoder, keyFieldDecoders, valueFieldDecoders);
}
}