From c9d60372f1024650e5d92981a4f48ec6c8c5f6d8 Mon Sep 17 00:00:00 2001
From: boli <boli@localhost>
Date: Fri, 18 Aug 2006 17:26:43 +0000
Subject: [PATCH] Removed the unnessary first byte in index keys. Updated all methods to remove the use of these prefix keys to iterate over a range of index keys. Index.readRange is modified to allow for unspecified lower and upper bounds so the search starts and ends at the smallest and/or biggest key respectively.

---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java        |   18 ++---
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java   |   54 +++++-------------
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java |    5 -
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java  |   24 -------
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java  |   24 -------
 opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java            |   51 ++++++++++++----
 6 files changed, 64 insertions(+), 112 deletions(-)

diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
index 2bb3439..5d71300 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/AttributeIndex.java
@@ -316,23 +316,6 @@
   }
 
   /**
-   * Makes a byte array representing an equality index key from
-   * a byte array containing the normalized value.
-   * The key is '=' followed by the normalized value.
-   *
-   * @param normalizedBytes The normalized value.
-   * @return A byte array containing the equality key.
-   */
-  byte[] makeEqualityKey(byte[] normalizedBytes)
-  {
-    byte[] keyBytes = new byte[1 + normalizedBytes.length];
-    keyBytes[0] = '=';
-    System.arraycopy(normalizedBytes, 0, keyBytes, 1,
-                     normalizedBytes.length);
-    return keyBytes;
-  }
-
-  /**
    * Makes a byte array representing a substring index key for
    * one substring of a value.
    *
@@ -343,9 +326,8 @@
    */
   private byte[] makeSubstringKey(byte[] bytes, int pos, int len)
   {
-    byte[] keyBytes = new byte[len + 1];
-    keyBytes[0] = '*';
-    System.arraycopy(bytes, pos, keyBytes, 1, len);
+    byte[] keyBytes = new byte[len];
+    System.arraycopy(bytes, pos, keyBytes, 0, len);
     return keyBytes;
   }
 
@@ -478,12 +460,12 @@
     // Iterate through all the keys that have this value as the prefix.
 
     // Set the lower bound for a range search.
-    byte[] lower = makeEqualityKey(bytes);
+    byte[] lower = bytes;
 
     // Set the upper bound for a range search.
     // We need a key for the upper bound that is of equal length
     // but slightly greater than the lower bound.
