From 21223912856469a2eac9be72e23bcac4cc07c71a Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Tue, 24 Jul 2007 18:41:36 +0000
Subject: [PATCH] Fix for issue 1794: - Attribute index no longer need the backend index entry limit parameter on construction. This is now handled by the admin framework. - Updated test cases to reflect the change

---
 opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java |  168 ++++++++++++++++++++++++++++++-------------------------
 1 files changed, 91 insertions(+), 77 deletions(-)

diff --git a/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index fc54256..4aa1c95 100644
--- a/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -120,39 +120,27 @@
 
   private int cursorEntryLimit = 100000;
 
-  private int backendIndexEntryLimit = 4000;
-
   /**
    * Create a new attribute index object.
    * @param entryContainer The entryContainer of this attribute index.
    * @param state The state database to persist index state info.
    * @param env The JE environment handle.
    * @param indexConfig The attribute index configuration.
-   * @param backendIndexEntryLimit The backend index entry limit to use
-   *        if none is specified for this attribute index.
    * @throws DatabaseException if a JE database error occurs.
    * @throws ConfigException if a configuration related error occurs.
    */
-  public AttributeIndex(JEIndexCfg indexConfig, State state,
-                        int backendIndexEntryLimit,
-                        Environment env,
+  public AttributeIndex(JEIndexCfg indexConfig, State state, Environment env,
                         EntryContainer entryContainer)
       throws DatabaseException, ConfigException
   {
     this.entryContainer = entryContainer;
     this.env = env;
     this.indexConfig = indexConfig;
-    this.backendIndexEntryLimit = backendIndexEntryLimit;
     this.state = state;
 
     AttributeType attrType = indexConfig.getIndexAttribute();
     String name = attrType.getNameOrOID();
-    int indexEntryLimit = backendIndexEntryLimit;
-
-    if(indexConfig.getIndexEntryLimit() != null)
-    {
-      indexEntryLimit = indexConfig.getIndexEntryLimit();
-    }
+    int indexEntryLimit = indexConfig.getIndexEntryLimit();
 
     if (indexConfig.getIndexType().contains(JEIndexCfgDefn.IndexType.EQUALITY))
     {
@@ -655,10 +643,14 @@
    * Retrieve the entry IDs that might match an equality filter.
    *
    * @param equalityFilter The equality filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain the filter
    *         assertion value.
    */
-  public EntryIDSet evaluateEqualityFilter(SearchFilter equalityFilter)
+  public EntryIDSet evaluateEqualityFilter(SearchFilter equalityFilter,
+                                           StringBuilder debugBuffer)
   {
     if (equalityIndex == null)
     {
@@ -672,6 +664,14 @@
            equalityFilter.getAssertionValue().getNormalizedValue().value();
       DatabaseEntry key = new DatabaseEntry(keyBytes);
 
+      if(debugBuffer != null)
+      {
+        debugBuffer.append("[INDEX:");
+        debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+        debugBuffer.append(".");
+        debugBuffer.append("equality]");
+      }
+
       // Read the key.
       return equalityIndex.readKey(key, null, LockMode.DEFAULT);
     }
@@ -689,16 +689,28 @@
    * Retrieve the entry IDs that might match a presence filter.
    *
    * @param filter The presence filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain one or more
    *         values of the attribute type in the filter.
    */
-  public EntryIDSet evaluatePresenceFilter(SearchFilter filter)
+  public EntryIDSet evaluatePresenceFilter(SearchFilter filter,
+                                           StringBuilder debugBuffer)
   {
     if (presenceIndex == null)
     {
       return new EntryIDSet();
     }
 
+    if(debugBuffer != null)
+    {
+      debugBuffer.append("[INDEX:");
+      debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+      debugBuffer.append(".");
+      debugBuffer.append("presence]");
+    }
+
     // Read the presence key
     return presenceIndex.readKey(presenceKey, null, LockMode.DEFAULT);
   }
@@ -707,10 +719,14 @@
    * Retrieve the entry IDs that might match a greater-or-equal filter.
    *
    * @param filter The greater-or-equal filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain a value
    *         greater than or equal to the filter assertion value.
    */
-  public EntryIDSet evaluateGreaterOrEqualFilter(SearchFilter filter)
+  public EntryIDSet evaluateGreaterOrEqualFilter(SearchFilter filter,
+                                                 StringBuilder debugBuffer)
   {
     if (orderingIndex == null)
     {
@@ -730,6 +746,14 @@
       // bound.
       byte[] upper = new byte[0];
 
+      if(debugBuffer != null)
+      {
+        debugBuffer.append("[INDEX:");
+        debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+        debugBuffer.append(".");
+        debugBuffer.append("ordering]");
+      }
+
       // Read the range: lower <= keys < upper.
       return orderingIndex.readRange(lower, upper, true, false);
     }
@@ -747,10 +771,14 @@
    * Retrieve the entry IDs that might match a less-or-equal filter.
    *
    * @param filter The less-or-equal filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain a value
    *         less than or equal to the filter assertion value.
    */
-  public EntryIDSet evaluateLessOrEqualFilter(SearchFilter filter)
+  public EntryIDSet evaluateLessOrEqualFilter(SearchFilter filter,
+                                              StringBuilder debugBuffer)
   {
     if (orderingIndex == null)
     {
@@ -770,6 +798,14 @@
       byte[] upper = orderingRule.normalizeValue(
            filter.getAssertionValue().getValue()).value();
 
+      if(debugBuffer != null)
+      {
+        debugBuffer.append("[INDEX:");
+        debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+        debugBuffer.append(".");
+        debugBuffer.append("ordering]");
+      }
+
       // Read the range: lower < keys <= upper.
       return orderingIndex.readRange(lower, upper, false, true);
     }
@@ -787,10 +823,14 @@
    * Retrieve the entry IDs that might match a substring filter.
    *
    * @param filter The substring filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain a value
    *         that matches the filter substrings.
    */
-  public EntryIDSet evaluateSubstringFilter(SearchFilter filter)
+  public EntryIDSet evaluateSubstringFilter(SearchFilter filter,
+                                            StringBuilder debugBuffer)
   {
     SubstringMatchingRule matchRule =
          filter.getAttributeType().getSubstringMatchingRule();
@@ -815,6 +855,16 @@
           if (results.isDefined() &&
                results.size() <= IndexFilter.FILTER_CANDIDATE_THRESHOLD)
           {
+
+            if(debugBuffer != null)
+            {
+              debugBuffer.append("[INDEX:");
+              debugBuffer.append(indexConfig.getIndexAttribute().
+                  getNameOrOID());
+              debugBuffer.append(".");
+              debugBuffer.append("equality]");
+            }
+
             return results;
           }
         }
@@ -860,6 +910,14 @@
         }
       }
 
+      if(debugBuffer != null)
+      {
+        debugBuffer.append("[INDEX:");
+        debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+        debugBuffer.append(".");
+        debugBuffer.append("substring]");
+      }
+
       return results;
     }
     catch (DirectoryException e)
@@ -964,10 +1022,14 @@
    * Retrieve the entry IDs that might match an approximate filter.
    *
    * @param approximateFilter The approximate filter.
+   * @param debugBuffer If not null, a diagnostic string will be written
+   *                     which will help determine how the indexes contributed
+   *                     to this search.
    * @return The candidate entry IDs that might contain the filter
    *         assertion value.
    */
-  public EntryIDSet evaluateApproximateFilter(SearchFilter approximateFilter)
+  public EntryIDSet evaluateApproximateFilter(SearchFilter approximateFilter,
+                                              StringBuilder debugBuffer)
   {
     if (approximateIndex == null)
     {
@@ -984,6 +1046,14 @@
                approximateFilter.getAssertionValue().getValue()).value();
       DatabaseEntry key = new DatabaseEntry(keyBytes);
 
+      if(debugBuffer != null)
+      {
+        debugBuffer.append("[INDEX:");
+        debugBuffer.append(indexConfig.getIndexAttribute().getNameOrOID());
+        debugBuffer.append(".");
+        debugBuffer.append("approximate]");
+      }
+
       // Read the key.
       return approximateIndex.readKey(key, null, LockMode.DEFAULT);
     }
@@ -1078,57 +1148,6 @@
   }
 
   /**
-   * Set the index entry limit used by the backend using this attribute index.
-   * This index will use the backend entry limit only if there is not one
-   * specified for this index.
-   *
-   * @param backendIndexEntryLimit The backend index entry limit.
-   * @return True if a rebuild is required or false otherwise.
-   */
-  public synchronized boolean setBackendIndexEntryLimit(
-      int backendIndexEntryLimit)
-  {
-    // Only update if there is no limit specified for this index.
-    boolean rebuildRequired = false;
-    if(indexConfig.getIndexEntryLimit() == null)
-    {
-      if(equalityIndex != null)
-      {
-        rebuildRequired |=
-            equalityIndex.setIndexEntryLimit(backendIndexEntryLimit);
-      }
-
-      if(presenceIndex != null)
-      {
-        rebuildRequired |=
-            presenceIndex.setIndexEntryLimit(backendIndexEntryLimit);
-      }
-
-      if(substringIndex != null)
-      {
-        rebuildRequired |=
-            substringIndex.setIndexEntryLimit(backendIndexEntryLimit);
-      }
-
-      if(orderingIndex != null)
-      {
-        rebuildRequired |=
-            orderingIndex.setIndexEntryLimit(backendIndexEntryLimit);
-      }
-
-      if(approximateIndex != null)
-      {
-        rebuildRequired |=
-            approximateIndex.setIndexEntryLimit(backendIndexEntryLimit);
-      }
-    }
-
-    this.backendIndexEntryLimit = backendIndexEntryLimit;
-
-    return rebuildRequired;
-  }
-
-  /**
    * {@inheritDoc}
    */
   public synchronized boolean isConfigurationChangeAcceptable(
@@ -1198,12 +1217,7 @@
     {
       AttributeType attrType = cfg.getIndexAttribute();
       String name = attrType.getNameOrOID();
-      int indexEntryLimit = backendIndexEntryLimit;
-
-      if(cfg.getIndexEntryLimit() != null)
-      {
-        indexEntryLimit = cfg.getIndexEntryLimit();
-      }
+      int indexEntryLimit = cfg.getIndexEntryLimit();
 
       if (cfg.getIndexType().contains(JEIndexCfgDefn.IndexType.EQUALITY))
       {

--
Gitblit v1.10.0