com.bigdata.service.ndx
Class DataServiceIndex

java.lang.Object
  extended by com.bigdata.service.ndx.DataServiceIndex
All Implemented Interfaces:
IAutoboxBTree, IIndex, IRangeQuery, ISimpleBTree, IClientIndex

public class DataServiceIndex
extends Object
implements IClientIndex

A view onto an unpartitioned index living inside an embedded DataService. Access to the index is moderated by the concurrency control mechanisms of the data service.

Applications writing to this interface are directly portable to scale-out partitioned indices and to embedded indices without concurrency control.

Note: Since the index is NOT partitioned we do not have to handle stale locators. That makes this implementation MUCH simpler than the ClientIndexView.

Version:
$Id: DataServiceIndex.java 2265 2009-10-26 12:51:06Z thompsonbry $
Author:
Bryan Thompson

Field Summary
protected static boolean DEBUG
           
protected static boolean INFO
           
protected static org.apache.log4j.Logger log
          Note: Invocations of the non-batch API are logged at the WARN level since they result in an application that can not scale efficiently to partitioned indices.
protected static boolean WARN
           
 
Fields inherited from interface com.bigdata.btree.IRangeQuery
ALL, CURSOR, DEFAULT, DELETED, FIXED_LENGTH_SUCCESSOR, KEYS, NONE, PARALLEL, READONLY, REMOVEALL, REVERSE, VALS
 
Constructor Summary
DataServiceIndex(LocalDataServiceFederation fed, String name, long timestamp)
          Creates a view onto an unpartitioned index living on an embedded data service.
 
Method Summary
 boolean contains(byte[] key)
          Return true iff there is a (non-deleted) index entry for the key.
 boolean contains(Object key)
          Return true iff there is an entry for the key.
 ICounter getCounter()
          Counters are local to a specific index partition and are only available to unisolated procedures running inside of an IConcurrencyManager (which includes procedures run on an IDataService).
 ICounterSet getCounters()
          FIXME populate with counters concerning the client's access to the index rather than the index's counters.
 IndexMetadata getIndexMetadata()
          The metadata for the index.
 String getName()
          The name of the scale-out index.
 IResourceMetadata[] getResourceMetadata()
          The resources associated with the cached IndexMetadata.
 long getTimestamp()
          The transaction identifier -or- ITx.UNISOLATED iff the index view is unisolated -or- - timestamp for a historical read of the most recent committed state not later than timestamp.
protected  ITupleSerializer getTupleSerializer()
           
 byte[] insert(byte[] key, byte[] value)
          Insert or update a value under the key.
 Object insert(Object key, Object val)
          Insert with auto-magic handling of keys and value objects.
 byte[] lookup(byte[] key)
          Lookup a value for a key.
 Object lookup(Object key)
          Lookup a value for a key.
 long rangeCount()
          Return the #of tuples in the index.
 long rangeCount(byte[] fromKey, byte[] toKey)
          Return the #of tuples in a half-open key range.
 long rangeCountExact(byte[] fromKey, byte[] toKey)
          Return the exact #of tuples in a half-open key range.
 long rangeCountExactWithDeleted(byte[] fromKey, byte[] toKey)
          Return the exact #of tuples in a half-open key range, including any deleted tuples.
 ITupleIterator rangeIterator()
          Visits all tuples in key order.
 ITupleIterator rangeIterator(byte[] fromKey, byte[] toKey)
          Return an iterator that visits the entries in a half-open key range.
 ITupleIterator rangeIterator(byte[] fromKey, byte[] toKey, int capacity, int flags, IFilterConstructor filter)
          Designated variant (the one that gets overridden) for an iterator that visits the entries in a half-open key range.
 byte[] remove(byte[] key)
          Remove the key and its associated value.
 Object remove(Object key)
          Remove the key and its associated value.
 void submit(byte[] fromKey, byte[] toKey, IKeyRangeIndexProcedure proc, IResultHandler handler)
          The procedure will be transparently applied against each index partition spanned by the given key range.
 Object submit(byte[] key, ISimpleIndexProcedure proc)
          Submits an index procedure that operations on a single key to the appropriate index partition returning the result of that procedure.
 void submit(int fromIndex, int toIndex, byte[][] keys, byte[][] vals, AbstractKeyArrayIndexProcedureConstructor ctor, IResultHandler aggregator)
          Runs a procedure against an index.
 String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

