From 6f031f1cfa9c786704c689c2cd224c51ca7fd34c Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Thu, 18 Dec 2014 10:10:19 +0000
Subject: [PATCH] OPENDJ-1602 New pluggable storage based backend

---
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/ExportJob.java             |   56 ++++++++------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/NullIndex.java             |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java                 |    6 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java           |    2 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java |   57 +++++--------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java        |   75 +++++++++++-------
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java        |    4 
 opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java           |   24 +++---
 8 files changed, 119 insertions(+), 109 deletions(-)

diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
index 258250d..93fd5bb 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -118,7 +118,7 @@
 
   /** The mapping from names to indexes. */
   private final Map<String, Index> nameToIndexes = new HashMap<String, Index>();
-  private final IndexQueryFactory<IndexQuery> indexQueryFactory;
+  private final IndexingOptions indexingOptions;
 
   /**
    * The mapping from extensible index types (e.g. "substring" or "shared") to list of indexes.
@@ -144,8 +144,7 @@
     buildIndexes(txn, IndexType.APPROXIMATE);
     buildExtensibleIndexes(txn);
 
-    final JEIndexConfig config = new JEIndexConfig(indexConfig.getSubstringLength());
-    indexQueryFactory = new IndexQueryFactoryImpl(nameToIndexes, config);
+    indexingOptions = new JEIndexConfig(indexConfig.getSubstringLength());
     extensibleIndexesMapping = computeExtensibleIndexesMapping();
   }
 
@@ -294,7 +293,7 @@
    */
   public IndexingOptions getIndexingOptions()
   {
-    return indexQueryFactory.getIndexingOptions();
+    return indexingOptions;
   }
 
   /**
@@ -318,10 +317,9 @@
   public void addEntry(IndexBuffer buffer, EntryID entryID, Entry entry)
        throws StorageRuntimeException, DirectoryException
   {
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
     for (Index index : nameToIndexes.values())
     {
-      index.addEntry(buffer, entryID, entry, options);
+      index.addEntry(buffer, entryID, entry, indexingOptions);
     }
   }
 
@@ -337,10 +335,9 @@
   public void removeEntry(IndexBuffer buffer, EntryID entryID, Entry entry)
        throws StorageRuntimeException, DirectoryException
   {
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
     for (Index index : nameToIndexes.values())
     {
-      index.removeEntry(buffer, entryID, entry, options);
+      index.removeEntry(buffer, entryID, entry, indexingOptions);
     }
   }
 
@@ -363,10 +360,9 @@
                           List<Modification> mods)
        throws StorageRuntimeException
   {
-    final IndexingOptions options = indexQueryFactory.getIndexingOptions();
     for (Index index : nameToIndexes.values())
     {
-      index.modifyEntry(buffer, entryID, oldEntry, newEntry, mods, options);
+      index.modifyEntry(buffer, entryID, oldEntry, newEntry, mods, indexingOptions);
     }
   }
 
@@ -451,6 +447,8 @@
    * Retrieve the entry IDs that might match two filters that restrict a value
    * to both a lower bound and an upper bound.
    *
+   * @param indexQueryFactory
+   *          The index query factory to use for the evaluation 
    * @param filter1
    *          The first filter, that is either a less-or-equal filter or a
    *          greater-or-equal filter.
@@ -466,8 +464,8 @@
    *          filter usage statistics.
    * @return The candidate entry IDs that might contain match both filters.
    */
-  public EntryIDSet evaluateBoundedRange(SearchFilter filter1, SearchFilter filter2, StringBuilder debugBuffer,
-      DatabaseEnvironmentMonitor monitor)
+  public EntryIDSet evaluateBoundedRange(IndexQueryFactory<IndexQuery> indexQueryFactory,
+      SearchFilter filter1, SearchFilter filter2, StringBuilder debugBuffer, DatabaseEnvironmentMonitor monitor)
   {
     // TODO : this implementation is not optimal
     // as it implies two separate evaluations instead of a single one,
@@ -475,22 +473,24 @@
     // in IndexFilter#evaluateLogicalAndFilter method.
     // One solution could be to implement a boundedRangeAssertion that combine
     // the two operations in one.
-    EntryIDSet results = evaluate(filter1, debugBuffer, monitor);
-    EntryIDSet results2 = evaluate(filter2, debugBuffer, monitor);
+    EntryIDSet results = evaluate(indexQueryFactory, filter1, debugBuffer, monitor);
+    EntryIDSet results2 = evaluate(indexQueryFactory, filter2, debugBuffer, monitor);
     results.retainAll(results2);
     return results;
   }
 