-    byte[] upper = makeEqualityKey(bytes);
+    byte[] upper = bytes;
     for (int i = upper.length-1; i >= 0; i--)
     {
       if (upper[i] == 0xFF)
@@ -520,9 +502,8 @@
     try
     {
       // Make a key from the normalized assertion value.
-      byte[] normBytes =
+      byte[] keyBytes =
            equalityFilter.getAssertionValue().getNormalizedValue().value();
-      byte[] keyBytes = makeEqualityKey(normBytes);
       DatabaseEntry key = new DatabaseEntry(keyBytes);
 
       // Read the key.
@@ -573,15 +554,12 @@
       // Use the ordering matching rule to normalize the value.
       OrderingMatchingRule orderingRule =
            filter.getAttributeType().getOrderingMatchingRule();
-      byte[] normBytes = orderingRule.normalizeValue(
+      byte[] lower = orderingRule.normalizeValue(
            filter.getAssertionValue().getValue()).value();
-      byte[] lower = makeEqualityKey(normBytes);
 
-      // Set the upper bound for a range search.
-      // We need a key for the upper bound that is slightly greater than
-      // the equality key prefix.
-      byte[] upper = makeEqualityKey(new byte[0]);
-      upper[0] = (byte) (upper[0] + 1);
+      // Set the upper bound to 0 to search all keys greater then the lower
+      // bound.
+      byte[] upper = new byte[0];
 
       // Read the range: lower <= keys < upper.
       return orderingIndex.readRange(lower, upper, true, false);
@@ -609,16 +587,16 @@
 
     try
     {
-      // Set the lower bound for a range search.
-      byte[] lower = makeEqualityKey(new byte[0]);
+      // Set the lower bound to 0 to start the range search from the smallest
+      // key.
+      byte[] lower = new byte[0];
 
       // Set the upper bound for a range search.
       // Use the ordering matching rule to normalize the value.
       OrderingMatchingRule orderingRule =
            filter.getAttributeType().getOrderingMatchingRule();
-      byte[] normBytes = orderingRule.normalizeValue(
+      byte[] upper = orderingRule.normalizeValue(
            filter.getAssertionValue().getValue()).value();
-      byte[] upper = makeEqualityKey(normBytes);
 
       // Read the range: lower < keys <= upper.
       return orderingIndex.readRange(lower, upper, false, true);
@@ -742,12 +720,10 @@
       byte[] normBytes;
 
       // Set the lower bound for a range search.
-      normBytes = orderingRule.normalizeValue(lowerValue.getValue()).value();
-      byte[] lower = makeEqualityKey(normBytes);
+      byte[] lower = orderingRule.normalizeValue(lowerValue.getValue()).value();
 
       // Set the upper bound for a range search.
-      normBytes = orderingRule.normalizeValue(upperValue.getValue()).value();
-      byte[] upper = makeEqualityKey(normBytes);
+      byte[] upper = orderingRule.normalizeValue(upperValue.getValue()).value();
 
       // Read the range: lower <= keys <= upper.
       return orderingIndex.readRange(lower, upper, true, true);
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
index 767161a..5af7e7b 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/EqualityIndexer.java
@@ -273,9 +273,8 @@
     {
       try
       {
-        byte[] normalizedBytes = value.getNormalizedValue().value();
+        byte[] keyBytes = value.getNormalizedValue().value();
 
-        byte[] keyBytes = makeEqualityKey(normalizedBytes);
         keys.add(new ASN1OctetString(keyBytes));
       }
       catch (DirectoryException e)
@@ -301,25 +300,4 @@
     }
   }
 
-  /**
-   * Makes a byte array representing an equality index key from
-   * a byte array containing the normalized value.
-   * The key is '=' followed by the normalized value.
-   * FIXME: The '=' prefix is no longer necessary since different index
-   * FIXME: types are no longer stored in the same database, but uses of
-   * FIXME: the Index.readRange method would have to be revisited if the
-   * FIXME: prefix is removed.
-   *
-   * @param normalizedBytes The normalized value.
-   * @return A byte array containing the equality key.
-   */
-  byte[] makeEqualityKey(byte[] normalizedBytes)
-  {
-    byte[] keyBytes = new byte[1 + normalizedBytes.length];
-    keyBytes[0] = '=';
-    System.arraycopy(normalizedBytes, 0, keyBytes, 1,
-                     normalizedBytes.length);
-    return keyBytes;
-  }
-
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
index 3d77600..38be22d 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/Index.java
@@ -368,14 +368,22 @@
    * Reads a range of keys and collects all their entry IDs into a
    * single set.
    *
-   * @param lower The lower bound of the range.
-   * @param upper The upper bound of the range.
+   * @param lower The lower bound of the range. A 0 length byte array indicates
+   *                      no lower bound and the range will start from the
+   *                      smallest key.
+   * @param upper The upper bound of the range. A 0 length byte array indicates
+   *                      no upper bound and the range will end at the largest
+   *                      key.
    * @param lowerIncluded true if a key exactly matching the lower bound
    *                      is included in the range, false if only keys
    *                      strictly greater than the lower bound are included.
+   *                      This value is ignored if the lower bound is not
+   *                      specified.
    * @param upperIncluded true if a key exactly matching the upper bound
    *                      is included in the range, false if only keys
    *                      strictly less than the upper bound are included.
+   *                      This value is ignored if the upper bound is not
+   *                      specified.
    * @return The set of entry IDs.
    */
   public EntryIDSet readRange(byte[] lower, byte[] upper,
@@ -389,7 +397,7 @@
       int totalIDCount = 0;
 
       DatabaseEntry data = new DatabaseEntry();
-      DatabaseEntry key = new DatabaseEntry(lower);
+      DatabaseEntry key;
 
       ArrayList<EntryIDSet> lists = new ArrayList<EntryIDSet>();
 
@@ -400,14 +408,25 @@
 
       try
       {
-        // Initialize the cursor to the lower bound.
-        status = cursor.getSearchKeyRange(key, data, lockMode);
-
-        // Advance past the lower bound if necessary.
-        if (status == OperationStatus.SUCCESS && !lowerIncluded &&
-             comparator.compare(key.getData(), lower) == 0)
+        // Set the lower bound if necessary.
+        if(lower.length > 0)
         {
-          // Do not include the lower value.
+          key = new DatabaseEntry(lower);
+
+          // Initialize the cursor to the lower bound.
+          status = cursor.getSearchKeyRange(key, data, lockMode);
+
+          // Advance past the lower bound if necessary.
+          if (status == OperationStatus.SUCCESS && !lowerIncluded &&
+               comparator.compare(key.getData(), lower) == 0)
+          {
+            // Do not include the lower value.
+            status = cursor.getNext(key, data, lockMode);
+          }
+        }
+        else
+        {
+          key = new DatabaseEntry();
           status = cursor.getNext(key, data, lockMode);
         }
 
@@ -417,13 +436,17 @@
           return new EntryIDSet(key.getData(), null);
         }
 
-        // Step through the keys until we hit the upper bound.
+        // Step through the keys until we hit the upper bound or the last key.
         while (status == OperationStatus.SUCCESS)
         {
-          int cmp = comparator.compare(key.getData(), upper);
-          if ((cmp > 0) || (cmp == 0 && !upperIncluded))
+          // Check against the upper bound if necessary
+          if(upper.length > 0)
           {
-            break;
+            int cmp = comparator.compare(key.getData(), upper);
+            if ((cmp > 0) || (cmp == 0 && !upperIncluded))
+            {
+              break;
+            }
           }
           EntryIDSet list = new EntryIDSet(key.getData(), data.getData());
           if (!list.isDefined())
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
index 3eb3f65..6b73dbd 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/OrderingIndexer.java
@@ -263,10 +263,9 @@
     {
       try
       {
-        byte[] normalizedBytes =
+        byte[] keyBytes =
              orderingRule.normalizeValue(value.getValue()).value();
 
-        byte[] keyBytes = makeOrderingKey(normalizedBytes);
         keys.add(new ASN1OctetString(keyBytes));
       }
       catch (DirectoryException e)
@@ -292,25 +291,4 @@
     }
   }
 
-  /**
-   * Makes a byte array representing an ordering index key from
-   * a byte array containing the normalized value.
-   * The key is '=' followed by the normalized value
-   * FIXME: The '=' prefix is no longer necessary since different index
-   * FIXME: types are no longer stored in the same database, but uses of
-   * FIXME: the Index.readRange method would have to be revisited if the
-   * FIXME: prefix is removed.
-   *
-   * @param normalizedBytes The normalized value.
-   * @return A byte array containing the ordering key.
-   */
-  byte[] makeOrderingKey(byte[] normalizedBytes)
-  {
-    byte[] keyBytes = new byte[1 + normalizedBytes.length];
-    keyBytes[0] = '=';
-    System.arraycopy(normalizedBytes, 0, keyBytes, 1,
-                     normalizedBytes.length);
-    return keyBytes;
-  }
-
 }
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
index bdf5b02..249cfc2 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/SubstringIndexer.java
@@ -247,9 +247,8 @@
    */
   private byte[] makeSubstringKey(byte[] bytes, int pos, int len)
   {
-    byte[] keyBytes = new byte[len + 1];
-    keyBytes[0] = '*';
-    System.arraycopy(bytes, pos, keyBytes, 1, len);
+    byte[] keyBytes = new byte[len];
+    System.arraycopy(bytes, pos, keyBytes, 0, len);
     return keyBytes;
   }
 
diff --git a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
index b27df18..bc891e0 100644
--- a/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
+++ b/opendj-sdk/opends/src/server/org/opends/server/backends/jeb/VerifyJob.java
@@ -1412,8 +1412,7 @@
           // Equality index.
           if (indexConfig.isEqualityIndex())
           {
-            byte[] keyBytes = attrIndex.makeEqualityKey(normalizedBytes);
-            DatabaseEntry key = new DatabaseEntry(keyBytes);
+            DatabaseEntry key = new DatabaseEntry(normalizedBytes);
             try
             {
               ConditionResult cr;
@@ -1422,12 +1421,12 @@
               {
                 System.err.printf("Missing ID %d%n%s",
                                   entryID.longValue(),
-                                  keyDump(equalityIndex, keyBytes));
+                                  keyDump(equalityIndex, normalizedBytes));
                 errorCount++;
               }
               else if (cr == ConditionResult.UNDEFINED)
               {
-                incrEntryLimitStats(equalityIndex, keyBytes);
+                incrEntryLimitStats(equalityIndex, normalizedBytes);
               }
             }
             catch (DatabaseException e)
@@ -1435,7 +1434,7 @@
               assert debugException(CLASS_NAME, "verifyAttribute", e);
               System.err.printf("Error reading database: %s%n%s",
                                 e.getMessage(),
-                                keyDump(equalityIndex, keyBytes));
+                                keyDump(equalityIndex, normalizedBytes));
               errorCount++;
             }
           }
@@ -1486,8 +1485,7 @@
             normalizedBytes =
                  orderingRule.normalizeValue(value.getValue()).value();
 
-            byte[] keyBytes = attrIndex.makeEqualityKey(normalizedBytes);
-            DatabaseEntry key = new DatabaseEntry(keyBytes);
+            DatabaseEntry key = new DatabaseEntry(normalizedBytes);
             try
             {
               ConditionResult cr;
@@ -1496,12 +1494,12 @@
               {
                 System.err.printf("Missing ID %d%n%s",
                                   entryID.longValue(),
-                                  keyDump(orderingIndex, keyBytes));
+                                  keyDump(orderingIndex, normalizedBytes));
                 errorCount++;
               }
               else if (cr == ConditionResult.UNDEFINED)
               {
-                incrEntryLimitStats(orderingIndex, keyBytes);
+                incrEntryLimitStats(orderingIndex, normalizedBytes);
               }
             }
             catch (DatabaseException e)
@@ -1509,7 +1507,7 @@
               assert debugException(CLASS_NAME, "verifyAttribute", e);
               System.err.printf("Error reading database: %s%n%s",
                                 e.getMessage(),
-                                keyDump(orderingIndex, keyBytes));
+                                keyDump(orderingIndex, normalizedBytes));
               errorCount++;
             }
           }

--
Gitblit v1.10.0