You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2014/06/05 17:54:52 UTC

svn commit: r1600688 [3/3] - in /lucene/dev/trunk: lucene/ lucene/codecs/src/java/org/apache/lucene/codecs/memory/ lucene/codecs/src/java/org/apache/lucene/codecs/simpletext/ lucene/core/src/java/org/apache/lucene/codecs/ lucene/core/src/java/org/apach...

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestDocTermOrds.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestDocTermOrds.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestDocTermOrds.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestDocTermOrds.java Thu Jun  5 15:54:49 2014
@@ -456,11 +456,10 @@ public class TestDocTermOrds extends Luc
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(-3, NumericUtils.prefixCodedToInt(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(5, NumericUtils.prefixCodedToInt(value));
     
     ir.close();
@@ -498,11 +497,10 @@ public class TestDocTermOrds extends Luc
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(-3, NumericUtils.prefixCodedToLong(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(5, NumericUtils.prefixCodedToLong(value));
     
     ir.close();
@@ -640,11 +638,10 @@ public class TestDocTermOrds extends Luc
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals("bar", value.utf8ToString());
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals("baz", value.utf8ToString());
     
     ir.close();

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCache.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCache.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCache.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCache.java Thu Jun  5 15:54:49 2014
@@ -201,28 +201,23 @@ public class TestFieldCache extends Luce
 
     // getTermsIndex
     SortedDocValues termsIndex = cache.getTermsIndex(reader, "theRandomUnicodeString");
-    assertSame("Second request to cache return same array", termsIndex, cache.getTermsIndex(reader, "theRandomUnicodeString"));
-    final BytesRef br = new BytesRef();
     for (int i = 0; i < NUM_DOCS; i++) {
-      final BytesRef term;
+      final String s;
       final int ord = termsIndex.getOrd(i);
       if (ord == -1) {
-        term = null;
+        s = null;
       } else {
-        termsIndex.lookupOrd(ord, br);
-        term = br;
+        s = termsIndex.lookupOrd(ord).utf8ToString();
       }
-      final String s = term == null ? null : term.utf8ToString();
       assertTrue("for doc " + i + ": " + s + " does not equal: " + unicodeStrings[i], unicodeStrings[i] == null || unicodeStrings[i].equals(s));
     }
 
     int nTerms = termsIndex.getValueCount();
 
     TermsEnum tenum = termsIndex.termsEnum();
-    BytesRef val = new BytesRef();
     for (int i=0; i<nTerms; i++) {
-      BytesRef val1 = tenum.next();
-      termsIndex.lookupOrd(i, val);
+      BytesRef val1 = BytesRef.deepCopyOf(tenum.next());
+      final BytesRef val = termsIndex.lookupOrd(i);
       // System.out.println("i="+i);
       assertEquals(val, val1);
     }
@@ -231,13 +226,13 @@ public class TestFieldCache extends Luce
     int num = atLeast(100);
     for (int i = 0; i < num; i++) {
       int k = random().nextInt(nTerms);
-      termsIndex.lookupOrd(k, val);
+      final BytesRef val = BytesRef.deepCopyOf(termsIndex.lookupOrd(k));
       assertEquals(TermsEnum.SeekStatus.FOUND, tenum.seekCeil(val));
       assertEquals(val, tenum.term());
     }
 
     for(int i=0;i<nTerms;i++) {
-      termsIndex.lookupOrd(i, val);
+      final BytesRef val = BytesRef.deepCopyOf(termsIndex.lookupOrd(i));
       assertEquals(TermsEnum.SeekStatus.FOUND, tenum.seekCeil(val));
       assertEquals(val, tenum.term());
     }
@@ -250,14 +245,12 @@ public class TestFieldCache extends Luce
     assertSame("Second request to cache return same array", terms, cache.getTerms(reader, "theRandomUnicodeString", true));
     Bits bits = cache.getDocsWithField(reader, "theRandomUnicodeString");
     for (int i = 0; i < NUM_DOCS; i++) {
-      terms.get(i, br);
-      final BytesRef term;
+      final String s;
       if (!bits.get(i)) {
-        term = null;
+        s = null;
       } else {
-        term = br;
+        s = terms.get(i).utf8ToString();
       }
-      final String s = term == null ? null : term.utf8ToString();
       assertTrue("for doc " + i + ": " + s + " does not equal: " + unicodeStrings[i], unicodeStrings[i] == null || unicodeStrings[i].equals(s));
     }
 
@@ -282,8 +275,7 @@ public class TestFieldCache extends Luce
         }
         long ord = termOrds.nextOrd();
         assert ord != SortedSetDocValues.NO_MORE_ORDS;
-        BytesRef scratch = new BytesRef();
-        termOrds.lookupOrd(ord, scratch);
+        BytesRef scratch = termOrds.lookupOrd(ord);
         assertEquals(v, scratch);
       }
       assertEquals(SortedSetDocValues.NO_MORE_ORDS, termOrds.nextOrd());
@@ -448,8 +440,6 @@ public class TestFieldCache extends Luce
     iw.shutdown();
     AtomicReader ar = getOnlySegmentReader(ir);
     
-    BytesRef scratch = new BytesRef();
-    
     // Binary type: can be retrieved via getTerms()
     try {
       FieldCache.DEFAULT.getNumerics(ar, "binary", FieldCache.NUMERIC_UTILS_INT_PARSER, false);
@@ -457,8 +447,8 @@ public class TestFieldCache extends Luce
     } catch (IllegalStateException expected) {}
     
     BinaryDocValues binary = FieldCache.DEFAULT.getTerms(ar, "binary", true);
-    binary.get(0, scratch);
-    assertEquals("binary value", scratch.utf8ToString());
+    final BytesRef term = binary.get(0);
+    assertEquals("binary value", term.utf8ToString());
     
     try {
       FieldCache.DEFAULT.getTermsIndex(ar, "binary");
@@ -490,13 +480,13 @@ public class TestFieldCache extends Luce
     } catch (IllegalStateException expected) {}
     
     binary = FieldCache.DEFAULT.getTerms(ar, "sorted", true);
-    binary.get(0, scratch);
+    BytesRef scratch = binary.get(0);
     assertEquals("sorted value", scratch.utf8ToString());
     
     SortedDocValues sorted = FieldCache.DEFAULT.getTermsIndex(ar, "sorted");
     assertEquals(0, sorted.getOrd(0));
     assertEquals(1, sorted.getValueCount());
-    sorted.get(0, scratch);
+    scratch = sorted.get(0);
     assertEquals("sorted value", scratch.utf8ToString());
     
     SortedSetDocValues sortedSet = FieldCache.DEFAULT.getDocTermOrds(ar, "sorted", null);
@@ -598,14 +588,13 @@ public class TestFieldCache extends Luce
     NumericDocValues doubles = cache.getNumerics(ar, "bogusdoubles", FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, true);
     assertEquals(0, doubles.get(0));
     
-    BytesRef scratch = new BytesRef();
     BinaryDocValues binaries = cache.getTerms(ar, "bogusterms", true);
-    binaries.get(0, scratch);
+    BytesRef scratch = binaries.get(0);
     assertEquals(0, scratch.length);
     
     SortedDocValues sorted = cache.getTermsIndex(ar, "bogustermsindex");
     assertEquals(-1, sorted.getOrd(0));
-    sorted.get(0, scratch);
+    scratch = sorted.get(0);
     assertEquals(0, scratch.length);
     
     SortedSetDocValues sortedSet = cache.getDocTermOrds(ar, "bogusmultivalued", null);
@@ -657,14 +646,13 @@ public class TestFieldCache extends Luce
     NumericDocValues doubles = cache.getNumerics(ar, "bogusdoubles", FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, true);
     assertEquals(0, doubles.get(0));
     
-    BytesRef scratch = new BytesRef();
     BinaryDocValues binaries = cache.getTerms(ar, "bogusterms", true);
-    binaries.get(0, scratch);
+    BytesRef scratch = binaries.get(0);
     assertEquals(0, scratch.length);
     
     SortedDocValues sorted = cache.getTermsIndex(ar, "bogustermsindex");
     assertEquals(-1, sorted.getOrd(0));
-    sorted.get(0, scratch);
+    scratch = sorted.get(0);
     assertEquals(0, scratch.length);
     
     SortedSetDocValues sortedSet = cache.getDocTermOrds(ar, "bogusmultivalued", null);

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSort.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSort.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSort.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSort.java Thu Jun  5 15:54:49 2014
@@ -1054,7 +1054,10 @@ public class TestFieldCacheSort extends 
     // this should not throw AIOOBE or RuntimeEx
     IndexReader reader = UninvertingReader.wrap(DirectoryReader.open(indexStore),
                          Collections.singletonMap("string", Type.SORTED));
-    IndexSearcher searcher = newSearcher(reader);
+    // NOTE: we can't wrap this with newSearcher, because when the API is abused in this way,
+    // the number of ords can exceed the number of documents, and AssertingAtomicReader will get angry,
+    // rightfully so (its a broken dv)
+    IndexSearcher searcher = new IndexSearcher(reader);
     searcher.search(new MatchAllDocsQuery(), null, 500, sort);
     reader.close();
     indexStore.close();

Added: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSortRandom.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSortRandom.java?rev=1600688&view=auto
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSortRandom.java (added)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheSortRandom.java Thu Jun  5 15:54:49 2014
@@ -0,0 +1,288 @@
+package org.apache.lucene.uninverting;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.document.IntField;
+import org.apache.lucene.document.StringField;
+import org.apache.lucene.index.AtomicReaderContext;
+import org.apache.lucene.index.DocValues;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.NumericDocValues;
+import org.apache.lucene.index.RandomIndexWriter;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreQuery;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.FieldDoc;
+import org.apache.lucene.search.Filter;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.Sort;
+import org.apache.lucene.search.SortField;
+import org.apache.lucene.search.TopFieldDocs;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.uninverting.UninvertingReader.Type;
+import org.apache.lucene.util.Bits;
+import org.apache.lucene.util.BytesRef;
+import org.apache.lucene.util.FixedBitSet;
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.TestUtil;
+
+/** random sorting tests with uninversion */
+public class TestFieldCacheSortRandom extends LuceneTestCase {
+
+  public void testRandomStringSort() throws Exception {
+    Random random = new Random(random().nextLong());
+
+    final int NUM_DOCS = atLeast(100);
+    final Directory dir = newDirectory();
+    final RandomIndexWriter writer = new RandomIndexWriter(random, dir);
+    final boolean allowDups = random.nextBoolean();
+    final Set<String> seen = new HashSet<>();
+    final int maxLength = TestUtil.nextInt(random, 5, 100);
+    if (VERBOSE) {
+      System.out.println("TEST: NUM_DOCS=" + NUM_DOCS + " maxLength=" + maxLength + " allowDups=" + allowDups);
+    }
+
+    int numDocs = 0;
+    final List<BytesRef> docValues = new ArrayList<>();
+    // TODO: deletions
+    while (numDocs < NUM_DOCS) {
+      final Document doc = new Document();
+
+      // 10% of the time, the document is missing the value:
+      final BytesRef br;
+      if (random().nextInt(10) != 7) {
+        final String s;
+        if (random.nextBoolean()) {
+          s = TestUtil.randomSimpleString(random, maxLength);
+        } else {
+          s = TestUtil.randomUnicodeString(random, maxLength);
+        }
+
+        if (!allowDups) {
+          if (seen.contains(s)) {
+            continue;
+          }
+          seen.add(s);
+        }
+
+        if (VERBOSE) {
+          System.out.println("  " + numDocs + ": s=" + s);
+        }
+
+        doc.add(new StringField("stringdv", s, Field.Store.NO));
+        docValues.add(new BytesRef(s));
+
+      } else {
+        br = null;
+        if (VERBOSE) {
+          System.out.println("  " + numDocs + ": <missing>");
+        }
+        docValues.add(null);
+      }
+
+      doc.add(new IntField("id", numDocs, Field.Store.YES));
+      writer.addDocument(doc);
+      numDocs++;
+
+      if (random.nextInt(40) == 17) {
+        // force flush
+        writer.getReader().close();
+      }
+    }
+
+    Map<String,UninvertingReader.Type> mapping = new HashMap<>();
+    mapping.put("stringdv", Type.SORTED);
+    mapping.put("id", Type.INTEGER);
+    final IndexReader r = UninvertingReader.wrap(writer.getReader(), mapping);
+    writer.shutdown();
+    if (VERBOSE) {
+      System.out.println("  reader=" + r);
+    }
+    
+    final IndexSearcher s = newSearcher(r, false);
+    final int ITERS = atLeast(100);
+    for(int iter=0;iter<ITERS;iter++) {
+      final boolean reverse = random.nextBoolean();
+
+      final TopFieldDocs hits;
+      final SortField sf;
+      final boolean sortMissingLast;
+      final boolean missingIsNull;
+      sf = new SortField("stringdv", SortField.Type.STRING, reverse);
+      sortMissingLast = random().nextBoolean();
+      missingIsNull = true;
+
+      if (sortMissingLast) {
+        sf.setMissingValue(SortField.STRING_LAST);
+      }
+      
+      final Sort sort;
+      if (random.nextBoolean()) {
+        sort = new Sort(sf);
+      } else {
+        sort = new Sort(sf, SortField.FIELD_DOC);
+      }
+      final int hitCount = TestUtil.nextInt(random, 1, r.maxDoc() + 20);
+      final RandomFilter f = new RandomFilter(random, random.nextFloat(), docValues);
+      int queryType = random.nextInt(3);
+      if (queryType == 0) {
+        // force out of order
+        BooleanQuery bq = new BooleanQuery();
+        // Add a Query with SHOULD, since bw.scorer() returns BooleanScorer2
+        // which delegates to BS if there are no mandatory clauses.
+        bq.add(new MatchAllDocsQuery(), Occur.SHOULD);
+        // Set minNrShouldMatch to 1 so that BQ will not optimize rewrite to return
+        // the clause instead of BQ.
+        bq.setMinimumNumberShouldMatch(1);
+        hits = s.search(bq, f, hitCount, sort, random.nextBoolean(), random.nextBoolean());
+      } else if (queryType == 1) {
+        hits = s.search(new ConstantScoreQuery(f),
+                        null, hitCount, sort, random.nextBoolean(), random.nextBoolean());
+      } else {
+        hits = s.search(new MatchAllDocsQuery(),
+                        f, hitCount, sort, random.nextBoolean(), random.nextBoolean());
+      }
+
+      if (VERBOSE) {
+        System.out.println("\nTEST: iter=" + iter + " " + hits.totalHits + " hits; topN=" + hitCount + "; reverse=" + reverse + "; sortMissingLast=" + sortMissingLast + " sort=" + sort);
+      }
+
+      // Compute expected results:
+      Collections.sort(f.matchValues, new Comparator<BytesRef>() {
+          @Override
+          public int compare(BytesRef a, BytesRef b) {
+            if (a == null) {
+              if (b == null) {
+                return 0;
+              }
+              if (sortMissingLast) {
+                return 1;
+              } else {
+                return -1;
+              }
+            } else if (b == null) {
+              if (sortMissingLast) {
+                return -1;
+              } else {
+                return 1;
+              }
+            } else {
+              return a.compareTo(b);
+            }
+          }
+        });
+
+      if (reverse) {
+        Collections.reverse(f.matchValues);
+      }
+      final List<BytesRef> expected = f.matchValues;
+      if (VERBOSE) {
+        System.out.println("  expected:");
+        for(int idx=0;idx<expected.size();idx++) {
+          BytesRef br = expected.get(idx);
+          if (br == null && missingIsNull == false) {
+            br = new BytesRef();
+          }
+          System.out.println("    " + idx + ": " + (br == null ? "<missing>" : br.utf8ToString()));
+          if (idx == hitCount-1) {
+            break;
+          }
+        }
+      }
+      
+      if (VERBOSE) {
+        System.out.println("  actual:");
+        for(int hitIDX=0;hitIDX<hits.scoreDocs.length;hitIDX++) {
+          final FieldDoc fd = (FieldDoc) hits.scoreDocs[hitIDX];
+          BytesRef br = (BytesRef) fd.fields[0];
+
+          System.out.println("    " + hitIDX + ": " + (br == null ? "<missing>" : br.utf8ToString()) + " id=" + s.doc(fd.doc).get("id"));
+        }
+      }
+      for(int hitIDX=0;hitIDX<hits.scoreDocs.length;hitIDX++) {
+        final FieldDoc fd = (FieldDoc) hits.scoreDocs[hitIDX];
+        BytesRef br = expected.get(hitIDX);
+        if (br == null && missingIsNull == false) {
+          br = new BytesRef();
+        }
+
+        // Normally, the old codecs (that don't support
+        // docsWithField via doc values) will always return
+        // an empty BytesRef for the missing case; however,
+        // if all docs in a given segment were missing, in
+        // that case it will return null!  So we must map
+        // null here, too:
+        BytesRef br2 = (BytesRef) fd.fields[0];
+        if (br2 == null && missingIsNull == false) {
+          br2 = new BytesRef();
+        }
+        
+        assertEquals(br, br2);
+      }
+    }
+
+    r.close();
+    dir.close();
+  }
+  
+  private static class RandomFilter extends Filter {
+    private final Random random;
+    private float density;
+    private final List<BytesRef> docValues;
+    public final List<BytesRef> matchValues = Collections.synchronizedList(new ArrayList<BytesRef>());
+
+    // density should be 0.0 ... 1.0
+    public RandomFilter(Random random, float density, List<BytesRef> docValues) {
+      this.random = random;
+      this.density = density;
+      this.docValues = docValues;
+    }
+
+    @Override
+    public DocIdSet getDocIdSet(AtomicReaderContext context, Bits acceptDocs) throws IOException {
+      final int maxDoc = context.reader().maxDoc();
+      final NumericDocValues idSource = DocValues.getNumeric(context.reader(), "id");
+      assertNotNull(idSource);
+      final FixedBitSet bits = new FixedBitSet(maxDoc);
+      for(int docID=0;docID<maxDoc;docID++) {
+        if (random.nextFloat() <= density && (acceptDocs == null || acceptDocs.get(docID))) {
+          bits.set(docID);
+          //System.out.println("  acc id=" + idSource.getInt(docID) + " docID=" + docID);
+          matchValues.add(docValues.get((int) idSource.get(docID)));
+        }
+      }
+
+      return bits;
+    }
+  }
+}

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheVsDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheVsDocValues.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheVsDocValues.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheVsDocValues.java Thu Jun  5 15:54:49 2014
@@ -200,8 +200,7 @@ public class TestFieldCacheVsDocValues e
     BinaryDocValues s = FieldCache.DEFAULT.getTerms(ar, "field", false);
     for(int docID=0;docID<docBytes.size();docID++) {
       StoredDocument doc = ar.document(docID);
-      BytesRef bytes = new BytesRef();
-      s.get(docID, bytes);
+      BytesRef bytes = s.get(docID);
       byte[] expected = docBytes.get(Integer.parseInt(doc.get("id")));
       assertEquals(expected.length, bytes.length);
       assertEquals(new BytesRef(expected), bytes);
@@ -272,8 +271,7 @@ public class TestFieldCacheVsDocValues e
     BinaryDocValues s = FieldCache.DEFAULT.getTerms(ar, "field", false);
     for(int docID=0;docID<docBytes.size();docID++) {
       StoredDocument doc = ar.document(docID);
-      BytesRef bytes = new BytesRef();
-      s.get(docID, bytes);
+      BytesRef bytes = s.get(docID);
       byte[] expected = docBytes.get(Integer.parseInt(doc.get("id")));
       assertEquals(expected.length, bytes.length);
       assertEquals(new BytesRef(expected), bytes);
@@ -495,7 +493,7 @@ public class TestFieldCacheVsDocValues e
     // can be null for the segment if no docs actually had any SortedDocValues
     // in this case FC.getDocTermsOrds returns EMPTY
     if (actual == null) {
-      assertEquals(DocValues.EMPTY_SORTED_SET, expected);
+      assertEquals(expected.getValueCount(), 0);
       return;
     }
     assertEquals(expected.getValueCount(), actual.getValueCount());
@@ -511,11 +509,9 @@ public class TestFieldCacheVsDocValues e
     }
     
     // compare ord dictionary
-    BytesRef expectedBytes = new BytesRef();
-    BytesRef actualBytes = new BytesRef();
     for (long i = 0; i < expected.getValueCount(); i++) {
-      expected.lookupOrd(i, expectedBytes);
-      actual.lookupOrd(i, actualBytes);
+      final BytesRef expectedBytes = BytesRef.deepCopyOf(expected.lookupOrd(i));
+      final BytesRef actualBytes = actual.lookupOrd(i);
       assertEquals(expectedBytes, actualBytes);
     }
     

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheWithThreads.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheWithThreads.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheWithThreads.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestFieldCacheWithThreads.java Thu Jun  5 15:54:49 2014
@@ -90,8 +90,6 @@ public class TestFieldCacheWithThreads e
               SortedDocValues sdv = FieldCache.DEFAULT.getTermsIndex(ar, "sorted");
               startingGun.await();
               int iters = atLeast(1000);
-              BytesRef scratch = new BytesRef();
-              BytesRef scratch2 = new BytesRef();
               for(int iter=0;iter<iters;iter++) {
                 int docID = threadRandom.nextInt(numDocs);
                 switch(threadRandom.nextInt(4)) {
@@ -108,11 +106,10 @@ public class TestFieldCacheWithThreads e
                   assertEquals(numbers.get(docID).longValue(), FieldCache.DEFAULT.getNumerics(ar, "number", FieldCache.NUMERIC_UTILS_DOUBLE_PARSER, false).get(docID));
                   break;
                 }
-                bdv.get(docID, scratch);
-                assertEquals(binary.get(docID), scratch);
-                // Cannot share a single scratch against two "sources":
-                sdv.get(docID, scratch2);
-                assertEquals(sorted.get(docID), scratch2);
+                BytesRef term = bdv.get(docID);
+                assertEquals(binary.get(docID), term);
+                term = sdv.get(docID);
+                assertEquals(sorted.get(docID), term);
               }
             } catch (Exception e) {
               throw new RuntimeException(e);
@@ -207,12 +204,11 @@ public class TestFieldCacheWithThreads e
             while(System.currentTimeMillis() < END_TIME) {
               final SortedDocValues source;
               source = stringDVDirect;
-              final BytesRef scratch = new BytesRef();
 
               for(int iter=0;iter<100;iter++) {
                 final int docID = random.nextInt(sr.maxDoc());
-                source.get(docID, scratch);
-                assertEquals(docValues.get((int) docIDToID.get(docID)), scratch);
+                BytesRef term = source.get(docID);
+                assertEquals(docValues.get((int) docIDToID.get(docID)), term);
               }
             }
           }

Modified: lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestUninvertingReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestUninvertingReader.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestUninvertingReader.java (original)
+++ lucene/dev/trunk/lucene/misc/src/test/org/apache/lucene/uninverting/TestUninvertingReader.java Thu Jun  5 15:54:49 2014
@@ -72,11 +72,10 @@ public class TestUninvertingReader exten
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(-3, NumericUtils.prefixCodedToInt(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(5, NumericUtils.prefixCodedToInt(value));
     
     ir.close();
@@ -117,11 +116,10 @@ public class TestUninvertingReader exten
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(Float.floatToRawIntBits(-3f), NumericUtils.prefixCodedToInt(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(Float.floatToRawIntBits(5f), NumericUtils.prefixCodedToInt(value));
     
     ir.close();
@@ -161,11 +159,10 @@ public class TestUninvertingReader exten
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(-3, NumericUtils.prefixCodedToLong(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(5, NumericUtils.prefixCodedToLong(value));
     
     ir.close();
@@ -205,11 +202,10 @@ public class TestUninvertingReader exten
     assertEquals(1, v.nextOrd());
     assertEquals(SortedSetDocValues.NO_MORE_ORDS, v.nextOrd());
     
-    BytesRef value = new BytesRef();
-    v.lookupOrd(0, value);
+    BytesRef value = v.lookupOrd(0);
     assertEquals(Double.doubleToRawLongBits(-3d), NumericUtils.prefixCodedToLong(value));
     
-    v.lookupOrd(1, value);
+    value = v.lookupOrd(1);
     assertEquals(Double.doubleToRawLongBits(5d), NumericUtils.prefixCodedToLong(value));
     
     ir.close();

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/docvalues/DocTermsIndexDocValues.java Thu Jun  5 15:54:49 2014
@@ -40,7 +40,6 @@ public abstract class DocTermsIndexDocVa
   protected final SortedDocValues termsIndex;
   protected final ValueSource vs;
   protected final MutableValueStr val = new MutableValueStr();
-  protected final BytesRef spare = new BytesRef();
   protected final CharsRef spareChars = new CharsRef();
 
   public DocTermsIndexDocValues(ValueSource vs, AtomicReaderContext context, String field) throws IOException {
@@ -71,17 +70,18 @@ public abstract class DocTermsIndexDocVa
 
   @Override
   public boolean bytesVal(int doc, BytesRef target) {
-    termsIndex.get(doc, target);
+    target.length = 0;
+    target.copyBytes(termsIndex.get(doc));
     return target.length > 0;
   }
 
   @Override
   public String strVal(int doc) {
-    termsIndex.get(doc, spare);
-    if (spare.length == 0) {
+    final BytesRef term = termsIndex.get(doc);
+    if (term.length == 0) {
       return null;
     }
-    UnicodeUtil.UTF8toUTF16(spare, spareChars);
+    UnicodeUtil.UTF8toUTF16(term, spareChars);
     return spareChars.toString();
   }
 
@@ -149,14 +149,10 @@ public abstract class DocTermsIndexDocVa
       @Override
       public void fillValue(int doc) {
         int ord = termsIndex.getOrd(doc);
-        if (ord == -1) {
-          mval.value.bytes = BytesRef.EMPTY_BYTES;
-          mval.value.offset = 0;
-          mval.value.length = 0;
-          mval.exists = false;
-        } else {
-          termsIndex.lookupOrd(ord, mval.value);
-          mval.exists = true;
+        mval.value.length = 0;
+        mval.exists = ord >= 0;
+        if (mval.exists) {
+          mval.value.copyBytes(termsIndex.lookupOrd(ord));
         }
       }
     };

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/BytesRefFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/BytesRefFieldSource.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/BytesRefFieldSource.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/BytesRefFieldSource.java Thu Jun  5 15:54:49 2014
@@ -59,7 +59,7 @@ public class BytesRefFieldSource extends
 
         @Override
         public boolean bytesVal(int doc, BytesRef target) {
-          binaryValues.get(doc, target);
+          target.copyBytes(binaryValues.get(doc));
           return target.length > 0;
         }
 
@@ -93,13 +93,8 @@ public class BytesRefFieldSource extends
             @Override
             public void fillValue(int doc) {
               mval.exists = docsWithField.get(doc);
-              if (mval.exists) {
-                binaryValues.get(doc, mval.value);
-              } else {
-                mval.value.bytes = BytesRef.EMPTY_BYTES;
-                mval.value.offset = 0;
-                mval.value.length = 0;
-              }
+              mval.value.length = 0;
+              mval.value.copyBytes(binaryValues.get(doc));
             }
           };
         }

Modified: lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/JoinDocFreqValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/JoinDocFreqValueSource.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/JoinDocFreqValueSource.java (original)
+++ lucene/dev/trunk/lucene/queries/src/java/org/apache/lucene/queries/function/valuesource/JoinDocFreqValueSource.java Thu Jun  5 15:54:49 2014
@@ -62,14 +62,13 @@ public class JoinDocFreqValueSource exte
     final TermsEnum termsEnum = t == null ? TermsEnum.EMPTY : t.iterator(null);
     
     return new IntDocValues(this) {
-      final BytesRef ref = new BytesRef();
 
       @Override
       public int intVal(int doc) 
       {
         try {
-          terms.get(doc, ref);
-          if (termsEnum.seekExact(ref)) {
+          final BytesRef term = terms.get(doc);
+          if (termsEnum.seekExact(term)) {
             return termsEnum.docFreq();
           } else {
             return 0;

Modified: lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java (original)
+++ lucene/dev/trunk/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/SlowCollatedStringComparator.java Thu Jun  5 15:54:49 2014
@@ -45,7 +45,6 @@ public final class SlowCollatedStringCom
   final Collator collator;
   private String bottom;
   private String topValue;
-  private final BytesRef tempBR = new BytesRef();
 
   public SlowCollatedStringComparator(int numHits, String field, Collator collator) {
     values = new String[numHits];
@@ -70,8 +69,8 @@ public final class SlowCollatedStringCom
 
   @Override
   public int compareBottom(int doc) {
-    currentDocTerms.get(doc, tempBR);
-    final String val2 = tempBR.length == 0 && docsWithField.get(doc) == false ? null : tempBR.utf8ToString();
+    final BytesRef term = currentDocTerms.get(doc);
+    final String val2 = term.length == 0 && docsWithField.get(doc) == false ? null : term.utf8ToString();
     if (bottom == null) {
       if (val2 == null) {
         return 0;
@@ -85,11 +84,11 @@ public final class SlowCollatedStringCom
 
   @Override
   public void copy(int slot, int doc) {
-    currentDocTerms.get(doc, tempBR);
-    if (tempBR.length == 0 && docsWithField.get(doc) == false) {
+    final BytesRef term = currentDocTerms.get(doc);
+    if (term.length == 0 && docsWithField.get(doc) == false) {
       values[slot] = null;
     } else {
-      values[slot] = tempBR.utf8ToString();
+      values[slot] = term.utf8ToString();
     }
   }
 
@@ -131,12 +130,12 @@ public final class SlowCollatedStringCom
 
   @Override
   public int compareTop(int doc) {
-    currentDocTerms.get(doc, tempBR);
+    final BytesRef term = currentDocTerms.get(doc);
     final String docValue;
-    if (tempBR.length == 0 && docsWithField.get(doc) == false) {
+    if (term.length == 0 && docsWithField.get(doc) == false) {
       docValue = null;
     } else {
-      docValue = tempBR.utf8ToString();
+      docValue = term.utf8ToString();
     }
     return compareValues(topValue, docValue);
   }

Modified: lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java (original)
+++ lucene/dev/trunk/lucene/spatial/src/java/org/apache/lucene/spatial/serialized/SerializedDVStrategy.java Thu Jun  5 15:54:49 2014
@@ -215,7 +215,7 @@ public class SerializedDVStrategy extend
 
         boolean fillBytes(int doc) {
           if (bytesRefDoc != doc) {
-            docValues.get(doc, bytesRef);
+            bytesRef.copyBytes(docValues.get(doc));
             bytesRefDoc = doc;
           }
           return bytesRef.length != 0;

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingInfixSuggester.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingInfixSuggester.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingInfixSuggester.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/AnalyzingInfixSuggester.java Thu Jun  5 15:54:49 2014
@@ -488,17 +488,15 @@ public class AnalyzingInfixSuggester ext
     BinaryDocValues payloadsDV = MultiDocValues.getBinaryValues(searcher.getIndexReader(), "payloads");
     List<AtomicReaderContext> leaves = searcher.getIndexReader().leaves();
     List<LookupResult> results = new ArrayList<>();
-    BytesRef scratch = new BytesRef();
     for (int i=0;i<hits.scoreDocs.length;i++) {
       FieldDoc fd = (FieldDoc) hits.scoreDocs[i];
-      textDV.get(fd.doc, scratch);
-      String text = scratch.utf8ToString();
+      BytesRef term = textDV.get(fd.doc);
+      String text = term.utf8ToString();
       long score = (Long) fd.fields[0];
 
       BytesRef payload;
       if (payloadsDV != null) {
-        payload = new BytesRef();
-        payloadsDV.get(fd.doc, payload);
+        payload = BytesRef.deepCopyOf(payloadsDV.get(fd.doc));
       } else {
         payload = null;
       }
@@ -512,8 +510,7 @@ public class AnalyzingInfixSuggester ext
         contextsDV.setDocument(fd.doc - leaves.get(segment).docBase);
         long ord;
         while ((ord = contextsDV.nextOrd()) != SortedSetDocValues.NO_MORE_ORDS) {
-          BytesRef context = new BytesRef();
-          contextsDV.lookupOrd(ord, context);
+          BytesRef context = BytesRef.deepCopyOf(contextsDV.lookupOrd(ord));
           contexts.add(context);
         }
       } else {

Modified: lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/BlendedInfixSuggester.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/BlendedInfixSuggester.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/BlendedInfixSuggester.java (original)
+++ lucene/dev/trunk/lucene/suggest/src/java/org/apache/lucene/search/suggest/analyzing/BlendedInfixSuggester.java Thu Jun  5 15:54:49 2014
@@ -155,18 +155,15 @@ public class BlendedInfixSuggester exten
     // we reduce the num to the one initially requested
     int actualNum = num / numFactor;
 
-    BytesRef scratch = new BytesRef();
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       FieldDoc fd = (FieldDoc) hits.scoreDocs[i];
 
-      textDV.get(fd.doc, scratch);
-      String text = scratch.utf8ToString();
+      final String text = textDV.get(fd.doc).utf8ToString();
       long weight = (Long) fd.fields[0];
 
       BytesRef payload;
       if (payloadsDV != null) {
-        payload = new BytesRef();
-        payloadsDV.get(fd.doc, payload);
+        payload = BytesRef.deepCopyOf(payloadsDV.get(fd.doc));
       } else {
         payload = null;
       }

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/AssertingAtomicReader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/AssertingAtomicReader.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/AssertingAtomicReader.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/AssertingAtomicReader.java Thu Jun  5 15:54:49 2014
@@ -449,11 +449,11 @@ public class AssertingAtomicReader exten
     }
 
     @Override
-    public void get(int docID, BytesRef result) {
+    public BytesRef get(int docID) {
       assert docID >= 0 && docID < maxDoc;
+      final BytesRef result = in.get(docID);
       assert result.isValid();
-      in.get(docID, result);
-      assert result.isValid();
+      return result;
     }
   }
   
@@ -479,11 +479,11 @@ public class AssertingAtomicReader exten
     }
 
     @Override
-    public void lookupOrd(int ord, BytesRef result) {
+    public BytesRef lookupOrd(int ord) {
       assert ord >= 0 && ord < valueCount;
+      final BytesRef result = in.lookupOrd(ord);
       assert result.isValid();
-      in.lookupOrd(ord, result);
-      assert result.isValid();
+      return result;
     }
 
     @Override
@@ -494,11 +494,11 @@ public class AssertingAtomicReader exten
     }
 
     @Override
-    public void get(int docID, BytesRef result) {
+    public BytesRef get(int docID) {
       assert docID >= 0 && docID < maxDoc;
+      final BytesRef result = in.get(docID);
       assert result.isValid();
-      in.get(docID, result);
-      assert result.isValid();
+      return result;
     }
 
     @Override
@@ -543,11 +543,11 @@ public class AssertingAtomicReader exten
     }
 
     @Override
-    public void lookupOrd(long ord, BytesRef result) {
+    public BytesRef lookupOrd(long ord) {
       assert ord >= 0 && ord < valueCount;
+      final BytesRef result = in.lookupOrd(ord);
       assert result.isValid();
-      in.lookupOrd(ord, result);
-      assert result.isValid();
+      return result;
     }
 
     @Override

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/BaseDocValuesFormatTestCase.java Thu Jun  5 15:54:49 2014
@@ -206,11 +206,10 @@ public abstract class BaseDocValuesForma
       assertEquals(text, hitDoc.get("fieldname"));
       assert ireader.leaves().size() == 1;
       BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv1");
-      BytesRef scratch = new BytesRef();
-      dv.get(hits.scoreDocs[i].doc, scratch);
+      BytesRef scratch = dv.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef(longTerm), scratch);
       dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv2");
-      dv.get(hits.scoreDocs[i].doc, scratch);
+      scratch = dv.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef(text), scratch);
     }
 
@@ -238,7 +237,6 @@ public abstract class BaseDocValuesForma
     Query query = new TermQuery(new Term("fieldname", "text"));
     TopDocs hits = isearcher.search(query, null, 1);
     assertEquals(1, hits.totalHits);
-    BytesRef scratch = new BytesRef();
     // Iterate through the results:
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       StoredDocument hitDoc = isearcher.doc(hits.scoreDocs[i].doc);
@@ -247,7 +245,7 @@ public abstract class BaseDocValuesForma
       NumericDocValues dv = ireader.leaves().get(0).reader().getNumericDocValues("dv1");
       assertEquals(5, dv.get(hits.scoreDocs[i].doc));
       BinaryDocValues dv2 = ireader.leaves().get(0).reader().getBinaryDocValues("dv2");
-      dv2.get(hits.scoreDocs[i].doc, scratch);
+      BytesRef scratch = dv2.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef("hello world"), scratch);
     }
 
@@ -276,7 +274,6 @@ public abstract class BaseDocValuesForma
     Query query = new TermQuery(new Term("fieldname", "text"));
     TopDocs hits = isearcher.search(query, null, 1);
     assertEquals(1, hits.totalHits);
-    BytesRef scratch = new BytesRef();
     // Iterate through the results:
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       StoredDocument hitDoc = isearcher.doc(hits.scoreDocs[i].doc);
@@ -284,12 +281,12 @@ public abstract class BaseDocValuesForma
       assert ireader.leaves().size() == 1;
       SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv1");
       int ord = dv.getOrd(0);
-      dv.lookupOrd(ord, scratch);
+      BytesRef scratch = dv.lookupOrd(ord);
       assertEquals(new BytesRef("hello hello"), scratch);
       NumericDocValues dv2 = ireader.leaves().get(0).reader().getNumericDocValues("dv2");
       assertEquals(5, dv2.get(hits.scoreDocs[i].doc));
       BinaryDocValues dv3 = ireader.leaves().get(0).reader().getBinaryDocValues("dv3");
-      dv3.get(hits.scoreDocs[i].doc, scratch);
+      scratch = dv3.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef("hello world"), scratch);
     }
 
@@ -326,12 +323,12 @@ public abstract class BaseDocValuesForma
       assert ireader.leaves().size() == 1;
       SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv2");
       int ord = dv.getOrd(0);
-      dv.lookupOrd(ord, scratch);
+      scratch = dv.lookupOrd(ord);
       assertEquals(new BytesRef("hello hello"), scratch);
       NumericDocValues dv2 = ireader.leaves().get(0).reader().getNumericDocValues("dv3");
       assertEquals(5, dv2.get(hits.scoreDocs[i].doc));
       BinaryDocValues dv3 = ireader.leaves().get(0).reader().getBinaryDocValues("dv1");
-      dv3.get(hits.scoreDocs[i].doc, scratch);
+      scratch = dv3.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef("hello world"), scratch);
     }
 
@@ -480,14 +477,13 @@ public abstract class BaseDocValuesForma
     Query query = new TermQuery(new Term("fieldname", "text"));
     TopDocs hits = isearcher.search(query, null, 1);
     assertEquals(1, hits.totalHits);
-    BytesRef scratch = new BytesRef();
     // Iterate through the results:
     for (int i = 0; i < hits.scoreDocs.length; i++) {
       StoredDocument hitDoc = isearcher.doc(hits.scoreDocs[i].doc);
       assertEquals(text, hitDoc.get("fieldname"));
       assert ireader.leaves().size() == 1;
       BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
-      dv.get(hits.scoreDocs[i].doc, scratch);
+      BytesRef scratch = dv.get(hits.scoreDocs[i].doc);
       assertEquals(new BytesRef("hello world"), scratch);
     }
 
@@ -527,7 +523,7 @@ public abstract class BaseDocValuesForma
       } else {
         expected = "hello 2";
       }
-      dv.get(i, scratch);
+      scratch = dv.get(i);
       assertEquals(expected, scratch.utf8ToString());
     }
 
@@ -564,7 +560,7 @@ public abstract class BaseDocValuesForma
       assertEquals(text, hitDoc.get("fieldname"));
       assert ireader.leaves().size() == 1;
       SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-      dv.lookupOrd(dv.getOrd(hits.scoreDocs[i].doc), scratch);
+      scratch = dv.lookupOrd(dv.getOrd(hits.scoreDocs[i].doc));
       assertEquals(new BytesRef("hello world"), scratch);
     }
 
@@ -593,9 +589,9 @@ public abstract class BaseDocValuesForma
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     BytesRef scratch = new BytesRef();
-    dv.lookupOrd(dv.getOrd(0), scratch);
+    scratch = dv.lookupOrd(dv.getOrd(0));
     assertEquals("hello world 1", scratch.utf8ToString());
-    dv.lookupOrd(dv.getOrd(1), scratch);
+    scratch = dv.lookupOrd(dv.getOrd(1));
     assertEquals("hello world 2", scratch.utf8ToString());
 
     ireader.close();
@@ -626,12 +622,11 @@ public abstract class BaseDocValuesForma
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     assertEquals(2, dv.getValueCount());
-    BytesRef scratch = new BytesRef();
     assertEquals(0, dv.getOrd(0));
-    dv.lookupOrd(0, scratch);
+    BytesRef scratch = dv.lookupOrd(0);
     assertEquals("hello world 1", scratch.utf8ToString());
     assertEquals(1, dv.getOrd(1));
-    dv.lookupOrd(1, scratch);
+    scratch = dv.lookupOrd(1);
     assertEquals("hello world 2", scratch.utf8ToString());
     assertEquals(0, dv.getOrd(2));
 
@@ -663,10 +658,9 @@ public abstract class BaseDocValuesForma
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     assertEquals(2, dv.getValueCount()); // 2 ords
-    BytesRef scratch = new BytesRef();
-    dv.lookupOrd(0, scratch);
+    BytesRef scratch = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello world 1"), scratch);
-    dv.lookupOrd(1, scratch);
+    scratch = dv.lookupOrd(1);
     assertEquals(new BytesRef("hello world 2"), scratch);
     for(int i=0;i<2;i++) {
       StoredDocument doc2 = ireader.leaves().get(0).reader().document(i);
@@ -676,7 +670,7 @@ public abstract class BaseDocValuesForma
       } else {
         expected = "hello world 2";
       }
-      dv.lookupOrd(dv.getOrd(i), scratch);
+      scratch = dv.lookupOrd(dv.getOrd(i));
       assertEquals(expected, scratch.utf8ToString());
     }
 
@@ -712,8 +706,7 @@ public abstract class BaseDocValuesForma
     } else {
       assertEquals(0, dv.getOrd(0));
       assertEquals(1, dv.getValueCount());
-      BytesRef ref = new BytesRef();
-      dv.lookupOrd(0, ref);
+      BytesRef ref = dv.lookupOrd(0);
       assertEquals(new BytesRef(), ref);
     }
     
@@ -737,8 +730,7 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals(new BytesRef("hello\nworld\r1"), scratch);
 
     ireader.close();
@@ -763,13 +755,12 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.lookupOrd(dv.getOrd(0), scratch);
+    BytesRef scratch = dv.lookupOrd(dv.getOrd(0));
     assertEquals(new BytesRef("hello world 2"), scratch);
     if (defaultCodecSupportsDocsWithField()) {
       assertEquals(-1, dv.getOrd(1));
     }
-    dv.get(1, scratch);
+    scratch = dv.get(1);
     assertEquals(new BytesRef(""), scratch);
     ireader.close();
     directory.close();
@@ -866,10 +857,9 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     SortedDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-    BytesRef scratch = new BytesRef();
     assertEquals(0, dv.getOrd(0));
     assertEquals(0, dv.getOrd(1));
-    dv.lookupOrd(dv.getOrd(0), scratch);
+    BytesRef scratch = dv.lookupOrd(dv.getOrd(0));
     assertEquals("", scratch.utf8ToString());
 
     ireader.close();
@@ -896,10 +886,9 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals("", scratch.utf8ToString());
-    dv.get(1, scratch);
+    scratch = dv.get(1);
     assertEquals("", scratch.utf8ToString());
 
     ireader.close();
@@ -925,8 +914,7 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals(new BytesRef(bytes), scratch);
 
     ireader.close();
@@ -952,8 +940,7 @@ public abstract class BaseDocValuesForma
     IndexReader ireader = DirectoryReader.open(directory); // read-only=true
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals(new BytesRef(bytes), scratch);
     ireader.close();
     directory.close();
@@ -976,8 +963,7 @@ public abstract class BaseDocValuesForma
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
     byte mybytes[] = new byte[20];
-    BytesRef scratch = new BytesRef(mybytes);
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals("boo!", scratch.utf8ToString());
     assertFalse(scratch.bytes == mybytes);
 
@@ -1002,8 +988,7 @@ public abstract class BaseDocValuesForma
     assert ireader.leaves().size() == 1;
     BinaryDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
     byte mybytes[] = new byte[20];
-    BytesRef scratch = new BytesRef(mybytes);
-    dv.get(0, scratch);
+    BytesRef scratch = dv.get(0);
     assertEquals("boo!", scratch.utf8ToString());
     assertFalse(scratch.bytes == mybytes);
 
@@ -1011,72 +996,6 @@ public abstract class BaseDocValuesForma
     directory.close();
   }
   
-  public void testCodecUsesOwnBytesEachTime() throws IOException {
-    Analyzer analyzer = new MockAnalyzer(random());
-
-    Directory directory = newDirectory();
-    IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer);
-    conf.setMergePolicy(newLogMergePolicy());
-    RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
-    Document doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("foo!")));
-    iwriter.addDocument(doc);
-    doc = new Document();
-    doc.add(new BinaryDocValuesField("dv", new BytesRef("bar!")));
-    iwriter.addDocument(doc);
-    iwriter.shutdown();
-    
-    // Now search the index:
-    IndexReader ireader = DirectoryReader.open(directory); // read-only=true
-    assert ireader.leaves().size() == 1;
-    BinaryDocValues dv = ireader.leaves().get(0).reader().getBinaryDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
-    assertEquals("foo!", scratch.utf8ToString());
-    
-    BytesRef scratch2 = new BytesRef();
-    dv.get(1, scratch2);
-    assertEquals("bar!", scratch2.utf8ToString());
-    // check scratch is still valid
-    assertEquals("foo!", scratch.utf8ToString());
-
-    ireader.close();
-    directory.close();
-  }
-  
-  public void testCodecUsesOwnSortedBytesEachTime() throws IOException {
-    Analyzer analyzer = new MockAnalyzer(random());
-
-    Directory directory = newDirectory();
-    IndexWriterConfig conf = newIndexWriterConfig(TEST_VERSION_CURRENT, analyzer);
-    conf.setMergePolicy(newLogMergePolicy());
-    RandomIndexWriter iwriter = new RandomIndexWriter(random(), directory, conf);
-    Document doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("foo!")));
-    iwriter.addDocument(doc);
-    doc = new Document();
-    doc.add(new SortedDocValuesField("dv", new BytesRef("bar!")));
-    iwriter.addDocument(doc);
-    iwriter.shutdown();
-    
-    // Now search the index:
-    IndexReader ireader = DirectoryReader.open(directory); // read-only=true
-    assert ireader.leaves().size() == 1;
-    BinaryDocValues dv = ireader.leaves().get(0).reader().getSortedDocValues("dv");
-    BytesRef scratch = new BytesRef();
-    dv.get(0, scratch);
-    assertEquals("foo!", scratch.utf8ToString());
-    
-    BytesRef scratch2 = new BytesRef();
-    dv.get(1, scratch2);
-    assertEquals("bar!", scratch2.utf8ToString());
-    // check scratch is still valid
-    assertEquals("foo!", scratch.utf8ToString());
-
-    ireader.close();
-    directory.close();
-  }
-  
   /*
    * Simple test case to show how to use the API
    */