log

protected static final org.apache.log4j.Logger log
Note: Invocations of the non-batch API are logged at the WARN level since they result in an application that can not scale efficiently to partitioned indices.


WARN

protected static final boolean WARN

INFO

protected static final boolean INFO

DEBUG

protected static final boolean DEBUG
Constructor Detail

DataServiceIndex

public DataServiceIndex(LocalDataServiceFederation fed,
                        String name,
                        long timestamp)
Creates a view onto an unpartitioned index living on an embedded data service.

Parameters:
fed - The LocalDataServiceFederation.
name - The index name.
timestamp - The transaction identifier -or- ITx.UNISOLATED iff the index view is unisolated -or- - timestamp for a historical read of the most recent committed state not later than timestamp.
Throws:
NoSuchIndexException - if the named index does not exist.
Method Detail

getTimestamp

public long getTimestamp()
The transaction identifier -or- ITx.UNISOLATED iff the index view is unisolated -or- - timestamp for a historical read of the most recent committed state not later than timestamp.

Specified by:
getTimestamp in interface IClientIndex
Returns:
The transaction identifier for the index view.

getName

public String getName()
Description copied from interface: IClientIndex
The name of the scale-out index.

Specified by:
getName in interface IClientIndex

toString

public String toString()
Overrides:
toString in class Object

getIndexMetadata

public IndexMetadata getIndexMetadata()
Description copied from interface: IIndex
The metadata for the index. This is full of good stuff about the index.

Specified by:
getIndexMetadata in interface IIndex

getCounters

public ICounterSet getCounters()
FIXME populate with counters concerning the client's access to the index rather than the index's counters. This should be basically the same for the ClientIndexView and the DataServiceIndex.

Specified by:
getCounters in interface IIndex

getCounter

public ICounter getCounter()
Description copied from interface: IClientIndex
Counters are local to a specific index partition and are only available to unisolated procedures running inside of an IConcurrencyManager (which includes procedures run on an IDataService).

Specified by:
getCounter in interface IIndex
Specified by:
getCounter in interface IClientIndex

getTupleSerializer

protected ITupleSerializer getTupleSerializer()

contains

public boolean contains(Object key)
Description copied from interface: IAutoboxBTree
Return true iff there is an entry for the key.

Specified by:
contains in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
True if the btree contains an entry for that key.

contains

public boolean contains(byte[] key)
Description copied from interface: ISimpleBTree
Return true iff there is a (non-deleted) index entry for the key. An index entry with a null value will cause this method to return true. A deleted index entry will cause this method to return false.

Specified by:
contains in interface ISimpleBTree
Parameters:
key - The key.
Returns:
true if the index contains an (un-deleted) entry for that key.

insert

public Object insert(Object key,
                     Object val)
Description copied from interface: IAutoboxBTree
Insert with auto-magic handling of keys and value objects.

Specified by:
insert in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
val - The value is implicitly converted to a byte[].
Returns:
The de-serialized old value -or- null if there was no value stored under that key.

insert

public byte[] insert(byte[] key,
                     byte[] value)
Description copied from interface: ISimpleBTree
Insert or update a value under the key.

Specified by:
insert in interface ISimpleBTree
Parameters:
key - The key.
value - The value (may be null).
Returns:
The previous value under that key or null if the key was not found or if the previous entry for that key was marked as deleted.

lookup

public Object lookup(Object key)
Description copied from interface: IAutoboxBTree
Lookup a value for a key.

Specified by:
lookup in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
The de-serialized value or null if there is no entry for that key.

lookup

