/* * * 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; } } }