You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by sa...@apache.org on 2011/05/22 23:45:45 UTC

svn commit: r1126234 [27/28] - in /lucene/dev/branches/solr2452: ./ dev-tools/eclipse/ dev-tools/idea/ dev-tools/idea/.idea/ dev-tools/idea/lucene/ dev-tools/idea/lucene/contrib/ant/ dev-tools/idea/lucene/contrib/db/bdb-je/ dev-tools/idea/lucene/contri...

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/QueryValueSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/QueryValueSource.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/QueryValueSource.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/QueryValueSource.java Sun May 22 21:45:19 2011
@@ -23,6 +23,8 @@ import org.apache.lucene.search.*;
 import org.apache.lucene.search.Weight.ScorerContext;
 import org.apache.lucene.util.ReaderUtil;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.search.MutableValue;
+import org.apache.solr.search.MutableValueFloat;
 
 import java.io.IOException;
 import java.util.Map;
@@ -49,7 +51,7 @@ public class QueryValueSource extends Va
 
   @Override
   public DocValues getValues(Map fcontext, AtomicReaderContext readerContext) throws IOException {
-    return new QueryDocValues(readerContext, q, defVal, fcontext);
+    return new QueryDocValues(this, readerContext, fcontext);
   }
 
   @Override
@@ -72,31 +74,31 @@ public class QueryValueSource extends Va
 }
 
 
