You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by yo...@apache.org on 2009/12/24 22:54:16 UTC
svn commit: r893812 - in /lucene/solr/trunk/src/java/org/apache/solr:
schema/PointType.java search/ToMultiValueSource.java
Author: yonik
Date: Thu Dec 24 21:54:12 2009
New Revision: 893812
URL: http://svn.apache.org/viewvc?rev=893812&view=rev
Log:
SOLR-1131: no need for point value source to recreate sub-value sources for each new reader. Make ToMultiValueSource slightly more generic, specialize for dimention=2, and make point value source inherit from that
Modified:
lucene/solr/trunk/src/java/org/apache/solr/schema/PointType.java
lucene/solr/trunk/src/java/org/apache/solr/search/ToMultiValueSource.java
Modified: lucene/solr/trunk/src/java/org/apache/solr/schema/PointType.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/schema/PointType.java?rev=893812&r1=893811&r2=893812&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/schema/PointType.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/schema/PointType.java Thu Dec 24 21:54:12 2009
@@ -32,12 +32,15 @@
import org.apache.solr.request.XMLWriter;
import org.apache.solr.search.MultiValueSource;
import org.apache.solr.search.QParser;
+import org.apache.solr.search.ToMultiValueSource;
import org.apache.solr.search.function.DocValues;
import org.apache.solr.search.function.ValueSource;
import org.apache.solr.search.function.distance.DistanceUtils;
import java.io.IOException;
import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
/**
* A point type that indexes a point in an n-dimensional space as separate fields and uses
@@ -110,7 +113,12 @@
@Override
public ValueSource getValueSource(SchemaField field, QParser parser) {
- return new PointTypeValueSource(field, dimension, subType, parser);
+ ArrayList<ValueSource> vs = new ArrayList(dimension);
+ for (int i=0; i<dimension; i++) {
+ SchemaField sub = subField(field, i);
+ vs.add(sub.getType().getValueSource(sub, parser));
+ }
+ return new PointTypeValueSource(field, vs);
}
@@ -165,108 +173,24 @@
}
return bq;
}
+}
- class PointTypeValueSource extends MultiValueSource {
- protected SchemaField field;
- protected FieldType subType;
- protected int dimension;
- private QParser parser;
-
- public PointTypeValueSource(SchemaField field, int dimension, FieldType subType, QParser parser) {
- this.field = field;
- this.dimension = dimension;
- this.subType = subType;
- this.parser = parser;
- }
-
- @Override
- public void createWeight(Map context, Searcher searcher) throws IOException {
- String name = field.getName();
- String suffix = FieldType.POLY_FIELD_SEPARATOR + subType.typeName;
- int len = name.length();
- StringBuilder bldr = new StringBuilder(len + 3 + suffix.length());//should be enough buffer to handle most values of j.
- bldr.append(name);
- for (int i = 0; i < dimension; i++) {
- bldr.append(i).append(suffix);
- SchemaField sf = schema.getField(bldr.toString());
- subType.getValueSource(sf, parser).createWeight(context, searcher);
- bldr.setLength(len);
- }
- }
- public int dimension() {
- return dimension;
- }
+class PointTypeValueSource extends ToMultiValueSource {
+ private final SchemaField sf;
+
+ public PointTypeValueSource(SchemaField sf, List<ValueSource> sources) {
+ super(sources);
+ this.sf = sf;
+ }
- @Override
- public DocValues getValues(Map context, IndexReader reader) throws IOException {
- final DocValues[] valsArr1 = new DocValues[dimension];
- String name = field.getName();
- String suffix = FieldType.POLY_FIELD_SEPARATOR + subType.typeName;
- int len = name.length();
- StringBuilder bldr = new StringBuilder(len + 3 + suffix.length());//should be enough buffer to handle most values of j.
- bldr.append(name);
- for (int i = 0; i < dimension; i++) {
- bldr.append(i).append(suffix);
- SchemaField sf = schema.getField(bldr.toString());
- valsArr1[i] = subType.getValueSource(sf, parser).getValues(context, reader);
- bldr.setLength(len);
- }
- return new DocValues() {
- //TODO: not sure how to handle the other types at this moment
- @Override
- public void doubleVal(int doc, double[] vals) {
- //TODO: check whether vals.length == dimension or assume its handled elsewhere?
- for (int i = 0; i < dimension; i++) {
- vals[i] = valsArr1[i].doubleVal(doc);
- }
- }
-
-
- @Override
- public String toString(int doc) {
- StringBuilder sb = new StringBuilder("point(");
- boolean firstTime = true;
- for (DocValues docValues : valsArr1) {
- if (firstTime == false) {
- sb.append(",");
- } else {
- firstTime = true;
- }
- sb.append(docValues.toString(doc));
- }
- sb.append(")");
- return sb.toString();
- }
- };
- }
-
- public String description() {
- StringBuilder sb = new StringBuilder();
- sb.append("point(");
- sb.append("fld=").append(field.name).append(", subType=").append(subType.typeName)
- .append(", dimension=").append(dimension).append(')');
- return sb.toString();
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) return true;
- if (!(o instanceof PointTypeValueSource)) return false;
-
- PointTypeValueSource that = (PointTypeValueSource) o;
-
- if (dimension != that.dimension) return false;
- if (!field.equals(that.field)) return false;
- return true;
- }
-
- @Override
- public int hashCode() {
- int result = field.hashCode();
- result = 31 * result + dimension;
- return result;
- }
+ @Override
+ public String name() {
+ return "point";
}
-}
+ @Override
+ public String description() {
+ return name()+"("+sf.getName()+")";
+ }
+}
\ No newline at end of file
Modified: lucene/solr/trunk/src/java/org/apache/solr/search/ToMultiValueSource.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/ToMultiValueSource.java?rev=893812&r1=893811&r2=893812&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/ToMultiValueSource.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/ToMultiValueSource.java Thu Dec 24 21:54:12 2009
@@ -47,13 +47,67 @@
return sources.size();
}
+ public String name() {
+ return "toMultiVS";
+ }
+
@Override
public DocValues getValues(Map context, IndexReader reader) throws IOException {
int size = sources.size();
+
+ // special-case x,y and lat,lon since it's so common
+ if (size==2) {
+ final DocValues x = sources.get(0).getValues(context, reader);
+ final DocValues y = sources.get(1).getValues(context, reader);
+ return new DocValues() {
+ @Override
+ public void byteVal(int doc, byte[] vals) {
+ vals[0] = x.byteVal(doc);
+ vals[1] = y.byteVal(doc);
+ }
+
+ @Override
+ public void shortVal(int doc, short[] vals) {
+ vals[0] = x.shortVal(doc);
+ vals[1] = y.shortVal(doc);
+ }
+ @Override
+ public void intVal(int doc, int[] vals) {
+ vals[0] = x.intVal(doc);
+ vals[1] = y.intVal(doc);
+ }
+ @Override
+ public void longVal(int doc, long[] vals) {
+ vals[0] = x.longVal(doc);
+ vals[1] = y.longVal(doc);
+ }
+ @Override
+ public void floatVal(int doc, float[] vals) {
+ vals[0] = x.byteVal(doc);
+ vals[1] = y.byteVal(doc);
+ }
+ @Override
+ public void doubleVal(int doc, double[] vals) {
+ vals[0] = x.doubleVal(doc);
+ vals[1] = y.doubleVal(doc);
+ }
+ @Override
+ public void strVal(int doc, String[] vals) {
+ vals[0] = x.strVal(doc);
+ vals[1] = y.strVal(doc);
+ }
+ public String toString(int doc) {
+ return name() + "(" + x.toString(doc) + "," + y.toString(doc) + ")";
+ }
+ };
+ }
+
+
final DocValues[] valsArr = new DocValues[size];
for (int i = 0; i < size; i++) {
valsArr[i] = sources.get(i).getValues(context, reader);
}
+
return new DocValues() {
@Override
public void byteVal(int doc, byte[] vals) {
@@ -107,7 +161,7 @@
@Override
public String toString(int doc) {
StringBuilder sb = new StringBuilder();
- sb.append("toMultiVS(");
+ sb.append(name()).append('(');
boolean firstTime = true;
for (DocValues vals : valsArr) {
if (firstTime) {
@@ -131,7 +185,7 @@
public String description() {
StringBuilder sb = new StringBuilder();
- sb.append("toMultiVS(");
+ sb.append(name()).append('(');
boolean firstTime = true;
for (ValueSource source : sources) {
if (firstTime) {