You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by se...@apache.org on 2010/03/01 23:45:48 UTC
svn commit: r917770 [2/4] - in
/directory/sandbox/seelmann/hbase-partition/src:
main/java/org/apache/directory/server/core/partition/hbase/
main/java/org/apache/directory/server/core/partition/hbase/cursor/
main/java/org/apache/directory/server/core/pa...
Added: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/mapreduce/TreeTableBuilder.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/mapreduce/TreeTableBuilder.java?rev=917770&view=auto
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/mapreduce/TreeTableBuilder.java (added)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/mapreduce/TreeTableBuilder.java Mon Mar 1 22:45:47 2010
@@ -0,0 +1,143 @@
+/*
+ * 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.directory.server.core.partition.hbase.mapreduce;
+
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.directory.server.core.entry.ServerEntry;
+import org.apache.directory.server.core.partition.hbase.HBaseStore;
+import org.apache.directory.server.core.partition.hbase.Utils;
+import org.apache.directory.server.core.partition.hbase.table.HBaseMasterTable;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schema.loader.ldif.JarLdifSchemaLoader;
+import org.apache.directory.shared.ldap.schema.manager.impl.DefaultSchemaManager;
+import org.apache.hadoop.hbase.client.Result;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.mapreduce.TableMapper;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.io.IntWritable;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mapreduce.Mapper;
+
+
+/**
+ * Mapper that build indices.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class TreeTableBuilder extends TableMapper<IntWritable, Text>
+{
+
+ private static enum Counters
+ {
+ TREE_ENTRIES
+ }
+
+ public static final String SUFFIX = "org.apache.directory.suffix";
+ public static final String TABLE_PREFIX = "org.apache.directory.table.prefix";
+
+ private HBaseStore store;
+
+
+ protected void setup( Mapper<ImmutableBytesWritable, Result, IntWritable, Text>.Context context )
+ throws IOException, InterruptedException
+ {
+ try
+ {
+ JarLdifSchemaLoader schemaLoader = new JarLdifSchemaLoader();
+ SchemaManager schemaManager = new DefaultSchemaManager( schemaLoader );
+ schemaManager.loadAllEnabled();
+
+ LdapDN suffixDn = new LdapDN( context.getConfiguration().get( SUFFIX ) );
+ suffixDn.normalize( schemaManager.getNormalizerMapping() );
+
+ store = new HBaseStore();
+
+ store.setSuffixDn( suffixDn.getName() );
+ store.setCacheSize( 100 );
+ String tablePrefix = context.getConfiguration().get( TABLE_PREFIX );
+ store.setTablePrefix( tablePrefix );
+ store.init( schemaManager );
+
+ store.getConfiguration().setBoolean( HBaseStore.STRONG_CONSISTENCY_PROPERTY, false );
+ store.getConfiguration().setBoolean( HBaseMasterTable.MAINTAIN_COUNTERS_PROPERTY, true );
+ for ( Map.Entry<String, String> property : context.getConfiguration() )
+ {
+ store.getConfiguration().set( property.getKey(), property.getValue() );
+ }
+ }
+ catch ( Throwable e )
+ {
+ e.printStackTrace();
+ throw new IOException( e );
+ }
+ }
+
+
+ protected void cleanup( Mapper<ImmutableBytesWritable, Result, IntWritable, Text>.Context context )
+ throws IOException, InterruptedException
+ {
+ try
+ {
+ store.destroy();
+ }
+ catch ( Throwable e )
+ {
+ e.printStackTrace();
+ throw new IOException( e );
+ }
+ }
+
+
+ @Override
+ public void map( ImmutableBytesWritable key, Result result, Context context ) throws IOException,
+ InterruptedException
+ {
+ try
+ {
+ UUID id = Utils.toUUID( key.get() );
+ ServerEntry entry = store.getMasterTable().convertToServerEntry( id, result );
+
+ // write to tree table
+ UUID parentId = Utils.toUUID( result.getValue( HBaseMasterTable.TREE_INFO_FAMILY,
+ HBaseMasterTable.PARENT_ID_QUALIFIER ) );
+ String normRdn = Bytes.toString( result.getValue( HBaseMasterTable.TREE_INFO_FAMILY,
+ HBaseMasterTable.NORM_RDN_QUALIFIER ) );
+ String upRdn = Bytes.toString( result.getValue( HBaseMasterTable.TREE_INFO_FAMILY,
+ HBaseMasterTable.UP_RDN_QUALIFIER ) );
+ HBaseMasterTable.MasterTreeInfo mti = new HBaseMasterTable.MasterTreeInfo( parentId, normRdn, upRdn );
+ store.getMasterTable().addToTree( id, mti, entry );
+
+ context.getCounter( Counters.TREE_ENTRIES ).increment( 1 );
+ }
+ catch ( Exception e )
+ {
+ System.err.println( "Error indexing entry id=" + Utils.toUUID( key.get() ) );
+ System.err.println( ">>>" + result + "<<<" );
+ e.printStackTrace();
+ }
+ }
+
+}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseColumnIndexTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseColumnIndexTable.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseColumnIndexTable.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseColumnIndexTable.java Mon Mar 1 22:45:47 2010
@@ -23,8 +23,10 @@
import java.util.ArrayList;
import java.util.List;
import java.util.NavigableMap;
+import java.util.UUID;
import org.apache.directory.server.core.partition.hbase.Cache;
+import org.apache.directory.server.core.partition.hbase.Utils;
import org.apache.directory.shared.ldap.schema.AttributeType;
import org.apache.directory.shared.ldap.schema.SchemaManager;
import org.apache.directory.shared.ldap.util.Base64;
@@ -111,7 +113,7 @@
}
- public byte[] getScanKey( Object value, byte[] entryId ) throws Exception
+ public byte[] getScanKey( Object value ) throws Exception
{
ByteBuffer bb = new ByteBuffer();
@@ -133,21 +135,11 @@
bb.append( normValue );
}
- // add entryId
- if ( entryId == VALUE_SCAN_START )
- {
- bb.append( VALUE_SCAN_START );
- }
- else if ( entryId == VALUE_SCAN_STOP )
- {
- bb.append( VALUE_SCAN_STOP );
- }
-
return bb.copyOfUsedBytes();
}
- public List<Long> getColumnCandidates( Object value ) throws Exception
+ public List<UUID> getColumnCandidates( Object value ) throws Exception
{
byte[] equalsKey = getEqualsKey( value );
Info info = fetchInfo( equalsKey );
@@ -159,7 +151,7 @@
}
- public List<Long> getColumnCandidates( Result result ) throws Exception
+ public List<UUID> getColumnCandidates( Result result ) throws Exception
{
Info info = extractInfo( result );
return info.candidates;
@@ -175,7 +167,7 @@
* @return
* @throws Exception "index";
*/
- public boolean exists( Object value, Long id ) throws Exception
+ public boolean exists( Object value, UUID id ) throws Exception
{
byte[] equalsKey = getEqualsKey( value );
Info info = fetchInfo( equalsKey );
@@ -194,10 +186,13 @@
{
return null;
}
+
String key = String.valueOf( Base64.encode( row ) );
- if ( infoCache.contains( key ) )
+
+ Info info = infoCache.get( key );
+ if ( info != null )
{
- return infoCache.get( key );
+ return info;
}
Get get = new Get( row );
@@ -229,21 +224,18 @@
NavigableMap<byte[], byte[]> infoMap = result.getFamilyMap( INFO_FAMILY );
for ( byte[] qualifier : infoMap.keySet() )
{
- if ( qualifier.length == 8 )
- {
- info.candidates.add( Bytes.toLong( qualifier ) );
- }
+ info.candidates.add( Utils.toUUID( qualifier ) );
}
return info;
}
- public void add( byte[] value, Long id ) throws Exception
+ public void add( byte[] value, UUID id ) throws Exception
{
// exact match (attribute=value): =value -> id
byte[] equalsKey = getEqualsKey( value );
Put exactPut = new Put( equalsKey );
- exactPut.add( INFO_FAMILY, Bytes.toBytes( id ), Bytes.toBytes( id ) );
+ exactPut.add( INFO_FAMILY, Utils.toBytes( id ), Utils.toBytes( id ) );
HBaseTableHelper.put( getIndexTablePool(), indexTableName, exactPut );
// TODO: optimize - don't need to clear the áºhole cache
@@ -253,12 +245,12 @@
}
- public void drop( byte[] value, Long id ) throws Exception
+ public void drop( byte[] value, UUID id ) throws Exception
{
// exact match (attribute=value): =value -> id
byte[] equalsKey = getEqualsKey( value );
Delete exactDel = new Delete( equalsKey );
- exactDel.deleteColumn( INFO_FAMILY, Bytes.toBytes( id ) );
+ exactDel.deleteColumn( INFO_FAMILY, Utils.toBytes( id ) );
HBaseTableHelper.delete( getIndexTablePool(), indexTableName, exactDel );
// TODO: optimize - don't need to clear the áºhole cache
@@ -270,7 +262,7 @@
class Info
{
Object value;
- List<Long> candidates = new ArrayList<Long>();
+ List<UUID> candidates = new ArrayList<UUID>();
}
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseIndexTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseIndexTable.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseIndexTable.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseIndexTable.java Mon Mar 1 22:45:47 2010
@@ -20,6 +20,8 @@
package org.apache.directory.server.core.partition.hbase.table;
+import java.util.UUID;
+
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
@@ -36,14 +38,12 @@
public static final byte[] INFO_FAMILY = Bytes.toBytes( "info" );
public static final byte[] ID_QUALIFIER = Bytes.toBytes( "id" );
- public static final byte[] VALUE_SCAN_START = new byte[]
- { 0x00 };
- public static final byte[] VALUE_SCAN_STOP = new byte[]
- { ( byte ) 0xFF };
- public static final byte[] FULL_SCAN_START = new byte[]
- { 0x00 };
- public static final byte[] FULL_SCAN_STOP = new byte[]
- { ( byte ) 0xFF };
+ public static final UUID VALUE_SCAN_START = UUID.fromString( "00000000-0000-0000-0000-000000000000" );
+ public static final UUID VALUE_SCAN_STOP = UUID.fromString( "ffffffff-ffff-ffff-ffff-ffffffffffff" );
+
+ public static final Byte DELIMITER = Byte.valueOf( ( byte ) 0x00 );
+ public static final Byte FULL_SCAN_START = Byte.valueOf( ( byte ) 0x00 );
+ public static final Byte FULL_SCAN_STOP = Byte.valueOf( ( byte ) 0xFF );
public abstract void close() throws Exception;
@@ -60,15 +60,15 @@
* @return true if an index exists
* @throws Exception
*/
- public abstract boolean exists( Object value, Long id ) throws Exception;
+ public abstract boolean exists( Object value, UUID id ) throws Exception;
public abstract ResultScanner getScanner( Scan scan ) throws Exception;
- public abstract void add( byte[] value, Long id ) throws Exception;
+ public abstract void add( byte[] value, UUID id ) throws Exception;
- public abstract void drop( byte[] value, Long id ) throws Exception;
+ public abstract void drop( byte[] value, UUID id ) throws Exception;
}
\ No newline at end of file
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseMasterTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseMasterTable.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseMasterTable.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseMasterTable.java Mon Mar 1 22:45:47 2010
@@ -24,6 +24,9 @@
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
+import java.util.UUID;
+
+import javax.naming.directory.InvalidAttributeValueException;
import org.apache.directory.server.core.entry.DefaultServerAttribute;
import org.apache.directory.server.core.entry.DefaultServerEntry;
@@ -33,6 +36,8 @@
import org.apache.directory.server.core.entry.ServerStringValue;
import org.apache.directory.server.core.partition.hbase.Cache;
import org.apache.directory.server.core.partition.hbase.HBaseStore;
+import org.apache.directory.server.core.partition.hbase.Utils;
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
import org.apache.directory.shared.ldap.entry.EntryAttribute;
import org.apache.directory.shared.ldap.entry.Value;
import org.apache.directory.shared.ldap.name.LdapDN;
@@ -59,10 +64,8 @@
*/
public class HBaseMasterTable
{
- public static final Long ROOT_ID = 0L;
- public static final byte[] ROOT_ROW = Bytes.toBytes( ROOT_ID );
- public static final byte[] SEQUENCE_ROW = Bytes.toBytes( ROOT_ID );
- public static final byte[] SEQUENCE_QUALIFIER = Bytes.toBytes( "sequence" );
+ public static final UUID ROOT_ID = UUID.fromString( "00000000-0000-0000-0000-000000000000" );
+ public static final byte[] ROOT_ROW = Utils.toBytes( ROOT_ID );
public static final byte[] TREE_INFO_FAMILY = Bytes.toBytes( "treeInfo" );
public static final byte[] ID_QUALIFIER = Bytes.toBytes( "id" );
@@ -86,6 +89,7 @@
public static final String MASTER_TABLE = "master";
public static final String TREE_TABLE = "tree";
public static final String MAINTAIN_COUNTERS_PROPERTY = "org.apache.directory.maintain.counters";
+ public static final String COMPRESSION_ALGORITHM_PROPERTY = "org.apache.directory.compression.algorithm";
private HBaseConfiguration configuration;
private boolean maintainCounters;
@@ -99,22 +103,22 @@
private MasterTreeInfo suffixMti;
/** id -> master tree info */
- private Cache<Long, MasterTreeInfo> mtiCache;
+ private Cache<UUID, MasterTreeInfo> mtiCache;
/** master tree info -> id */
- private Cache<String, Long> idCache;
+ private Cache<String, UUID> idCache;
/** id -> one level count */
- private Cache<Long, Long> oneLevelCountCache;
+ private Cache<UUID, Long> oneLevelCountCache;
/** id -> sub level count */
- private Cache<Long, Long> subLevelCountCache;
+ private Cache<UUID, Long> subLevelCountCache;
/** id -> DN */
- private Cache<Long, LdapDN> dnCache;
+ private Cache<UUID, LdapDN> dnCache;
/** id -> entry */
- private Cache<Long, ServerEntry> entryCache;
+ private Cache<UUID, ServerEntry> entryCache;
public HBaseMasterTable( HBaseStore store )
@@ -127,16 +131,16 @@
this.treeTableName = store.getTablePrefix() + TREE_TABLE;
this.suffixMti = new MasterTreeInfo( ROOT_ID, suffixDn.getNormName(), null );
- this.entryCache = new Cache<Long, ServerEntry>( store.getCacheSize() );
+ this.entryCache = new Cache<UUID, ServerEntry>( store.getCacheSize() );
int dnCacheSize = Math.max( store.getCacheSize(), store.getNdnIndex().getCacheSize() );
- this.dnCache = new Cache<Long, LdapDN>( dnCacheSize );
- this.mtiCache = new Cache<Long, MasterTreeInfo>( dnCacheSize );
- this.idCache = new Cache<String, Long>( dnCacheSize );
+ this.dnCache = new Cache<UUID, LdapDN>( dnCacheSize );
+ this.mtiCache = new Cache<UUID, MasterTreeInfo>( dnCacheSize );
+ this.idCache = new Cache<String, UUID>( dnCacheSize );
- this.oneLevelCountCache = new Cache<Long, Long>( Math.max( store.getCacheSize(), store.getOneLevelIndex()
+ this.oneLevelCountCache = new Cache<UUID, Long>( Math.max( store.getCacheSize(), store.getOneLevelIndex()
.getCacheSize() ) );
- this.subLevelCountCache = new Cache<Long, Long>( Math.max( store.getCacheSize(), store.getSubLevelIndex()
+ this.subLevelCountCache = new Cache<UUID, Long>( Math.max( store.getCacheSize(), store.getSubLevelIndex()
.getCacheSize() ) );
}
@@ -154,18 +158,14 @@
}
- public Long add( ServerEntry entry ) throws Exception
+ public UUID add( ServerEntry entry ) throws Exception
{
- Long id = addToMaster( entry );
- addToTree( id, entry );
- return id;
- }
-
-
- public Long addToMaster( ServerEntry entry ) throws Exception
- {
- Long id = nextId();
- List<Long> parentIds = fetchParentIds( entry.getDn(), false );
+ UUID id = getId( entry );
+ List<UUID> parentIds = fetchParentIds( entry.getDn(), false );
+ if ( parentIds == null )
+ {
+ throw new NullPointerException( "fetchParentIds() returned null for " + entry.getDn() );
+ }
String upRdn;
String normRdn;
if ( entry.getDn().equals( suffixDn ) )
@@ -178,12 +178,22 @@
upRdn = entry.getDn().getRdn().getUpName();
normRdn = entry.getDn().getRdn().getNormName();
}
+ MasterTreeInfo mti = new MasterTreeInfo( parentIds.get( 0 ), normRdn, upRdn );
+
+ addToMaster( id, mti, entry );
+ addToTree( id, mti, entry );
+
+ return id;
+ }
+
- // put to master and tree table
- Put masterPut = new Put( Bytes.toBytes( id ) );
- masterPut.add( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER, Bytes.toBytes( parentIds.get( 0 ) ) );
- masterPut.add( TREE_INFO_FAMILY, UP_RDN_QUALIFIER, Bytes.toBytes( upRdn ) );
- masterPut.add( TREE_INFO_FAMILY, NORM_RDN_QUALIFIER, Bytes.toBytes( normRdn ) );
+ public void addToMaster( UUID id, MasterTreeInfo mti, ServerEntry entry ) throws Exception
+ {
+ // put to master table
+ Put masterPut = new Put( Utils.toBytes( id ) );
+ masterPut.add( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER, Utils.toBytes( mti.parentId ) );
+ masterPut.add( TREE_INFO_FAMILY, UP_RDN_QUALIFIER, Bytes.toBytes( mti.upName ) );
+ masterPut.add( TREE_INFO_FAMILY, NORM_RDN_QUALIFIER, Bytes.toBytes( mti.normName ) );
for ( EntryAttribute attribute : entry )
{
String attr = attribute.getUpId();
@@ -199,33 +209,14 @@
}
}
HBaseTableHelper.put( getMasterTablePool(), masterTableName, masterPut );
-
- return id;
}
- public Long addToTree( Long id, ServerEntry entry ) throws Exception
+ public void addToTree( UUID id, MasterTreeInfo mti, ServerEntry entry ) throws Exception
{
- List<Long> parentIds = fetchParentIds( entry.getDn(), false );
- String upRdn;
- String normRdn;
- MasterTreeInfo treeTableKey;
- if ( entry.getDn().equals( suffixDn ) )
- {
- upRdn = entry.getDn().getName();
- normRdn = entry.getDn().getNormName();
- treeTableKey = new MasterTreeInfo( parentIds.get( 0 ), normRdn, upRdn );
- }
- else
- {
- upRdn = entry.getDn().getRdn().getUpName();
- normRdn = entry.getDn().getRdn().getNormName();
- treeTableKey = new MasterTreeInfo( parentIds.get( 0 ), normRdn, upRdn );
- }
-
// put to tree table
- Put treePut = new Put( treeTableKey.treeTableKey );
- treePut.add( TREE_INFO_FAMILY, ID_QUALIFIER, Bytes.toBytes( id ) );
+ Put treePut = new Put( mti.treeTableKey );
+ treePut.add( TREE_INFO_FAMILY, ID_QUALIFIER, Utils.toBytes( id ) );
for ( EntryAttribute attribute : entry )
{
String attrOid = ( ( ServerAttribute ) attribute ).getAttributeType().getOid();
@@ -253,12 +244,11 @@
}
}
}
- HBaseTableHelper.put( getTreeTablePool(), treeTableName, treePut );
if ( maintainCounters )
{
// update parent one-level count
- MasterTreeInfo parentKey = fetchMasterTreeInfo( parentIds.get( 0 ) );
+ MasterTreeInfo parentKey = fetchMasterTreeInfo( mti.parentId );
if ( parentKey != null )
{
HBaseTableHelper.increment( getTreeTablePool(), treeTableName, parentKey.treeTableKey,
@@ -266,14 +256,11 @@
}
// update all parents sub-level count
- for ( Long parentId : parentIds )
+ while ( parentKey != null )
{
- parentKey = fetchMasterTreeInfo( parentId );
- if ( parentKey != null )
- {
- HBaseTableHelper.increment( getTreeTablePool(), treeTableName, parentKey.treeTableKey,
- TREE_INFO_FAMILY, SUB_LEVEL_COUNT_QUALIFIER );
- }
+ HBaseTableHelper.increment( getTreeTablePool(), treeTableName, parentKey.treeTableKey,
+ TREE_INFO_FAMILY, SUB_LEVEL_COUNT_QUALIFIER );
+ parentKey = fetchMasterTreeInfo( parentKey.parentId );
}
// clear caches
@@ -281,16 +268,16 @@
subLevelCountCache.clear();
}
- return id;
+ HBaseTableHelper.put( getTreeTablePool(), treeTableName, treePut );
}
- public void delete( Long id, ServerEntry entry ) throws Exception
+ public void delete( UUID id, ServerEntry entry ) throws Exception
{
MasterTreeInfo key = fetchMasterTreeInfo( id );
// delete in master table
- Delete masterDel = new Delete( Bytes.toBytes( id ) );
+ Delete masterDel = new Delete( Utils.toBytes( id ) );
HBaseTableHelper.delete( getMasterTablePool(), masterTableName, masterDel );
// delete in tree table
@@ -300,8 +287,8 @@
if ( maintainCounters )
{
// update parent one-level count
- Long parentId = key.parentId;
- if ( parentId > ROOT_ID )
+ UUID parentId = key.parentId;
+ if ( !parentId.equals( ROOT_ID ) )
{
MasterTreeInfo parentKey = fetchMasterTreeInfo( parentId );
HBaseTableHelper.decrement( getTreeTablePool(), treeTableName, parentKey.treeTableKey,
@@ -309,7 +296,7 @@
}
// update sub-level count of all parents
- while ( parentId > ROOT_ID )
+ while ( !parentId.equals( ROOT_ID ) )
{
MasterTreeInfo parentKey = fetchMasterTreeInfo( parentId );
HBaseTableHelper.decrement( getTreeTablePool(), treeTableName, parentKey.treeTableKey,
@@ -328,16 +315,16 @@
}
- public void modify( Long id, ServerEntry entry ) throws Exception
+ public void modify( UUID id, ServerEntry entry ) throws Exception
{
// TODO: replace quick-and-dirty implementation (delete+put) with with better algorithm
MasterTreeInfo ttk = fetchMasterTreeInfo( id );
// delete complete attribute family
- Delete masterDel = new Delete( Bytes.toBytes( id ) );
+ Delete masterDel = new Delete( Utils.toBytes( id ) );
masterDel.deleteFamily( UP_ATTRIBUTES_FAMILY );
HBaseTableHelper.delete( getMasterTablePool(), masterTableName, masterDel );
- Delete treeDel = new Delete( Bytes.toBytes( id ) );
+ Delete treeDel = new Delete( Utils.toBytes( id ) );
treeDel.deleteFamily( NORM_ATTRIBUTES_FAMILY );
HBaseTableHelper.delete( getTreeTablePool(), treeTableName, treeDel );
@@ -348,7 +335,7 @@
// add all attributes
// TODO: duplicate code
- Put masterPut = new Put( Bytes.toBytes( id ) );
+ Put masterPut = new Put( Utils.toBytes( id ) );
Put treePut = new Put( ttk.treeTableKey );
for ( EntryAttribute attribute : entry )
{
@@ -396,18 +383,19 @@
* @return the server entry, null if entry doesn't exist.
* @throws Exception the exception
*/
- public ServerEntry fetchEntry( Long id ) throws Exception
+ public ServerEntry fetchEntry( UUID id ) throws Exception
{
if ( id == null || id.equals( ROOT_ID ) )
{
return null;
}
- if ( entryCache.contains( id ) )
+ ServerEntry entry = entryCache.get( id );
+ if ( entry != null )
{
- return entryCache.get( id );
+ return entry;
}
- Get entryGet = new Get( Bytes.toBytes( id ) );
+ Get entryGet = new Get( Utils.toBytes( id ) );
entryGet.addColumn( TREE_INFO_FAMILY, ID_QUALIFIER );
entryGet.addColumn( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER );
entryGet.addColumn( TREE_INFO_FAMILY, UP_RDN_QUALIFIER );
@@ -418,16 +406,16 @@
{
return null;
}
- ServerEntry entry = convertToServerEntry( id, result );
+ entry = convertToServerEntry( id, result );
entryCache.put( id, entry );
return entry;
}
- public ServerEntry convertToServerEntry( Long id, Result result ) throws Exception
+ public ServerEntry convertToServerEntry( UUID id, Result result ) throws Exception
{
- Long parentId = Bytes.toLong( result.getValue( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER ) );
- String normRdn = Bytes.toString( result.getValue( TREE_INFO_FAMILY, UP_RDN_QUALIFIER ) );
+ UUID parentId = Utils.toUUID( result.getValue( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER ) );
+ String normRdn = Bytes.toString( result.getValue( TREE_INFO_FAMILY, NORM_RDN_QUALIFIER ) );
String upRdn = Bytes.toString( result.getValue( TREE_INFO_FAMILY, UP_RDN_QUALIFIER ) );
MasterTreeInfo mti = new MasterTreeInfo( parentId, normRdn, upRdn );
LdapDN dn = fetchDn( id, mti );
@@ -461,11 +449,12 @@
}
- private LdapDN fetchDn( Long id, MasterTreeInfo mti ) throws Exception
+ private LdapDN fetchDn( UUID id, MasterTreeInfo mti ) throws Exception
{
- if ( dnCache.contains( id ) )
+ LdapDN dn = dnCache.get( id );
+ if ( dn != null )
{
- return dnCache.get( id );
+ return dn;
}
// build DN, only normalize the RDN part, the parent is already normalized
@@ -480,7 +469,7 @@
}
}
while ( mti != null );
- LdapDN dn = new LdapDN( sb.toString() );
+ dn = new LdapDN( sb.toString() );
dn.normalize( schemaManager.getAttributeTypeRegistry().getNormalizerMapping() );
// put DN to cache
@@ -497,13 +486,13 @@
* @return the entry ID, null if entry doesn't exist.
* @throws Exception
*/
- public Long fetchId( LdapDN dn ) throws Exception
+ public UUID fetchId( LdapDN dn ) throws Exception
{
if ( dn == null )
{
return null;
}
- List<Long> ids = fetchParentIds( dn, true );
+ List<UUID> ids = fetchParentIds( dn, true );
return ids == null ? null : ids.get( 0 );
}
@@ -515,7 +504,7 @@
* @return the parent ID, null if entry doesn't exist.
* @throws Exception
*/
- public Long fetchParentId( Long id ) throws Exception
+ public UUID fetchParentId( UUID id ) throws Exception
{
if ( id == null || id.equals( ROOT_ID ) )
{
@@ -530,7 +519,7 @@
}
- public NavigableMap<byte[], byte[]> fetchNormAttributes( Long id ) throws Exception
+ public NavigableMap<byte[], byte[]> fetchNormAttributes( UUID id ) throws Exception
{
MasterTreeInfo mti = fetchMasterTreeInfo( id );
Get get = new Get( mti.treeTableKey );
@@ -548,11 +537,12 @@
* @return the one level count, 0 if entry doesn't exist.
* @throws Exception
*/
- public int getOneLevelCount( Long id ) throws Exception
+ public int getOneLevelCount( UUID id ) throws Exception
{
- if ( oneLevelCountCache.contains( id ) )
+ Long count = oneLevelCountCache.get( id );
+ if ( count != null )
{
- return oneLevelCountCache.get( id ).intValue();
+ return count.intValue();
}
MasterTreeInfo mti = fetchMasterTreeInfo( id );
@@ -560,8 +550,8 @@
{
return 0;
}
- Long count = HBaseTableHelper.getLongValue( getTreeTablePool(), treeTableName, mti.treeTableKey,
- TREE_INFO_FAMILY, ONE_LEVEL_COUNT_QUALIFIER, 0L );
+ count = HBaseTableHelper.getLongValue( getTreeTablePool(), treeTableName, mti.treeTableKey, TREE_INFO_FAMILY,
+ ONE_LEVEL_COUNT_QUALIFIER, 0L );
oneLevelCountCache.put( id, count );
return count.intValue();
@@ -575,11 +565,12 @@
* @return the sub level count, 0 if entry doesn't exist.
* @throws Exception
*/
- public int getSubLevelCount( Long id ) throws Exception
+ public int getSubLevelCount( UUID id ) throws Exception
{
- if ( subLevelCountCache.contains( id ) )
+ Long count = subLevelCountCache.get( id );
+ if ( count != null )
{
- return subLevelCountCache.get( id ).intValue();
+ return count.intValue();
}
MasterTreeInfo mti = fetchMasterTreeInfo( id );
@@ -587,8 +578,8 @@
{
return 0;
}
- Long count = HBaseTableHelper.getLongValue( getTreeTablePool(), treeTableName, mti.treeTableKey,
- TREE_INFO_FAMILY, SUB_LEVEL_COUNT_QUALIFIER, 0L );
+ count = HBaseTableHelper.getLongValue( getTreeTablePool(), treeTableName, mti.treeTableKey, TREE_INFO_FAMILY,
+ SUB_LEVEL_COUNT_QUALIFIER, 0L );
subLevelCountCache.put( id, count );
return count.intValue();
@@ -602,18 +593,18 @@
}
- private List<Long> fetchParentIds( LdapDN dn, boolean includeChild ) throws Exception
+ private List<UUID> fetchParentIds( LdapDN dn, boolean includeChild ) throws Exception
{
if ( !dn.startsWith( suffixDn ) )
{
return null;
}
- List<Long> path = new ArrayList<Long>();
+ List<UUID> path = new ArrayList<UUID>();
path.add( ROOT_ID );
if ( !dn.equals( suffixDn ) || includeChild )
{
- Long parentId = getSuffixId();
+ UUID parentId = getSuffixId();
if ( parentId == null )
{
return null;
@@ -638,31 +629,17 @@
}
- private Long getSuffixId() throws Exception
+ private UUID getSuffixId() throws Exception
{
return fetchId( suffixMti );
}
- private List<Long> ids = new ArrayList<Long>();
-
- private long nextId() throws Exception
+ private UUID getId( ServerEntry entry ) throws InvalidAttributeValueException
{
- if ( ids.isEmpty() )
- {
- long amount = 100;
- byte[] id = HBaseTableHelper.increment( getMasterTablePool(), masterTableName, SEQUENCE_ROW,
- TREE_INFO_FAMILY, SEQUENCE_QUALIFIER, amount );
- long upper = Bytes.toLong( id );
- long lower = upper - amount + 1;
- for ( long l = lower; l <= upper; l++ )
- {
- ids.add( l );
- }
- }
-
- Long id = ids.remove( 0 );
- return id;
+ String name = entry.get( SchemaConstants.ENTRY_UUID_AT ).getString();
+ UUID uuid = UUID.fromString( name );
+ return uuid;
}
@@ -688,14 +665,15 @@
}
- private Long fetchId( MasterTreeInfo mti ) throws Exception
+ private UUID fetchId( MasterTreeInfo mti ) throws Exception
{
- if ( idCache.contains( mti.string ) )
+ UUID id = idCache.get( mti.string );
+ if ( id != null )
{
- return idCache.get( mti.string );
+ return id;
}
- Long id = HBaseTableHelper.getLongValue( getTreeTablePool(), treeTableName, mti.treeTableKey, TREE_INFO_FAMILY,
+ id = HBaseTableHelper.getUUIDValue( getTreeTablePool(), treeTableName, mti.treeTableKey, TREE_INFO_FAMILY,
ID_QUALIFIER, null );
if ( id == null )
{
@@ -715,18 +693,19 @@
* @return the master tree info, null if entry doesn't exist
* @throws Exception
*/
- private MasterTreeInfo fetchMasterTreeInfo( Long id ) throws Exception
+ private MasterTreeInfo fetchMasterTreeInfo( UUID id ) throws Exception
{
if ( id == null || id.equals( ROOT_ID ) )
{
return null;
}
- if ( mtiCache.contains( id ) )
+ MasterTreeInfo mti = mtiCache.get( id );
+ if ( mti != null )
{
- return mtiCache.get( id );
+ return mti;
}
- Get get = new Get( Bytes.toBytes( id ) );
+ Get get = new Get( Utils.toBytes( id ) );
get.addColumn( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER );
get.addColumn( TREE_INFO_FAMILY, NORM_RDN_QUALIFIER );
get.addColumn( TREE_INFO_FAMILY, UP_RDN_QUALIFIER );
@@ -735,33 +714,41 @@
{
return null;
}
- Long parentId = Bytes.toLong( result.getValue( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER ) );
+ UUID parentId = Utils.toUUID( result.getValue( TREE_INFO_FAMILY, PARENT_ID_QUALIFIER ) );
String normRdn = Bytes.toString( result.getValue( TREE_INFO_FAMILY, NORM_RDN_QUALIFIER ) );
String upRdn = Bytes.toString( result.getValue( TREE_INFO_FAMILY, UP_RDN_QUALIFIER ) );
- MasterTreeInfo mti = new MasterTreeInfo( parentId, normRdn, upRdn );
+ mti = new MasterTreeInfo( parentId, normRdn, upRdn );
mtiCache.put( id, mti );
idCache.put( mti.string, id );
return mti;
}
- static class MasterTreeInfo
+ public static class MasterTreeInfo
{
- private final Long parentId;
+ private final UUID parentId;
private final String normName;
private final String upName;
public final byte[] treeTableKey;
public final String string;
- public MasterTreeInfo( Long parentId, String normName, String upName )
+ public MasterTreeInfo( UUID parentId, String normName, String upName )
{
this.parentId = parentId;
this.normName = normName;
this.upName = upName;
- this.treeTableKey = Bytes.add( Bytes.toBytes( parentId ), KEY_DELIMITER_BYTES, Bytes.toBytes( normName ) );
+ this.treeTableKey = Bytes.add( Utils.toBytes( parentId ), KEY_DELIMITER_BYTES, Bytes.toBytes( normName ) );
this.string = "" + parentId + KEY_DELIMITER + normName;
}
+
+
+ @Override
+ public String toString()
+ {
+ return string;
+ }
+
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBasePresenceIndexTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBasePresenceIndexTable.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBasePresenceIndexTable.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBasePresenceIndexTable.java Mon Mar 1 22:45:47 2010
@@ -20,13 +20,13 @@
package org.apache.directory.server.core.partition.hbase.table;
+import java.util.UUID;
+
import org.apache.directory.server.core.partition.hbase.Cache;
import org.apache.directory.server.core.partition.hbase.HBaseStore;
+import org.apache.directory.server.core.partition.hbase.Utils;
import org.apache.directory.server.core.partition.hbase.cursor.HBasePresenceIndexCursor;
-import org.apache.directory.shared.ldap.schema.SchemaManager;
-import org.apache.directory.shared.ldap.util.Base64;
import org.apache.directory.shared.ldap.util.ByteBuffer;
-import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
@@ -49,10 +49,8 @@
public static final byte[] COUNT_ROW = Bytes.toBytes( "!" );
public static final byte[] INFO_FAMILY = Bytes.toBytes( "info" );
public static final byte[] ID_QUALIFIER = Bytes.toBytes( "id" );
- public static final byte[] VALUE_SCAN_FIRST_ENTRYID = new byte[]
- { 0x00 };
- public static final byte[] VALUE_SCAN_LAST_ENTRYID = new byte[]
- { ( byte ) 0xFF };
+ public static final UUID VALUE_SCAN_FIRST_ENTRYID = UUID.fromString( "00000000-0000-0000-0000-000000000000" );
+ public static final UUID VALUE_SCAN_LAST_ENTRYID = UUID.fromString( "ffffffff-ffff-ffff-ffff-ffffffffffff" );
protected String indexTableName;
private HBaseTablePool indexTablePool;
@@ -91,7 +89,7 @@
* @return the presence index row key for the entry ID
* @throws Exception
*/
- public byte[] getPresenceKey( byte[] entryId ) throws Exception
+ public byte[] getPresenceKey( UUID entryId ) throws Exception
{
ByteBuffer bb = new ByteBuffer();
@@ -100,15 +98,15 @@
// add entryId
if ( entryId == VALUE_SCAN_FIRST_ENTRYID )
{
- bb.append( VALUE_SCAN_FIRST_ENTRYID );
+ bb.append( Bytes.toBytes( VALUE_SCAN_FIRST_ENTRYID.toString() ) );
}
else if ( entryId == VALUE_SCAN_LAST_ENTRYID )
{
- bb.append( VALUE_SCAN_LAST_ENTRYID );
+ bb.append( Bytes.toBytes( VALUE_SCAN_LAST_ENTRYID.toString() ) );
}
else if ( entryId != null )
{
- bb.append( Bytes.toBytes( String.valueOf( Base64.encode( entryId ) ) ) );
+ bb.append( Bytes.toBytes( entryId.toString() ) );
}
return bb.copyOfUsedBytes();
@@ -117,9 +115,10 @@
public int count() throws Exception
{
- if ( countCache.contains( attributeTypeOid ) )
+ Integer cachedCount = countCache.get( attributeTypeOid );
+ if ( cachedCount != null )
{
- return countCache.get( attributeTypeOid ).intValue();
+ return cachedCount.intValue();
}
// TODO: scan directly instead of using the cursor?
@@ -146,13 +145,13 @@
* Checks if the entry has such an attribute (attributeType=*)
*
* @param attributeType
- * @param id the entry id
+ * @param entryId the entry id
* @return true if the entry contains such an attribute type
* @throws Exception
*/
- public boolean exists( Long id ) throws Exception
+ public boolean exists( UUID entryId ) throws Exception
{
- byte[] row = getPresenceKey( Bytes.toBytes( id ) );
+ byte[] row = getPresenceKey( entryId );
Get get = new Get( row );
return HBaseTableHelper.exists( getIndexTablePool(), indexTableName, get );
}
@@ -164,22 +163,22 @@
}
- public void add( Long entryId ) throws Exception
+ public void add( UUID entryId ) throws Exception
{
// presence (attribute=*): *<id> -> id
- byte[] presenceRow = getPresenceKey( Bytes.toBytes( entryId ) );
+ byte[] presenceRow = getPresenceKey( entryId );
Put presencePut = new Put( presenceRow );
- presencePut.add( INFO_FAMILY, ID_QUALIFIER, Bytes.toBytes( entryId ) );
+ presencePut.add( INFO_FAMILY, ID_QUALIFIER, Utils.toBytes( entryId ) );
HBaseTableHelper.put( getIndexTablePool(), indexTableName, presencePut );
countCache.clear();
}
- public void drop( Long entryId ) throws Exception
+ public void drop( UUID entryId ) throws Exception
{
// presence (attribute=*): *<id> -> id
- byte[] presenceRow = getPresenceKey( Bytes.toBytes( entryId ) );
+ byte[] presenceRow = getPresenceKey( entryId );
Delete presenceDel = new Delete( presenceRow );
HBaseTableHelper.delete( getIndexTablePool(), indexTableName, presenceDel );
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseRowIndexTable.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseRowIndexTable.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseRowIndexTable.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseRowIndexTable.java Mon Mar 1 22:45:47 2010
@@ -20,12 +20,14 @@
package org.apache.directory.server.core.partition.hbase.table;
+import java.util.UUID;
+
import org.apache.directory.server.core.entry.ServerEntry;
import org.apache.directory.server.core.partition.hbase.HBaseStore;
+import org.apache.directory.server.core.partition.hbase.Utils;
import org.apache.directory.server.core.partition.hbase.index.HBaseUserIndex;
import org.apache.directory.server.xdbm.IndexCursor;
import org.apache.directory.shared.ldap.schema.AttributeType;
-import org.apache.directory.shared.ldap.util.Base64;
import org.apache.directory.shared.ldap.util.ByteBuffer;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
@@ -69,7 +71,7 @@
* @return the equals row key for the value
* @throws Exception
*/
- private byte[] getEqualsKey( Object value, Long id ) throws Exception
+ private byte[] getEqualsKey( Object value, UUID id ) throws Exception
{
if ( value == null || id == null )
{
@@ -83,13 +85,15 @@
byte[] normValue = getNormalized( value );
bb.append( normValue );
- bb.append( Bytes.toBytes( String.valueOf( Base64.encode( Bytes.toBytes( id ) ) ) ) );
+ bb.append( '\u0000' );
+
+ bb.append( Bytes.toBytes( id.toString() ) );
return bb.copyOfUsedBytes();
}
- public byte[] getScanKey( Object value, byte[] entryId ) throws Exception
+ public byte[] getScanKey( Object value, Byte delimiter, UUID entryId ) throws Exception
{
ByteBuffer bb = new ByteBuffer();
@@ -99,11 +103,11 @@
// there are special values to support attribute scan
if ( value == FULL_SCAN_START )
{
- bb.append( FULL_SCAN_START );
+ bb.append( FULL_SCAN_START.byteValue() );
}
else if ( value == FULL_SCAN_STOP )
{
- bb.append( FULL_SCAN_STOP );
+ bb.append( FULL_SCAN_STOP.byteValue() );
}
else if ( value != null )
{
@@ -111,31 +115,35 @@
bb.append( normValue );
}
+ if ( delimiter != null )
+ {
+ bb.append( delimiter.byteValue() );
+ }
+
// add entryId
if ( entryId == VALUE_SCAN_START )
{
- bb.append( VALUE_SCAN_START );
+ bb.append( Bytes.toBytes( VALUE_SCAN_START.toString() ) );
}
else if ( entryId == VALUE_SCAN_STOP )
{
- bb.append( VALUE_SCAN_STOP );
+ bb.append( Bytes.toBytes( VALUE_SCAN_STOP.toString() ) );
}
else if ( entryId != null )
{
- bb.append( Bytes.toBytes( String.valueOf( Base64.encode( entryId ) ) ) );
+ bb.append( Bytes.toBytes( entryId.toString() ) );
}
return bb.copyOfUsedBytes();
}
- public Object getValueFromEqualsKey( byte[] row ) throws Exception
+ public Object extractValueFromEqualsKey( byte[] row ) throws Exception
{
byte[] value = Bytes.tail( row, row.length - 1 );
- value = Bytes.head( value, value.length - 12 );
+ value = Bytes.head( value, value.length - 1 - 36 ); // \00 + length of UUID
AttributeType at = schemaManager.getAttributeTypeRegistry().lookup( attributeTypeOid );
return at.getSyntax().isHumanReadable() ? Bytes.toString( value ) : value;
-
}
@@ -144,14 +152,15 @@
*/
public int count( Object value ) throws Exception
{
- if ( countCache.contains( value ) )
+ Integer cachedCount = countCache.get( value );
+ if ( cachedCount != null )
{
- return countCache.get( value ).intValue();
+ return cachedCount.intValue();
}
// TODO: scan directly instead of using the cursor?
HBaseUserIndex<HBaseIndexTable> index = store.getUserIndex( attributeTypeOid );
- IndexCursor<Object, ServerEntry> cursor = index.forwardCursor( value );
+ IndexCursor<Object, ServerEntry, UUID> cursor = index.forwardCursor( value );
int count = 0;
int limit = 100;
while ( cursor.next() && count <= limit )
@@ -170,12 +179,13 @@
}
- public boolean exists( Object value, Long id ) throws Exception
+ public boolean exists( Object value, UUID id ) throws Exception
{
String key = value + ":" + id;
- if ( existsCache.contains( key ) )
+ Boolean cachedExists = existsCache.get( key );
+ if ( cachedExists != null )
{
- return existsCache.get( key );
+ return cachedExists.booleanValue();
}
byte[] row = getEqualsKey( value, id );
@@ -190,12 +200,12 @@
}
- public void add( byte[] value, Long id ) throws Exception
+ public void add( byte[] value, UUID id ) throws Exception
{
- // exact match (attribute=value): =value<id> -> id, value
+ // exact match (attribute=value): =value<0x00><id> -> id, value
byte[] exactRow = getEqualsKey( value, id );
Put exactPut = new Put( exactRow );
- exactPut.add( INFO_FAMILY, ID_QUALIFIER, Bytes.toBytes( id ) );
+ exactPut.add( INFO_FAMILY, ID_QUALIFIER, Utils.toBytes( id ) );
HBaseTableHelper.put( getIndexTablePool(), indexTableName, exactPut );
// TODO: optimize - don't need to clear the áºhole cache
@@ -204,9 +214,9 @@
}
- public void drop( byte[] value, Long id ) throws Exception
+ public void drop( byte[] value, UUID id ) throws Exception
{
- // exact match (attribute=value): =value<id> -> id
+ // exact match (attribute=value): =value<0x00><id> -> id
byte[] exactRow = getEqualsKey( value, id );
Delete exactDel = new Delete( exactRow );
HBaseTableHelper.delete( getIndexTablePool(), indexTableName, exactDel );
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseTableHelper.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseTableHelper.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseTableHelper.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/table/HBaseTableHelper.java Mon Mar 1 22:45:47 2010
@@ -20,6 +20,8 @@
package org.apache.directory.server.core.partition.hbase.table;
+import java.util.UUID;
+
import org.apache.directory.server.core.partition.hbase.Utils;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
@@ -199,6 +201,56 @@
/**
+ * Gets the UUID value of a column, the default value if the column doesn't exist.
+ *
+ * @param pool the table pool
+ * @param tableName the table name
+ * @param row the row
+ * @param family the family
+ * @param qualifier the qualifier
+ * @param defaultValue the default value if the column doesn't exist
+ *
+ * @return the long value
+ *
+ * @throws Exception the exception
+ */
+ public static UUID getUUIDValue( HBaseTablePool pool, String tableName, byte[] row, byte[] family,
+ byte[] qualifier, UUID defaultValue ) throws Exception
+ {
+ HTable table = pool.getTable();
+ try
+ {
+ Get get = new Get( row );
+ get.addColumn( family, qualifier );
+ Result result = table.get( get );
+ RPC_COUNT++;
+ byte[] value = result.getValue( family, qualifier );
+ UUID uuid;
+ if ( value == null )
+ {
+ uuid = defaultValue;
+ }
+ else
+ {
+ uuid = Utils.toUUID( value );
+ }
+
+ if ( LOG.isDebugEnabled() )
+ {
+ LOG.debug( "Get Long from " + tableName + ":" + Utils.getPrintableString( row ) + ":"
+ + Utils.getPrintableString( family ) + ":" + Utils.getPrintableString( qualifier ) + " -> " + uuid );
+ logStack( 2 );
+ }
+ return uuid;
+ }
+ finally
+ {
+ pool.putTable( table );
+ }
+ }
+
+
+ /**
* Commits a {@link Put} to the table.
*
* @param pool the table pool
@@ -410,7 +462,9 @@
HColumnDescriptor columnDescriptor = new HColumnDescriptor( family );
columnDescriptor.setMaxVersions( 1 );
//columnDescriptor.setInMemory( true );
- columnDescriptor.setCompressionType( Algorithm.LZO );
+ String typeValue = configuration.get( HBaseMasterTable.COMPRESSION_ALGORITHM_PROPERTY, "NONE" );
+ Algorithm type = Algorithm.valueOf( typeValue );
+ columnDescriptor.setCompressionType( type );
descriptor.addFamily( columnDescriptor );
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedCursorBuilder.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedCursorBuilder.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedCursorBuilder.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedCursorBuilder.java Mon Mar 1 22:45:47 2010
@@ -39,13 +39,13 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 659774 $
*/
-public class ExtendedCursorBuilder extends CursorBuilder
+public class ExtendedCursorBuilder<ID> extends CursorBuilder<ID>
{
/** The database used by this builder */
- private Store<ServerEntry> db = null;
+ private Store<ServerEntry, ID> db = null;
/** Evaluator dependency on a EvaluatorBuilder */
- private ExtendedEvaluatorBuilder evaluatorBuilder;
+ private ExtendedEvaluatorBuilder<ID> evaluatorBuilder;
/**
@@ -54,7 +54,7 @@
* @param db database used by this enumerator
* @param evaluatorBuilder the evaluator builder
*/
- public ExtendedCursorBuilder( Store<ServerEntry> db, ExtendedEvaluatorBuilder evaluatorBuilder )
+ public ExtendedCursorBuilder( Store<ServerEntry, ID> db, ExtendedEvaluatorBuilder<ID> evaluatorBuilder )
{
super( db, evaluatorBuilder );
this.db = db;
@@ -62,7 +62,7 @@
}
- public IndexCursor<?, ServerEntry> build( ExprNode node ) throws Exception
+ public IndexCursor<?, ServerEntry, ID> build( ExprNode node ) throws Exception
{
// set the "real" filter node as annotation to the scope node
if ( node.getAssertionType() == AssertionType.AND )
@@ -77,19 +77,19 @@
switch ( node.getAssertionType() )
{
case SUBSTRING:
- return new ExtendedSubstringCursor( db, ( ExtendedSubstringEvaluator ) evaluatorBuilder.build( node ) );
+ return new ExtendedSubstringCursor<ID>( db, ( ExtendedSubstringEvaluator<ID> ) evaluatorBuilder.build( node ) );
case SCOPE:
ExprNode filter = ( ExprNode ) node.get( "filter" );
if ( ( ( ScopeNode ) node ).getScope() == SearchScope.ONELEVEL )
{
- return new ExtendedOneLevelScopeCursor( db, filter, ( OneLevelScopeEvaluator ) evaluatorBuilder
+ return new ExtendedOneLevelScopeCursor<ID>( db, filter, ( OneLevelScopeEvaluator<ServerEntry, ID> ) evaluatorBuilder
.build( node ) );
}
else
{
- return new ExtendedSubtreeScopeCursor( db, filter, ( SubtreeScopeEvaluator ) evaluatorBuilder
+ return new ExtendedSubtreeScopeCursor<ID>( db, filter, ( SubtreeScopeEvaluator<ServerEntry, ID> ) evaluatorBuilder
.build( node ) );
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedEvaluatorBuilder.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedEvaluatorBuilder.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedEvaluatorBuilder.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedEvaluatorBuilder.java Mon Mar 1 22:45:47 2010
@@ -36,9 +36,9 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 659774 $
*/
-public class ExtendedEvaluatorBuilder extends EvaluatorBuilder
+public class ExtendedEvaluatorBuilder<ID> extends EvaluatorBuilder<ID>
{
- private final Store<ServerEntry> db;
+ private final Store<ServerEntry, ID> db;
private final SchemaManager schemaManager;
@@ -50,7 +50,7 @@
* @param registries the schema registries
* @throws Exception failure to access db or lookup schema in registries
*/
- public ExtendedEvaluatorBuilder( Store<ServerEntry> db, SchemaManager schemaManager ) throws Exception
+ public ExtendedEvaluatorBuilder( Store<ServerEntry, ID> db, SchemaManager schemaManager ) throws Exception
{
super( db, schemaManager );
this.db = db;
@@ -58,11 +58,11 @@
}
- public Evaluator<? extends ExprNode, ServerEntry> build( ExprNode node ) throws Exception
+ public Evaluator<? extends ExprNode, ServerEntry, ID> build( ExprNode node ) throws Exception
{
if ( node.getAssertionType() == AssertionType.SUBSTRING )
{
- return new ExtendedSubstringEvaluator( ( SubstringNode ) node, db, schemaManager );
+ return new ExtendedSubstringEvaluator<ID>( ( SubstringNode ) node, db, schemaManager );
}
else
{
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOneLevelScopeCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOneLevelScopeCursor.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOneLevelScopeCursor.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOneLevelScopeCursor.java Mon Mar 1 22:45:47 2010
@@ -39,26 +39,25 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
-public class ExtendedOneLevelScopeCursor extends AbstractIndexCursor<Long, ServerEntry>
+public class ExtendedOneLevelScopeCursor<ID> extends AbstractIndexCursor<ID, ServerEntry, ID>
{
/** Error message for unsupported operations */
private static final String UNSUPPORTED_MSG = "Scope Cursors are not ordered and do not support positioning by element.";
/** The entry database/store */
- private final Store<ServerEntry> db;
+ private final Store<ServerEntry, ID> db;
/** A onelevel ScopeNode Evaluator */
- @SuppressWarnings("unchecked")
- private final OneLevelScopeEvaluator evaluator;
+ private final OneLevelScopeEvaluator<ServerEntry, ID> evaluator;
/** A Cursor over the entries in the scope of the search base */
- private final IndexCursor<Long, ServerEntry> scopeCursor;
+ private final IndexCursor<ID, ServerEntry, ID> scopeCursor;
/** A Cursor over entries brought into scope by alias dereferencing */
- private final Cursor<IndexEntry<Long, ServerEntry>> dereferencedCursor;
+ private final Cursor<IndexEntry<ID, ServerEntry, ID>> dereferencedCursor;
/** Currently active Cursor: we switch between two cursors */
- private Cursor<IndexEntry<Long, ServerEntry>> cursor;
+ private Cursor<IndexEntry<ID, ServerEntry, ID>> cursor;
/** Whether or not this Cursor is positioned so an entry is available */
private boolean available = false;
@@ -72,17 +71,16 @@
* @param evaluator an IndexEntry (candidate) evaluator
* @throws Exception on db access failures
*/
- @SuppressWarnings("unchecked")
- public ExtendedOneLevelScopeCursor( Store<ServerEntry> db, ExprNode filter, OneLevelScopeEvaluator evaluator )
- throws Exception
+ public ExtendedOneLevelScopeCursor( Store<ServerEntry, ID> db, ExprNode filter,
+ OneLevelScopeEvaluator<ServerEntry, ID> evaluator ) throws Exception
{
this.db = db;
this.evaluator = evaluator;
- Index<Long, ServerEntry> oneLevelIndex = db.getOneLevelIndex();
- if ( oneLevelIndex instanceof IndexFilteringExtension<?, ?> )
+ Index<ID, ServerEntry, ID> oneLevelIndex = db.getOneLevelIndex();
+ if ( oneLevelIndex instanceof IndexFilteringExtension<?, ?, ?> )
{
- IndexFilteringExtension<Long, ServerEntry> filteringIndex = ( IndexFilteringExtension<Long, ServerEntry> ) oneLevelIndex;
+ IndexFilteringExtension<ID, ServerEntry, ID> filteringIndex = ( IndexFilteringExtension<ID, ServerEntry, ID> ) oneLevelIndex;
scopeCursor = filteringIndex.forwardFilteringCursor( evaluator.getBaseId(), filter );
}
else
@@ -107,25 +105,25 @@
}
- public void beforeValue( Long id, Long value ) throws Exception
+ public void beforeValue( ID id, ID value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void afterValue( Long id, Long value ) throws Exception
+ public void afterValue( ID id, ID value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void before( IndexEntry<Long, ServerEntry> element ) throws Exception
+ public void before( IndexEntry<ID, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void after( IndexEntry<Long, ServerEntry> element ) throws Exception
+ public void after( IndexEntry<ID, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
@@ -303,7 +301,7 @@
}
- public IndexEntry<Long, ServerEntry> get() throws Exception
+ public IndexEntry<ID, ServerEntry, ID> get() throws Exception
{
checkNotClosed( "get()" );
if ( available )
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOptimizer.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOptimizer.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOptimizer.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedOptimizer.java Mon Mar 1 22:45:47 2010
@@ -33,14 +33,14 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 777037 $
*/
-public class ExtendedOptimizer<E> extends DefaultOptimizer<E>
+public class ExtendedOptimizer<E, ID> extends DefaultOptimizer<E, ID>
{
/** the database this optimizer operates on */
- private final Store<E> db;
+ private final Store<E, ID> db;
/** creates cursors over entries satisfying filter expressions */
- private final ExtendedCursorBuilder cursorBuilder;
+ private final ExtendedCursorBuilder<ID> cursorBuilder;
/** creates evaluators which check to see if candidates satisfy a filter expression */
- private final ExtendedEvaluatorBuilder evaluatorBuilder;
+ private final ExtendedEvaluatorBuilder<ID> evaluatorBuilder;
/**
@@ -48,8 +48,8 @@
*
* @param db the database this optimizer works for.
*/
- public ExtendedOptimizer( Store<E> db, ExtendedCursorBuilder cursorBuilder,
- ExtendedEvaluatorBuilder evaluatorBuilder ) throws Exception
+ public ExtendedOptimizer( Store<E, ID> db, ExtendedCursorBuilder<ID> cursorBuilder,
+ ExtendedEvaluatorBuilder<ID> evaluatorBuilder ) throws Exception
{
super( db );
this.db = db;
@@ -95,10 +95,10 @@
{
if ( db.hasUserIndexOn( node.getAttribute() ) )
{
- Index<?, E> idx = db.getUserIndex( node.getAttribute() );
- if ( idx instanceof IndexSubstringExtension<?, ?> )
+ Index<?, E, ID> idx = db.getUserIndex( node.getAttribute() );
+ if ( idx instanceof IndexSubstringExtension<?, ?, ?> )
{
- IndexSubstringExtension<?, E> substringIdx = ( IndexSubstringExtension<?, E> ) idx;
+ IndexSubstringExtension<?, E, ID> substringIdx = ( IndexSubstringExtension<?, E, ID> ) idx;
return substringIdx.substringCount( node );
}
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringCursor.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringCursor.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringCursor.java Mon Mar 1 22:45:47 2010
@@ -36,18 +36,18 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
-public class ExtendedSubstringCursor extends AbstractIndexCursor<String, ServerEntry>
+public class ExtendedSubstringCursor<ID> extends AbstractIndexCursor<String, ServerEntry, ID>
{
private static final String UNSUPPORTED_MSG = "SubstringCursors may not be ordered and do not support positioning by element.";
private final boolean hasIndex;
- private final IndexCursor<String, ServerEntry> wrapped;
- private final ExtendedSubstringEvaluator evaluator;
- private final ForwardIndexEntry<String, ServerEntry> indexEntry = new ForwardIndexEntry<String, ServerEntry>();
+ private final IndexCursor<String, ServerEntry, ID> wrapped;
+ private final ExtendedSubstringEvaluator<ID> evaluator;
+ private final ForwardIndexEntry<String, ServerEntry, ID> indexEntry = new ForwardIndexEntry<String, ServerEntry, ID>();
private boolean available = false;
@SuppressWarnings("unchecked")
- public ExtendedSubstringCursor( Store<ServerEntry> db, final ExtendedSubstringEvaluator substringEvaluator )
+ public ExtendedSubstringCursor( Store<ServerEntry, ID> db, final ExtendedSubstringEvaluator substringEvaluator )
throws Exception
{
evaluator = substringEvaluator;
@@ -55,9 +55,9 @@
if ( hasIndex )
{
- Index<String, ServerEntry> idx = ( Index<String, ServerEntry> ) db.getUserIndex( evaluator.getExpression()
+ Index<String, ServerEntry, ID> idx = ( Index<String, ServerEntry, ID> ) db.getUserIndex( evaluator.getExpression()
.getAttribute() );
- if ( idx instanceof IndexSubstringExtension<?, ?> )
+ if ( idx instanceof IndexSubstringExtension<?, ?, ?> )
{
wrapped = ( ( IndexSubstringExtension ) idx ).forwardSubstringCursor( evaluator.getExpression() );
}
@@ -93,25 +93,25 @@
}
- public void beforeValue( Long id, String value ) throws Exception
+ public void beforeValue( ID id, String value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void afterValue( Long id, String value ) throws Exception
+ public void afterValue( ID id, String value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void before( IndexEntry<String, ServerEntry> element ) throws Exception
+ public void before( IndexEntry<String, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void after( IndexEntry<String, ServerEntry> element ) throws Exception
+ public void after( IndexEntry<String, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
@@ -122,7 +122,7 @@
checkNotClosed( "beforeFirst()" );
if ( evaluator.getExpression().getInitial() != null && hasIndex )
{
- ForwardIndexEntry<String, ServerEntry> indexEntry = new ForwardIndexEntry<String, ServerEntry>();
+ ForwardIndexEntry<String, ServerEntry, ID> indexEntry = new ForwardIndexEntry<String, ServerEntry, ID>();
indexEntry.setValue( evaluator.getExpression().getInitial() );
wrapped.before( indexEntry );
}
@@ -163,7 +163,7 @@
}
- private boolean evaluateCandidate( IndexEntry<String, ServerEntry> indexEntry ) throws Exception
+ private boolean evaluateCandidate( IndexEntry<String, ServerEntry, ID> indexEntry ) throws Exception
{
if ( hasIndex )
{
@@ -188,7 +188,7 @@
while ( wrapped.previous() )
{
checkNotClosed( "previous()" );
- IndexEntry<String, ServerEntry> entry = wrapped.get();
+ IndexEntry<String, ServerEntry, ID> entry = wrapped.get();
if ( evaluateCandidate( entry ) )
{
available = true;
@@ -209,7 +209,7 @@
while ( wrapped.next() )
{
checkNotClosed( "next()" );
- IndexEntry<String, ServerEntry> entry = wrapped.get();
+ IndexEntry<String, ServerEntry, ID> entry = wrapped.get();
if ( evaluateCandidate( entry ) )
{
available = true;
@@ -225,7 +225,7 @@
}
- public IndexEntry<String, ServerEntry> get() throws Exception
+ public IndexEntry<String, ServerEntry, ID> get() throws Exception
{
checkNotClosed( "get()" );
if ( available )
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringEvaluator.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringEvaluator.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringEvaluator.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubstringEvaluator.java Mon Mar 1 22:45:47 2010
@@ -45,10 +45,10 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 764131 $
*/
-public class ExtendedSubstringEvaluator implements Evaluator<SubstringNode, ServerEntry>
+public class ExtendedSubstringEvaluator<ID> implements Evaluator<SubstringNode, ServerEntry, ID>
{
/** Database used while evaluating candidates */
- private final Store<ServerEntry> db;
+ private final Store<ServerEntry, ID> db;
/** Schema manager used to translate attributeIds to OIDs */
private final SchemaManager schemaManager;
@@ -63,7 +63,7 @@
private final Normalizer normalizer;
- private final Index<String, ServerEntry> idx;
+ private final Index<String, ServerEntry, ID> idx;
/**
@@ -74,7 +74,7 @@
* @param registries the set of registries
* @throws Exception if there are failures accessing resources and the db
*/
- public ExtendedSubstringEvaluator( SubstringNode node, Store<ServerEntry> db, SchemaManager schemaManager )
+ public ExtendedSubstringEvaluator( SubstringNode node, Store<ServerEntry, ID> db, SchemaManager schemaManager )
throws Exception
{
this.db = db;
@@ -106,7 +106,7 @@
if ( db.hasUserIndexOn( node.getAttribute() ) )
{
//noinspection unchecked
- idx = ( Index<String, ServerEntry> ) db.getUserIndex( node.getAttribute() );
+ idx = ( Index<String, ServerEntry, ID> ) db.getUserIndex( node.getAttribute() );
}
else
{
@@ -115,13 +115,13 @@
}
- public boolean evaluate( IndexEntry<?, ServerEntry> indexEntry ) throws Exception
+ public boolean evaluate( IndexEntry<?, ServerEntry, ID> indexEntry ) throws Exception
{
if ( idx == null || indexEntry.getObject() != null )
{
//noinspection unchecked
- return evaluateWithoutIndex( ( IndexEntry<String, ServerEntry> ) indexEntry );
+ return evaluateWithoutIndex( ( IndexEntry<String, ServerEntry, ID> ) indexEntry );
}
else
{
@@ -130,7 +130,7 @@
}
- public boolean evaluate( Long id ) throws Exception
+ public boolean evaluateId( ID id ) throws Exception
{
if ( idx == null )
@@ -145,7 +145,7 @@
}
- public boolean evaluate( ServerEntry entry ) throws Exception
+ public boolean evaluateEntry( ServerEntry entry ) throws Exception
{
if ( idx == null )
@@ -172,7 +172,7 @@
}
- private boolean evaluateWithIndex( IndexEntry<?, ServerEntry> indexEntry ) throws Exception
+ private boolean evaluateWithIndex( IndexEntry<?, ServerEntry, ID> indexEntry ) throws Exception
{
/*
* Note that this is using the reverse half of the index giving a
@@ -180,15 +180,15 @@
* Otherwise we would have to scan the entire index if there were
* no reverse lookups.
*/
- Cursor<IndexEntry<String, ServerEntry>> entries = idx.reverseCursor( indexEntry.getId() );
+ Cursor<IndexEntry<String, ServerEntry, ID>> entries = idx.reverseCursor( indexEntry.getId() );
// cycle through the attribute values testing for a match
while ( entries.next() )
{
- IndexEntry rec = entries.get();
+ IndexEntry<String, ServerEntry, ID> rec = entries.get();
// once match is found cleanup and return true
- if ( regex.matcher( ( String ) rec.getValue() ).matches() )
+ if ( regex.matcher( rec.getValue() ).matches() )
{
entries.close();
return true;
@@ -200,15 +200,13 @@
}
- @SuppressWarnings(
- { "UnusedDeclaration" })
private boolean evaluateWithIndex( ServerEntry entry ) throws Exception
{
throw new UnsupportedOperationException( "This is too inefficient without getId() on ServerEntry" );
}
- private boolean evaluateWithIndex( Long id ) throws Exception
+ private boolean evaluateWithIndex( ID id ) throws Exception
{
/*
* Note that this is using the reverse half of the index giving a
@@ -216,15 +214,15 @@
* Otherwise we would have to scan the entire index if there were
* no reverse lookups.
*/
- Cursor<IndexEntry<String, ServerEntry>> entries = idx.reverseCursor( id );
+ Cursor<IndexEntry<String, ServerEntry, ID>> entries = idx.reverseCursor( id );
// cycle through the attribute values testing for a match
while ( entries.next() )
{
- IndexEntry rec = entries.get();
+ IndexEntry<String, ServerEntry, ID> rec = entries.get();
// once match is found cleanup and return true
- if ( regex.matcher( ( String ) rec.getValue() ).matches() )
+ if ( regex.matcher( rec.getValue() ).matches() )
{
entries.close();
return true;
@@ -238,7 +236,7 @@
// TODO - determine if comaparator and index entry should have the Value
// wrapper or the raw normalized value
- private boolean evaluateWithoutIndex( Long id ) throws Exception
+ private boolean evaluateWithoutIndex( ID id ) throws Exception
{
return evaluateWithoutIndex( db.lookup( id ) );
}
@@ -260,7 +258,7 @@
* The test uses the comparator obtained from the appropriate
* substring matching rule.
*/
- for ( Value value : attr )
+ for ( Value<?> value : attr )
{
value.normalize( normalizer );
String strValue = ( String ) value.getNormalizedValue();
@@ -301,7 +299,7 @@
* The test uses the comparator obtained from the appropriate
* substring matching rule.
*/
- for ( Value value : attr )
+ for ( Value<?> value : attr )
{
value.normalize( normalizer );
String strValue = ( String ) value.getNormalizedValue();
@@ -323,7 +321,7 @@
// TODO - determine if comaparator and index entry should have the Value
// wrapper or the raw normalized value
- private boolean evaluateWithoutIndex( IndexEntry<String, ServerEntry> indexEntry ) throws Exception
+ private boolean evaluateWithoutIndex( IndexEntry<String, ServerEntry, ID> indexEntry ) throws Exception
{
ServerEntry entry = indexEntry.getObject();
@@ -352,7 +350,7 @@
* The test uses the comparator obtained from the appropriate
* substring matching rule.
*/
- for ( Value value : attr )
+ for ( Value<?> value : attr )
{
value.normalize( normalizer );
String strValue = ( String ) value.getNormalizedValue();
@@ -395,7 +393,7 @@
* The test uses the comparator obtained from the appropriate
* substring matching rule.
*/
- for ( Value value : attr )
+ for ( Value<?> value : attr )
{
value.normalize( normalizer );
String strValue = ( String ) value.getNormalizedValue();
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubtreeScopeCursor.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubtreeScopeCursor.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubtreeScopeCursor.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/ExtendedSubtreeScopeCursor.java Mon Mar 1 22:45:47 2010
@@ -39,29 +39,29 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$
*/
-public class ExtendedSubtreeScopeCursor extends AbstractIndexCursor<Long, ServerEntry>
+public class ExtendedSubtreeScopeCursor<ID> extends AbstractIndexCursor<ID, ServerEntry, ID>
{
private static final String UNSUPPORTED_MSG = "Scope Cursors are not ordered and do not support positioning by element.";
/** The Entry database/store */
- private final Store<ServerEntry> db;
+ private final Store<ServerEntry, ID> db;
/** A ScopeNode Evaluator */
- private final SubtreeScopeEvaluator<ServerEntry> evaluator;
+ private final SubtreeScopeEvaluator<ServerEntry, ID> evaluator;
/** A Cursor over the entries in the scope of the search base */
- private final IndexCursor<Long, ServerEntry> scopeCursor;
+ private final IndexCursor<ID, ServerEntry, ID> scopeCursor;
/** A Cursor over entries brought into scope by alias dereferencing */
- private final IndexCursor<Long, ServerEntry> dereferencedCursor;
+ private final IndexCursor<ID, ServerEntry, ID> dereferencedCursor;
/** Currently active Cursor: we switch between two cursors */
- private IndexCursor<Long, ServerEntry> cursor;
+ private IndexCursor<ID, ServerEntry, ID> cursor;
/** Whether or not this Cursor is positioned so an entry is available */
private boolean available = false;
- private Long contextEntryId;
+ private ID contextEntryId;
/**
@@ -72,21 +72,21 @@
* @param evaluator an IndexEntry (candidate) evaluator
* @throws Exception on db access failures
*/
- public ExtendedSubtreeScopeCursor( Store<ServerEntry> db, ExprNode filter,
- SubtreeScopeEvaluator<ServerEntry> evaluator ) throws Exception
+ public ExtendedSubtreeScopeCursor( Store<ServerEntry, ID> db, ExprNode filter,
+ SubtreeScopeEvaluator<ServerEntry, ID> evaluator ) throws Exception
{
this.db = db;
this.evaluator = evaluator;
- Index<Long, ServerEntry> subLevelIndex = db.getSubLevelIndex();
- if ( subLevelIndex instanceof IndexFilteringExtension<?, ?> )
+ Index<ID, ServerEntry, ID> subLevelIndex = db.getSubLevelIndex();
+ if ( subLevelIndex instanceof IndexFilteringExtension<?, ?, ?> )
{
- IndexFilteringExtension<Long, ServerEntry> filteringIndex = ( IndexFilteringExtension<Long, ServerEntry> ) subLevelIndex;
+ IndexFilteringExtension<ID, ServerEntry, ID> filteringIndex = ( IndexFilteringExtension<ID, ServerEntry, ID> ) subLevelIndex;
scopeCursor = filteringIndex.forwardFilteringCursor( evaluator.getBaseId(), filter );
}
- else if ( evaluator.getBaseId() == getContextEntryId() )
+ else if ( evaluator.getBaseId().equals( getContextEntryId() ) )
{
- scopeCursor = new AllEntriesCursor( db );
+ scopeCursor = new AllEntriesCursor<ID>( db );
}
else
{
@@ -104,7 +104,7 @@
}
- private Long getContextEntryId()
+ private ID getContextEntryId() throws Exception
{
if ( contextEntryId == null )
{
@@ -121,7 +121,7 @@
if ( contextEntryId == null )
{
- return 1L;
+ return db.getDefaultId();
}
return contextEntryId;
@@ -134,25 +134,25 @@
}
- public void beforeValue( Long id, Long value ) throws Exception
+ public void beforeValue( ID id, ID value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void before( IndexEntry<Long, ServerEntry> element ) throws Exception
+ public void before( IndexEntry<ID, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void afterValue( Long id, Long value ) throws Exception
+ public void afterValue( ID id, ID value ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
- public void after( IndexEntry<Long, ServerEntry> element ) throws Exception
+ public void after( IndexEntry<ID, ServerEntry, ID> element ) throws Exception
{
throw new UnsupportedOperationException( UNSUPPORTED_MSG );
}
@@ -329,7 +329,7 @@
}
- public IndexEntry<Long, ServerEntry> get() throws Exception
+ public IndexEntry<ID, ServerEntry, ID> get() throws Exception
{
checkNotClosed( "get()" );
if ( available )
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexFilteringExtension.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexFilteringExtension.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexFilteringExtension.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexFilteringExtension.java Mon Mar 1 22:45:47 2010
@@ -31,10 +31,10 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 787602 $
*/
-public interface IndexFilteringExtension<K, O> extends Index<K, O>
+public interface IndexFilteringExtension<K, O, ID> extends Index<K, O, ID>
{
- IndexCursor<K, O> forwardFilteringCursor( Long id, ExprNode filter ) throws Exception;
- //IndexCursor<K, O> reverseCursor( Long id, ExprNode filter ) throws Exception;
+ IndexCursor<K, O, ID> forwardFilteringCursor( ID id, ExprNode filter ) throws Exception;
+ //IndexCursor<K, O, ID> reverseCursor( ID id, ExprNode filter ) throws Exception;
}
Modified: directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexSubstringExtension.java
URL: http://svn.apache.org/viewvc/directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexSubstringExtension.java?rev=917770&r1=917769&r2=917770&view=diff
==============================================================================
--- directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexSubstringExtension.java (original)
+++ directory/sandbox/seelmann/hbase-partition/src/main/java/org/apache/directory/server/core/partition/hbase/xdbmext/IndexSubstringExtension.java Mon Mar 1 22:45:47 2010
@@ -33,7 +33,7 @@
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev: 787602 $
*/
-public interface IndexSubstringExtension<K, O> extends Index<K, O>
+public interface IndexSubstringExtension<K, O, ID> extends Index<K, O, ID>
{
int substringCount( SubstringNode node ) throws Exception;
@@ -42,10 +42,10 @@
boolean forwardSubstring( SubstringNode node, Pattern valuePattern ) throws Exception;
- boolean forwardSubstring( SubstringNode node, Pattern valuePattern, Long id ) throws Exception;
+ boolean forwardSubstring( SubstringNode node, Pattern valuePattern, ID id ) throws Exception;
- IndexCursor<Object, O> forwardSubstringCursor( SubstringNode node ) throws Exception;
+ IndexCursor<Object, O, ID> forwardSubstringCursor( SubstringNode node ) throws Exception;
//boolean reverseGreaterOrEq( Long id ) throws Exception;
//boolean reverseGreaterOrEq( Long id, K attrVal ) throws Exception;