public byte[] lookup(byte[] key)
Description copied from interface: ISimpleBTree
Lookup a value for a key.

Specified by:
lookup in interface ISimpleBTree
Returns:
The value stored under that key or null if there is no entry for that key or if the entry under that key is marked as deleted.

remove

public Object remove(Object key)
Description copied from interface: IAutoboxBTree
Remove the key and its associated value.

Specified by:
remove in interface IAutoboxBTree
Parameters:
key - The key is implicitly converted to an unsigned byte[].
Returns:
The de-serialized value stored under that key or null if the key was not found.

remove

public byte[] remove(byte[] key)
Description copied from interface: ISimpleBTree
Remove the key and its associated value.

Specified by:
remove in interface ISimpleBTree
Parameters:
key - The key.
Returns:
The value stored under that key or null if the key was not found or if the previous entry under that key was marked as deleted.

rangeCount

public long rangeCount()
Description copied from interface: IRangeQuery
Return the #of tuples in the index.

Note: If the index supports deletion markers then the range count will be an upper bound and may double count tuples which have been overwritten, including the special case where the overwrite is a delete.

Specified by:
rangeCount in interface IRangeQuery
Returns:
The #of tuples in the index.

rangeCount

public long rangeCount(byte[] fromKey,
                       byte[] toKey)
Description copied from interface: IRangeQuery
Return the #of tuples in a half-open key range. The fromKey and toKey need not exist in the B+Tree.

Note: If the index supports deletion markers then the range count will be an upper bound and may double count tuples which have been overwritten, including the special case where the overwrite is a delete.

Specified by:
rangeCount in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The #of tuples in the half-open key range.

rangeCountExact

public long rangeCountExact(byte[] fromKey,
                            byte[] toKey)
Description copied from interface: IRangeQuery
Return the exact #of tuples in a half-open key range. The fromKey and toKey need not exist in the B+Tree.

Note: If the index supports deletion markers then this operation will require a key-range scan.

Specified by:
rangeCountExact in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The exact #of tuples in the half-open key range.

rangeCountExactWithDeleted

public long rangeCountExactWithDeleted(byte[] fromKey,
                                       byte[] toKey)
Description copied from interface: IRangeQuery
Return the exact #of tuples in a half-open key range, including any deleted tuples. The fromKey and toKey need not exist in the B+Tree.

When the view is just an AbstractBTree the result is the same as for IRangeQuery.rangeCount(byte[], byte[]), which already reports all tuples regardless of whether or not they are deleted.

When the index is a view with multiple sources, this operation requires a key-range scan where both deleted and undeleted tuples are visited.

Specified by:
rangeCountExactWithDeleted in interface IRangeQuery
Parameters:
fromKey - The lowest key that will be counted (inclusive). When null there is no lower bound.
toKey - The first key that will not be counted (exclusive). When null there is no upper bound.
Returns:
The exact #of deleted and undeleted tuples in the half-open key range.
See Also:
IRangeQuery.rangeCountExact(byte[], byte[])

rangeIterator

public final ITupleIterator rangeIterator()
Description copied from interface: IRangeQuery
Visits all tuples in key order. This is identical to
 rangeIterator(null, null)
 

Specified by:
rangeIterator in interface IRangeQuery
Returns:
An iterator that will visit all entries in key order.

rangeIterator

public ITupleIterator rangeIterator(byte[] fromKey,
                                    byte[] toKey)
Description copied from interface: IRangeQuery
Return an iterator that visits the entries in a half-open key range. When toKey EQ fromKey nothing will be visited. It is an error if toKey LT fromKey.

Specified by:
rangeIterator in interface IRangeQuery
Parameters:
fromKey - The first key that will be visited (inclusive lower bound). When null there is no lower bound.
toKey - The first key that will NOT be visited (exclusive upper bound). When null there is no upper bound.
See Also:
SuccessorUtil, which may be used to compute the successor of a value before encoding it as a component of a key., BytesUtil#successor(byte[]), which may be used to compute the successor of an encoded key., EntryFilter, which may be used to filter the entries visited by the iterator.

