/*
* 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.split;
import com.facebook.presto.spi.RecordCursor;
import com.facebook.presto.spi.RecordSet;
import com.facebook.presto.spi.type.Type;
import com.google.common.primitives.Ints;
import io.airlift.slice.Slice;
import java.util.List;
import static com.google.common.base.Preconditions.checkElementIndex;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static java.util.Objects.requireNonNull;
public class MappedRecordSet
implements RecordSet
{
private final RecordSet delegate;
private final int[] delegateFieldIndex;
private final List<Type> columnTypes;
public MappedRecordSet(RecordSet delegate, List<Integer> delegateFieldIndex)
{
this.delegate = requireNonNull(delegate, "delegate is null");
this.delegateFieldIndex = Ints.toArray(requireNonNull(delegateFieldIndex, "delegateFieldIndex is null"));
List<Type> types = delegate.getColumnTypes();
this.columnTypes = delegateFieldIndex.stream().map(types::get).collect(toImmutableList());
}
@Override
public List<Type> getColumnTypes()
{
return columnTypes;
}
@Override
public RecordCursor cursor()
{
return new MappedRecordCursor(delegate.cursor(), delegateFieldIndex);
}
private static class MappedRecordCursor
implements RecordCursor
{
private final RecordCursor delegate;
private final int[] delegateFieldIndex;
private MappedRecordCursor(RecordCursor delegate, int[] delegateFieldIndex)
{
this.delegate = delegate;
this.delegateFieldIndex = delegateFieldIndex;
}
@Override
public long getTotalBytes()
{
return delegate.getTotalBytes();
}
@Override
public long getCompletedBytes()
{
return delegate.getCompletedBytes();
}
@Override
public long getReadTimeNanos()
{
return delegate.getReadTimeNanos();
}
@Override
public Type getType(int field)
{
return delegate.getType(toDelegateField(field));
}
@Override
public boolean advanceNextPosition()
{
return delegate.advanceNextPosition();
}
@Override
public boolean getBoolean(int field)
{
return delegate.getBoolean(toDelegateField(field));
}
@Override
public long getLong(int field)
{
return delegate.getLong(toDelegateField(field));
}
@Override
public double getDouble(int field)
{
return delegate.getDouble(toDelegateField(field));
}
@Override
public Slice getSlice(int field)
{
return delegate.getSlice(toDelegateField(field));
}
@Override
public Object getObject(int field)
{
return delegate.getObject(toDelegateField(field));
}
@Override
public boolean isNull(int field)
{
return delegate.isNull(toDelegateField(field));
}
@Override
public void close()
{
delegate.close();
}
private int toDelegateField(int field)
{
checkElementIndex(field, delegateFieldIndex.length, "field");
return delegateFieldIndex[field];
}
}
}