-  private EntryIDSet evaluate(SearchFilter filter, StringBuilder debugBuffer, DatabaseEnvironmentMonitor monitor)
+  private EntryIDSet evaluate(IndexQueryFactory<IndexQuery> indexQueryFactory, SearchFilter filter,
+      StringBuilder debugBuffer, DatabaseEnvironmentMonitor monitor)
   {
     boolean isLessOrEqual = filter.getFilterType() == FilterType.LESS_OR_EQUAL;
     IndexFilterType indexFilterType = isLessOrEqual ? IndexFilterType.LESS_OR_EQUAL : IndexFilterType.GREATER_OR_EQUAL;
-    return evaluateFilter(indexFilterType, filter, debugBuffer, monitor);
+    return evaluateFilter(indexQueryFactory, indexFilterType, filter, debugBuffer, monitor);
   }
 
   /**
    * Retrieve the entry IDs that might match a filter.
    *
+   * @param indexQueryFactory the index query factory to use for the evaluation
    * @param indexFilterType the index type filter
    * @param filter The filter.
    * @param debugBuffer If not null, a diagnostic string will be written
@@ -501,12 +501,12 @@
    * @return The candidate entry IDs that might contain a value
    *         that matches the filter type.
    */
-  public EntryIDSet evaluateFilter(IndexFilterType indexFilterType, SearchFilter filter, StringBuilder debugBuffer,
-      DatabaseEnvironmentMonitor monitor)
+  public EntryIDSet evaluateFilter(IndexQueryFactory<IndexQuery> indexQueryFactory, IndexFilterType indexFilterType,
+      SearchFilter filter, StringBuilder debugBuffer, DatabaseEnvironmentMonitor monitor)
   {
     try
     {
-      final IndexQuery indexQuery = getIndexQuery(indexFilterType, filter);
+      final IndexQuery indexQuery = getIndexQuery(indexQueryFactory, indexFilterType, filter);
       return evaluateIndexQuery(indexQuery, indexFilterType.toString(), filter, debugBuffer, monitor);
     }
     catch (DecodeException e)
@@ -516,7 +516,8 @@
     }
   }
 
