From b1f6835f209f7d82b1299e02ce40c84f3b6a059c Mon Sep 17 00:00:00 2001
From: Fabio Pistolesi <fabio.pistolesi@forgerock.com>
Date: Fri, 12 Jun 2015 09:18:01 +0000
Subject: [PATCH] OPENDJ-2108 CR-7212 Some indexes are evaluated as indexed but should be not-indexed.

---
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQuery.java            |   14 ++++---
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexFilter.java           |    4 +-
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java        |   41 ++++++++++++++++----
 opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java |   15 +++++--
 4 files changed, 53 insertions(+), 21 deletions(-)

diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
index d513ee7..1f41856 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/AttributeIndex.java
@@ -498,12 +498,13 @@
       StringBuilder debugBuffer, BackendMonitor monitor)
   {
     LocalizableMessageBuilder debugMessage = monitor.isFilterUseEnabled() ? new LocalizableMessageBuilder() : null;
-    EntryIDSet results = indexQuery.evaluate(debugMessage);
+    StringBuilder indexNameOut = debugBuffer == null ? null : new StringBuilder();
+    EntryIDSet results = indexQuery.evaluate(debugMessage, indexNameOut);
 
     if (debugBuffer != null)
     {
-      debugBuffer.append("[INDEX:").append(config.getAttribute().getNameOrOID())
-        .append(".").append(indexName).append("]");
+      appendDebugIndexInformation(debugBuffer, indexName);
+      appendDebugUnindexedInformation(debugBuffer, indexNameOut);
     }
 
     if (monitor.isFilterUseEnabled())
@@ -521,6 +522,27 @@
   }
 
   /**
+   * Appends additional traces to {@code debugsearchindex} when a filter successfully used
+   * an auxiliary index type during index query.
+   *
+   * @param debugBuffer the current debugsearchindex buffer
+   * @param indexNameOut the name of the index type
+   */
+  private void appendDebugUnindexedInformation(StringBuilder debugBuffer, StringBuilder indexNameOut)
+  {
+    if (indexNameOut.length() > 0)
+    {
+      debugBuffer.append(newUndefinedSet().toString());
+      appendDebugIndexInformation(debugBuffer, indexNameOut.toString());
+    }
+  }
+
+  private void appendDebugIndexInformation(final StringBuilder debugBuffer, final String infos)
+  {
+    debugBuffer.append("[INDEX:").append(config.getAttribute().getNameOrOID()).append(".").append(infos).append("]");
+  }
+
+  /**
    * Retrieve the entry IDs that might match two filters that restrict a value
    * to both a lower bound and an upper bound.
    *
@@ -881,11 +903,16 @@
         monitor.updateStats(filter,
             INFO_INDEX_FILTER_MATCHING_RULE_NOT_INDEXED.get(matchRuleOID, config.getAttribute().getNameOrOID()));
       }
-      return IndexQuery.createNullIndexQuery().evaluate(null);
+      return IndexQuery.createNullIndexQuery().evaluate(null, null);
     }
 
     try
     {
+      final IndexQuery indexQuery = rule.getAssertion(filter.getAssertionValue()).createIndexQuery(indexQueryFactory);
+      LocalizableMessageBuilder debugMessage = monitor.isFilterUseEnabled() ? new LocalizableMessageBuilder() : null;
+      StringBuilder indexNameOut = debugBuffer == null ? null : new StringBuilder();
+      EntryIDSet results = indexQuery.evaluate(debugMessage, indexNameOut);
+
       if (debugBuffer != null)
       {
         debugBuffer.append("[INDEX:");
@@ -897,11 +924,9 @@
               .append(indexer.getIndexID());
         }
         debugBuffer.append("]");
+        appendDebugUnindexedInformation(debugBuffer, indexNameOut);
       }
 
-      final IndexQuery indexQuery = rule.getAssertion(filter.getAssertionValue()).createIndexQuery(indexQueryFactory);
-      LocalizableMessageBuilder debugMessage = monitor.isFilterUseEnabled() ? new LocalizableMessageBuilder() : null;
-      EntryIDSet results = indexQuery.evaluate(debugMessage);
       if (monitor.isFilterUseEnabled())
       {
         if (results.isDefined())
@@ -918,7 +943,7 @@
     catch (DecodeException e)
     {
       logger.traceException(e);
-      return IndexQuery.createNullIndexQuery().evaluate(null);
+      return IndexQuery.createNullIndexQuery().evaluate(null, null);
     }
   }
 
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexFilter.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexFilter.java
index dc6c9f5..c67e4f0 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexFilter.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexFilter.java
@@ -351,7 +351,7 @@
       // This will always be unindexed since the filter potentially matches
       // entries containing the specified attribute type as well as any entry
       // containing the attribute in its DN as part of a superior RDN.
-      return IndexQuery.createNullIndexQuery().evaluate(null);
+      return IndexQuery.createNullIndexQuery().evaluate(null, null);
     }
 
     AttributeIndex attributeIndex = entryContainer.getAttributeIndex(extensibleFilter.getAttributeType());
@@ -360,7 +360,7 @@
       final IndexQueryFactoryImpl indexQueryFactory = new IndexQueryFactoryImpl(txn, attributeIndex);
       return attributeIndex.evaluateExtensibleFilter(indexQueryFactory, extensibleFilter, buffer, monitor);
     }
-    return IndexQuery.createNullIndexQuery().evaluate(null);
+    return IndexQuery.createNullIndexQuery().evaluate(null, null);
   }
 
   private void appendToDebugBuffer(String content)
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQuery.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQuery.java
index d7d757a..ab44001 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQuery.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQuery.java
@@ -52,9 +52,11 @@
    * @param debugMessage If not null, diagnostic message will be written
    *                      which will help to determine why the returned
    *                      EntryIDSet is not defined.
+   * @param indexNameOut If not null, output parameter for the name of the index type actually used to return
+   *                      index results.
    * @return The non null EntryIDSet as a result of evaluating this query
    */