-class QueryDocValues extends DocValues {
-  final Query q;
-//  final IndexReader reader;
+class QueryDocValues extends FloatDocValues {
   final AtomicReaderContext readerContext;
   final Weight weight;
   final float defVal;
   final Map fcontext;
+  final Query q;
 
   Scorer scorer;
   int scorerDoc; // the document the scorer is on
+  boolean noMatches=false;
 
   // the last document requested... start off with high value
   // to trigger a scorer reset on first access.
   int lastDocRequested=Integer.MAX_VALUE;
   
 
-  public QueryDocValues(AtomicReaderContext readerContext, Query q, float defVal, Map fcontext) throws IOException {
-    IndexReader reader = readerContext.reader;
+  public QueryDocValues(QueryValueSource vs, AtomicReaderContext readerContext, Map fcontext) throws IOException {
+    super(vs);
+
     this.readerContext = readerContext;
-    this.q = q;
-    this.defVal = defVal;
+    this.defVal = vs.defVal;
+    this.q = vs.q;
     this.fcontext = fcontext;
 
     Weight w = fcontext==null ? null : (Weight)fcontext.get(q);
-    // TODO: sort by function doesn't weight (SOLR-1297 is open because of this bug)... so weightSearcher will currently be null
     if (w == null) {
       IndexSearcher weightSearcher;
       if(fcontext == null) {
@@ -116,8 +118,12 @@ class QueryDocValues extends DocValues {
   public float floatVal(int doc) {
     try {
       if (doc < lastDocRequested) {
+        if (noMatches) return defVal;
         scorer = weight.scorer(readerContext, ScorerContext.def());
-        if (scorer==null) return defVal;
+        if (scorer==null) {
+          noMatches = true;
+          return defVal;
+        }
         scorerDoc = -1;
       }
       lastDocRequested = doc;
@@ -137,24 +143,104 @@ class QueryDocValues extends DocValues {
     } catch (IOException e) {
       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in QueryDocVals("+q+") doc="+doc, e);
     }
-  }  
-
-  @Override
-  public int intVal(int doc) {
-    return (int)floatVal(doc);
-  }
-  @Override
-  public long longVal(int doc) {
-    return (long)floatVal(doc);
   }
+
   @Override
-  public double doubleVal(int doc) {
-    return (double)floatVal(doc);
+  public boolean exists(int doc) {
+    try {
+      if (doc < lastDocRequested) {
+        if (noMatches) return false;
+        scorer = weight.scorer(readerContext, ScorerContext.def());
+        scorerDoc = -1;
+        if (scorer==null) {
+          noMatches = true;
+          return false;
+        }
+      }
+      lastDocRequested = doc;
+
+      if (scorerDoc < doc) {
+        scorerDoc = scorer.advance(doc);
+      }
+
+      if (scorerDoc > doc) {
+        // query doesn't match this document... either because we hit the
+        // end, or because the next doc is after this doc.
+        return false;
+      }
+
+      // a match!
+      return true;
+    } catch (IOException e) {
+      throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in QueryDocVals("+q+") doc="+doc, e);
+    }
   }
-  @Override
-  public String strVal(int doc) {
-    return Float.toString(floatVal(doc));
+
+   @Override
+  public Object objectVal(int doc) {
+     try {
+       return exists(doc) ? scorer.score() : null;
+     } catch (IOException e) {
+       throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in QueryDocVals("+q+") doc="+doc, e);
+     }
+   }
+
+  @Override
+  public ValueFiller getValueFiller() {
+    //
+    // TODO: if we want to support more than one value-filler or a value-filler in conjunction with
+    // the DocValues, then members like "scorer" should be per ValueFiller instance.
+    // Or we can say that the user should just instantiate multiple DocValues.
+    //
+    return new ValueFiller() {
+      private final MutableValueFloat mval = new MutableValueFloat();
+
+      @Override
+      public MutableValue getValue() {
+        return mval;
+      }
+
+      @Override
+      public void fillValue(int doc) {
+        try {
+          if (noMatches) {
+            mval.value = defVal;
+            mval.exists = false;
+            return;
+          }
+          scorer = weight.scorer(readerContext, ScorerContext.def());
+          scorerDoc = -1;
+          if (scorer==null) {
+            noMatches = true;
+            mval.value = defVal;
+            mval.exists = false;
+            return;
+          }
+          lastDocRequested = doc;
+
+          if (scorerDoc < doc) {
+            scorerDoc = scorer.advance(doc);
+          }
+
+          if (scorerDoc > doc) {
+            // query doesn't match this document... either because we hit the
+            // end, or because the next doc is after this doc.
+            mval.value = defVal;
+            mval.exists = false;
+            return;
+          }
+
+          // a match!
+          mval.value = scorer.score();
+          mval.exists = true;
+          return;
+        } catch (IOException e) {
+          throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "caught exception in QueryDocVals("+q+") doc="+doc, e);
+        }
+      }
+    };
   }
+
   @Override
   public String toString(int doc) {
     return "query(" + q + ",def=" + defVal + ")=" + floatVal(doc);

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/RangeMapFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/RangeMapFloatFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/RangeMapFloatFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/RangeMapFloatFunction.java Sun May 22 21:45:19 2011
@@ -54,29 +54,13 @@ public class RangeMapFloatFunction exten
   @Override
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final DocValues vals =  source.getValues(context, readerContext);
-    return new DocValues() {
+    return new FloatDocValues(this) {
       @Override
       public float floatVal(int doc) {
         float val = vals.floatVal(doc);
         return (val>=min && val<=max) ? target : (defaultVal == null ? val : defaultVal);
       }
       @Override
-      public int intVal(int doc) {
-        return (int)floatVal(doc);
-      }
-      @Override
-      public long longVal(int doc) {
-        return (long)floatVal(doc);
-      }
-      @Override
-      public double doubleVal(int doc) {
-        return (double)floatVal(doc);
-      }
-      @Override
-      public String strVal(int doc) {
-        return Float.toString(floatVal(doc));
-      }
-      @Override
       public String toString(int doc) {
         return "map(" + vals.toString(doc) + ",min=" + min + ",max=" + max + ",target=" + target + ")";
       }

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReciprocalFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReciprocalFloatFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReciprocalFloatFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReciprocalFloatFunction.java Sun May 22 21:45:19 2011
@@ -60,28 +60,12 @@ public class ReciprocalFloatFunction ext
   @Override
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final DocValues vals = source.getValues(context, readerContext);
-    return new DocValues() {
+    return new FloatDocValues(this) {
       @Override
       public float floatVal(int doc) {
         return a/(m*vals.floatVal(doc) + b);
       }
       @Override
-      public int intVal(int doc) {
-        return (int)floatVal(doc);
-      }
-      @Override
-      public long longVal(int doc) {
-        return (long)floatVal(doc);
-      }
-      @Override
-      public double doubleVal(int doc) {
-        return (double)floatVal(doc);
-      }
-      @Override
-      public String strVal(int doc) {
-        return Float.toString(floatVal(doc));
-      }
-      @Override
       public String toString(int doc) {
         return Float.toString(a) + "/("
                 + m + "*float(" + vals.toString(doc) + ')'

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java Sun May 22 21:45:19 2011
@@ -66,47 +66,11 @@ public class ReverseOrdFieldSource exten
     final FieldCache.DocTermsIndex sindex = FieldCache.DEFAULT.getTermsIndex(topReader, field);
     final int end = sindex.numOrd();
 
-    return new DocValues() {
-      @Override
-      public float floatVal(int doc) {
-        return (float)(end - sindex.getOrd(doc+off));
-      }
-
-      @Override
+    return new IntDocValues(this) {
+     @Override
       public int intVal(int doc) {
         return (end - sindex.getOrd(doc+off));
       }
-
-      @Override
-      public long longVal(int doc) {
-        return (long)(end - sindex.getOrd(doc+off));
-      }
-
-      @Override
-      public int ordVal(int doc) {
-        return (end - sindex.getOrd(doc+off));
-      }
-
-      @Override
-      public int numOrd() {
-        return end;
-      }
-
-      @Override
-      public double doubleVal(int doc) {
-        return (double)(end - sindex.getOrd(doc+off));
-      }
-
-      @Override
-      public String strVal(int doc) {
-        // the string value of the ordinal, not the string itself
-        return Integer.toString((end - sindex.getOrd(doc+off)));
-      }
-
-      @Override
-      public String toString(int doc) {
-        return description() + '=' + strVal(doc);
-      }
     };
   }
 

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ScaleFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ScaleFloatFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ScaleFloatFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/ScaleFloatFunction.java Sun May 22 21:45:19 2011
@@ -108,28 +108,12 @@ public class ScaleFloatFunction extends 
 
     final DocValues vals =  source.getValues(context, readerContext);
 
-    return new DocValues() {
+    return new FloatDocValues(this) {
       @Override
       public float floatVal(int doc) {
 	return (vals.floatVal(doc) - minSource) * scale + min;
       }
       @Override
-      public int intVal(int doc) {
-        return (int)floatVal(doc);
-      }
-      @Override
-      public long longVal(int doc) {
-        return (long)floatVal(doc);
-      }
-      @Override
-      public double doubleVal(int doc) {
-        return (double)floatVal(doc);
-      }
-      @Override
-      public String strVal(int doc) {
-        return Float.toString(floatVal(doc));
-      }
-      @Override
       public String toString(int doc) {
 	return "scale(" + vals.toString(doc) + ",toMin=" + min + ",toMax=" + max
                 + ",fromMin=" + minSource

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/SimpleFloatFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/SimpleFloatFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/SimpleFloatFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/SimpleFloatFunction.java Sun May 22 21:45:19 2011
@@ -34,28 +34,12 @@ import java.util.Map;
   @Override
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final DocValues vals =  source.getValues(context, readerContext);
-    return new DocValues() {
+    return new FloatDocValues(this) {
       @Override
       public float floatVal(int doc) {
 	return func(doc, vals);
       }
       @Override
-      public int intVal(int doc) {
-        return (int)floatVal(doc);
-      }
-      @Override
-      public long longVal(int doc) {
-        return (long)floatVal(doc);
-      }
-      @Override
-      public double doubleVal(int doc) {
-        return (double)floatVal(doc);
-      }
-      @Override
-      public String strVal(int doc) {
-        return Float.toString(floatVal(doc));
-      }
-      @Override
       public String toString(int doc) {
 	return name() + '(' + vals.toString(doc) + ')';
       }

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/StringIndexDocValues.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/StringIndexDocValues.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/StringIndexDocValues.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/StringIndexDocValues.java Sun May 22 21:45:19 2011
@@ -21,8 +21,10 @@ import org.apache.lucene.search.FieldCac
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.util.BytesRef;
+import org.apache.noggit.CharArr;
 import org.apache.solr.search.MutableValue;
 import org.apache.solr.search.MutableValueStr;
+import org.apache.solr.util.ByteUtils;
 
 import java.io.IOException;
 
@@ -30,64 +32,97 @@ import java.io.IOException;
  *  Serves as base class for DocValues based on StringIndex 
  **/
 public abstract class StringIndexDocValues extends DocValues {
-    protected final FieldCache.DocTermsIndex termsIndex;
-    protected final ValueSource vs;
-    protected final MutableValueStr val = new MutableValueStr();
-
-    public StringIndexDocValues(ValueSource vs, AtomicReaderContext context, String field) throws IOException {
-      try {
-        termsIndex = FieldCache.DEFAULT.getTermsIndex(context.reader, field);
-      } catch (RuntimeException e) {
-        throw new StringIndexException(field, e);
-      }
-      this.vs = vs;
+  protected final FieldCache.DocTermsIndex termsIndex;
+  protected final ValueSource vs;
+  protected final MutableValueStr val = new MutableValueStr();
+  protected final BytesRef spare = new BytesRef();
+  protected final CharArr spareChars = new CharArr();
+
+  public StringIndexDocValues(ValueSource vs, AtomicReaderContext context, String field) throws IOException {
+    try {
+      termsIndex = FieldCache.DEFAULT.getTermsIndex(context.reader, field);
+    } catch (RuntimeException e) {
+      throw new StringIndexException(field, e);
     }
+    this.vs = vs;
+  }
+
+  public FieldCache.DocTermsIndex getDocTermsIndex() {
+    return termsIndex;
+  }
+
+  protected abstract String toTerm(String readableValue);
+
+  @Override
+  public boolean exists(int doc) {
+    return termsIndex.getOrd(doc) != 0;
+  }
+
 
-    public FieldCache.DocTermsIndex getDocTermsIndex() {
-      return termsIndex;
+  @Override
+  public boolean bytesVal(int doc, BytesRef target) {
+    int ord=termsIndex.getOrd(doc);
+    if (ord==0) {
+      target.length = 0;
+      return false;
     }
-  
-    protected abstract String toTerm(String readableValue);
+    termsIndex.lookup(ord, target);
+    return true;
+  }
+
+  @Override
+  public String strVal(int doc) {
+    int ord=termsIndex.getOrd(doc);
+    if (ord==0) return null;
+    termsIndex.lookup(ord, spare);
+    spareChars.reset();
+    ByteUtils.UTF8toUTF16(spare, spareChars);
+    return spareChars.toString();
+  }
 
-    @Override
-    public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
-      // TODO: are lowerVal and upperVal in indexed form or not?
-      lowerVal = lowerVal == null ? null : toTerm(lowerVal);
-      upperVal = upperVal == null ? null : toTerm(upperVal);
-
-      final BytesRef spare = new BytesRef();
-
-      int lower = Integer.MIN_VALUE;
-      if (lowerVal != null) {
-        lower = termsIndex.binarySearchLookup(new BytesRef(lowerVal), spare);
-        if (lower < 0) {
-          lower = -lower-1;
-        } else if (!includeLower) {
-          lower++;
-        }
+
+  @Override
+  public abstract Object objectVal(int doc);  // force subclasses to override
+
+  @Override
+  public ValueSourceScorer getRangeScorer(IndexReader reader, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper) {
+    // TODO: are lowerVal and upperVal in indexed form or not?
+    lowerVal = lowerVal == null ? null : toTerm(lowerVal);
+    upperVal = upperVal == null ? null : toTerm(upperVal);
+
+    final BytesRef spare = new BytesRef();
+
+    int lower = Integer.MIN_VALUE;
+    if (lowerVal != null) {
+      lower = termsIndex.binarySearchLookup(new BytesRef(lowerVal), spare);
+      if (lower < 0) {
+        lower = -lower-1;
+      } else if (!includeLower) {
+        lower++;
       }
-      
-      int upper = Integer.MAX_VALUE;
-      if (upperVal != null) {
-        upper = termsIndex.binarySearchLookup(new BytesRef(upperVal), spare);
-        if (upper < 0) {
-          upper = -upper-2;
-        } else if (!includeUpper) {
-          upper--;
-        }
+    }
+
+    int upper = Integer.MAX_VALUE;
+    if (upperVal != null) {
+      upper = termsIndex.binarySearchLookup(new BytesRef(upperVal), spare);
+      if (upper < 0) {
+        upper = -upper-2;
+      } else if (!includeUpper) {
+        upper--;
       }
+    }
 
-      final int ll = lower;
-      final int uu = upper;
+    final int ll = lower;
+    final int uu = upper;
 
-      return new ValueSourceScorer(reader, this) {
-        @Override
-        public boolean matchesValue(int doc) {
-          int ord = termsIndex.getOrd(doc);
-          return ord >= ll && ord <= uu;
-        }
-      };
-    }
+    return new ValueSourceScorer(reader, this) {
+      @Override
+      public boolean matchesValue(int doc) {
+        int ord = termsIndex.getOrd(doc);
+        return ord >= ll && ord <= uu;
+      }
+    };
+  }
 
   @Override
   public String toString(int doc) {
@@ -117,7 +152,7 @@ public abstract class StringIndexDocValu
     public StringIndexException(final String fieldName,
                                 final RuntimeException cause) {
       super("Can't initialize StringIndex to generate (function) " +
-            "DocValues for field: " + fieldName, cause);
+              "DocValues for field: " + fieldName, cause);
     }
   }
 

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/GeohashHaversineFunction.java Sun May 22 21:45:19 2011
@@ -18,6 +18,7 @@ package org.apache.solr.search.function.
 
 
 import org.apache.lucene.spatial.DistanceUtils;
+import org.apache.solr.search.function.DoubleDocValues;
 import org.apache.solr.search.function.ValueSource;
 import org.apache.solr.search.function.DocValues;
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
@@ -58,32 +59,11 @@ public class GeohashHaversineFunction ex
     final DocValues gh1DV = geoHash1.getValues(context, readerContext);
     final DocValues gh2DV = geoHash2.getValues(context, readerContext);
 
-    return new DocValues() {
-      @Override
-      public float floatVal(int doc) {
-        return (float) doubleVal(doc);
-      }
-
-      @Override
-      public int intVal(int doc) {
-        return (int) doubleVal(doc);
-      }
-
-      @Override
-      public long longVal(int doc) {
-        return (long) doubleVal(doc);
-      }
-
+    return new DoubleDocValues(this) {
       @Override
       public double doubleVal(int doc) {
         return distance(doc, gh1DV, gh2DV);
       }
-
-      @Override
-      public String strVal(int doc) {
-        return Double.toString(doubleVal(doc));
-      }
-
       @Override
       public String toString(int doc) {
         StringBuilder sb = new StringBuilder();

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineConstFunction.java Sun May 22 21:45:19 2011
@@ -198,22 +198,7 @@ public class HaversineConstFunction exte
     final double lonCenterRad = this.lonCenter * DistanceUtils.DEGREES_TO_RADIANS;
     final double latCenterRad_cos = this.latCenterRad_cos;
 
-    return new DocValues() {
-      @Override
-      public float floatVal(int doc) {
-        return (float) doubleVal(doc);
-      }
-
-      @Override
-      public int intVal(int doc) {
-        return (int) doubleVal(doc);
-      }
-
-      @Override
-      public long longVal(int doc) {
-        return (long) doubleVal(doc);
-      }
-
+    return new DoubleDocValues(this) {
       @Override
       public double doubleVal(int doc) {
         double latRad = latVals.doubleVal(doc) * DistanceUtils.DEGREES_TO_RADIANS;
@@ -226,12 +211,6 @@ public class HaversineConstFunction exte
                 (latCenterRad_cos * Math.cos(latRad) * hsinY * hsinY);
         return (EARTH_MEAN_DIAMETER * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h)));
       }
-
-      @Override
-      public String strVal(int doc) {
-        return Double.toString(doubleVal(doc));
-      }
-
       @Override
       public String toString(int doc) {
         return name() + '(' + latVals.toString(doc) + ',' + lonVals.toString(doc) + ',' + latCenter + ',' + lonCenter + ')';

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/HaversineFunction.java Sun May 22 21:45:19 2011
@@ -20,6 +20,7 @@ import org.apache.lucene.index.IndexRead
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.spatial.DistanceUtils;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.search.function.DoubleDocValues;
 import org.apache.solr.search.function.MultiValueSource;
 import org.apache.solr.search.function.DocValues;
 import org.apache.solr.search.function.ValueSource;
@@ -99,32 +100,11 @@ public class HaversineFunction extends V
     final DocValues vals1 = p1.getValues(context, readerContext);
 
     final DocValues vals2 = p2.getValues(context, readerContext);
-    return new DocValues() {
-      @Override
-      public float floatVal(int doc) {
-        return (float) doubleVal(doc);
-      }
-
-      @Override
-      public int intVal(int doc) {
-        return (int) doubleVal(doc);
-      }
-
-      @Override
-      public long longVal(int doc) {
-        return (long) doubleVal(doc);
-      }
-
+    return new DoubleDocValues(this) {
       @Override
       public double doubleVal(int doc) {
         return distance(doc, vals1, vals2);
       }
-
-      @Override
-      public String strVal(int doc) {
-        return Double.toString(doubleVal(doc));
-      }
-
       @Override
       public String toString(int doc) {
         StringBuilder sb = new StringBuilder();

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/StringDistanceFunction.java Sun May 22 21:45:19 2011
@@ -20,6 +20,7 @@ package org.apache.solr.search.function.
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.search.spell.StringDistance;
 import org.apache.solr.search.function.DocValues;
+import org.apache.solr.search.function.FloatDocValues;
 import org.apache.solr.search.function.ValueSource;
 
 import java.io.IOException;
@@ -51,7 +52,7 @@ public class StringDistanceFunction exte
   public DocValues getValues(Map context, AtomicReaderContext readerContext) throws IOException {
     final DocValues str1DV = str1.getValues(context, readerContext);
     final DocValues str2DV = str2.getValues(context, readerContext);
-    return new DocValues() {
+    return new FloatDocValues(this) {
 
       @Override
       public float floatVal(int doc) {
@@ -59,21 +60,6 @@ public class StringDistanceFunction exte
       }
 
       @Override
-      public int intVal(int doc) {
-        return (int) doubleVal(doc);
-      }
-
-      @Override
-      public long longVal(int doc) {
-        return (long) doubleVal(doc);
-      }
-
-      @Override
-      public double doubleVal(int doc) {
-        return (double) floatVal(doc);
-      }
-
-      @Override
       public String toString(int doc) {
         StringBuilder sb = new StringBuilder();
         sb.append("strdist").append('(');

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/search/function/distance/VectorDistanceFunction.java Sun May 22 21:45:19 2011
@@ -21,6 +21,7 @@ import org.apache.lucene.search.IndexSea
 import org.apache.lucene.spatial.DistanceUtils;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.search.function.DocValues;
+import org.apache.solr.search.function.DoubleDocValues;
 import org.apache.solr.search.function.MultiValueSource;
 import org.apache.solr.search.function.ValueSource;
 
@@ -85,31 +86,7 @@ public class VectorDistanceFunction exte
     final DocValues vals2 = source2.getValues(context, readerContext);
 
 
-    return new DocValues() {
-      @Override
-      public byte byteVal(int doc) {
-        return (byte) doubleVal(doc);
-      }
-
-      @Override
-      public short shortVal(int doc) {
-        return (short) doubleVal(doc);
-      }
-
-      @Override
-      public float floatVal(int doc) {
-        return (float) doubleVal(doc);
-      }
-
-      @Override
-      public int intVal(int doc) {
-        return (int) doubleVal(doc);
-      }
-
-      @Override
-      public long longVal(int doc) {
-        return (long) doubleVal(doc);
-      }
+    return new DoubleDocValues(this) {
 
       @Override
       public double doubleVal(int doc) {
@@ -117,11 +94,6 @@ public class VectorDistanceFunction exte
       }
 
       @Override
-      public String strVal(int doc) {
-        return Double.toString(doubleVal(doc));
-      }
-
-      @Override
       public String toString(int doc) {
         StringBuilder sb = new StringBuilder();
         sb.append(name()).append('(').append(power).append(',');

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/spelling/suggest/Lookup.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/spelling/suggest/Lookup.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/spelling/suggest/Lookup.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/spelling/suggest/Lookup.java Sun May 22 21:45:19 2011
@@ -12,13 +12,12 @@ import org.apache.solr.core.SolrCore;
 import org.apache.solr.util.TermFreqIterator;
 
 public abstract class Lookup {
-  
   /**
    * Result of a lookup.
    */
   public static final class LookupResult implements Comparable<LookupResult> {
-    String key;
-    float value;
+    public final String key;
+    public final float value;
     
     public LookupResult(String key, float value) {
       this.key = key;

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/AddUpdateCommand.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/AddUpdateCommand.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/AddUpdateCommand.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/AddUpdateCommand.java Sun May 22 21:45:19 2011
@@ -18,7 +18,7 @@
 package org.apache.solr.update;
 
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
+import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.index.Term;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
@@ -74,7 +74,7 @@ public class AddUpdateCommand extends Up
        if (sf != null) {
          if (doc != null) {
            schema.getUniqueKeyField();
-           Field storedId = doc.getField(sf.getName());
+           Fieldable storedId = doc.getFieldable(sf.getName());
            indexedId = sf.getType().storedToIndexed(storedId);
          }
          if (solrDoc != null) {

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/DocumentBuilder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/DocumentBuilder.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/DocumentBuilder.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/DocumentBuilder.java Sun May 22 21:45:19 2011
@@ -159,7 +159,7 @@ public class DocumentBuilder {
     // default value are defacto 'required' fields.  
     List<String> missingFields = null;
     for (SchemaField field : schema.getRequiredFields()) {
-      if (doc.getField(field.getName() ) == null) {
+      if (doc.getFieldable(field.getName() ) == null) {
         if (field.getDefaultValue() != null) {
           addField(doc, field, field.getDefaultValue(), 1.0f);
         } else {
@@ -313,7 +313,7 @@ public class DocumentBuilder {
     // Now validate required fields or add default values
     // fields with default values are defacto 'required'
     for (SchemaField field : schema.getRequiredFields()) {
-      if (out.getField(field.getName() ) == null) {
+      if (out.getFieldable(field.getName() ) == null) {
         if (field.getDefaultValue() != null) {
           addField(out, field, field.getDefaultValue(), 1.0f);
         } 
@@ -339,8 +339,7 @@ public class DocumentBuilder {
    */
   public SolrDocument loadStoredFields( SolrDocument doc, Document luceneDoc  )
   {
-    for( Object f : luceneDoc.getFields() ) {
-      Fieldable field = (Fieldable)f;
+    for( Fieldable field : luceneDoc.getFields() ) {
       if( field.isStored() ) {
         SchemaField sf = schema.getField( field.name() );
         if( !schema.isCopyFieldTarget( sf ) ) {

Modified: lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/UpdateHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/UpdateHandler.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/UpdateHandler.java (original)
+++ lucene/dev/branches/solr2452/solr/src/java/org/apache/solr/update/UpdateHandler.java Sun May 22 21:45:19 2011
@@ -21,7 +21,6 @@ package org.apache.solr.update;
 import org.apache.lucene.index.IndexReader.AtomicReaderContext;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
 import org.apache.lucene.document.Fieldable;
 import org.apache.lucene.search.Collector;
 import org.apache.lucene.search.Scorer;
@@ -125,7 +124,7 @@ public abstract class UpdateHandler impl
 
   protected final String getIndexedIdOptional(Document doc) {
     if (idField == null) return null;
-    Field f = doc.getField(idField.getName());
+    Fieldable f = doc.getFieldable(idField.getName());
     if (f == null) return null;
     return idFieldType.storedToIndexed(f);
   }

Modified: lucene/dev/branches/solr2452/solr/src/site/src/documentation/content/xdocs/site.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/site/src/documentation/content/xdocs/site.xml?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/site/src/documentation/content/xdocs/site.xml (original)
+++ lucene/dev/branches/solr2452/solr/src/site/src/documentation/content/xdocs/site.xml Sun May 22 21:45:19 2011
@@ -42,12 +42,13 @@ See http://forrest.apache.org/docs/linki
   </about>
 
   <docs label="Documentation">
-    <features    label="Features"         href="features.html" />
-    <tutorial    label="Tutorial"         href="tutorial.html" />
-    <wiki        label="Docs (Wiki)" href="ext:wiki" />
-    <faq         label="FAQ"              href="ext:faq" />
-    <apidocs     label="All Javadoc"     href="api/index.html" />
-    <apidocs     label="SolrJ Javadoc"     href="api/solrj/index.html" />
+    <features    label="Features"                href="features.html" />
+    <tutorial    label="Tutorial"                href="tutorial.html" />
+    <wiki        label="Docs (Wiki)"             href="ext:wiki" />
+    <faq         label="FAQ"                     href="ext:faq" />
+    <apidocs     label="All Javadoc"             href="api/index.html" />
+    <apidocs     label="SolrJ Javadoc"           href="api/solrj/index.html" />
+    <apidocs     label="Test Framework Javadoc"  href="api/test-framework/index.html" />
   </docs>
 
   <resources label="Resources">

Modified: lucene/dev/branches/solr2452/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java (original)
+++ lucene/dev/branches/solr2452/solr/src/solrj/org/apache/solr/client/solrj/impl/CommonsHttpSolrServer.java Sun May 22 21:45:19 2011
@@ -26,15 +26,7 @@ import java.util.*;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.InflaterInputStream;
 
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpConnectionManager;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.HttpMethodBase;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
-import org.apache.commons.httpclient.NoHttpResponseException;
+import org.apache.commons.httpclient.*;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
 import org.apache.commons.httpclient.methods.PostMethod;
@@ -43,6 +35,7 @@ import org.apache.commons.httpclient.met
 import org.apache.commons.httpclient.methods.multipart.Part;
 import org.apache.commons.httpclient.methods.multipart.PartBase;
 import org.apache.commons.httpclient.methods.multipart.StringPart;
+import org.apache.commons.httpclient.params.HttpMethodParams;
 import org.apache.commons.io.IOUtils;
 import org.apache.solr.client.solrj.ResponseParser;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -205,15 +198,21 @@ public class CommonsHttpSolrServer exten
     if( _baseURL.indexOf( '?' ) >=0 ) {
       throw new RuntimeException( "Invalid base url for solrj.  The base URL must not contain parameters: "+_baseURL );
     }
- 
-    _httpClient = (client == null) ? new HttpClient(new MultiThreadedHttpConnectionManager()) : client;
 
     if (client == null) {
+      _httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()) ;
+
+      // prevent retries  (note: this didn't work when set on mgr.. needed to be set on client)
+      DefaultHttpMethodRetryHandler retryhandler = new DefaultHttpMethodRetryHandler(0, false);
+      _httpClient.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryhandler);
+
       // set some better defaults if we created a new connection manager and client
-      
+
       // increase the default connections
       this.setDefaultMaxConnectionsPerHost( 32 );  // 2
       this.setMaxTotalConnections( 128 ); // 20
+    } else {
+      _httpClient = client;
     }
 
     _parser = parser;

Modified: lucene/dev/branches/solr2452/solr/src/test-files/solr/conf/solrconfig-spellchecker.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test-files/solr/conf/solrconfig-spellchecker.xml?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test-files/solr/conf/solrconfig-spellchecker.xml (original)
+++ lucene/dev/branches/solr2452/solr/src/test-files/solr/conf/solrconfig-spellchecker.xml Sun May 22 21:45:19 2011
@@ -31,7 +31,7 @@
   <requestHandler name="standard" class="solr.StandardRequestHandler" />
 
   <!-- Suggest component -->
-  <searchComponent class="solr.SpellCheckComponent" name="suggest">
+  <searchComponent class="solr.SpellCheckComponent" name="suggest_jaspell">
     <lst name="spellchecker">
       <str name="name">suggest</str>
       <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
@@ -45,6 +45,38 @@
     </lst>
   </searchComponent>
 
+  <!-- TSTLookup suggest component -->
+  <searchComponent class="solr.SpellCheckComponent" name="suggest_tst">
+    <lst name="spellchecker">
+      <str name="name">suggest_tst</str>
+      <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
+      <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
+      <str name="field">suggest</str>
+      <str name="storeDir">suggest_tst</str>
+      <str name="buildOnCommit">true</str>
+
+      <!-- Suggester properties -->
+      <float name="threshold">0.0</float>
+    </lst>
+  </searchComponent>
+
+  <!-- FSTLookup suggest component -->
+  <searchComponent class="solr.SpellCheckComponent" name="suggest_fst">
+    <lst name="spellchecker">
+      <str name="name">suggest_fst</str>
+      <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
+      <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.FSTLookup</str>
+      <str name="field">suggest</str>
+      <str name="storeDir">suggest_fst</str>
+      <str name="buildOnCommit">true</str>
+
+      <!-- Suggester properties -->
+      <int name="weightBuckets">5</int>
+      <bool name="exactMatchFirst">true</bool>
+    </lst>
+  </searchComponent>
+
+  <!--  The default (jaspell) -->
   <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
     <lst name="defaults">
       <str name="spellcheck">true</str>
@@ -52,8 +84,32 @@
       <str name="spellcheck.collate">true</str>
     </lst>
     <arr name="components">
-      <str>suggest</str>
+      <str>suggest_jaspell</str>
     </arr>
   </requestHandler>
 
+  <!--  tst (ternary tree based) -->
+  <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest_tst">
+    <lst name="defaults">
+      <str name="spellcheck">true</str>
+      <str name="spellcheck.dictionary">suggest_tst</str>
+      <str name="spellcheck.collate">true</str>
+    </lst>
+    <arr name="components">
+      <str>suggest_tst</str>
+    </arr>
+  </requestHandler>
+  
+  <!--  fst (finite state automaton based) -->
+  <requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest_fst">
+    <lst name="defaults">
+      <str name="spellcheck">true</str>
+      <str name="spellcheck.dictionary">suggest_fst</str>
+      <str name="spellcheck.collate">false</str>
+    </lst>
+    <arr name="components">
+      <str>suggest_fst</str>
+    </arr>
+  </requestHandler>
+  
 </config>

Modified: lucene/dev/branches/solr2452/solr/src/test-files/solr/shared/solr.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test-files/solr/shared/solr.xml?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test-files/solr/shared/solr.xml (original)
+++ lucene/dev/branches/solr2452/solr/src/test-files/solr/shared/solr.xml Sun May 22 21:45:19 2011
@@ -30,7 +30,7 @@
   adminPath: RequestHandler path to manage cores.  
     If 'null' (or absent), cores will not be manageable via REST
   -->
-  <cores adminPath="/admin/cores" defaultCoreName="core0">
+  <cores adminPath="/admin/cores" defaultCoreName="core0" host="127.0.0.1" hostPort="${hostPort:8983}" hostContext="solr" zkClientTimeout="8000">
     <core name="core0" instanceDir="./">
       <property name="version" value="3.5"/>
       <property name="l10n" value="EN"/>

Modified: lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/JSONTestUtil.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/JSONTestUtil.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/JSONTestUtil.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/JSONTestUtil.java Sun May 22 21:45:19 2011
@@ -25,29 +25,69 @@ import java.util.*;
 
 public class JSONTestUtil {
 
+  /**
+   * Default delta used in numeric equality comparisons for floats and doubles.
+   */
+  public final static double DEFAULT_DELTA = 1e-5;
+
+  /**
+   * comparison using default delta
+   * @see #DEFAULT_DELTA
+   * @see #match(String,String,double)
+   */
   public static String match(String input, String pathAndExpected) throws Exception {
+    return match(input, pathAndExpected, DEFAULT_DELTA);
+  }
+
+  /**
+   * comparison using default delta
+   * @see #DEFAULT_DELTA
+   * @see #match(String,String,String,double)
+   */
+  public static String match(String path, String input, String expected) throws Exception {
+    return match(path, input, expected, DEFAULT_DELTA);
+  }
+
+  /**
+   * comparison using default delta
+   * @see #DEFAULT_DELTA
+   * @see #matchObj(String,Object,Object,double)
+   */
+  public static String matchObj(String path, Object input, Object expected) throws Exception {
+    return matchObj(path,input,expected, DEFAULT_DELTA);
+  }
+
+  /**
+   * @param input JSON Structure to parse and test against
+   * @param pathAndExpected JSON path expression + '==' + expected value
+   * @param delta tollerance allowed in comparing float/double values
+   */
+  public static String match(String input, String pathAndExpected, double delta) throws Exception {
     int pos = pathAndExpected.indexOf("==");
     String path = pos>=0 ? pathAndExpected.substring(0,pos) : null;
     String expected = pos>=0 ? pathAndExpected.substring(pos+2) : pathAndExpected;
-    return match(path, input, expected);
+    return match(path, input, expected, delta);
   }
 
-  public static String match(String path, String input, String expected) throws Exception {
+  /**
+   * @param path JSON path expression
+   * @param input JSON Structure to parse and test against
+   * @param expected expected value of path
+   * @param delta tollerance allowed in comparing float/double values
+   */
+  public static String match(String path, String input, String expected, double delta) throws Exception {
     Object inputObj = ObjectBuilder.fromJSON(input);
     Object expectObj = ObjectBuilder.fromJSON(expected);
     return matchObj(path, inputObj, expectObj);
   }
 
   /**
-  public static Object fromJSON(String json) {
-    try {
-      Object out = ObjectBuilder.fromJSON(json);
-    } finally {
-
-  }
-  **/
-  
-  public static String matchObj(String path, Object input, Object expected) throws Exception {
+   * @param path JSON path expression
+   * @param input JSON Structure
+   * @param expected expected JSON Object
+   * @param delta tollerance allowed in comparing float/double values
+   */
+  public static String matchObj(String path, Object input, Object expected, double delta) throws Exception {
     CollectionTester tester = new CollectionTester(input);
     boolean reversed = path.startsWith("!");
     String positivePath = reversed ? path.substring(1) : path;
@@ -68,14 +108,19 @@ class CollectionTester {
   public Object val;
   public Object expectedRoot;
   public Object expected;
+  public double delta;
   public List<Object> path;
   public String err;
 
-  public CollectionTester(Object val) {
+  public CollectionTester(Object val, double delta) {
     this.val = val;
     this.valRoot = val;
+    this.delta = delta;
     path = new ArrayList<Object>();
   }
+  public CollectionTester(Object val) {
+    this(val, JSONTestUtil.DEFAULT_DELTA);
+  }
 
   public String getPath() {
     StringBuilder sb = new StringBuilder();
@@ -143,7 +188,7 @@ class CollectionTester {
         double a = ((Number)expected).doubleValue();
         double b = ((Number)val).doubleValue();
         if (Double.compare(a,b) == 0) return true;
-        if (Math.abs(a-b) < 1e-5) return true;
+        if (Math.abs(a-b) < delta) return true;
         return false;
       } else {
         setErr("mismatch: '" + expected + "'!='" + val + "'");

Modified: lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/SolrTestCaseJ4.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/SolrTestCaseJ4.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/SolrTestCaseJ4.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test-framework/org/apache/solr/SolrTestCaseJ4.java Sun May 22 21:45:19 2011
@@ -36,8 +36,12 @@ import org.apache.solr.handler.JsonUpdat
 import org.apache.solr.request.LocalSolrQueryRequest;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.request.SolrRequestHandler;
+import org.apache.solr.response.ResultContext;
+import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.IndexSchema;
 import org.apache.solr.schema.SchemaField;
+import org.apache.solr.search.DocIterator;
+import org.apache.solr.search.DocList;
 import org.apache.solr.search.SolrIndexSearcher;
 import org.apache.solr.servlet.DirectSolrConnection;
 import org.apache.solr.util.TestHarness;
@@ -374,15 +378,29 @@ public abstract class SolrTestCaseJ4 ext
     }
   }
 
-  /** Validates a query matches some JSON test expressions and closes the query.
-   * The text expression is of the form path:JSON.  To facilitate easy embedding
-   * in Java strings, the JSON can have double quotes replaced with single quotes.
-   *
-   * Please use this with care: this makes it easy to match complete structures, but doing so
-   * can result in fragile tests if you are matching more than what you want to test.
-   *
-   **/
+  /**
+   * Validates a query matches some JSON test expressions using the default double delta tollerance.
+   * @see JSONTestUtil#DEFAULT_DELTA
+   * @see #assertJQ(SolrQueryRequest,double,String...)
+   */
   public static void assertJQ(SolrQueryRequest req, String... tests) throws Exception {
+    assertJQ(req, JSONTestUtil.DEFAULT_DELTA, tests);
+  }
+  /**
+   * Validates a query matches some JSON test expressions and closes the
+   * query. The text expression is of the form path:JSON.  To facilitate
+   * easy embedding in Java strings, the JSON can have double quotes
+   * replaced with single quotes.
+   * <p>
+   * Please use this with care: this makes it easy to match complete
+   * structures, but doing so can result in fragile tests if you are
+   * matching more than what you want to test.
+   * </p>
+   * @param req Solr request to execute
+   * @param delta tollerance allowed in comparing float/double values
+   * @param tests JSON path expression + '==' + expected value
+   */
+  public static void assertJQ(SolrQueryRequest req, double delta, String... tests) throws Exception {
     SolrParams params =  null;
     try {
       params = req.getParams();
@@ -409,7 +427,7 @@ public abstract class SolrTestCaseJ4 ext
 
         try {
           failed = true;
-          String err = JSONTestUtil.match(response, testJSON);
+          String err = JSONTestUtil.match(response, testJSON, delta);
           failed = false;
           if (err != null) {
             log.error("query failed JSON validation. error=" + err +
@@ -722,6 +740,7 @@ public abstract class SolrTestCaseJ4 ext
   }
 
   public static final IRange ZERO_ONE = new IRange(0,1);
+  public static final IRange ZERO_TWO = new IRange(0,2);
   public static final IRange ONE_ONE = new IRange(1,1);
 
   public static class Doc implements Comparable{
@@ -1040,6 +1059,29 @@ public abstract class SolrTestCaseJ4 ext
     return out.toString();
   }
 
+  /** Return a Map from field value to a list of document ids */
+  Map<Comparable, List<Comparable>> invertField(Map<Comparable, Doc> model, String field) {
+    Map<Comparable, List<Comparable>> value_to_id = new HashMap<Comparable, List<Comparable>>();
+
+    // invert field
+    for (Comparable key : model.keySet()) {
+      Doc doc = model.get(key);
+      List<Comparable> vals = doc.getValues(field);
+      if (vals == null) continue;
+      for (Comparable val : vals) {
+        List<Comparable> ids = value_to_id.get(val);
+        if (ids == null) {
+          ids = new ArrayList<Comparable>(2);
+          value_to_id.put(val, ids);
+        }
+        ids.add(key);
+      }
+    }
+
+    return value_to_id;
+  }
+
+
   /** Gets a resource from the context classloader as {@link File}. This method should only be used,
    * if a real file is needed. To get a stream, code should prefer
    * {@link Class#getResourceAsStream} using {@code this.getClass()}.

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/BasicFunctionalityTest.java Sun May 22 21:45:19 2011
@@ -561,7 +561,7 @@ public class BasicFunctionalityTest exte
 
     DocList dl = ((ResultContext) rsp.getValues().get("response")).docs;
     org.apache.lucene.document.Document d = req.getSearcher().doc(dl.iterator().nextDoc());
-    // ensure field is not lazy
+    // ensure field is not lazy, only works for Non-Numeric fields currently (if you change schema behind test, this may fail)
     assertTrue( d.getFieldable("test_hlt") instanceof Field );
     assertTrue( d.getFieldable("title") instanceof Field );
     req.close();

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/TestDistributedSearch.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/TestDistributedSearch.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/TestDistributedSearch.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/TestDistributedSearch.java Sun May 22 21:45:19 2011
@@ -40,7 +40,8 @@ public class TestDistributedSearch exten
   String nlong = "n_l";
   String tlong = "other_tl1";
   String ndate = "n_dt";
-  String tdate = "n_tdt";
+  String tdate_a = "a_n_tdt";
+  String tdate_b = "b_n_tdt";
   
   String oddField="oddField_s";
   String missingField="ignore_exception__missing_but_valid_field_t";
@@ -48,25 +49,40 @@ public class TestDistributedSearch exten
 
   @Override
   public void doTest() throws Exception {
+    int backupStress = stress; // make a copy so we can restore
+
+
     del("*:*");
-    indexr(id,1, i1, 100, tlong, 100,t1,"now is the time for all good men"
-            ,"foo_f", 1.414f, "foo_b", "true", "foo_d", 1.414d);
-    indexr(id,2, i1, 50 , tlong, 50,t1,"to come to the aid of their country."
-    );
-    indexr(id,3, i1, 2, tlong, 2,t1,"how now brown cow"
-    );
-    indexr(id,4, i1, -100 ,tlong, 101,t1,"the quick fox jumped over the lazy dog"
-    );
-    indexr(id,5, i1, 500, tlong, 500 ,t1,"the quick fox jumped way over the lazy dog"
-    );
+    indexr(id,1, i1, 100, tlong, 100,t1,"now is the time for all good men", 
+           tdate_a, "2010-04-20T11:00:00Z",
+           tdate_b, "2009-08-20T11:00:00Z",
+           "foo_f", 1.414f, "foo_b", "true", "foo_d", 1.414d);
+    indexr(id,2, i1, 50 , tlong, 50,t1,"to come to the aid of their country.", 
+           tdate_a, "2010-05-02T11:00:00Z",
+           tdate_b, "2009-11-02T11:00:00Z");
+    indexr(id,3, i1, 2, tlong, 2,t1,"how now brown cow", 
+           tdate_a, "2010-05-03T11:00:00Z");
+    indexr(id,4, i1, -100 ,tlong, 101,
+           t1,"the quick fox jumped over the lazy dog", 
+           tdate_a, "2010-05-03T11:00:00Z",
+           tdate_b, "2010-05-03T11:00:00Z");
+    indexr(id,5, i1, 500, tlong, 500 ,
+           t1,"the quick fox jumped way over the lazy dog", 
+           tdate_a, "2010-05-05T11:00:00Z");
     indexr(id,6, i1, -600, tlong, 600 ,t1,"humpty dumpy sat on a wall");
     indexr(id,7, i1, 123, tlong, 123 ,t1,"humpty dumpy had a great fall");
-    indexr(id,8, i1, 876, tlong, 876,t1,"all the kings horses and all the kings men");
+    indexr(id,8, i1, 876, tlong, 876,
+           tdate_b, "2010-01-05T11:00:00Z",
+           t1,"all the kings horses and all the kings men");
     indexr(id,9, i1, 7, tlong, 7,t1,"couldn't put humpty together again");
     indexr(id,10, i1, 4321, tlong, 4321,t1,"this too shall pass");
-    indexr(id,11, i1, -987, tlong, 987,t1,"An eye for eye only ends up making the whole world blind.");
-    indexr(id,12, i1, 379, tlong, 379,t1,"Great works are performed, not by strength, but by perseverance.");
-    indexr(id,13, i1, 232, tlong, 232,t1,"no eggs on wall, lesson learned", oddField, "odd man out");
+    indexr(id,11, i1, -987, tlong, 987,
+           t1,"An eye for eye only ends up making the whole world blind.");
+    indexr(id,12, i1, 379, tlong, 379,
+           t1,"Great works are performed, not by strength, but by perseverance.");
+    indexr(id,13, i1, 232, tlong, 232,
+           t1,"no eggs on wall, lesson learned", 
+           oddField, "odd man out");
 
     indexr(id, 14, "SubjectTerms_mfacet", new String[]  {"mathematical models", "mathematical analysis"});
     indexr(id, 15, "SubjectTerms_mfacet", new String[]  {"test 1", "test 2", "test3"});
@@ -132,23 +148,73 @@ public class TestDistributedSearch exten
     // then the primary sort should always be a tie and then the secondary should always decide
     query("q","{!func}ms(NOW)", "sort","score desc,"+i1+" desc","fl","id");    
 
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","count", "facet.mincount",2);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.limit",-1, "facet.sort","index", "facet.mincount",2);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.offset",10, "facet.limit",1, "facet.sort","index");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1,"facet.limit",1);
-    query("q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*");
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.offset",1);
-    query("q","*:*", "rows",100, "facet","true", "facet.field",t1, "facet.mincount",2);
+    query("q","*:*", "rows",0, "facet","true", "facet.field",t1);
+    query("q","*:*", "rows",0, "facet","true", "facet.field",t1,"facet.limit",1);
+    query("q","*:*", "rows",0, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*");
+    query("q","*:*", "rows",0, "facet","true", "facet.field",t1, "facet.mincount",2);
+
+    // simple date facet on one field
+    query("q","*:*", "rows",100, "facet","true", 
+          "facet.date",tdate_a, 
+          "facet.date.other", "all", 
+          "facet.date.start","2010-05-01T11:00:00Z", 
+          "facet.date.gap","+1DAY", 
+          "facet.date.end","2010-05-20T11:00:00Z");
+
+    // date facet on multiple fields
+    query("q","*:*", "rows",100, "facet","true", 
+          "facet.date",tdate_a, 
+          "facet.date",tdate_b, 
+          "facet.date.other", "all", 
+          "f."+tdate_b+".facet.date.start","2009-05-01T11:00:00Z", 
+          "f."+tdate_b+".facet.date.gap","+3MONTHS", 
+          "facet.date.start","2010-05-01T11:00:00Z", 
+          "facet.date.gap","+1DAY", 
+          "facet.date.end","2010-05-20T11:00:00Z");
+
+    // simple range facet on one field
+    query("q","*:*", "rows",100, "facet","true", 
+          "facet.range",tlong, 
+          "facet.range.start",200, 
+          "facet.range.gap",100, 
+          "facet.range.end",900);
+
+    // range facet on multiple fields
+    query("q","*:*", "rows",100, "facet","true", 
+          "facet.range",tlong, 
+          "facet.range",i1, 
+          "f."+i1+".facet.range.start",300, 
+          "f."+i1+".facet.range.gap",87, 
+          "facet.range.end",900,
+          "facet.range.start",200, 
+          "facet.range.gap",100, 
+          "f."+tlong+".facet.range.end",900);
+
+    stress=0;  // turn off stress... we want to tex max combos in min time
+    for (int i=0; i<25*RANDOM_MULTIPLIER; i++) {
+      String f = fieldNames[random.nextInt(fieldNames.length)];
+      if (random.nextBoolean()) f = t1;  // the text field is a really interesting one to facet on (and it's multi-valued too)
+
+      // we want a random query and not just *:* so we'll get zero counts in facets also
+      // TODO: do a better random query
+      String q = random.nextBoolean() ? "*:*" : "id:(1 3 5 7 9 11 13) OR id:[100 TO " + random.nextInt(50) + "]";
+
+      int nolimit = random.nextBoolean() ? -1 : 10000;  // these should be equivalent
+
+      // if limit==-1, we should always get exact matches
+      query("q",q, "rows",0, "facet","true", "facet.field",f, "facet.limit",nolimit, "facet.sort","count", "facet.mincount",random.nextInt(5), "facet.offset",random.nextInt(10));
+      query("q",q, "rows",0, "facet","true", "facet.field",f, "facet.limit",nolimit, "facet.sort","index", "facet.mincount",random.nextInt(5), "facet.offset",random.nextInt(10));
+      // for index sort, we should get exact results for mincount <= 1
+      query("q",q, "rows",0, "facet","true", "facet.field",f, "facet.sort","index", "facet.mincount",random.nextInt(2), "facet.offset",random.nextInt(10), "facet.limit",random.nextInt(11)-1);
+    }
+    stress = backupStress;  // restore stress
 
     // test faceting multiple things at once
-    query("q","*:*", "rows",100, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*"
+    query("q","*:*", "rows",0, "facet","true", "facet.query","quick", "facet.query","all", "facet.query","*:*"
     ,"facet.field",t1);
 
     // test filter tagging, facet exclusion, and naming (multi-select facet support)
-    query("q","*:*", "rows",100, "facet","true", "facet.query","{!key=myquick}quick", "facet.query","{!key=myall ex=a}all", "facet.query","*:*"
+    query("q","*:*", "rows",0, "facet","true", "facet.query","{!key=myquick}quick", "facet.query","{!key=myall ex=a}all", "facet.query","*:*"
     ,"facet.field","{!key=mykey ex=a}"+t1
     ,"facet.field","{!key=other ex=b}"+t1
     ,"facet.field","{!key=again ex=a,b}"+t1

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/analysis/TestSynonymMap.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/analysis/TestSynonymMap.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/analysis/TestSynonymMap.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/analysis/TestSynonymMap.java Sun May 22 21:45:19 2011
@@ -17,6 +17,8 @@
 
 package org.apache.solr.analysis;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -25,6 +27,8 @@ import java.util.Map;
 import org.apache.lucene.analysis.Token;
 import org.apache.lucene.analysis.synonym.SynonymMap;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.solr.common.ResourceLoader;
+
 
 public class TestSynonymMap extends LuceneTestCase {
 
@@ -257,6 +261,43 @@ public class TestSynonymMap extends Luce
     assertTokIncludes( getSubSynonymMap( getSubSynonymMap( synMap, "ab" ), "bc" ), "cd", "gh" );
   }
   
+
+  public void testLoadRules() throws Exception {
+    Map<String, String> args = new HashMap<String, String>();
+    args.put( "synonyms", "something.txt" );
+    SynonymFilterFactory ff = new SynonymFilterFactory();
+    ff.init(args);
+    ff.inform( new ResourceLoader() {
+      @Override
+      public List<String> getLines(String resource) throws IOException {
+        if( !"something.txt".equals(resource) ) {
+          throw new RuntimeException( "should not get a differnt resource" );
+        }
+        List<String> rules = new ArrayList<String>();
+        rules.add( "a,b" );
+        return rules;
+      }
+
+      @Override
+      public Object newInstance(String cname, String... subpackages) {
+        throw new RuntimeException("stub");
+      }
+
+      @Override
+      public InputStream openResource(String resource) throws IOException {
+        throw new RuntimeException("stub");
+      }
+    });
+    
+    SynonymMap synMap = ff.getSynonymMap();
+    assertEquals( 2, synMap.submap.size() );
+    assertTokIncludes( synMap, "a", "a" );
+    assertTokIncludes( synMap, "a", "b" );
+    assertTokIncludes( synMap, "b", "a" );
+    assertTokIncludes( synMap, "b", "b" );
+  }
+  
+  
   private void assertTokIncludes( SynonymMap map, String src, String exp ) throws Exception {
     Token[] tokens = map.submap.get( src ).synonyms;
     boolean inc = false;

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/MultiCoreExampleTestBase.java Sun May 22 21:45:19 2011
@@ -26,6 +26,7 @@ import org.apache.solr.common.SolrInputD
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.util.ExternalPaths;
+import org.junit.Test;
 
 
 /**
@@ -65,8 +66,8 @@ public abstract class MultiCoreExampleTe
   protected abstract SolrServer getSolrCore1();
   protected abstract SolrServer getSolrAdmin();
   protected abstract SolrServer getSolrCore(String name);
-  
 
+  @Test
   public void testMultiCore() throws Exception
   {
     UpdateRequest up = new UpdateRequest();
@@ -79,6 +80,8 @@ public abstract class MultiCoreExampleTe
     // Add something to each core
     SolrInputDocument doc = new SolrInputDocument();
     doc.setField( "id", "AAA" );
+    doc.setField( "name", "AAA1" );
+    doc.setField( "type", "BBB1" );
     doc.setField( "core0", "yup" );
    
     // Add to core0
@@ -96,6 +99,8 @@ public abstract class MultiCoreExampleTe
 
     // Add to core1
     doc.setField( "id", "BBB" );
+    doc.setField( "name", "BBB1" );
+    doc.setField( "type", "AAA1" );
     doc.setField( "core1", "yup" );
     doc.removeField( "core0" );
     up.add( doc );
@@ -124,6 +129,12 @@ public abstract class MultiCoreExampleTe
     assertEquals( 0, getSolrCore1().query( new SolrQuery( "id:AAA" ) ).getResults().size() );
     assertEquals( 1, getSolrCore1().query( new SolrQuery( "id:BBB" ) ).getResults().size() );
 
+    // cross-core join
+    assertEquals( 0, getSolrCore0().query( new SolrQuery( "{!join from=type to=name}*:*" ) ).getResults().size() );  // normal join
+    assertEquals( 1, getSolrCore0().query( new SolrQuery( "{!join from=type to=name fromIndex=core1}id:BBB" ) ).getResults().size() );
+    assertEquals( 1, getSolrCore1().query( new SolrQuery( "{!join from=type to=name fromIndex=core0}id:AAA" ) ).getResults().size() );
+
+
     // Now test reloading it should have a newer open time
     String name = "core0";
     SolrServer coreadmin = getSolrAdmin();

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Sun May 22 21:45:19 2011
@@ -52,6 +52,7 @@ import org.apache.solr.common.util.XML;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.FacetParams;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
@@ -380,7 +381,7 @@ abstract public class SolrExampleTests e
   }
 
 
-  @Test
+  @Test @Ignore   // TODO: re-enable when new transformer syntax is implemented
   public void testAugmentFields() throws Exception
   {    
     SolrServer server = getSolrServer();
@@ -405,7 +406,7 @@ abstract public class SolrExampleTests e
     
     SolrQuery query = new SolrQuery();
     query.setQuery( "*:*" );
-    query.set( CommonParams.FL, "id,price,_docid_,_explain:nl_,score,aaa=_value:aaa_,ten=_value:int:10_" );
+    query.set( CommonParams.FL, "id,price,_docid_,_explain:nl_,score,aaa:_value:aaa_,ten:_value:int:10_" );
     query.addSortField( "price", SolrQuery.ORDER.asc );
     QueryResponse rsp = server.query( query );
     

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/embedded/TestSolrProperties.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/embedded/TestSolrProperties.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/embedded/TestSolrProperties.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/client/solrj/embedded/TestSolrProperties.java Sun May 22 21:45:19 2011
@@ -37,6 +37,7 @@ import org.apache.solr.client.solrj.requ
 import org.apache.solr.client.solrj.request.UpdateRequest.ACTION;
 import org.apache.solr.client.solrj.response.CoreAdminResponse;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.FileUtils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.util.AbstractSolrTestCase;
 import org.junit.After;
@@ -54,6 +55,7 @@ import org.w3c.dom.Node;
 public class TestSolrProperties extends LuceneTestCase {
   protected static Logger log = LoggerFactory.getLogger(TestSolrProperties.class);
   protected CoreContainer cores = null;
+  private File home;
   private File solrXml;
   
   private static final XPathFactory xpathFactory = XPathFactory.newInstance();
@@ -62,19 +64,27 @@ public class TestSolrProperties extends 
     return "solr/shared";
   }
 
-  public String getSolrXml() {
+  public String getOrigSolrXml() {
     return "solr.xml";
   }
 
+  public String getSolrXml() {
+    return "test-solr.xml";
+  }
+  
   @Override
   @Before
   public void setUp() throws Exception {
     super.setUp();
-    File home = SolrTestCaseJ4.getFile(getSolrHome());
+    System.setProperty("solr.solr.home", getSolrHome());
+    
+    home = SolrTestCaseJ4.getFile(getSolrHome());
     System.setProperty("solr.solr.home", home.getAbsolutePath());
 
     log.info("pwd: " + (new File(".")).getAbsolutePath());
-    solrXml = new File(home, "solr.xml");
+    File origSolrXml = new File(home, getOrigSolrXml());
+    solrXml = new File(home, getSolrXml());
+    FileUtils.copyFile(origSolrXml, solrXml);
     cores = new CoreContainer(home.getAbsolutePath(), solrXml);
   }
 
@@ -83,7 +93,7 @@ public class TestSolrProperties extends 
   public void tearDown() throws Exception {
     if (cores != null)
       cores.shutdown();
-    File dataDir = new File(getSolrHome() + "/data");
+    File dataDir = new File(home,"data");
     String skip = System.getProperty("solr.test.leavedatadir");
     if (null != skip && 0 != skip.trim().length()) {
       log.info("NOTE: per solr.test.leavedatadir, dataDir will not be removed: " + dataDir.getAbsolutePath());
@@ -92,8 +102,9 @@ public class TestSolrProperties extends 
         log.warn("!!!! WARNING: best effort to remove " + dataDir.getAbsolutePath() + " FAILED !!!!!");
       }
     }
-    File persistedFile = new File(getSolrHome() + File.separator + "solr-persist.xml");
-    persistedFile.delete();
+    File persistedFile = new File(home,"solr-persist.xml");
+    assertTrue("Failed to delete "+persistedFile, persistedFile.delete());
+    assertTrue("Failed to delete "+solrXml, solrXml.delete());
     super.tearDown();
   }
 
@@ -109,6 +120,10 @@ public class TestSolrProperties extends 
   protected SolrServer getSolrAdmin() {
     return new EmbeddedSolrServer(cores, "core0");
   }
+  
+  protected SolrServer getRenamedSolrAdmin() {
+    return new EmbeddedSolrServer(cores, "renamed_core");
+  }
 
   protected SolrServer getSolrCore(String name) {
     return new EmbeddedSolrServer(cores, name);
@@ -187,16 +202,31 @@ public class TestSolrProperties extends 
 
     mcr = CoreAdminRequest.persist("solr-persist.xml", coreadmin);
     
-    // System.out.println(IOUtils.toString(new FileInputStream(new File(solrXml.getParent(), "solr-persist.xml"))));
+    //System.out.println(IOUtils.toString(new FileInputStream(new File(solrXml.getParent(), "solr-persist.xml"))));
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
     FileInputStream fis = new FileInputStream(new File(solrXml.getParent(), "solr-persist.xml"));
     try {
       Document document = builder.parse(fis);
       assertTrue(exists("/solr/cores[@defaultCoreName='core0']", document));
+      assertTrue(exists("/solr/cores[@host='127.0.0.1']", document));
+      assertTrue(exists("/solr/cores[@hostPort='8983']", document));
+      assertTrue(exists("/solr/cores[@zkClientTimeout='8000']", document));
+      assertTrue(exists("/solr/cores[@hostContext='solr']", document));
+      
+    } finally {
+      fis.close();
+    }
+    
+    CoreAdminRequest.renameCore(name, "renamed_core", coreadmin);
+    mcr = CoreAdminRequest.persist("solr-persist.xml", getRenamedSolrAdmin());
+    
+    fis = new FileInputStream(new File(solrXml.getParent(), "solr-persist.xml"));
+    try {
+      Document document = builder.parse(fis);
+      assertTrue(exists("/solr/cores/core[@name='renamed_core']", document));
     } finally {
       fis.close();
     }
- 
   }
   
   public static boolean exists(String xpathStr, Node node)

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/JsonLoaderTest.java Sun May 22 21:45:19 2011
@@ -26,7 +26,9 @@ import org.apache.lucene.util.LuceneTest
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
+import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.update.AddUpdateCommand;
 import org.apache.solr.update.CommitUpdateCommand;
 import org.apache.solr.update.DeleteUpdateCommand;
@@ -81,13 +83,11 @@ public class JsonLoaderTest extends Solr
   public void testParsing() throws Exception
   {
     SolrQueryRequest req = req();
-    Reader reader = new StringReader(input);
-    
+    SolrQueryResponse rsp = new SolrQueryResponse();
     BufferingRequestProcessor p = new BufferingRequestProcessor(null);
-    JsonLoader loader = new JsonLoader( p );
-    
-    loader.processUpdate(req,  p, new JSONParser(reader) );
-    
+    JsonLoader loader = new JsonLoader( req, p );
+    loader.load(req, rsp, new ContentStreamBase.StringStream(input));
+
     assertEquals( 2, p.addCommands.size() );
     
     AddUpdateCommand add = p.addCommands.get(0);
@@ -133,8 +133,67 @@ public class JsonLoaderTest extends Solr
 
     req.close();
   }
+
+
+  public void testSimpleFormat() throws Exception
+  {
+    String str = "[{'id':'1'},{'id':'2'}]".replace('\'', '"');
+    SolrQueryRequest req = req("commitWithin","100", "overwrite","false");
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    BufferingRequestProcessor p = new BufferingRequestProcessor(null);
+    JsonLoader loader = new JsonLoader( req, p );
+    loader.load(req, rsp, new ContentStreamBase.StringStream(str));
+
+    assertEquals( 2, p.addCommands.size() );
+
+    AddUpdateCommand add = p.addCommands.get(0);
+    SolrInputDocument d = add.solrDoc;
+    SolrInputField f = d.getField( "id" );
+    assertEquals("1", f.getValue());
+    assertEquals(add.commitWithin, 100);
+    assertEquals(add.overwrite, false);
+
+    add = p.addCommands.get(1);
+    d = add.solrDoc;
+    f = d.getField( "id" );
+    assertEquals("2", f.getValue());
+    assertEquals(add.commitWithin, 100);
+    assertEquals(add.overwrite, false);
+
+    req.close();
+  }
+
+  public void testSimpleFormatInAdd() throws Exception
+  {
+    String str = "{'add':[{'id':'1'},{'id':'2'}]}".replace('\'', '"');
+    SolrQueryRequest req = req();
+    SolrQueryResponse rsp = new SolrQueryResponse();
+    BufferingRequestProcessor p = new BufferingRequestProcessor(null);
+    JsonLoader loader = new JsonLoader( req, p );
+    loader.load(req, rsp, new ContentStreamBase.StringStream(str));
+
+    assertEquals( 2, p.addCommands.size() );
+
+    AddUpdateCommand add = p.addCommands.get(0);
+    SolrInputDocument d = add.solrDoc;
+    SolrInputField f = d.getField( "id" );
+    assertEquals("1", f.getValue());
+    assertEquals(add.commitWithin, -1);
+    assertEquals(add.overwrite, true);
+
+    add = p.addCommands.get(1);
+    d = add.solrDoc;
+    f = d.getField( "id" );
+    assertEquals("2", f.getValue());
+    assertEquals(add.commitWithin, -1);
+    assertEquals(add.overwrite, true);
+
+    req.close();
+  }
+
 }
 
+
 class BufferingRequestProcessor extends UpdateRequestProcessor
 {
   List<AddUpdateCommand> addCommands = new ArrayList<AddUpdateCommand>();

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/MoreLikeThisHandlerTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/MoreLikeThisHandlerTest.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/MoreLikeThisHandlerTest.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/handler/MoreLikeThisHandlerTest.java Sun May 22 21:45:19 2011
@@ -79,7 +79,7 @@ public class MoreLikeThisHandlerTest ext
 
     params.set(CommonParams.Q, "id:42");
     params.set(MoreLikeThisParams.MLT, "true");
-    params.set(MoreLikeThisParams.SIMILARITY_FIELDS, "name,subword,foo_ti");
+    params.set(MoreLikeThisParams.SIMILARITY_FIELDS, "name,subword");
     params.set(MoreLikeThisParams.INTERESTING_TERMS, "details");
     params.set(MoreLikeThisParams.MIN_TERM_FREQ,"1");
     params.set(MoreLikeThisParams.MIN_DOC_FREQ,"1");

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/JSONWriterTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/JSONWriterTest.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/JSONWriterTest.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/JSONWriterTest.java Sun May 22 21:45:19 2011
@@ -73,12 +73,12 @@ public class JSONWriterTest extends Solr
 
     StringWriter buf = new StringWriter();
     NamedList nl = new NamedList();
-    nl.add("data1", "hello");
+    nl.add("data1", "he\u2028llo\u2029!");       // make sure that 2028 and 2029 are both escaped (they are illegal in javascript)
     nl.add(null, 42);
     rsp.add("nl", nl);
 
     w.write(buf, req, rsp);
-    assertEquals(buf.toString(), "{\"nl\":[[\"data1\",\"hello\"],[null,42]]}");
+    assertEquals("{\"nl\":[[\"data1\",\"he\\u2028llo\\u2029!\"],[null,42]]}", buf.toString());
     req.close();
   }
   

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/TestFaceting.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/TestFaceting.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/TestFaceting.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/request/TestFaceting.java Sun May 22 21:45:19 2011
@@ -17,14 +17,17 @@
 
 package org.apache.solr.request;
 
+import java.util.Locale;
+import java.util.Random;
+
+import org.apache.lucene.index.DocTermOrds;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermsEnum;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import java.util.Locale;
-import java.util.Random;
 
 /**
  * @version $Id$
@@ -62,43 +65,47 @@ public class TestFaceting extends SolrTe
   }
 
   void doTermEnum(int size) throws Exception {
+    //System.out.println("doTermEnum size=" + size);
     close();
     createIndex(size);
     req = lrf.makeRequest("q","*:*");
 
-    TermIndex ti = new TermIndex(proto.field());
-    NumberedTermsEnum te = ti.getEnumerator(req.getSearcher().getIndexReader());
+    UnInvertedField uif = new UnInvertedField(proto.field(), req.getSearcher());
 
-    // iterate through first
-    while(te.term() != null) te.next();
-    assertEquals(size, te.getTermNumber());
-    te.close();
+    assertEquals(size, uif.getNumTerms());
 
-    te = ti.getEnumerator(req.getSearcher().getIndexReader());
+    TermsEnum te = uif.getOrdTermsEnum(req.getSearcher().getIndexReader());
+    assertEquals(size == 0, te == null);
 
     Random r = new Random(size);
     // test seeking by term string
     for (int i=0; i<size*2+10; i++) {
       int rnum = r.nextInt(size+2);
       String s = t(rnum);
-      BytesRef br = te.skipTo(new BytesRef(s));
+      //System.out.println("s=" + s);
+      final BytesRef br;
+      if (te == null) {
+        br = null;
+      } else {
+        TermsEnum.SeekStatus status = te.seek(new BytesRef(s));
+        if (status == TermsEnum.SeekStatus.END) {
+          br = null;
+        } else {
+          br = te.term();
+        }
+      }
       assertEquals(br != null, rnum < size);
       if (rnum < size) {
-        assertEquals(rnum, te.pos);
+        assertEquals(rnum, (int) te.ord());
         assertEquals(s, te.term().utf8ToString());
-      } else {
-        assertEquals(null, te.term());
-        assertEquals(size, te.getTermNumber());
       }
     }
 
     // test seeking before term
-    assertEquals(size>0, te.skipTo(new BytesRef("000")) != null);
-    assertEquals(0, te.getTermNumber());
     if (size>0) {
+      assertEquals(size>0, te.seek(new BytesRef("000"), true) != TermsEnum.SeekStatus.END);
+      assertEquals(0, te.ord());
       assertEquals(t(0), te.term().utf8ToString());
-    } else {
-      assertEquals(null, te.term());
     }
 
     if (size>0) {
@@ -106,9 +113,10 @@ public class TestFaceting extends SolrTe
       for (int i=0; i<size*2+10; i++) {
         int rnum = r.nextInt(size);
         String s = t(rnum);
-        BytesRef br = te.skipTo(rnum);
+        assertTrue(te.seek((long) rnum) != TermsEnum.SeekStatus.END);
+        BytesRef br = te.term();
         assertNotNull(br);
-        assertEquals(rnum, te.pos);
+        assertEquals(rnum, (int) te.ord());
         assertEquals(s, te.term().utf8ToString());
       }
     }
@@ -118,11 +126,12 @@ public class TestFaceting extends SolrTe
   public void testTermEnum() throws Exception {
     doTermEnum(0);
     doTermEnum(1);
-    doTermEnum(TermIndex.interval - 1);  // test boundaries around the block size
-    doTermEnum(TermIndex.interval);
-    doTermEnum(TermIndex.interval + 1);
-    doTermEnum(TermIndex.interval * 2 + 2);    
-    // doTermEnum(TermIndex.interval * 3 + 3);    
+    final int DEFAULT_INDEX_INTERVAL = 1 << DocTermOrds.DEFAULT_INDEX_INTERVAL_BITS;
+    doTermEnum(DEFAULT_INDEX_INTERVAL - 1);  // test boundaries around the block size
+    doTermEnum(DEFAULT_INDEX_INTERVAL);
+    doTermEnum(DEFAULT_INDEX_INTERVAL + 1);
+    doTermEnum(DEFAULT_INDEX_INTERVAL * 2 + 2);    
+    // doTermEnum(DEFAULT_INDEX_INTERVAL * 3 + 3);    
   }
 
   @Test

Modified: lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/search/QueryParsingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/search/QueryParsingTest.java?rev=1126234&r1=1126233&r2=1126234&view=diff
==============================================================================
--- lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/search/QueryParsingTest.java (original)
+++ lucene/dev/branches/solr2452/solr/src/test/org/apache/solr/search/QueryParsingTest.java Sun May 22 21:45:19 2011
@@ -99,15 +99,15 @@ public class QueryParsingTest extends So
     assertEquals(flds[0].getType(), SortField.CUSTOM);
     //Not thrilled about the fragility of string matching here, but...
     //the value sources get wrapped, so the out field is different than the input
-    assertEquals(flds[0].getField(), "pow(float(weight),const(2.0))");
+    assertEquals(flds[0].getField(), "pow(float(weight),const(2))");
     
     //test functions (more deep)
-    sort = QueryParsing.parseSort("sum(product(r_f1,sum(d_f1,t_f1,1)),a_f1) asc", req);
+    sort = QueryParsing.parseSort("sum(product(r_f1,sum(d_f1,t_f1,1.0)),a_f1) asc", req);
     flds = sort.getSort();
     assertEquals(flds[0].getType(), SortField.CUSTOM);
     assertEquals(flds[0].getField(), "sum(product(float(r_f1),sum(float(d_f1),float(t_f1),const(1.0))),float(a_f1))");
 
-    sort = QueryParsing.parseSort("pow(weight,                 2)         desc", req);
+    sort = QueryParsing.parseSort("pow(weight,                 2.0)         desc", req);
     flds = sort.getSort();
     assertEquals(flds[0].getType(), SortField.CUSTOM);
     //Not thrilled about the fragility of string matching here, but...
@@ -115,7 +115,7 @@ public class QueryParsingTest extends So
     assertEquals(flds[0].getField(), "pow(float(weight),const(2.0))");
 
 
-    sort = QueryParsing.parseSort("pow(weight, 2) desc, weight    desc,   bday    asc", req);
+    sort = QueryParsing.parseSort("pow(weight, 2.0) desc, weight    desc,   bday    asc", req);
     flds = sort.getSort();
     assertEquals(flds[0].getType(), SortField.CUSTOM);