-  private IndexQuery getIndexQuery(IndexFilterType indexFilterType, SearchFilter filter) throws DecodeException
+  private IndexQuery getIndexQuery(IndexQueryFactory<IndexQuery> indexQueryFactory, IndexFilterType indexFilterType,
+      SearchFilter filter) throws DecodeException
   {
     MatchingRule rule;
     Assertion assertion;
@@ -907,7 +908,7 @@
    * @return The equality index.
    */
   public Index getEqualityIndex() {
-    return nameToIndexes.get(IndexType.EQUALITY.toString());
+    return getIndexById(IndexType.EQUALITY.toString());
   }
 
   /**
@@ -916,7 +917,7 @@
    * @return The approximate index.
    */
   public Index getApproximateIndex() {
-    return nameToIndexes.get(IndexType.APPROXIMATE.toString());
+    return getIndexById(IndexType.APPROXIMATE.toString());
   }
 
   /**
@@ -925,7 +926,7 @@
    * @return  The ordering index.
    */
   public Index getOrderingIndex() {
-    return nameToIndexes.get(IndexType.ORDERING.toString());
+    return getIndexById(IndexType.ORDERING.toString());
   }
 
   /**
@@ -934,7 +935,7 @@
    * @return The substring index.
    */
   public Index getSubstringIndex() {
-    return nameToIndexes.get(IndexType.SUBSTRING.toString());
+    return getIndexById(IndexType.SUBSTRING.toString());
   }
 
   /**
@@ -943,7 +944,23 @@
    * @return The presence index.
    */
   public Index getPresenceIndex() {
-    return nameToIndexes.get(IndexType.PRESENCE.toString());
+    return getIndexById(IndexType.PRESENCE.toString());
+  }
+
+  /**
+   * Return the index identified by the provided identifier.
+   * <p>
+   * Common index identifiers are "presence", "equality", "substring",
+   * "ordering" and "approximate".
+   *
+   * @param indexId
+   *          the identifier of the requested index
+   * @return The index identified by the provided identifier, or null if no such
+   *         index exists
+   */
+  public Index getIndexById(String indexId)
+  {
+    return nameToIndexes.get(indexId);
   }
 
   /**
@@ -1003,6 +1020,7 @@
   /**
    * Retrieve the entry IDs that might match an extensible filter.
    *
+   * @param indexQueryFactory the index query factory to use for the evaluation
    * @param filter The extensible filter.
    * @param debugBuffer If not null, a diagnostic string will be written
    *                     which will help determine how the indexes contributed
@@ -1012,9 +1030,8 @@
    * @return The candidate entry IDs that might contain the filter
    *         assertion value.
    */
-  public EntryIDSet evaluateExtensibleFilter(SearchFilter filter,
-                                             StringBuilder debugBuffer,
-                                             DatabaseEnvironmentMonitor monitor)
+  public EntryIDSet evaluateExtensibleFilter(IndexQueryFactory<IndexQuery> indexQueryFactory, SearchFilter filter,
+      StringBuilder debugBuffer, DatabaseEnvironmentMonitor monitor)
   {
     //Get the Matching Rule OID of the filter.
     String matchRuleOID  = filter.getMatchingRuleID();
@@ -1029,7 +1046,7 @@
         || matchRuleOID.equalsIgnoreCase(eqRule.getNameOrOID()))
     {
       //No matching rule is defined; use the default equality matching rule.
-      return evaluateFilter(IndexFilterType.EQUALITY, filter, debugBuffer, monitor);
+      return evaluateFilter(indexQueryFactory, IndexFilterType.EQUALITY, filter, debugBuffer, monitor);
     }
 
     MatchingRule rule = DirectoryServer.getMatchingRule(matchRuleOID);
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
index 5ac171a..8debe7b 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/EntryContainer.java
@@ -929,8 +929,8 @@
             }
 
             // Create an index filter to get the search result candidate entries
-            IndexFilter indexFilter =
-                new IndexFilter(EntryContainer.this, searchOperation, debugBuffer, rootContainer.getMonitorProvider());
+            IndexFilter indexFilter = new IndexFilter(
+                EntryContainer.this, txn, searchOperation, debugBuffer, rootContainer.getMonitorProvider());
 
             // Evaluate the filter against the attribute indexes.
             entryIDList = indexFilter.evaluate();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/ExportJob.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/ExportJob.java
index 36585c6..8a60cc4 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/ExportJob.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/ExportJob.java
@@ -35,7 +35,8 @@
 import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteString;
 import org.opends.server.backends.pluggable.spi.Cursor;
-import org.opends.server.backends.pluggable.spi.Storage;
+import org.opends.server.backends.pluggable.spi.ReadOperation;
+import org.opends.server.backends.pluggable.spi.ReadableStorage;
 import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
 import org.opends.server.types.DN;
 import org.opends.server.types.Entry;
