From 20fdcbef0d17440c367d2943f9c5799bddfe661f Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Tue, 07 Apr 2015 10:45:33 +0000
Subject: [PATCH] OPENDJ-1628 - Simplify Index hierarchy and remove Indexer classes

---
 opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java |  139 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 112 insertions(+), 27 deletions(-)

diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
index 4ccfbb6..577e8d6 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
@@ -29,13 +29,18 @@
 import static org.opends.messages.JebMessages.*;
 import static org.opends.server.backends.pluggable.EntryIDSet.newUndefinedSet;
 
+import java.util.ArrayList;
 import java.util.Collection;
 
 import org.forgerock.i18n.LocalizableMessageBuilder;
+import org.forgerock.i18n.slf4j.LocalizedLogger;
 import org.forgerock.opendj.ldap.ByteSequence;
+import org.forgerock.opendj.ldap.ByteString;
 import org.forgerock.opendj.ldap.spi.IndexQueryFactory;
 import org.forgerock.opendj.ldap.spi.IndexingOptions;
+import org.opends.server.backends.pluggable.spi.Cursor;
 import org.opends.server.backends.pluggable.spi.ReadableTransaction;
+import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
 
 /**
  * This class is an implementation of IndexQueryFactory which creates
@@ -43,6 +48,7 @@
  */
 final class IndexQueryFactoryImpl implements IndexQueryFactory<IndexQuery>
 {
+  private static final LocalizedLogger logger = LocalizedLogger.getLoggerForThisClass();
 
   private static final String PRESENCE_INDEX_KEY = "presence";
 
@@ -85,7 +91,7 @@
             return createMatchAllQuery().evaluate(debugMessage);
           }
 
-          final EntryIDSet entrySet = index.read(txn, key);
+          final EntryIDSet entrySet = index.get(txn, key);
           if (debugMessage != null && !entrySet.isDefined())
           {
             updateStatsUndefinedResults(debugMessage, index);
@@ -103,35 +109,118 @@
 
   /** {@inheritDoc} */
   @Override
-  public IndexQuery createRangeMatchQuery(final String indexID,
-      final ByteSequence lowerBound, final ByteSequence upperBound,
-      final boolean includeLowerBound, final boolean includeUpperBound)
+  public IndexQuery createRangeMatchQuery(final String indexID, final ByteSequence lowerBound,
+      final ByteSequence upperBound, final boolean includeLowerBound, final boolean includeUpperBound)
   {
     return new IndexQuery()
+    {
+      @Override
+      public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
       {
-        @Override
-        public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+        // Find the right index.
+        final Index index = attributeIndex.getIndexById(indexID);
+        if (index == null)
         {
-          // Find the right index.
-          final Index index = attributeIndex.getIndexById(indexID);
-          if (index == null)
+          if (debugMessage != null)
           {
-            if(debugMessage != null)
-            {
-              debugMessage.append(INFO_JEB_INDEX_FILTER_INDEX_TYPE_DISABLED.get(indexID, ""));
-            }
-            return createMatchAllQuery().evaluate(debugMessage);
+            debugMessage.append(INFO_JEB_INDEX_FILTER_INDEX_TYPE_DISABLED.get(indexID, ""));
           }
-
-          final EntryIDSet entrySet = index.readRange(txn, lowerBound, upperBound,
-              includeLowerBound, includeUpperBound);
-          if(debugMessage != null && !entrySet.isDefined())
-          {
-            updateStatsUndefinedResults(debugMessage, index);
-          }
-          return entrySet;
+          return createMatchAllQuery().evaluate(debugMessage);
         }
 
+        final EntryIDSet entrySet = readRange(index, txn, lowerBound, upperBound, includeLowerBound, includeUpperBound);
+        if (debugMessage != null && !entrySet.isDefined())
+        {
+          updateStatsUndefinedResults(debugMessage, index);
+        }
+        return entrySet;
+      }
+
+      private final EntryIDSet readRange(Index index, ReadableTransaction txn, ByteSequence lower, ByteSequence upper,
+          boolean lowerIncluded, boolean upperIncluded)
+      {
+        // If this index is not trusted, then just return an undefined id set.
+        if (!index.isTrusted())
+        {
+          return newUndefinedSet();
+        }
+
+        try
+        {
+          // Total number of IDs found so far.
+          int totalIDCount = 0;
+          ArrayList<EntryIDSet> sets = new ArrayList<EntryIDSet>();
+          Cursor<ByteString, EntryIDSet> cursor = index.openCursor(txn);
+          try
+          {
+            boolean success;
+            // Set the lower bound if necessary.
+            if (lower.length() > 0)
+            {
+              // Initialize the cursor to the lower bound.
+              success = cursor.positionToKeyOrNext(lower);
+
+              // Advance past the lower bound if necessary.
+              if (success && !lowerIncluded && cursor.getKey().equals(lower))
+              {
+                // Do not include the lower value.
+                success = cursor.next();
+              }
+            }
+            else
+            {
+              success = cursor.next();
+            }
+
+            if (!success)
+            {
+              // There are no values.
+              return EntryIDSet.newDefinedSet();
+            }
+
+            // Step through the keys until we hit the upper bound or the last key.
+            while (success)
+            {
+              // Check against the upper bound if necessary
+              if (upper.length() > 0)
+              {
+                int cmp = cursor.getKey().compareTo(upper);
+                if (cmp > 0 || (cmp == 0 && !upperIncluded))
+                {
+                  break;
+                }
+              }
+
+              EntryIDSet set = cursor.getValue();
+              if (!set.isDefined())
+              {
+                // There is no point continuing.
+                return set;
+              }
+              totalIDCount += set.size();
+              if (totalIDCount > IndexFilter.CURSOR_ENTRY_LIMIT)
+              {
+                // There are too many. Give up and return an undefined list.
+                return newUndefinedSet();
+              }
+              sets.add(set);
+              success = cursor.next();
+            }
+
+            return EntryIDSet.newSetFromUnion(sets);
+          }
+          finally
+          {
+            cursor.close();
+          }
+        }
+        catch (StorageRuntimeException e)
+        {
+          logger.traceException(e);
+          return newUndefinedSet();
+        }
+      }
+
         @Override
         public String toString()
         {
@@ -186,7 +275,7 @@
             return newUndefinedSet();
           }
 
-          final EntryIDSet entrySet = index.read(txn, PresenceIndexer.presenceKey);
+          final EntryIDSet entrySet = index.get(txn, AttributeIndex.PRESENCE_KEY);
           if (debugMessage != null && !entrySet.isDefined())
           {
             updateStatsUndefinedResults(debugMessage, index);
@@ -208,10 +297,6 @@
     {
       debugMessage.append(INFO_JEB_INDEX_FILTER_INDEX_NOT_TRUSTED.get(index.getName()));
     }
-    else if (index.isRebuildRunning())
-    {
-      debugMessage.append(INFO_JEB_INDEX_FILTER_INDEX_REBUILD_IN_PROGRESS.get(index.getName()));
-    }
     else
     {
       debugMessage.append(INFO_JEB_INDEX_FILTER_INDEX_LIMIT_EXCEEDED.get(index.getName()));

--
Gitblit v1.10.0