blob: 54ace5ea0f92600573334e58bb72380b44948dd4 [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.cassandra.utils.memory;
import java.util.Iterator;
import org.apache.cassandra.db.BufferDecoratedKey;
import org.apache.cassandra.db.Clustering;
import org.apache.cassandra.db.DecoratedKey;
import org.apache.cassandra.db.DeletionInfo;
import org.apache.cassandra.db.rows.*;
import org.apache.cassandra.db.transform.Transformation;
import org.apache.cassandra.utils.SearchIterator;
public abstract class EnsureOnHeap extends Transformation
{
public abstract DecoratedKey applyToPartitionKey(DecoratedKey key);
public abstract UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition);
public abstract SearchIterator<Clustering, Row> applyToPartition(SearchIterator<Clustering, Row> partition);
public abstract Iterator<Row> applyToPartition(Iterator<Row> partition);
public abstract DeletionInfo applyToDeletionInfo(DeletionInfo deletionInfo);
public abstract Row applyToRow(Row row);
public abstract Row applyToStatic(Row row);
public abstract RangeTombstoneMarker applyToMarker(RangeTombstoneMarker marker);
static class CloneToHeap extends EnsureOnHeap
{
protected BaseRowIterator<?> applyToPartition(BaseRowIterator partition)
{
return partition instanceof UnfilteredRowIterator
? Transformation.apply((UnfilteredRowIterator) partition, this)
: Transformation.apply((RowIterator) partition, this);
}
public DecoratedKey applyToPartitionKey(DecoratedKey key)
{
return new BufferDecoratedKey(key.getToken(), HeapAllocator.instance.clone(key.getKey()));
}
public Row applyToRow(Row row)
{
if (row == null)
return null;
return Rows.copy(row, HeapAllocator.instance.cloningBTreeRowBuilder()).build();
}
public Row applyToStatic(Row row)
{
if (row == Rows.EMPTY_STATIC_ROW)
return row;
return applyToRow(row);
}
public RangeTombstoneMarker applyToMarker(RangeTombstoneMarker marker)
{
return marker.copy(HeapAllocator.instance);
}
public UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition)
{
return Transformation.apply(partition, this);
}
public SearchIterator<Clustering, Row> applyToPartition(SearchIterator<Clustering, Row> partition)
{
return new SearchIterator<Clustering, Row>()
{
public Row next(Clustering key)
{
return applyToRow(partition.next(key));
}
};
}
public Iterator<Row> applyToPartition(Iterator<Row> partition)
{
return new Iterator<Row>()
{
public boolean hasNext()
{
return partition.hasNext();
}
public Row next()
{
return applyToRow(partition.next());
}
public void remove()
{
partition.remove();
}
};
}
public DeletionInfo applyToDeletionInfo(DeletionInfo deletionInfo)
{
return deletionInfo.copy(HeapAllocator.instance);
}
}
static class NoOp extends EnsureOnHeap
{
protected BaseRowIterator<?> applyToPartition(BaseRowIterator partition)
{
return partition;
}
public DecoratedKey applyToPartitionKey(DecoratedKey key)
{
return key;
}
public Row applyToRow(Row row)
{
return row;
}
public Row applyToStatic(Row row)
{
return row;
}
public RangeTombstoneMarker applyToMarker(RangeTombstoneMarker marker)
{
return marker;
}
public UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition)
{
return partition;
}
public SearchIterator<Clustering, Row> applyToPartition(SearchIterator<Clustering, Row> partition)
{
return partition;
}
public Iterator<Row> applyToPartition(Iterator<Row> partition)
{
return partition;
}
public DeletionInfo applyToDeletionInfo(DeletionInfo deletionInfo)
{
return deletionInfo;
}
}
}