@@ -1181,11 +1100,10 @@ public abstract class BaseDocValuesForma
     SortedDocValues docValues = MultiDocValues.getSortedValues(reader, "field");
     int[] sort = hash.sort(BytesRef.getUTF8SortedAsUnicodeComparator());
     BytesRef expected = new BytesRef();
-    BytesRef actual = new BytesRef();
     assertEquals(hash.size(), docValues.getValueCount());
     for (int i = 0; i < hash.size(); i++) {
       hash.get(sort[i], expected);
-      docValues.lookupOrd(i, actual);
+      final BytesRef actual = docValues.lookupOrd(i);
       assertEquals(expected.utf8ToString(), actual.utf8ToString());
       int ord = docValues.lookupTerm(expected);
       assertEquals(i, ord);
@@ -1198,7 +1116,7 @@ public abstract class BaseDocValuesForma
       DocsEnum termDocsEnum = slowR.termDocsEnum(new Term("id", entry.getKey()));
       int docId = termDocsEnum.nextDoc();
       expected = new BytesRef(entry.getValue());
-      docValues.get(docId, actual);
+      final BytesRef actual = docValues.get(docId);
       assertEquals(expected, actual);
     }
 
@@ -1357,8 +1275,7 @@ public abstract class BaseDocValuesForma
       BinaryDocValues docValues = r.getBinaryDocValues("dv");
       for (int i = 0; i < r.maxDoc(); i++) {
         BytesRef binaryValue = r.document(i).getBinaryValue("stored");
-        BytesRef scratch = new BytesRef();
-        docValues.get(i, scratch);
+        BytesRef scratch = docValues.get(i);
         assertEquals(binaryValue, scratch);
       }
     }
