blob: 03af6d0190a2ebebe51ddcffad3337546c2f9057 [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.db.composites;
import java.nio.ByteBuffer;
import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.cql3.ColumnIdentifier;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.memory.AbstractAllocator;
import org.apache.cassandra.utils.ObjectSizes;
public class CompoundSparseCellName extends CompoundComposite implements CellName
{
private static final ByteBuffer[] EMPTY_PREFIX = new ByteBuffer[0];
private static final long HEAP_SIZE = ObjectSizes.measure(new CompoundSparseCellName(null, false));
protected final ColumnIdentifier columnName;
// Not meant to be used directly, you should use the CellNameType method instead
CompoundSparseCellName(ColumnIdentifier columnName, boolean isStatic)
{
this(EMPTY_PREFIX, columnName, isStatic);
}
CompoundSparseCellName(ByteBuffer[] elements, ColumnIdentifier columnName, boolean isStatic)
{
this(elements, elements.length, columnName, isStatic);
}
CompoundSparseCellName(ByteBuffer[] elements, int size, ColumnIdentifier columnName, boolean isStatic)
{
super(elements, size, isStatic);
this.columnName = columnName;
}
@Override
public long unsharedHeapSize()
{
return HEAP_SIZE + ObjectSizes.sizeOnHeapOf(elements);
}
@Override
public long unsharedHeapSizeExcludingData()
{
return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements);
}
public int size()
{
return size + 1;
}
public ByteBuffer get(int i)
{
return i == size ? columnName.bytes : elements[i];
}
public int clusteringSize()
{
return size;
}
public ColumnIdentifier cql3ColumnName(CFMetaData metadata)
{
return columnName;
}
public ByteBuffer collectionElement()
{
return null;
}
public boolean isCollectionCell()
{
return false;
}
public boolean isSameCQL3RowAs(CellNameType type, CellName other)
{
if (clusteringSize() != other.clusteringSize() || other.isStatic() != isStatic())
return false;
for (int i = 0; i < clusteringSize(); i++)
{
if (type.subtype(i).compare(elements[i], other.get(i)) != 0)
return false;
}
return true;
}
public CellName copy(CFMetaData cfm, AbstractAllocator allocator)
{
if (elements.length == 0)
return this;
// We don't copy columnName because it's interned in SparseCellNameType
return new CompoundSparseCellName(elementsCopy(allocator), columnName, isStatic());
}
public static class WithCollection extends CompoundSparseCellName
{
private static final long HEAP_SIZE = ObjectSizes.measure(new WithCollection(null, ByteBufferUtil.EMPTY_BYTE_BUFFER, false));
private final ByteBuffer collectionElement;
WithCollection(ColumnIdentifier columnName, ByteBuffer collectionElement, boolean isStatic)
{
this(EMPTY_PREFIX, columnName, collectionElement, isStatic);
}
WithCollection(ByteBuffer[] elements, ColumnIdentifier columnName, ByteBuffer collectionElement, boolean isStatic)
{
this(elements, elements.length, columnName, collectionElement, isStatic);
}
WithCollection(ByteBuffer[] elements, int size, ColumnIdentifier columnName, ByteBuffer collectionElement, boolean isStatic)
{
super(elements, size, columnName, isStatic);
this.collectionElement = collectionElement;
}
public int size()
{
return size + 2;
}
public ByteBuffer get(int i)
{
return i == size + 1 ? collectionElement : super.get(i);
}
@Override
public ByteBuffer collectionElement()
{
return collectionElement;
}
@Override
public boolean isCollectionCell()
{
return true;
}
@Override
public CellName copy(CFMetaData cfm, AbstractAllocator allocator)
{
// We don't copy columnName because it's interned in SparseCellNameType
return new CompoundSparseCellName.WithCollection(elements.length == 0 ? elements : elementsCopy(allocator), size, columnName, allocator.clone(collectionElement), isStatic());
}
@Override
public long unsharedHeapSize()
{
return HEAP_SIZE + ObjectSizes.sizeOnHeapOf(elements)
+ ObjectSizes.sizeOnHeapExcludingData(collectionElement);
}
@Override
public long unsharedHeapSizeExcludingData()
{
return HEAP_SIZE + ObjectSizes.sizeOnHeapExcludingData(elements)
+ ObjectSizes.sizeOnHeapExcludingData(collectionElement);
}
}
}