in bulkloader/src/main/java/org/apache/directory/mavibot/btree/MavibotPartitionBuilder.java [1075:1224]
private void buildIndex( Index<?, String> idx, String ignoreVal ) throws Exception
{
BTree masterTree = rm.getManagedTree( masterTableName );
AttributeType type = idx.getAttribute();
boolean isBinary = type.getSyntax().isHumanReadable();
boolean singleValued = type.isSingleValued();
BTree fwdTree = rm.getManagedTree( type.getOid() + MavibotIndex.FORWARD_BTREE );
boolean fwdDupsAllowed = fwdTree.isAllowDuplicates();
Comparator fwdKeyComparator = fwdTree.getKeySerializer().getComparator();
Set<Tuple> fwdSet = new TreeSet<Tuple>( new IndexTupleComparator( fwdKeyComparator ) );
Map fwdMap = new TreeMap( fwdKeyComparator );
BTree revTree = null;
boolean revDupsAllowed;
Set<Tuple> revSet = null;
Map<String,Tuple> revMap = null;
Comparator revValComparator = null;
if( idx.hasReverse() )
{
revTree = rm.getManagedTree( type.getOid() + MavibotIndex.REVERSE_BTREE );
revDupsAllowed = revTree.isAllowDuplicates();
Comparator revKeyComparator = revTree.getKeySerializer().getComparator();
revValComparator = revTree.getValueSerializer().getComparator();
revSet = new TreeSet<Tuple>( new IndexTupleComparator( revKeyComparator ) );
revMap = new TreeMap( revKeyComparator );
}
TupleCursor<String, Entry> cursor = masterTree.browse();
while ( cursor.hasNext() )
{
Tuple<String, Entry> t = cursor.next();
Entry e = t.getValue();
Attribute at = e.get( type );
if( at == null )
{
continue;
}
if( singleValued )
{
Value v = at.get();
Object normVal = v.getNormValue();
if( ignoreVal != null )
{
if( normVal.equals( ignoreVal ) )
{
continue;
}
}
Tuple fwdTuple = new Tuple( normVal, t.getKey() );
fwdSet.add( fwdTuple );
if( revTree != null )
{
Tuple revTuple = new Tuple( t.getKey(), v.getNormValue() );
revSet.add( revTuple );
}
}
else
{
for( Value v : at )
{
Object val = v.getNormValue();
if( ignoreVal != null )
{
if( val.equals( ignoreVal ) )
{
continue;
}
}
Tuple fwdTuple = ( Tuple ) fwdMap.get( val );
if( fwdTuple == null )
{
Set<String> idSet = new TreeSet<String>();
idSet.add( t.getKey() );
fwdTuple = new Tuple( val, idSet );
fwdMap.put( val, fwdTuple );
}
else
{
Set<String> idSet = ( Set<String> ) fwdTuple.getValue();
idSet.add( t.getKey() );
}
if( revTree != null )
{
Tuple revTuple = revMap.get( t.getKey() );
if( revTuple == null )
{
Set valSet = new TreeSet( revValComparator );
valSet.add( val );
revTuple = new Tuple( t.getKey(), valSet );
}
else
{
Set valSet = ( Set ) revTuple.getValue();
valSet.add( val );
}
}
}
}
}
cursor.close();
if( singleValued )
{
if( fwdSet.isEmpty() )
{
return;
}
build( fwdSet.iterator(), fwdTree.getName() );
if( revTree != null )
{
build( revSet.iterator(), revTree.getName() );
}
}
else
{
if( fwdMap.isEmpty() )
{
return;
}
build( fwdMap.values().iterator(), fwdTree.getName() );
if( revTree != null )
{
build( revMap.values().iterator(), revTree.getName() );
}
}
}