Index: lucene/src/java/org/apache/lucene/search/cache/CachedArray.java
===================================================================
--- lucene/src/java/org/apache/lucene/search/cache/CachedArray.java	(revision 1051305)
+++ lucene/src/java/org/apache/lucene/search/cache/CachedArray.java	(working copy)
@@ -17,6 +17,7 @@
  * limitations under the License.
  */
 
+import org.apache.lucene.util.ArrayUtil;
 import org.apache.lucene.util.Bits;
 
 public abstract class CachedArray 
@@ -36,6 +37,8 @@
     this.numDocs = 0;
     this.numTerms = 0;
   }
+    
+  public abstract void setValue(int docid, Object value);
   
   /**
    * @return the native array
@@ -49,30 +52,78 @@
   public static class ByteValues extends CachedArray {
     public byte[] values = null;
     @Override public byte[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Byte)value;
+    }
   };
 
   public static class ShortValues extends CachedArray {
     public short[] values = null;
     @Override public short[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Short)value;
+    }
   };
 
   public static class IntValues extends CachedArray {
     public int[] values = null;
     @Override public int[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Integer)value;
+    }
   };
 
   public static class FloatValues extends CachedArray {
     public float[] values = null;
     @Override public float[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Float)value;
+    }
   };
 
   public static class LongValues extends CachedArray {
     public long[] values = null;
     @Override public long[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Long)value;
+    }
   };
 
   public static class DoubleValues extends CachedArray {
     public double[] values = null;
     @Override public double[] getRawArray() { return values; }
+    
+    @Override
+    public void setValue(int docid, Object value) {
+      if (docid >= values.length) {
+        values = ArrayUtil.grow(values, docid);
+      }
+      values[docid] = (Double)value;
+    }
   };
 }
Index: lucene/src/java/org/apache/lucene/util/ArrayUtil.java
===================================================================
--- lucene/src/java/org/apache/lucene/util/ArrayUtil.java	(revision 1051305)
+++ lucene/src/java/org/apache/lucene/util/ArrayUtil.java	(working copy)
@@ -254,7 +254,20 @@
   public static float[] grow(float[] array) {
     return grow(array, 1 + array.length);
   }
+  
+  public static double[] grow(double[] array, int minSize) {
+    if (array.length < minSize) {
+      double[] newArray = new double[oversize(minSize, RamUsageEstimator.NUM_BYTES_DOUBLE)];
+      System.arraycopy(array, 0, newArray, 0, array.length);
+      return newArray;
+    } else
+      return array;
+  }
 
+  public static double[] grow(double[] array) {
+    return grow(array, 1 + array.length);
+  }
+
   public static short[] shrink(short[] array, int targetSize) {
     final int newSize = getShrinkSize(array.length, targetSize, RamUsageEstimator.NUM_BYTES_SHORT);
     if (newSize != array.length) {