@@ -95,14 +96,12 @@
        throws IOException, LDIFException, StorageRuntimeException
   {
     List<DN> includeBranches = exportConfig.getIncludeBranches();
-    DN baseDN;
-    ArrayList<EntryContainer> exportContainers =
-        new ArrayList<EntryContainer>();
+    final ArrayList<EntryContainer> exportContainers = new ArrayList<EntryContainer>();
 
     for (EntryContainer entryContainer : rootContainer.getEntryContainers())
     {
       // Skip containers that are not covered by the include branches.
-      baseDN = entryContainer.getBaseDN();
+      DN baseDN = entryContainer.getBaseDN();
 
       if (includeBranches == null || includeBranches.isEmpty())
       {
@@ -128,29 +127,40 @@
     // Start a timer for the progress report.
     Timer timer = new Timer();
     TimerTask progressTask = new ProgressTask();
-    timer.scheduleAtFixedRate(progressTask, progressInterval,
-                              progressInterval);
+    timer.scheduleAtFixedRate(progressTask, progressInterval, progressInterval);
 
     // Iterate through the containers.
     try
     {
-      for (EntryContainer exportContainer : exportContainers)
+      rootContainer.getStorage().read(new ReadOperation<Void>()
       {
-        if (exportConfig.isCancelled())
+        @Override
+        public Void run(ReadableStorage txn) throws Exception
         {
-          break;
-        }
+          for (EntryContainer exportContainer : exportContainers)
+          {
+            if (exportConfig.isCancelled())
+            {
+              break;
+            }
 
-        exportContainer.sharedLock.lock();
-        try
-        {
-          exportContainer(exportContainer);
+            exportContainer.sharedLock.lock();
+            try
+            {
+              exportContainer(txn, exportContainer);
+            }
+            finally
+            {
+              exportContainer.sharedLock.unlock();
+            }
+          }
+          return null;
         }
-        finally
-        {
-          exportContainer.sharedLock.unlock();
-        }
-      }
+      });
+    }
+    catch (Exception e)
+    {
+      throw new StorageRuntimeException(e);
     }
     finally
     {
@@ -181,12 +191,10 @@
    * @throws  LDIFException  If an error occurs while trying to determine
    *                         whether to write an entry.
    */
-  private void exportContainer(EntryContainer entryContainer)
+  private void exportContainer(ReadableStorage txn, EntryContainer entryContainer)
        throws StorageRuntimeException, IOException, LDIFException
   {
-    Storage storage = entryContainer.getStorage();
-
-    Cursor cursor = storage.openCursor(entryContainer.getID2Entry().getName());
+    Cursor cursor = txn.openCursor(entryContainer.getID2Entry().getName());
     try
     {
       while (cursor.next())
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
index 7306449..7f79876 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/Index.java
@@ -492,8 +492,8 @@
    *                      specified.
    * @return The set of entry IDs.
    */
-  public EntryIDSet readRange(ByteSequence lower, ByteSequence upper,
-                               boolean lowerIncluded, boolean upperIncluded)
+  public EntryIDSet readRange(ReadableStorage txn,
+      ByteSequence lower, ByteSequence upper, boolean lowerIncluded, boolean upperIncluded)
   {
     // If this index is not trusted, then just return an undefined id set.
     if(rebuildRunning || !trusted)
@@ -508,7 +508,7 @@
 
       ArrayList<EntryIDSet> lists = new ArrayList<EntryIDSet>();
 
-      Cursor cursor = storage.openCursor(treeName);
+      Cursor cursor = txn.openCursor(treeName);
       try
       {
         ByteSequence key = ByteString.empty();
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java
index 40a28b3..697bf5d 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexFilter.java
@@ -32,6 +32,7 @@
 import java.util.Map;
 
 import org.opends.server.backends.pluggable.AttributeIndex.IndexFilterType;
+import org.opends.server.backends.pluggable.spi.ReadableStorage;
 import org.opends.server.core.SearchOperation;
 import org.opends.server.types.AttributeType;
 import org.opends.server.types.FilterType;
@@ -51,10 +52,9 @@
    */
   public static final int FILTER_CANDIDATE_THRESHOLD = 10;
 
-  /**
-   * The entry entryContainer holding the attribute indexes.
-   */
+  /** The entry container holding the attribute indexes. */
   private final EntryContainer entryContainer;
+  private final ReadableStorage txn;
 
   /**
    * The search operation provides the search base, scope and filter.
@@ -67,7 +67,6 @@
    * how the indexed contributed to the search operation.
    */
   private final StringBuilder buffer;
-
   private final DatabaseEnvironmentMonitor monitor;
 
   /**
@@ -76,17 +75,15 @@
    * @param entryContainer The entry entryContainer.
    * @param searchOp       The search operation to be evaluated.
    * @param monitor        The monitor to gather filter usage stats.
-   *
    * @param debugBuilder If not null, a diagnostic string will be written
    *                     which will help determine how the indexes contributed
    *                     to this search.
    */
-  public IndexFilter(EntryContainer entryContainer,
-                     SearchOperation searchOp,
-                     StringBuilder debugBuilder,
-                     DatabaseEnvironmentMonitor monitor)
+  public IndexFilter(EntryContainer entryContainer, ReadableStorage txn, SearchOperation searchOp,
+      StringBuilder debugBuilder, DatabaseEnvironmentMonitor monitor)
   {
     this.entryContainer = entryContainer;
+    this.txn = txn;
     this.searchOp = searchOp;
     this.buffer = debugBuilder;
     this.monitor = monitor;
@@ -265,7 +262,8 @@
           continue;
         }
 
-        EntryIDSet set = attributeIndex.evaluateBoundedRange(filter1, filter2, buffer, monitor);
+        final IndexQueryFactoryImpl indexQueryFactory = new IndexQueryFactoryImpl(txn, attributeIndex);
+        EntryIDSet set = attributeIndex.evaluateBoundedRange(indexQueryFactory, filter1, filter2, buffer, monitor);
         if(monitor.isFilterUseEnabled() && set.isDefined())
         {
           monitor.updateStats(SearchFilter.createANDFilter(rangeList), set.size());
@@ -356,7 +354,8 @@
     AttributeIndex attributeIndex = entryContainer.getAttributeIndex(filter.getAttributeType());
     if (attributeIndex != null)
     {
-      return attributeIndex.evaluateFilter(indexFilterType, filter, buffer, monitor);
+      final IndexQueryFactoryImpl indexQueryFactory = new IndexQueryFactoryImpl(txn, attributeIndex);
+      return attributeIndex.evaluateFilter(indexQueryFactory, indexFilterType, filter, buffer, monitor);
     }
 
     if (monitor.isFilterUseEnabled())
@@ -386,7 +385,8 @@
     AttributeIndex attributeIndex = entryContainer.getAttributeIndex(extensibleFilter.getAttributeType());
     if (attributeIndex != null)
     {
-      return attributeIndex.evaluateExtensibleFilter(extensibleFilter, buffer, monitor);
+      final IndexQueryFactoryImpl indexQueryFactory = new IndexQueryFactoryImpl(txn, attributeIndex);
+      return attributeIndex.evaluateExtensibleFilter(indexQueryFactory, extensibleFilter, buffer, monitor);
     }
     return IndexQuery.createNullIndexQuery().evaluate(null);
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
index dce3c39..f1398e8 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
@@ -27,12 +27,12 @@
 package org.opends.server.backends.pluggable;
 
 import java.util.Collection;
-import java.util.Map;
 
 import org.forgerock.i18n.LocalizableMessageBuilder;
 import org.forgerock.opendj.ldap.ByteSequence;
 import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
+import org.opends.server.backends.pluggable.spi.ReadableStorage;
 
 import static org.opends.messages.JebMessages.*;
 
@@ -40,47 +40,41 @@
  * This class is an implementation of IndexQueryFactory which creates
  * IndexQuery objects as part of the query of the JEB index.
  */
-public final class IndexQueryFactoryImpl implements
-    IndexQueryFactory<IndexQuery>
+public final class IndexQueryFactoryImpl implements IndexQueryFactory<IndexQuery>
 {
 
   private static final String PRESENCE_INDEX_KEY = "presence";
 
-  /**
-   * The Map containing the string type identifier and the corresponding index.
-   */
-  private final Map<String, Index> indexMap;
-  private final IndexingOptions indexingOptions;
+  private final ReadableStorage txn;
+  /** The Map containing the string type identifier and the corresponding index. */
+  private final AttributeIndex attributeIndex;
 
   /**
    * Creates a new IndexQueryFactoryImpl object.
    *
-   * @param indexMap
-   *          A map containing the index id and the corresponding index.
-   * @param indexingOptions
-   *          The options to use for indexing
+   * @param txn
+   *          The readable storage
+   * @param attributeIndex
+   *          The targeted attribute index
    */
-  public IndexQueryFactoryImpl(Map<String, Index> indexMap, IndexingOptions indexingOptions)
+  public IndexQueryFactoryImpl(ReadableStorage txn, AttributeIndex attributeIndex)
   {
-    this.indexMap = indexMap;
-    this.indexingOptions = indexingOptions;
+    this.txn = txn;
+    this.attributeIndex = attributeIndex;
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public IndexQuery createExactMatchQuery(final String indexID, final ByteSequence key)
   {
     return new IndexQuery()
       {
-
         @Override
         public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
         {
           // Read the database and get Record for the key.
           // Select the right index to be used.
-          Index index = indexMap.get(indexID);
+          final Index index = attributeIndex.getIndexById(indexID);
           if (index == null)
           {
             if(debugMessage != null)
@@ -89,7 +83,8 @@
             }
             return createMatchAllQuery().evaluate(debugMessage);
           }
-          EntryIDSet entrySet = index.readKey(key, null);
+
+          final EntryIDSet entrySet = index.readKey(key, null);
           if(debugMessage != null && !entrySet.isDefined())
           {
             updateStatsUndefinedResults(debugMessage, index);
@@ -99,8 +94,6 @@
       };
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public IndexQuery createRangeMatchQuery(final String indexID,
@@ -109,12 +102,11 @@
   {
     return new IndexQuery()
       {
-
         @Override
         public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
         {
           // Find the right index.
-          Index index = indexMap.get(indexID);
+          final Index index = attributeIndex.getIndexById(indexID);
           if (index == null)
           {
             if(debugMessage != null)
@@ -123,7 +115,8 @@
             }
             return createMatchAllQuery().evaluate(debugMessage);
           }
-        EntryIDSet entrySet = index.readRange(lowerBound, upperBound,
+
+          final EntryIDSet entrySet = index.readRange(txn, lowerBound, upperBound,
               includeLowerBound, includeUpperBound);
           if(debugMessage != null && !entrySet.isDefined())
           {
@@ -134,8 +127,6 @@
       };
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public IndexQuery createIntersectionQuery(Collection<IndexQuery> subqueries)
@@ -143,8 +134,6 @@
     return IndexQuery.createIntersectionIndexQuery(subqueries);
   }
 
-
-
   /** {@inheritDoc} */
   @Override
   public IndexQuery createUnionQuery(Collection<IndexQuery> subqueries)
@@ -152,8 +141,6 @@
     return IndexQuery.createUnionIndexQuery(subqueries);
   }
 
-
-
   /**
    * {@inheritDoc}
    * <p>
@@ -168,8 +155,8 @@
         @Override
         public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
         {
-        final String indexID = PRESENCE_INDEX_KEY;
-        final Index index = indexMap.get(indexID);
+          final String indexID = PRESENCE_INDEX_KEY;
+          final Index index = attributeIndex.getIndexById(indexID);
           if (index == null)
           {
             if(debugMessage != null)
@@ -179,7 +166,7 @@
             return new EntryIDSet();
           }
 
-          EntryIDSet entrySet = index.readKey(PresenceIndexer.presenceKey, null);
+          final EntryIDSet entrySet = index.readKey(PresenceIndexer.presenceKey, null);
           if (debugMessage != null && !entrySet.isDefined())
           {
             updateStatsUndefinedResults(debugMessage, index);
@@ -209,6 +196,6 @@
   @Override
   public IndexingOptions getIndexingOptions()
   {
-    return indexingOptions;
+    return attributeIndex.getIndexingOptions();
   }
 }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/NullIndex.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/NullIndex.java
index 6b47cf8..a161f02 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/NullIndex.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/NullIndex.java
@@ -109,8 +109,8 @@
 
   /** {@inheritDoc} */
   @Override
-  public EntryIDSet readRange(ByteSequence lower, ByteSequence upper,
-      boolean lowerIncluded, boolean upperIncluded)
+  public EntryIDSet readRange(ReadableStorage txn, ByteSequence lower, ByteSequence upper, boolean lowerIncluded,
+      boolean upperIncluded)
   {
     return new EntryIDSet();
   }
diff --git a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java
index 443ed38..da87828 100644
--- a/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java
+++ b/opendj-sdk/opendj3-server-dev/src/server/org/opends/server/backends/pluggable/spi/Storage.java
@@ -44,8 +44,6 @@
 
   void write(WriteOperation updateTransaction) throws Exception;
 
-  Cursor openCursor(TreeName name);
-
   @Override
   void close();
 }
\ No newline at end of file

--
Gitblit v1.10.0