@@ -1428,8 +1345,7 @@ public abstract class BaseDocValuesForma
       BinaryDocValues docValues = r.getSortedDocValues("dv");
       for (int i = 0; i < r.maxDoc(); i++) {
         BytesRef binaryValue = r.document(i).getBinaryValue("stored");
-        BytesRef scratch = new BytesRef();
-        docValues.get(i, scratch);
+        BytesRef scratch = docValues.get(i);
         assertEquals(binaryValue, scratch);
       }
     }
@@ -1470,8 +1386,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
 
     ireader.close();
@@ -1497,8 +1412,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     dv = getOnlySegmentReader(ireader).getSortedSetDocValues("field2");
@@ -1507,7 +1421,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    dv.lookupOrd(0, bytes);
+    bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("world"), bytes);
     
     ireader.close();
@@ -1542,15 +1456,14 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     dv.setDocument(1);
     assertEquals(1, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    dv.lookupOrd(1, bytes);
+    bytes = dv.lookupOrd(1);
     assertEquals(new BytesRef("world"), bytes);   
 
     ireader.close();
@@ -1577,11 +1490,10 @@ public abstract class BaseDocValuesForma
     assertEquals(1, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
-    dv.lookupOrd(1, bytes);
+    bytes = dv.lookupOrd(1);
     assertEquals(new BytesRef("world"), bytes);
 
     ireader.close();
@@ -1608,11 +1520,10 @@ public abstract class BaseDocValuesForma
     assertEquals(1, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
-    dv.lookupOrd(1, bytes);
+    bytes = dv.lookupOrd(1);
     assertEquals(new BytesRef("world"), bytes);
 
     ireader.close();
@@ -1655,14 +1566,13 @@ public abstract class BaseDocValuesForma
     assertEquals(1, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("beer"), bytes);
     
-    dv.lookupOrd(1, bytes);
+    bytes = dv.lookupOrd(1);
     assertEquals(new BytesRef("hello"), bytes);
     
-    dv.lookupOrd(2, bytes);
+    bytes = dv.lookupOrd(2);
     assertEquals(new BytesRef("world"), bytes);
 
     ireader.close();
@@ -1694,8 +1604,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     ireader.close();
@@ -1729,8 +1638,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     ireader.close();
@@ -1763,8 +1671,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     ireader.close();
@@ -1798,8 +1705,7 @@ public abstract class BaseDocValuesForma
     assertEquals(0, dv.nextOrd());
     assertEquals(NO_MORE_ORDS, dv.nextOrd());
     
-    BytesRef bytes = new BytesRef();
-    dv.lookupOrd(0, bytes);
+    BytesRef bytes = dv.lookupOrd(0);
     assertEquals(new BytesRef("hello"), bytes);
     
     ireader.close();
@@ -1955,7 +1861,6 @@ public abstract class BaseDocValuesForma
     for (AtomicReaderContext context : ir.leaves()) {
       AtomicReader r = context.reader();
       SortedSetDocValues docValues = r.getSortedSetDocValues("dv");
-      BytesRef scratch = new BytesRef();
       for (int i = 0; i < r.maxDoc(); i++) {
         String stringValues[] = r.document(i).getValues("stored");
         if (docValues != null) {
@@ -1965,7 +1870,7 @@ public abstract class BaseDocValuesForma
           assert docValues != null;
           long ord = docValues.nextOrd();
           assert ord != NO_MORE_ORDS;
-          docValues.lookupOrd(ord, scratch);
+          BytesRef scratch = docValues.lookupOrd(ord);
           assertEquals(stringValues[j], scratch.utf8ToString());
         }
         assert docValues == null || docValues.nextOrd() == NO_MORE_ORDS;
@@ -2158,10 +2063,9 @@ public abstract class BaseDocValuesForma
     assertEquals(1, ir.leaves().size());
     AtomicReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
-    BytesRef ref = new BytesRef();
-    dv.get(0, ref);
+    BytesRef ref = dv.get(0);
     assertEquals(new BytesRef(), ref);
-    dv.get(1, ref);
+    ref = dv.get(1);
     assertEquals(new BytesRef(), ref);
     Bits docsWithField = ar.getDocsWithField("dv1");
     assertTrue(docsWithField.get(0));
@@ -2191,10 +2095,9 @@ public abstract class BaseDocValuesForma
     assertEquals(1, ir.leaves().size());
     AtomicReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
-    BytesRef ref = new BytesRef();
-    dv.get(0, ref);
+    BytesRef ref = dv.get(0);
     assertEquals(new BytesRef(), ref);
-    dv.get(1, ref);
+    ref = dv.get(1);
     assertEquals(new BytesRef(), ref);
     Bits docsWithField = ar.getDocsWithField("dv1");
     assertTrue(docsWithField.get(0));
@@ -2228,12 +2131,11 @@ public abstract class BaseDocValuesForma
     assertEquals(1, ir.leaves().size());
     AtomicReader ar = ir.leaves().get(0).reader();
     BinaryDocValues dv = ar.getBinaryDocValues("dv1");
-    BytesRef ref = new BytesRef();
-    dv.get(0, ref);
+    BytesRef ref = dv.get(0);
     assertEquals(new BytesRef(), ref);
-    dv.get(1, ref);
+    ref = dv.get(1);
     assertEquals(new BytesRef(), ref);
-    dv.get(2, ref);
+    ref = dv.get(2);
     assertEquals(new BytesRef("boo"), ref);
     Bits docsWithField = ar.getDocsWithField("dv1");
     assertTrue(docsWithField.get(0));
@@ -2308,10 +2210,9 @@ public abstract class BaseDocValuesForma
               NumericDocValues numerics = r.getNumericDocValues("dvNum");
               for (int j = 0; j < r.maxDoc(); j++) {
                 BytesRef binaryValue = r.document(j).getBinaryValue("storedBin");
-                BytesRef scratch = new BytesRef();
-                binaries.get(j, scratch);
+                BytesRef scratch = binaries.get(j);
                 assertEquals(binaryValue, scratch);
-                sorted.get(j, scratch);
+                scratch = sorted.get(j);
                 assertEquals(binaryValue, scratch);
                 String expected = r.document(j).get("storedNum");
                 assertEquals(Long.parseLong(expected), numerics.get(j));
@@ -2420,10 +2321,9 @@ public abstract class BaseDocValuesForma
                 BytesRef binaryValue = r.document(j).getBinaryValue("storedBin");
                 if (binaryValue != null) {
                   if (binaries != null) {
-                    BytesRef scratch = new BytesRef();
-                    binaries.get(j, scratch);
+                    BytesRef scratch = binaries.get(j);
                     assertEquals(binaryValue, scratch);
-                    sorted.get(j, scratch);
+                    scratch = sorted.get(j);
                     assertEquals(binaryValue, scratch);
                     assertTrue(binaryBits.get(j));
                     assertTrue(sortedBits.get(j));
@@ -2451,8 +2351,7 @@ public abstract class BaseDocValuesForma
                   for (int k = 0; k < values.length; k++) {
                     long ord = sortedSet.nextOrd();
                     assertTrue(ord != SortedSetDocValues.NO_MORE_ORDS);
-                    BytesRef value = new BytesRef();
-                    sortedSet.lookupOrd(ord, value);
+                    BytesRef value = sortedSet.lookupOrd(ord);
                     assertEquals(values[k], value.utf8ToString());
                   }
                   assertEquals(SortedSetDocValues.NO_MORE_ORDS, sortedSet.nextOrd());
@@ -2507,9 +2406,8 @@ public abstract class BaseDocValuesForma
 
       AtomicReader ar = SlowCompositeReaderWrapper.wrap(r);
       BinaryDocValues values = ar.getBinaryDocValues("field");
-      BytesRef result = new BytesRef();
       for(int j=0;j<5;j++) {
-        values.get(0, result);
+        BytesRef result = values.get(0);
         assertTrue(result.length == 0 || result.length == 1<<i);
       }
       ar.close();

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Thu Jun  5 15:54:49 2014
@@ -2223,12 +2223,10 @@ public abstract class LuceneTestCase ext
         BinaryDocValues leftValues = MultiDocValues.getBinaryValues(leftReader, field);
         BinaryDocValues rightValues = MultiDocValues.getBinaryValues(rightReader, field);
         if (leftValues != null && rightValues != null) {
-          BytesRef scratchLeft = new BytesRef();
-          BytesRef scratchRight = new BytesRef();
           for(int docID=0;docID<leftReader.maxDoc();docID++) {
-            leftValues.get(docID, scratchLeft);
-            rightValues.get(docID, scratchRight);
-            assertEquals(info, scratchLeft, scratchRight);
+            final BytesRef left = BytesRef.deepCopyOf(leftValues.get(docID));
+            final BytesRef right = rightValues.get(docID);
+            assertEquals(info, left, right);
           }
         } else {
           assertNull(info, leftValues);
@@ -2246,15 +2244,15 @@ public abstract class LuceneTestCase ext
           BytesRef scratchLeft = new BytesRef();
           BytesRef scratchRight = new BytesRef();
           for (int i = 0; i < leftValues.getValueCount(); i++) {
-            leftValues.lookupOrd(i, scratchLeft);
-            rightValues.lookupOrd(i, scratchRight);
-            assertEquals(info, scratchLeft, scratchRight);
+            final BytesRef left = BytesRef.deepCopyOf(leftValues.lookupOrd(i));
+            final BytesRef right = rightValues.lookupOrd(i);
+            assertEquals(info, left, right);
           }
           // bytes
           for(int docID=0;docID<leftReader.maxDoc();docID++) {
-            leftValues.get(docID, scratchLeft);
-            rightValues.get(docID, scratchRight);
-            assertEquals(info, scratchLeft, scratchRight);
+            final BytesRef left = BytesRef.deepCopyOf(leftValues.get(docID));
+            final BytesRef right = rightValues.get(docID);
+            assertEquals(info, left, right);
           }
         } else {
           assertNull(info, leftValues);
@@ -2269,12 +2267,10 @@ public abstract class LuceneTestCase ext
           // numOrds
           assertEquals(info, leftValues.getValueCount(), rightValues.getValueCount());
           // ords
-          BytesRef scratchLeft = new BytesRef();
-          BytesRef scratchRight = new BytesRef();
           for (int i = 0; i < leftValues.getValueCount(); i++) {
-            leftValues.lookupOrd(i, scratchLeft);
-            rightValues.lookupOrd(i, scratchRight);
-            assertEquals(info, scratchLeft, scratchRight);
+            final BytesRef left = BytesRef.deepCopyOf(leftValues.lookupOrd(i));
+            final BytesRef right = rightValues.lookupOrd(i);
+            assertEquals(info, left, right);
           }
           // ord lists
           for(int docID=0;docID<leftReader.maxDoc();docID++) {

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java Thu Jun  5 15:54:49 2014
@@ -50,7 +50,6 @@ public class FieldFacetAccumulator exten
   protected final boolean multiValued;
   protected final boolean numField;
   protected final boolean dateField;
-  protected final BytesRef value;
   protected SortedSetDocValues setValues;
   protected SortedDocValues sortValues; 
   protected NumericDocValues numValues; 
@@ -70,7 +69,6 @@ public class FieldFacetAccumulator exten
     this.numField = schemaField.getType().getNumericType()!=null;
     this.dateField = schemaField.getType().getClass().equals(TrieDateField.class);
     this.parent = parent;  
-    this.value = new BytesRef();
     this.parser = AnalyticsParsers.getParser(schemaField.getType().getClass());
   }
 
@@ -108,7 +106,7 @@ public class FieldFacetAccumulator exten
         int term;
         while ((term = (int)setValues.nextOrd()) != SortedSetDocValues.NO_MORE_ORDS) {
           exists = true;
-          setValues.lookupOrd(term, value);
+          final BytesRef value = setValues.lookupOrd(term);
           parent.collectField(doc, name, parser.parse(value) );
         }
       }
@@ -129,11 +127,11 @@ public class FieldFacetAccumulator exten
         }
       } else {
         if(sortValues != null) {
-          sortValues.get(doc,value);
-          if( BytesRef.EMPTY_BYTES == value.bytes ){
+          final int ord = sortValues.getOrd(doc);
+          if (ord < 0) {
             parent.collectField(doc, name, FacetingAccumulator.MISSING_VALUE );
           } else {
-            parent.collectField(doc, name, parser.parse(value) );
+            parent.collectField(doc, name, parser.parse(sortValues.lookupOrd(ord)) );
           }
         } else {
           parent.collectField(doc, name, FacetingAccumulator.MISSING_VALUE );

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java Thu Jun  5 15:54:49 2014
@@ -218,7 +218,6 @@ public class ExpandComponent extends Sea
     searcher.search(query, pfilter.filter, collector);
     IntObjectMap groups = groupExpandCollector.getGroups();
     Map<String, DocSlice> outMap = new HashMap<>();
-    BytesRef bytesRef = new BytesRef();
     CharsRef charsRef = new CharsRef();
     FieldType fieldType = searcher.getSchema().getField(field).getType();
     for (IntObjectCursor cursor : (Iterable<IntObjectCursor>) groups) {
@@ -235,7 +234,7 @@ public class ExpandComponent extends Sea
           scores[i] = scoreDoc.score;
         }
         DocSlice slice = new DocSlice(0, docs.length, docs, scores, topDocs.totalHits, topDocs.getMaxScore());
-        values.lookupOrd(ord, bytesRef);
+        final BytesRef bytesRef = values.lookupOrd(ord);
         fieldType.indexedToReadable(bytesRef, charsRef);
         String group = charsRef.toString();
         outMap.put(group, slice);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/FieldFacetStats.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/FieldFacetStats.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/FieldFacetStats.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/component/FieldFacetStats.java Thu Jun  5 15:54:49 2014
@@ -62,8 +62,6 @@ public class FieldFacetStats {
 
   SortedDocValues topLevelSortedValues = null;
 
-  private final BytesRef tempBR = new BytesRef();
-
   public FieldFacetStats(SolrIndexSearcher searcher, String name, SchemaField field_sf, SchemaField facet_sf, boolean calcDistinct) {
     this.name = name;
     this.field_sf = field_sf;
@@ -106,14 +104,12 @@ public class FieldFacetStats {
     int term = topLevelSortedValues.getOrd(docID);
     int arrIdx = term;
     if (arrIdx >= 0 && arrIdx < topLevelSortedValues.getValueCount()) {
-      final BytesRef br;
+      final String key;
       if (term == -1) {
-        br = null;
+        key = null;
       } else {
-        br = tempBR;
-        topLevelSortedValues.lookupOrd(term, tempBR);
+        key = topLevelSortedValues.lookupOrd(term).utf8ToString();
       }
-      String key = br == null ? null : br.utf8ToString();
       while (facetStatsTerms.size() <= statsTermNum) {
         facetStatsTerms.add(new HashMap<String, Integer>());
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesFacets.java Thu Jun  5 15:54:49 2014
@@ -85,8 +85,6 @@ public class DocValuesFacets {
       throw new UnsupportedOperationException("Currently this faceting method is limited to " + Integer.MAX_VALUE + " unique terms");
     }
 
-    final BytesRef br = new BytesRef();
-
     final BytesRef prefixRef;
     if (prefix == null) {
       prefixRef = null;
@@ -132,7 +130,7 @@ public class DocValuesFacets {
           if (multiValued) {
             SortedSetDocValues sub = leaf.reader().getSortedSetDocValues(fieldName);
             if (sub == null) {
-              sub = DocValues.EMPTY_SORTED_SET;
+              sub = DocValues.emptySortedSet();
             }
             final SortedDocValues singleton = DocValues.unwrapSingleton(sub);
             if (singleton != null) {
@@ -144,7 +142,7 @@ public class DocValuesFacets {
           } else {
             SortedDocValues sub = leaf.reader().getSortedDocValues(fieldName);
             if (sub == null) {
-              sub = DocValues.EMPTY_SORTED;
+              sub = DocValues.emptySorted();
             }
             accumSingle(counts, startTermIndex, sub, disi, subIndex, ordinalMap);
           }
@@ -194,8 +192,8 @@ public class DocValuesFacets {
           long pair = sorted[i];
           int c = (int)(pair >>> 32);
           int tnum = Integer.MAX_VALUE - (int)pair;
-          si.lookupOrd(startTermIndex+tnum, br);
-          ft.indexedToReadable(br, charsRef);
+          final BytesRef term = si.lookupOrd(startTermIndex+tnum);
+          ft.indexedToReadable(term, charsRef);
           res.add(charsRef.toString(), c);
         }
       
@@ -213,8 +211,8 @@ public class DocValuesFacets {
           int c = counts[i];
           if (c<mincount || --off>=0) continue;
           if (--lim<0) break;
-          si.lookupOrd(startTermIndex+i, br);
-          ft.indexedToReadable(br, charsRef);
+          final BytesRef term = si.lookupOrd(startTermIndex+i);
+          ft.indexedToReadable(term, charsRef);
           res.add(charsRef.toString(), c);
         }
       }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesStats.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesStats.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesStats.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/request/DocValuesStats.java Thu Jun  5 15:54:49 2014
@@ -84,7 +84,7 @@ public class DocValuesStats {
       }
     }
     if (si == null) {
-      si = DocValues.EMPTY_SORTED_SET;
+      si = DocValues.emptySortedSet();
     }
     if (si.getValueCount() >= Integer.MAX_VALUE) {
       throw new UnsupportedOperationException("Currently this stats method is limited to " + Integer.MAX_VALUE + " unique terms");
@@ -112,7 +112,7 @@ public class DocValuesStats {
         if (multiValued) {
           SortedSetDocValues sub = leaf.reader().getSortedSetDocValues(fieldName);
           if (sub == null) {
-            sub = DocValues.EMPTY_SORTED_SET;
+            sub = DocValues.emptySortedSet();
           }
           final SortedDocValues singleton = DocValues.unwrapSingleton(sub);
           if (singleton != null) {
@@ -124,7 +124,7 @@ public class DocValuesStats {
         } else {
           SortedDocValues sub = leaf.reader().getSortedDocValues(fieldName);
           if (sub == null) {
-            sub = DocValues.EMPTY_SORTED;
+            sub = DocValues.emptySorted();
           }
           accumSingle(counts, docBase, facetStats, sub, disi, subIndex, ordinalMap);
         }
@@ -132,11 +132,10 @@ public class DocValuesStats {
     }
     
     // add results in index order
-    BytesRef value = new BytesRef();
     for (int ord = 0; ord < counts.length; ord++) {
       int count = counts[ord];
       if (count > 0) {
-        si.lookupOrd(ord, value);
+        final BytesRef value = si.lookupOrd(ord);
         res.accumulate(value, count);
         for (FieldFacetStats f : facetStats) {
           f.accumulateTermNum(ord, value);

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/BoolField.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/BoolField.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/BoolField.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/schema/BoolField.java Thu Jun  5 15:54:49 2014
@@ -193,11 +193,10 @@ class BoolFieldSource extends ValueSourc
 
     // figure out what ord maps to true
     int nord = sindex.getValueCount();
-    BytesRef br = new BytesRef();
     // if no values in the segment, default trueOrd to something other then -1 (missing)
     int tord = -2;
     for (int i=0; i<nord; i++) {
-      sindex.lookupOrd(i, br);
+      final BytesRef br = sindex.lookupOrd(i);
       if (br.length==1 && br.bytes[br.offset]=='T') {
         tord = i;
         break;

Modified: lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/TestFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/TestFaceting.java?rev=1600688&r1=1600687&r2=1600688&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/TestFaceting.java (original)
+++ lucene/dev/trunk/solr/core/src/test/org/apache/solr/request/TestFaceting.java Thu Jun  5 15:54:49 2014
@@ -923,61 +923,9 @@ public class TestFaceting extends SolrTe
           , "*[count(//lst[@name='facet_fields']/lst)=50]"
           , "*[count(//lst[@name='facet_fields']/lst/int)=100]"
       );
-
-      // Now, are all the UnInvertedFields still the same? Meaning they weren't re-fetched even when a bunch were
-      // requested at the same time?
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui0, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f0_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui1, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f1_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui2, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f2_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui3, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f3_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui4, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f4_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui5, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f5_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui6, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f6_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui7, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f7_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui8, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f8_ws"));
-      assertEquals("UnInvertedField coming back from the seacher should not have changed! ",
-          ui9, DocValues.getSortedSet(currentSearcher.getAtomicReader(), "f9_ws"));
     } finally {
       currentSearcherRef.decref();
     }
   }
-  
-  // assert same instance: either same object, or both wrapping same single-valued object
-  private void assertEquals(String msg, SortedSetDocValues dv1, SortedSetDocValues dv2) {
-    SortedDocValues singleton1 = DocValues.unwrapSingleton(dv1);
-    SortedDocValues singleton2 = DocValues.unwrapSingleton(dv2);
-    if (singleton1 == null || singleton2 == null) {
-      // actually a multi-valued field
-      if (dv1 instanceof MultiDocValues.MultiSortedSetDocValues) {
-        // if we produced more than one segment, ensure the core ordinal map is the same object
-        assertTrue(dv2 instanceof MultiDocValues.MultiSortedSetDocValues);
-        assertSame(((MultiDocValues.MultiSortedSetDocValues) dv1).mapping, 
-                   ((MultiDocValues.MultiSortedSetDocValues) dv2).mapping);
-      } else {
-        // otherwise, same atomic instance
-        assertSame(dv1, dv2);
-      }
-    } else {
-      // just wrapping a field that is actually single-valued
-      if (singleton1 instanceof MultiDocValues.MultiSortedDocValues) {
-        // if we produced more than one segment, ensure the core ordinal map is the same object
-        assertTrue(singleton2 instanceof MultiDocValues.MultiSortedDocValues);
-        assertSame(((MultiDocValues.MultiSortedDocValues) singleton1).mapping, 
-                   ((MultiDocValues.MultiSortedDocValues) singleton2).mapping);
-      } else {
-        // otherwise, same atomic instance
-        assertSame(singleton1, singleton2);
-      }
-    }
-  }
 }