blob: 6ec5eefed9db4d91fe16fe4606addc45eb1ec376 [file] [log] [blame]
/*
* Copyright 2009-2010 by The Regents of the University of California
* 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 from
*
* 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 edu.uci.ics.hyracks.storage.am.btree.api;
import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
import edu.uci.ics.hyracks.storage.am.common.api.ISlotManager;
import edu.uci.ics.hyracks.storage.am.common.api.ITreeIndexTupleReference;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleMode;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.FindTupleNoExactMatchPolicy;
import edu.uci.ics.hyracks.storage.am.common.ophelpers.MultiComparator;
/**
* A slot consists of two fields. The first field is 1 byte and it indicates the slot number of
* a prefix tuple that is called the first field prefixSlotOff. The second field is 3 bytes and
* it points to the start offset of a tuple that is called the second field tupleOff.
*
* We distinguish between two slot types:
* 1) prefix slots that point to prefix tuples (a frame is assumed to have a field numPrefixTuples)
* 2) tuple slots that point to data tuples (a frame is assumed to have a field numTuples)
*
* A tuple slot contains a tuple pointer and a pointer to a prefix slot (prefix slot number).
*
* INSERT procedure:
* - A tuple insertion may use an existing prefix tuple
* - A tuple insertion may never create a new prefix tuple
*
* Modifying the prefix slots would be extremely expensive because potentially all tuples slots
* would have to change their prefix slot pointers. All prefixes are recomputed during a reorg
* or compaction.
*/
public interface IPrefixSlotManager extends ISlotManager {
// TODO: Clean up interface after extending ISlotManager.
public int decodeFirstSlotField(int slot);
public int decodeSecondSlotField(int slot);
public int encodeSlotFields(int firstField, int secondField);
public int findSlot(ITupleReference searchKey, ITreeIndexTupleReference frameTuple,
ITreeIndexTupleReference framePrefixTuple, MultiComparator multiCmp, FindTupleMode mode,
FindTupleNoExactMatchPolicy matchPolicy);
public int insertSlot(int slot, int tupleOff);
/**
* @return the prefix slot number or FieldPrefixSlotManager.TUPLE_UNCOMPRESSED if none found
*/
public int findPrefix(ITupleReference tuple, ITreeIndexTupleReference framePrefixTuple);
public int getTupleSlotStartOff();
public int getTupleSlotEndOff();
public int getPrefixSlotStartOff();
public int getPrefixSlotEndOff();
public int getTupleSlotOff(int tupleIndex);
public int getPrefixSlotOff(int tupleIndex);
public int getSlotSize();
public void setSlot(int offset, int value);
// functions for testing
public void setPrefixSlot(int tupleIndex, int slot);
public void setMultiComparator(MultiComparator cmp);
}