-  public abstract EntryIDSet evaluate(LocalizableMessageBuilder debugMessage);
+  public abstract EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut);
 
   /**
    * Creates an IntersectionIndexQuery object from a collection of
@@ -101,7 +103,7 @@
   private static final class NullIndexQuery extends IndexQuery
   {
     @Override
-    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
     {
       return newUndefinedSet();
     }
@@ -134,12 +136,12 @@
     }
 
     @Override
-    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
     {
       final EntryIDSet entryIDs = newUndefinedSet();
       for (IndexQuery query : subIndexQueries)
       {
-        entryIDs.retainAll(query.evaluate(debugMessage));
+        entryIDs.retainAll(query.evaluate(debugMessage, indexNameOut));
         if (isBelowFilterThreshold(entryIDs))
         {
           break;
@@ -173,12 +175,12 @@
     }
 
     @Override
-    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+    public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
     {
       final EntryIDSet entryIDs = newDefinedSet();
       for (IndexQuery query : subIndexQueries)
       {
-        entryIDs.addAll(query.evaluate(debugMessage));
+        entryIDs.addAll(query.evaluate(debugMessage, indexNameOut));
         if (entryIDs.isDefined() && entryIDs.size() >= CURSOR_ENTRY_LIMIT)
         {
           break;
diff --git a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
index cf9e7ae..7b1ae32 100644
--- a/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
+++ b/opendj-sdk/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/IndexQueryFactoryImpl.java
@@ -38,6 +38,7 @@
 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.AttributeIndex.IndexFilterType;
 import org.opends.server.backends.pluggable.spi.Cursor;
 import org.opends.server.backends.pluggable.spi.ReadableTransaction;
 import org.opends.server.backends.pluggable.spi.StorageRuntimeException;
@@ -77,7 +78,7 @@
     return new IndexQuery()
       {
         @Override
-        public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+        public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
         {
           // Read the tree and get Record for the key.
           // Select the right index to be used.
@@ -89,7 +90,7 @@
               debugMessage.append(INFO_INDEX_FILTER_INDEX_TYPE_DISABLED.get(indexID,
                   attributeIndex.getAttributeType().getNameOrOID()));
             }
-            return createMatchAllQuery().evaluate(debugMessage);
+            return createMatchAllQuery().evaluate(debugMessage, indexNameOut);
           }
 
           final EntryIDSet entrySet = index.get(txn, key);
@@ -116,7 +117,7 @@
     return new IndexQuery()
     {
       @Override
-      public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+      public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
       {
         final Index index = attributeIndex.getNameToIndexes().get(indexID);
         if (index == null)
@@ -126,7 +127,7 @@
             debugMessage.append(INFO_INDEX_FILTER_INDEX_TYPE_DISABLED.get(indexID,
                   attributeIndex.getAttributeType().getNameOrOID()));
           }
-          return createMatchAllQuery().evaluate(debugMessage);
+          return createMatchAllQuery().evaluate(debugMessage, indexNameOut);
         }
 
         final EntryIDSet entrySet = readRange(index, txn, lowerBound, upperBound, includeLowerBound, includeUpperBound);
@@ -263,7 +264,7 @@
     return new IndexQuery()
       {
         @Override
-        public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage)
+        public EntryIDSet evaluate(LocalizableMessageBuilder debugMessage, StringBuilder indexNameOut)
         {
           final String indexID = PRESENCE_INDEX_KEY;
           final Index index = attributeIndex.getNameToIndexes().get(indexID);
@@ -282,6 +283,10 @@
           {
             updateStatsUndefinedResults(debugMessage, index);
           }
+          if (indexNameOut != null)
+          {
+            indexNameOut.append(IndexFilterType.PRESENCE.toString());
+          }
           return entrySet;
         }
 

--
Gitblit v1.10.0