rangeIterator

public ITupleIterator rangeIterator(byte[] fromKey,
                                    byte[] toKey,
                                    int capacity,
                                    int flags,
                                    IFilterConstructor filter)
Description copied from interface: IRangeQuery
Designated variant (the one that gets overridden) for an iterator that visits the entries in a half-open key range. When toKey EQ fromKey nothing will be visited. It is an error if toKey LT fromKey.

Specified by:
rangeIterator in interface IRangeQuery
Parameters:
fromKey - The first key that will be visited (inclusive lower bound). When null there is no lower bound.
toKey - The first key that will NOT be visited (exclusive upper bound). When null there is no upper bound.
capacity - The #of entries to buffer at a time. This is a hint and MAY be zero (0) to use an implementation specific default capacity. A non-zero value may be used if you know that you want at most N results or if you want to override the default #of results to be buffered before sending them across a network interface. (Note that you can control the default value using IBigdataClient.Options#DEFAULT_CLIENT_RANGE_QUERY_CAPACITY).
flags - A bitwise OR of IRangeQuery.KEYS, IRangeQuery.VALS, etc.
filter - An optional object used to construct a stacked iterator. When IRangeQuery.CURSOR is specified in flags, the base iterator will implement ITupleCursor and the first filter in the stack can safely cast the source iterator to an ITupleCursor. If the outermost filter in the stack does not implement ITupleIterator, then it will be wrapped an ITupleIterator.
See Also:
SuccessorUtil, which may be used to compute the successor of a value before encoding it as a component of a key., BytesUtil#successor(byte[]), which may be used to compute the successor of an encoded key., IFilterConstructor, which may be used to construct an iterator stack performing filtering or other operations.

submit

public Object submit(byte[] key,
                     ISimpleIndexProcedure proc)
Description copied from interface: IIndex
Submits an index procedure that operations on a single key to the appropriate index partition returning the result of that procedure.

Specified by:
submit in interface IIndex
Parameters:
key - The key.
proc - The procedure.
Returns:
The value returned by IIndexProcedure.apply(IIndex)

submit

public void submit(byte[] fromKey,
                   byte[] toKey,
                   IKeyRangeIndexProcedure proc,
                   IResultHandler handler)
Description copied from interface: IIndex
The procedure will be transparently applied against each index partition spanned by the given key range.

Note: Since this variant of submit() does not split keys the fromIndex and toIndex in the Splits reported to the IResultHandler will be zero (0).

Specified by:
submit in interface IIndex
Parameters:
fromKey - The lower bound (inclusive) -or- null if there is no lower bound.
toKey - The upper bound (exclusive) -or- null if there is no upper bound.
proc - The procedure. If the procedure implements the IParallelizableIndexProcedure marker interface then it MAY be executed in parallel against the relevant index partition(s).

submit

public void submit(int fromIndex,
                   int toIndex,
                   byte[][] keys,
                   byte[][] vals,
                   AbstractKeyArrayIndexProcedureConstructor ctor,
                   IResultHandler aggregator)
Description copied from interface: IIndex
Runs a procedure against an index.

Note: This may be used to send custom logic together with the data to a remote index or index partition. When the index is remote both the procedure and the return value MUST be Serializable.

Note: The scale-out indices add support for auto-split of the procedure such that it runs locally against each relevant index partition.

Specified by:
submit in interface IIndex
Parameters:
fromIndex - The index of the first key to be used (inclusive).
toIndex - The index of the last key to be used (exclusive).
keys - The keys (required).
vals - The values (optional depending on the procedure).
ctor - An object that can create instances of the procedure.
aggregator - When defined, results from each procedure application will be reported to this object.

getResourceMetadata

public IResourceMetadata[] getResourceMetadata()
The resources associated with the cached IndexMetadata.

Specified by:
getResourceMetadata in interface IIndex


Copyright © 2006-2009 SYSTAP, LLC. All Rights Reserved.