blob: 6c493e0b0392cc8ab9d705fe91317c6497df3b30 [file] [log] [blame]
Index: src/test/org/apache/lucene/index/DocHelper.java
===================================================================
--- src/test/org/apache/lucene/index/DocHelper.java (revision 723418)
+++ src/test/org/apache/lucene/index/DocHelper.java (working copy)
@@ -30,7 +30,7 @@
import org.apache.lucene.search.Similarity;
import org.apache.lucene.store.Directory;
-class DocHelper {
+public class DocHelper {
public static final String FIELD_1_TEXT = "field one text";
public static final String TEXT_FIELD_1_KEY = "textField1";
public static Field textField1 = new Field(TEXT_FIELD_1_KEY, FIELD_1_TEXT,
Index: src/test/org/apache/lucene/util/TestSerialization.java
===================================================================
--- src/test/org/apache/lucene/util/TestSerialization.java (revision 0)
+++ src/test/org/apache/lucene/util/TestSerialization.java (revision 0)
@@ -0,0 +1,122 @@
+package org.apache.lucene.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.DocHelper;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.ConstantScoreRangeQuery;
+import org.apache.lucene.search.DefaultSimilarity;
+import org.apache.lucene.search.RangeFilter;
+import org.apache.lucene.search.RangeQuery;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.search.function.CustomScoreQuery;
+import org.apache.lucene.search.function.OrdFieldSource;
+import org.apache.lucene.search.function.ValueSourceQuery;
+
+public class TestSerialization extends LuceneTestCase
+{
+ public static File tempDir = new File(System.getProperty("java.io.tmpdir"));
+
+ /**
+ * Term uses Externalization
+ * @throws IOException
+ */
+ public void testSerializeTerm() throws Exception {
+ File termFile = new File(tempDir, "term.obj");
+ FileOutputStream fileOut = new FileOutputStream(termFile);
+ ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
+ objOut.writeObject(new Term("date", "01/01/2001"));
+ objOut.close();
+
+ ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(termFile));
+ Term readTerm = (Term)objIn.readObject();
+ assertEquals(readTerm.field(), "date");
+ assertEquals(readTerm.text(), "01/01/2001");
+ }
+
+ public static void serialize(Object object, File file) throws IOException {
+ ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(file));
+ objOut.writeObject(object);
+ objOut.close();
+ }
+
+ public static Object deserialize(File file) throws Exception {
+ ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(file));
+ return objIn.readObject();
+ }
+
+ public void testSerializeFunctions() throws Exception {
+ File file = new File(tempDir, "function.obj");
+ ValueSourceQuery vsq = new ValueSourceQuery(new OrdFieldSource("field"));
+ CustomScoreQuery csq = new CustomScoreQuery(new TermQuery(new Term("field", "value1")), new ValueSourceQuery[] {vsq});
+
+ serialize(csq, file);
+ CustomScoreQuery readcsq = (CustomScoreQuery)deserialize(file);
+ assertEquals(csq, readcsq);
+ }
+
+ // TODO: test weights, explanation, topdocs
+ public void testSerializeQueries() throws Exception {
+ File queryFile = new File(tempDir, "query.obj");
+ BooleanQuery bq2 = new BooleanQuery();
+ bq2.add(new TermQuery(new Term("field", "value1")), BooleanClause.Occur.SHOULD);
+ bq2.add(new TermQuery(new Term("field", "value2")), BooleanClause.Occur.SHOULD);
+ BooleanQuery nested2 = new BooleanQuery();
+ nested2.add(new TermQuery(new Term("field", "nestedvalue1")), BooleanClause.Occur.SHOULD);
+ nested2.add(new TermQuery(new Term("field", "nestedvalue2")), BooleanClause.Occur.SHOULD);
+ nested2.add(new RangeQuery("field", "0000", "0010", true, false), BooleanClause.Occur.SHOULD);
+ nested2.add(new ConstantScoreRangeQuery("field", "0000", "0010", true, false), BooleanClause.Occur.SHOULD);
+ bq2.add(nested2, BooleanClause.Occur.SHOULD);
+
+ ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(queryFile));
+ objOut.writeObject(bq2);
+ DefaultSimilarity ds = new DefaultSimilarity();
+ ds.setDiscountOverlaps(true);
+ objOut.writeObject(ds);
+ RangeQuery rq = new RangeQuery("field", "0000", "0010", true, false);
+ objOut.writeObject(rq);
+ objOut.close();
+
+ ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(queryFile));
+ BooleanQuery readbq = (BooleanQuery)objIn.readObject();
+ DefaultSimilarity readds = (DefaultSimilarity)objIn.readObject();
+ RangeQuery readrq = (RangeQuery)objIn.readObject();
+
+ //System.out.println("rq: "+rq+"\nreadrq: "+readrq);
+ assertEquals(readrq, rq);
+ assertEquals(readbq, bq2);
+ assertEquals(ds, readds);
+ }
+
+ public void testSerializeFilters() throws Exception {
+ File file = new File(tempDir, "filters.obj");
+ RangeFilter rangeFilter = new RangeFilter("field", "0000", "0010",
+ true, true);
+ serialize(rangeFilter, file);
+
+ RangeFilter readrf = (RangeFilter)deserialize(file);
+ assertEquals(readrf, rangeFilter);
+ }
+
+ public void testSerializeDocument() throws Exception {
+ File docsFile = new File(tempDir, "docs.obj");
+ Document doc = new Document();
+ DocHelper.setupDoc(doc);
+ ObjectOutputStream objOut = new ObjectOutputStream(new FileOutputStream(docsFile));
+ objOut.writeObject(doc);
+ objOut.close();
+
+ ObjectInputStream objIn = new ObjectInputStream(new FileInputStream(docsFile));
+ Document readdoc = (Document)objIn.readObject();
+ //System.out.println("d1: "+doc+" d2: "+readdoc);
+ assertEquals(readdoc, doc);
+ }
+}
Property changes on: src/test/org/apache/lucene/util/TestSerialization.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ "Date Rev Author URL Id"
Name: svn:eol-style
+ native
Index: src/java/org/apache/lucene/search/MultiTermQuery.java
===================================================================
--- src/java/org/apache/lucene/search/MultiTermQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/MultiTermQuery.java (working copy)
@@ -25,7 +25,11 @@
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.TermEnum;
import org.apache.lucene.util.OpenBitSet;
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.util.ToStringUtils;
+import java.io.Externalizable;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
/**
* A {@link Query} that matches documents containing a subset of terms provided
@@ -42,7 +46,8 @@
* The pattern Term may be null. A query that uses a null pattern Term should
* override equals and hashcode.
*/
-public abstract class MultiTermQuery extends Query {
+public abstract class MultiTermQuery extends Query implements Externalizable {
+ private static final long serialVersionUID = 10L;
protected Term term;
protected boolean constantScoreRewrite = false;
@@ -70,7 +75,21 @@
protected Filter getFilter() {
return new MultiTermFilter(this);
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ out.writeObject(term);
+ out.writeBoolean(constantScoreRewrite);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ term = (Term)in.readObject();
+ constantScoreRewrite = in.readBoolean();
+ }
+
public Query rewrite(IndexReader reader) throws IOException {
if (!constantScoreRewrite) {
FilteredTermEnum enumerator = getEnum(reader);
Index: src/java/org/apache/lucene/search/ConstantScoreQuery.java
===================================================================
--- src/java/org/apache/lucene/search/ConstantScoreQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/ConstantScoreQuery.java (working copy)
@@ -30,6 +30,7 @@
* @version $Id$
*/
public class ConstantScoreQuery extends Query {
+ private static final long serialVersionUID = 10L;
protected final Filter filter;
public ConstantScoreQuery(Filter filter) {
Index: src/java/org/apache/lucene/search/FuzzyQuery.java
===================================================================
--- src/java/org/apache/lucene/search/FuzzyQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/FuzzyQuery.java (working copy)
@@ -28,7 +28,7 @@
* is based on the Levenshtein (edit distance) algorithm.
*/
public class FuzzyQuery extends MultiTermQuery {
-
+ private static final long serialVersionUID = 10L;
public final static float defaultMinSimilarity = 0.5f;
public final static int defaultPrefixLength = 0;
Index: src/java/org/apache/lucene/search/Filter.java
===================================================================
--- src/java/org/apache/lucene/search/Filter.java (revision 723418)
+++ src/java/org/apache/lucene/search/Filter.java (working copy)
@@ -31,6 +31,7 @@
* in order to work with Lucene 3.0.
*/
public abstract class Filter implements java.io.Serializable {
+ private static final long serialVersionUID = 10L;
/**
* @return A BitSet with true for documents which should be permitted in
* search results, and false for those that should not.
Index: src/java/org/apache/lucene/search/FieldCacheRangeFilter.java
===================================================================
--- src/java/org/apache/lucene/search/FieldCacheRangeFilter.java (revision 723418)
+++ src/java/org/apache/lucene/search/FieldCacheRangeFilter.java (working copy)
@@ -43,6 +43,7 @@
*/
public class FieldCacheRangeFilter extends Filter {
+ private static final long serialVersionUID = 10L;
private String field;
private String lowerVal;
private String upperVal;
Index: src/java/org/apache/lucene/search/RangeFilter.java
===================================================================
--- src/java/org/apache/lucene/search/RangeFilter.java (revision 723418)
+++ src/java/org/apache/lucene/search/RangeFilter.java (working copy)
@@ -18,8 +18,13 @@
*/
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.util.SerializeUtils;
import java.io.IOException;
+import java.io.Externalizable;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.BitSet;
import java.text.Collator;
@@ -35,8 +40,8 @@
* If you construct a large number of range filters with different ranges but on the
* same field, {@link FieldCacheRangeFilter} may have significantly better performance.
*/
-public class RangeFilter extends Filter {
-
+public class RangeFilter extends Filter implements Externalizable {
+ private static final long serialVersionUID = 10L;
private String fieldName;
private String lowerTerm;
private String upperTerm;
@@ -44,7 +49,8 @@
private boolean includeUpper;
private Collator collator;
private RangeQuery rangeQuery;
-
+
+ public RangeFilter() {}
/**
* @param fieldName The field this range applies to
* @param lowerTerm The lower bound on this range
@@ -156,7 +162,29 @@
buffer.append(includeUpper ? "]" : "}");
return buffer.toString();
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeUTF(fieldName);
+ out.writeUTF(lowerTerm);
+ out.writeUTF(upperTerm);
+ out.writeBoolean(includeLower);
+ out.writeBoolean(includeUpper);
+ out.writeObject(collator);
+ out.writeObject(rangeQuery);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ fieldName = in.readUTF();
+ lowerTerm = in.readUTF();
+ upperTerm = in.readUTF();
+ includeLower = in.readBoolean();
+ includeUpper = in.readBoolean();
+ collator = (Collator)in.readObject();
+ rangeQuery = (RangeQuery)in.readObject();
+ }
+
/** Returns true if <code>o</code> is equal to this. */
public boolean equals(Object o) {
if (this == o) return true;
Index: src/java/org/apache/lucene/search/TopFieldDocs.java
===================================================================
--- src/java/org/apache/lucene/search/TopFieldDocs.java (revision 723418)
+++ src/java/org/apache/lucene/search/TopFieldDocs.java (working copy)
@@ -29,7 +29,7 @@
*/
public class TopFieldDocs
extends TopDocs {
-
+ private static final long serialVersionUID = 10L;
/** The fields which were used to sort results by. */
public SortField[] fields;
Index: src/java/org/apache/lucene/search/RangeQuery.java
===================================================================
--- src/java/org/apache/lucene/search/RangeQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/RangeQuery.java (working copy)
@@ -17,11 +17,15 @@
* limitations under the License.
*/
+import java.io.Externalizable;
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.text.Collator;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.SerializeUtils;
/**
* A Query that matches documents within an exclusive range. A RangeQuery
@@ -37,15 +41,17 @@
*
* @version $Id$
*/
-public class RangeQuery extends MultiTermQuery {
+public class RangeQuery extends MultiTermQuery implements Externalizable {
+ private static final long serialVersionUID = 10L;
private Term lowerTerm;
private Term upperTerm;
private Collator collator;
private String field;
private boolean includeLower;
private boolean includeUpper;
-
-
+
+ public RangeQuery() {}
+
/**
* Constructs a query selecting all terms greater/equal than <code>lowerTerm</code>
* but less/equal than <code>upperTerm</code>.
@@ -195,6 +201,28 @@
return buffer.toString();
}
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ out.writeObject(lowerTerm);
+ out.writeObject(upperTerm);
+ out.writeObject(collator);
+ out.writeUTF(field);
+ out.writeBoolean(includeLower);
+ out.writeBoolean(includeUpper);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ lowerTerm = (Term)in.readObject();
+ upperTerm = (Term)in.readObject();
+ collator = (Collator)in.readObject();
+ field = in.readUTF().intern();
+ includeLower = in.readBoolean();
+ includeUpper = in.readBoolean();
+ }
+
/** Returns true iff <code>o</code> is equal to this. */
public boolean equals(Object o) {
if (this == o) return true;
Index: src/java/org/apache/lucene/search/ConstantScoreRangeQuery.java
===================================================================
--- src/java/org/apache/lucene/search/ConstantScoreRangeQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/ConstantScoreRangeQuery.java (working copy)
@@ -35,7 +35,10 @@
*/
public class ConstantScoreRangeQuery extends RangeQuery
{
-
+ private static final long serialVersionUID = 10L;
+
+ public ConstantScoreRangeQuery() {}
+
public ConstantScoreRangeQuery(String fieldName, String lowerVal, String upperVal, boolean includeLower, boolean includeUpper)
{
super(fieldName, lowerVal, upperVal, includeLower, includeUpper);
Index: src/java/org/apache/lucene/search/function/IntFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/IntFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/IntFieldSource.java (working copy)
@@ -40,6 +40,7 @@
*
*/
public class IntFieldSource extends FieldCacheSource {
+ private static final long serialVersionUID = 10L;
private FieldCache.IntParser parser;
/**
Index: src/java/org/apache/lucene/search/function/ValueSourceQuery.java
===================================================================
--- src/java/org/apache/lucene/search/function/ValueSourceQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/ValueSourceQuery.java (working copy)
@@ -18,10 +18,15 @@
*/
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.util.ToStringUtils;
+import java.io.Externalizable;
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Set;
/**
@@ -38,9 +43,12 @@
* The APIs introduced here might change in the future and will not be
* supported anymore in such a case.</font>
*/
-public class ValueSourceQuery extends Query {
+public class ValueSourceQuery extends Query implements Externalizable {
+ private static final long serialVersionUID = 10L;
ValueSource valSrc;
-
+
+ public ValueSourceQuery() {}
+
/**
* Create a value source query
* @param valSrc provides the values defines the function to be used for scoring
@@ -48,7 +56,19 @@
public ValueSourceQuery(ValueSource valSrc) {
this.valSrc=valSrc;
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ out.writeObject(valSrc);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ valSrc = (ValueSource)in.readObject();
+ }
+
/*(non-Javadoc) @see org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader) */
public Query rewrite(IndexReader reader) throws IOException {
return this;
@@ -59,15 +79,30 @@
// no terms involved here
}
- private class ValueSourceWeight implements Weight {
+ private class ValueSourceWeight implements Weight, Externalizable {
Similarity similarity;
float queryNorm;
float queryWeight;
-
+
+ public ValueSourceWeight() {}
+
public ValueSourceWeight(Searcher searcher) {
this.similarity = getSimilarity(searcher);
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(similarity);
+ out.writeFloat(queryNorm);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ similarity = (Similarity)in.readObject();
+ queryNorm = in.readFloat();
+ queryWeight = in.readFloat();
+ }
+
/*(non-Javadoc) @see org.apache.lucene.search.Weight#getQuery() */
public Query getQuery() {
return ValueSourceQuery.this;
Index: src/java/org/apache/lucene/search/function/ShortFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/ShortFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/ShortFieldSource.java (working copy)
@@ -38,6 +38,7 @@
* on the field.
*/
public class ShortFieldSource extends FieldCacheSource {
+ private static final long serialVersionUID = 10L;
private FieldCache.ShortParser parser;
/**
Index: src/java/org/apache/lucene/search/function/FieldScoreQuery.java
===================================================================
--- src/java/org/apache/lucene/search/function/FieldScoreQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/FieldScoreQuery.java (working copy)
@@ -58,7 +58,7 @@
* supported anymore in such a case.</font>
*/
public class FieldScoreQuery extends ValueSourceQuery {
-
+ private static final long serialVersionUID = 10L;
/**
* Type of score field, indicating how field values are interpreted/parsed.
* <p>
Index: src/java/org/apache/lucene/search/function/ReverseOrdFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/ReverseOrdFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/ReverseOrdFieldSource.java (working copy)
@@ -48,6 +48,7 @@
*/
public class ReverseOrdFieldSource extends ValueSource {
+ private static final long serialVersionUID = 10L;
public String field;
/**
Index: src/java/org/apache/lucene/search/function/ByteFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/ByteFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/ByteFieldSource.java (working copy)
@@ -38,6 +38,7 @@
* on the field.
*/
public class ByteFieldSource extends FieldCacheSource {
+ private static final long serialVersionUID = 10L;
private FieldCache.ByteParser parser;
/**
Index: src/java/org/apache/lucene/search/function/FieldCacheSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/FieldCacheSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/FieldCacheSource.java (working copy)
@@ -41,6 +41,7 @@
*
*/
public abstract class FieldCacheSource extends ValueSource {
+ private static final long serialVersionUID = 10L;
private String field;
/**
Index: src/java/org/apache/lucene/search/function/OrdFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/OrdFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/OrdFieldSource.java (working copy)
@@ -47,6 +47,7 @@
*/
public class OrdFieldSource extends ValueSource {
+ private static final long serialVersionUID = 10L;
protected String field;
/**
Index: src/java/org/apache/lucene/search/function/FloatFieldSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/FloatFieldSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/FloatFieldSource.java (working copy)
@@ -39,6 +39,7 @@
*
*/
public class FloatFieldSource extends FieldCacheSource {
+ private static final long serialVersionUID = 10L;
private FieldCache.FloatParser parser;
/**
Index: src/java/org/apache/lucene/search/function/CustomScoreQuery.java
===================================================================
--- src/java/org/apache/lucene/search/function/CustomScoreQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/CustomScoreQuery.java (working copy)
@@ -18,9 +18,14 @@
*/
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.text.Collator;
import java.util.Set;
+import java.io.Externalizable;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
import org.apache.lucene.search.ComplexExplanation;
import org.apache.lucene.search.Explanation;
import org.apache.lucene.search.Query;
@@ -28,6 +33,7 @@
import org.apache.lucene.search.Searcher;
import org.apache.lucene.search.Similarity;
import org.apache.lucene.search.Weight;
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.util.ToStringUtils;
/**
@@ -45,11 +51,13 @@
* The APIs introduced here might change in the future and will not be
* supported anymore in such a case.</font>
*/
-public class CustomScoreQuery extends Query {
-
+public class CustomScoreQuery extends Query implements Externalizable {
+ private static final long serialVersionUID = 10L;
private Query subQuery;
private ValueSourceQuery[] valSrcQueries; // never null (empty array if there are no valSrcQueries).
private boolean strict = false; // if true, valueSource part of query does not take part in weights normalization.
+
+ public CustomScoreQuery() {}
/**
* Create a CustomScoreQuery over input subQuery.
@@ -87,7 +95,23 @@
valSrcQueries : new ValueSourceQuery[0];
if (subQuery == null) throw new IllegalArgumentException("<subquery> must not be null!");
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ out.writeObject(subQuery);
+ out.writeObject(valSrcQueries);
+ out.writeBoolean(strict);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ subQuery = (Query)in.readObject();
+ valSrcQueries = (ValueSourceQuery[])in.readObject();
+ strict = in.readBoolean();
+ }
+
/*(non-Javadoc) @see org.apache.lucene.search.Query#rewrite(org.apache.lucene.index.IndexReader) */
public Query rewrite(IndexReader reader) throws IOException {
subQuery = subQuery.rewrite(reader);
@@ -271,7 +295,7 @@
//=========================== W E I G H T ============================
- private class CustomWeight implements Weight {
+ private class CustomWeight implements Weight, Externalizable {
Similarity similarity;
Weight subQueryWeight;
Weight[] valSrcWeights;
@@ -287,7 +311,23 @@
}
this.qStrict = strict;
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(similarity);
+ out.writeObject(subQueryWeight);
+ out.writeObject(valSrcWeights);
+ out.writeBoolean(qStrict);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ similarity = (Similarity)in.readObject();
+ subQueryWeight = (Weight)in.readObject();
+ valSrcWeights = (Weight[])in.readObject();
+ qStrict = in.readBoolean();
+ }
+
/*(non-Javadoc) @see org.apache.lucene.search.Weight#getQuery() */
public Query getQuery() {
return CustomScoreQuery.this;
Index: src/java/org/apache/lucene/search/function/ValueSource.java
===================================================================
--- src/java/org/apache/lucene/search/function/ValueSource.java (revision 723418)
+++ src/java/org/apache/lucene/search/function/ValueSource.java (working copy)
@@ -39,7 +39,7 @@
*
*/
public abstract class ValueSource implements Serializable {
-
+ private static final long serialVersionUID = 10L;
/**
* Return the DocValues used by the function query.
* @param reader the IndexReader used to read these values.
Index: src/java/org/apache/lucene/search/BooleanQuery.java
===================================================================
--- src/java/org/apache/lucene/search/BooleanQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/BooleanQuery.java (working copy)
@@ -18,18 +18,22 @@
*/
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.util.ToStringUtils;
import org.apache.lucene.search.BooleanClause.Occur;
+import java.io.Externalizable;
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.*;
/** A Query that matches documents matching boolean combinations of other
* queries, e.g. {@link TermQuery}s, {@link PhraseQuery}s or other
* BooleanQuerys.
*/
-public class BooleanQuery extends Query {
-
+public class BooleanQuery extends Query implements Externalizable {
+ private static final long serialVersionUID = 10L;
private static int maxClauseCount = 1024;
@@ -173,7 +177,7 @@
/** Returns the list of clauses in this query. */
public List clauses() { return clauses; }
- private class BooleanWeight implements Weight {
+ private class BooleanWeight implements Weight, Externalizable {
protected Similarity similarity;
protected ArrayList weights;
@@ -186,7 +190,19 @@
weights.add(c.getQuery().createWeight(searcher));
}
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(similarity);
+ out.writeObject(weights);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ similarity = (Similarity)in.readObject();
+ weights = (ArrayList)in.readObject();
+ }
+
public Query getQuery() { return BooleanQuery.this; }
public float getValue() { return getBoost(); }
@@ -456,6 +472,28 @@
return buffer.toString();
}
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ SerializeUtils.writeVInt(out, clauses.size());
+ for (int x=0; x < clauses.size(); x++) {
+ out.writeObject(clauses.get(x));
+ }
+ out.writeBoolean(disableCoord);
+ SerializeUtils.writeVInt(out, minNrShouldMatch);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ int csize = SerializeUtils.readVInt(in);
+ for (int x=0; x < csize; x++) {
+ clauses.add(in.readObject());
+ }
+ disableCoord = in.readBoolean();
+ minNrShouldMatch = SerializeUtils.readVInt(in);
+ }
/** Returns true iff <code>o</code> is equal to this. */
public boolean equals(Object o) {
Index: src/java/org/apache/lucene/search/Query.java
===================================================================
--- src/java/org/apache/lucene/search/Query.java (revision 723418)
+++ src/java/org/apache/lucene/search/Query.java (working copy)
@@ -18,12 +18,17 @@
*/
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.util.SerializeUtils;
/** The abstract base class for queries.
<p>Instantiable subclasses are:
@@ -44,7 +49,8 @@
<li>{@link org.apache.lucene.queryParser.QueryParser QueryParser}
</ul>
*/
-public abstract class Query implements java.io.Serializable, Cloneable {
+public abstract class Query implements Externalizable, Cloneable {
+ private static final long serialVersionUID = 10L;
private float boost = 1.0f; // query boost factor
/** Sets the boost for this query clause to <code>b</code>. Documents
@@ -74,7 +80,20 @@
* </ul>
*/
public abstract String toString(String field);
-
+
+ /** For Externalizable */
+ public Query() {}
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeFloat(boost);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ boost = in.readFloat();
+ }
+
/** Prints a query to a string. */
public String toString() {
return toString("");
Index: src/java/org/apache/lucene/search/PhraseQuery.java
===================================================================
--- src/java/org/apache/lucene/search/PhraseQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/PhraseQuery.java (working copy)
@@ -32,6 +32,7 @@
* <p>This query may be combined with other terms or queries with a {@link BooleanQuery}.
*/
public class PhraseQuery extends Query {
+ private static final long serialVersionUID = 10L;
private String field;
private ArrayList terms = new ArrayList(4);
private ArrayList positions = new ArrayList(4);
Index: src/java/org/apache/lucene/search/FieldDoc.java
===================================================================
--- src/java/org/apache/lucene/search/FieldDoc.java (revision 723418)
+++ src/java/org/apache/lucene/search/FieldDoc.java (working copy)
@@ -40,7 +40,7 @@
*/
public class FieldDoc
extends ScoreDoc {
-
+ private static final long serialVersionUID = 10L;
/** Expert: The values which are used to sort the referenced document.
* The order of these will match the original sort criteria given by a
* Sort object. Each Object will be either an Integer, Float or String,
Index: src/java/org/apache/lucene/search/TopDocs.java
===================================================================
--- src/java/org/apache/lucene/search/TopDocs.java (revision 723418)
+++ src/java/org/apache/lucene/search/TopDocs.java (working copy)
@@ -17,9 +17,17 @@
* limitations under the License.
*/
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+import org.apache.lucene.util.SerializeUtils;
+
/** Expert: Returned by low-level search implementations.
* @see Searcher#search(Query,Filter,int) */
-public class TopDocs implements java.io.Serializable {
+public class TopDocs implements Externalizable {
+ private static final long serialVersionUID = 10L;
/** Expert: The total number of hits for the query.
* @see Hits#length()
*/
@@ -34,6 +42,20 @@
return maxScore;
}
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ SerializeUtils.writeVInt(out, totalHits);
+ out.writeObject(scoreDocs);
+ out.writeFloat(maxScore);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ totalHits = SerializeUtils.readVInt(in);
+ scoreDocs = (ScoreDoc[])in.readObject();
+ maxScore = in.readFloat();
+ }
+
/** Expert: Sets the maximum score value encountered. */
public void setMaxScore(float maxScore) {
this.maxScore=maxScore;
Index: src/java/org/apache/lucene/search/Explanation.java
===================================================================
--- src/java/org/apache/lucene/search/Explanation.java (revision 723418)
+++ src/java/org/apache/lucene/search/Explanation.java (working copy)
@@ -17,10 +17,17 @@
* limitations under the License.
*/
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
import java.util.ArrayList;
+import org.apache.lucene.util.SerializeUtils;
+
/** Expert: Describes the score computation for document and query. */
-public class Explanation implements java.io.Serializable {
+public class Explanation implements Externalizable {
+ private static final long serialVersionUID = 10L;
private float value; // the value of this node
private String description; // what it represents
private ArrayList details; // sub-explanations
@@ -44,8 +51,20 @@
return (0.0f < getValue());
}
-
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeFloat(value);
+ out.writeUTF(description);
+ out.writeObject(details);
+ }
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ value = in.readFloat();
+ description = in.readUTF();
+ details = (ArrayList)in.readObject();
+ }
+
/** The value assigned to this explanation node. */
public float getValue() { return value; }
/** Sets the value assigned to this explanation node. */
Index: src/java/org/apache/lucene/search/Sort.java
===================================================================
--- src/java/org/apache/lucene/search/Sort.java (revision 723418)
+++ src/java/org/apache/lucene/search/Sort.java (working copy)
@@ -99,7 +99,7 @@
*/
public class Sort
implements Serializable {
-
+ private static final long serialVersionUID = 10L;
/**
* Represents sorting by computed relevance. Using this sort criteria returns
* the same results as calling
Index: src/java/org/apache/lucene/search/SortField.java
===================================================================
--- src/java/org/apache/lucene/search/SortField.java (revision 723418)
+++ src/java/org/apache/lucene/search/SortField.java (working copy)
@@ -32,7 +32,7 @@
*/
public class SortField
implements Serializable {
-
+ private static final long serialVersionUID = 10L;
/** Sort by document score (relevancy). Sort values are Float and higher
* values are at the front. */
public static final int SCORE = 0;
Index: src/java/org/apache/lucene/search/TermQuery.java
===================================================================
--- src/java/org/apache/lucene/search/TermQuery.java (revision 723418)
+++ src/java/org/apache/lucene/search/TermQuery.java (working copy)
@@ -18,26 +18,36 @@
*/
import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Set;
+import java.io.Externalizable;
import org.apache.lucene.index.Term;
import org.apache.lucene.index.TermDocs;
import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.util.ToStringUtils;
/** A Query that matches documents containing a term.
This may be combined with other terms with a {@link BooleanQuery}.
*/
public class TermQuery extends Query {
+ private static final long serialVersionUID = 10L;
private Term term;
-
- private class TermWeight implements Weight {
+
+ public TermQuery() {}
+
+ private class TermWeight implements Weight, Externalizable {
private Similarity similarity;
private float value;
private float idf;
private float queryNorm;
private float queryWeight;
-
+
+ public TermWeight() {}
+
public TermWeight(Searcher searcher)
throws IOException {
this.similarity = getSimilarity(searcher);
@@ -48,7 +58,25 @@
public Query getQuery() { return TermQuery.this; }
public float getValue() { return value; }
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(similarity);
+ out.writeFloat(value);
+ out.writeFloat(idf);
+ out.writeFloat(queryNorm);
+ out.writeFloat(queryWeight);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ similarity = (Similarity)in.readObject();
+ value = in.readFloat();
+ idf = in.readFloat();
+ queryNorm = in.readFloat();
+ queryWeight = in.readFloat();
+ }
+
public float sumOfSquaredWeights() {
queryWeight = idf * getBoost(); // compute query weight
return queryWeight * queryWeight; // square it
@@ -149,7 +177,17 @@
public void extractTerms(Set terms) {
terms.add(getTerm());
}
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(term);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ term = (Term)in.readObject();
+ }
+
/** Prints a user-readable version of this query. */
public String toString(String field) {
StringBuffer buffer = new StringBuffer();
Index: src/java/org/apache/lucene/search/ScoreDoc.java
===================================================================
--- src/java/org/apache/lucene/search/ScoreDoc.java (revision 723418)
+++ src/java/org/apache/lucene/search/ScoreDoc.java (working copy)
@@ -20,6 +20,7 @@
/** Expert: Returned by low-level search implementations.
* @see TopDocs */
public class ScoreDoc implements java.io.Serializable {
+ private static final long serialVersionUID = 10L;
/** Expert: The score of this document for the query. */
public float score;
Index: src/java/org/apache/lucene/search/ComplexExplanation.java
===================================================================
--- src/java/org/apache/lucene/search/ComplexExplanation.java (revision 723418)
+++ src/java/org/apache/lucene/search/ComplexExplanation.java (working copy)
@@ -20,6 +20,7 @@
/** Expert: Describes the score computation for document and query, and
* can distinguish a match independent of a positive value. */
public class ComplexExplanation extends Explanation {
+ private static final long serialVersionUID = 10L;
private Boolean match;
public ComplexExplanation() {
Index: src/java/org/apache/lucene/search/BooleanClause.java
===================================================================
--- src/java/org/apache/lucene/search/BooleanClause.java (revision 723418)
+++ src/java/org/apache/lucene/search/BooleanClause.java (working copy)
@@ -1,7 +1,13 @@
package org.apache.lucene.search;
import org.apache.lucene.util.Parameter;
+import org.apache.lucene.util.SerializeUtils;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -20,8 +26,12 @@
*/
/** A clause in a BooleanQuery. */
-public class BooleanClause implements java.io.Serializable {
+public class BooleanClause implements Externalizable {
+ private static final long serialVersionUID = 10L;
+ /** For Externalizable */
+ public BooleanClause() {}
+
/** Specifies how clauses are to occur in matching documents. */
public static final class Occur extends Parameter implements java.io.Serializable {
@@ -29,7 +39,7 @@
// typesafe enum pattern, no public constructor
super(name);
}
-
+
public String toString() {
if (this == MUST) return "+";
if (this == MUST_NOT) return "-";
@@ -102,6 +112,18 @@
return this.query.equals(other.query)
&& this.occur.equals(other.occur);
}
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(query);
+ out.writeObject(occur);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ query = (Query)in.readObject();
+ occur = (Occur)in.readObject();
+ }
/** Returns a hash code value for this object.*/
public int hashCode() {
Index: src/java/org/apache/lucene/search/DefaultSimilarity.java
===================================================================
--- src/java/org/apache/lucene/search/DefaultSimilarity.java (revision 723418)
+++ src/java/org/apache/lucene/search/DefaultSimilarity.java (working copy)
@@ -1,6 +1,12 @@
package org.apache.lucene.search;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
+
import org.apache.lucene.index.FieldInvertState;
+import org.apache.lucene.util.SerializeUtils;
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
@@ -20,8 +26,8 @@
*/
/** Expert: Default scoring implementation. */
-public class DefaultSimilarity extends Similarity {
-
+public class DefaultSimilarity extends Similarity implements Externalizable {
+ private static final long serialVersionUID = 10L;
/** Implemented as
* <code>state.getBoost()*lengthNorm(numTerms)</code>, where
* <code>numTerms</code> is {@link FieldInvertState#getLength()} if {@link
@@ -72,7 +78,17 @@
// Default false
protected boolean discountOverlaps;
-
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeBoolean(discountOverlaps);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ discountOverlaps = in.readBoolean();
+ }
+
/** Determines whether overlap tokens (Tokens with
* 0 position increment) are ignored when computing
* norm. By default this is false, meaning overlap
@@ -87,6 +103,20 @@
discountOverlaps = v;
}
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ DefaultSimilarity other = (DefaultSimilarity) obj;
+ if (discountOverlaps != other.discountOverlaps)
+ return false;
+ return true;
+ }
+
/** @see #setDiscountOverlaps */
public boolean getDiscountOverlaps() {
return discountOverlaps;
Index: src/java/org/apache/lucene/index/Payload.java
===================================================================
--- src/java/org/apache/lucene/index/Payload.java (revision 723418)
+++ src/java/org/apache/lucene/index/Payload.java (working copy)
@@ -35,6 +35,7 @@
*
*/
public class Payload implements Serializable, Cloneable {
+ private static final long serialVersionUID = 10L;
/** the byte array containing the payload data */
protected byte[] data;
Index: src/java/org/apache/lucene/index/Term.java
===================================================================
--- src/java/org/apache/lucene/index/Term.java (revision 723418)
+++ src/java/org/apache/lucene/index/Term.java (working copy)
@@ -1,5 +1,12 @@
package org.apache.lucene.index;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Externalizable;
+
+import org.apache.lucene.util.SerializeUtils;
+
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
@@ -25,10 +32,13 @@
Note that terms may represent more than words from text fields, but also
things like dates, email addresses, urls, etc. */
-public final class Term implements Comparable, java.io.Serializable {
+public final class Term implements Comparable, Externalizable {
+ private static final long serialVersionUID = 10L;
String field;
String text;
-
+
+ public Term() {}
+
/** Constructs a Term with the given field and text.
* <p>Note that a null field or null text value results in undefined
* behavior for most Lucene APIs that accept a Term parameter. */
@@ -113,10 +123,15 @@
public final String toString() { return field + ":" + text; }
- private void readObject(java.io.ObjectInputStream in)
- throws java.io.IOException, ClassNotFoundException
- {
- in.defaultReadObject();
- field = field.intern();
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeUTF(field);
+ out.writeUTF(text);
}
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long serialVersionUID = SerializeUtils.readVLong(in);
+ field = in.readUTF().intern();
+ text = in.readUTF();
+ }
}
Index: src/java/org/apache/lucene/util/SerializeUtils.java
===================================================================
--- src/java/org/apache/lucene/util/SerializeUtils.java (revision 0)
+++ src/java/org/apache/lucene/util/SerializeUtils.java (revision 0)
@@ -0,0 +1,172 @@
+package org.apache.lucene.util;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+
+/**
+ * From Hadoop WriteableUtils
+ *
+ */
+public class SerializeUtils
+{
+
+ /**
+ * Reads a zero-compressed encoded integer from input stream and returns it.
+ * @param stream Binary input stream
+ * @throws java.io.IOException
+ * @return deserialized integer from stream.
+ */
+ public static int readVInt(DataInput stream) throws IOException {
+ return (int) readVLong(stream);
+ }
+
+ /**
+ * Serializes an integer to a binary stream with zero-compressed encoding.
+ * For -120 <= i <= 127, only one byte is used with the actual value.
+ * For other values of i, the first byte value indicates whether the
+ * integer is positive or negative, and the number of bytes that follow.
+ * If the first byte value v is between -121 and -124, the following integer
+ * is positive, with number of bytes that follow are -(v+120).
+ * If the first byte value v is between -125 and -128, the following integer
+ * is negative, with number of bytes that follow are -(v+124). Bytes are
+ * stored in the high-non-zero-byte-first order.
+ *
+ * @param stream Binary output stream
+ * @param i Integer to be serialized
+ * @throws java.io.IOException
+ */
+ public static void writeVInt(DataOutput stream, int i) throws IOException {
+ writeVLong(stream, i);
+ }
+
+ /**
+ * Given the first byte of a vint/vlong, determine the sign
+ *
+ * @param value
+ * the first byte
+ * @return is the value negative
+ */
+ public static boolean isNegativeVInt(byte value)
+ {
+ return value < -120 || (value >= -112 && value < 0);
+ }
+
+ /**
+ * Serializes a long to a binary stream with zero-compressed encoding. For -112 <= i <=
+ * 127, only one byte is used with the actual value. For other values of i, the first
+ * byte value indicates whether the long is positive or negative, and the number of
+ * bytes that follow. If the first byte value v is between -113 and -120, the following
+ * long is positive, with number of bytes that follow are -(v+112). If the first byte
+ * value v is between -121 and -128, the following long is negative, with number of
+ * bytes that follow are -(v+120). Bytes are stored in the high-non-zero-byte-first
+ * order.
+ *
+ * @param stream
+ * Binary output stream
+ * @param i
+ * Long to be serialized
+ * @throws java.io.IOException
+ */
+ public static void writeVLong(DataOutput stream, long i) throws IOException
+ {
+ if (i >= -112 && i <= 127)
+ {
+ stream.writeByte((byte) i);
+ return;
+ }
+
+ int len = -112;
+ if (i < 0)
+ {
+ i ^= -1L; // take one's complement'
+ len = -120;
+ }
+
+ long tmp = i;
+ while (tmp != 0)
+ {
+ tmp = tmp >> 8;
+ len--;
+ }
+
+ stream.writeByte((byte) len);
+
+ len = (len < -120) ? -(len + 120) : -(len + 112);
+
+ for (int idx = len; idx != 0; idx--)
+ {
+ int shiftbits = (idx - 1) * 8;
+ long mask = 0xFFL << shiftbits;
+ stream.writeByte((byte) ((i & mask) >> shiftbits));
+ }
+ }
+
+ /**
+ * Reads a zero-compressed encoded long from input stream and returns it.
+ *
+ * @param stream
+ * Binary input stream
+ * @throws java.io.IOException
+ * @return deserialized long from stream.
+ */
+ public static long readVLong(DataInput stream) throws IOException
+ {
+ byte firstByte = stream.readByte();
+ int len = decodeVIntSize(firstByte);
+ if (len == 1)
+ {
+ return firstByte;
+ }
+ long i = 0;
+ for (int idx = 0; idx < len - 1; idx++)
+ {
+ byte b = stream.readByte();
+ i = i << 8;
+ i = i | (b & 0xFF);
+ }
+ return (isNegativeVInt(firstByte) ? (i ^ -1L) : i);
+ }
+
+ /**
+ * Parse the first byte of a vint/vlong to determine the number of bytes
+ *
+ * @param value
+ * the first byte of the vint/vlong
+ * @return the total number of bytes (1 to 9)
+ */
+ public static int decodeVIntSize(byte value)
+ {
+ if (value >= -112)
+ {
+ return 1;
+ }
+ else if (value < -120)
+ {
+ return -119 - value;
+ }
+ return -111 - value;
+ }
+
+ /**
+ * Get the encoded length if an integer is stored in a variable-length format
+ *
+ * @return the encoded length
+ */
+ public static int getVIntSize(long i)
+ {
+ if (i >= -112 && i <= 127)
+ {
+ return 1;
+ }
+
+ if (i < 0)
+ {
+ i ^= -1L; // take one's complement'
+ }
+ // find the number of bytes with non-leading zeros
+ int dataBits = Long.SIZE - Long.numberOfLeadingZeros(i);
+ // find the number of data bytes + length byte
+ return (dataBits + 7) / 8 + 1;
+ }
+}
Property changes on: src/java/org/apache/lucene/util/SerializeUtils.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ "Date Rev Author URL Id"
Name: svn:eol-style
+ native
Index: src/java/org/apache/lucene/util/Parameter.java
===================================================================
--- src/java/org/apache/lucene/util/Parameter.java (revision 723418)
+++ src/java/org/apache/lucene/util/Parameter.java (working copy)
@@ -18,16 +18,20 @@
*/
import java.io.ObjectStreamException;
-import java.io.Serializable;
import java.io.StreamCorruptedException;
import java.util.HashMap;
import java.util.Map;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
/**
* A serializable Enum class.
*/
-public abstract class Parameter implements Serializable
+public abstract class Parameter implements java.io.Serializable
{
+ private static final long serialVersionUID = 10L;
static Map allParameters = new HashMap();
private String name;
@@ -46,7 +50,20 @@
allParameters.put(key, this);
}
+ /**
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeUTF(name);
+ }
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ name = in.readUTF();
+ Object par = allParameters.get(makeKey(name));
+ if(par == null)
+ throw new StreamCorruptedException("Unknown parameter value: " + name);
+ }
+ **/
private String makeKey(String name){
return getClass() + " " + name;
}
Index: src/java/org/apache/lucene/document/SetBasedFieldSelector.java
===================================================================
--- src/java/org/apache/lucene/document/SetBasedFieldSelector.java (revision 723418)
+++ src/java/org/apache/lucene/document/SetBasedFieldSelector.java (working copy)
@@ -1,5 +1,8 @@
package org.apache.lucene.document;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Set;
/**
* Copyright 2004 The Apache Software Foundation
@@ -17,12 +20,14 @@
* limitations under the License.
*/
+import org.apache.lucene.util.SerializeUtils;
+
/**
* Declare what fields to load normally and what fields to load lazily
*
**/
public class SetBasedFieldSelector implements FieldSelector {
-
+ private static final long serialVersionUID = 10L;
private Set fieldsToLoad;
private Set lazyFieldsToLoad;
@@ -57,4 +62,16 @@
}
return result;
}
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeObject(fieldsToLoad);
+ out.writeObject(lazyFieldsToLoad);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ fieldsToLoad = (Set)in.readObject();
+ lazyFieldsToLoad = (Set)in.readObject();
+ }
}
\ No newline at end of file
Index: src/java/org/apache/lucene/document/Field.java
===================================================================
--- src/java/org/apache/lucene/document/Field.java (revision 723418)
+++ src/java/org/apache/lucene/document/Field.java (working copy)
@@ -20,8 +20,13 @@
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.index.IndexWriter; // for javadoc
import org.apache.lucene.util.Parameter;
+import org.apache.lucene.util.SerializeUtils;
import java.io.Reader;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.io.Serializable;
/**
@@ -32,7 +37,8 @@
index, so that they may be returned with hits on the document.
*/
-public final class Field extends AbstractField implements Fieldable, Serializable {
+public final class Field extends AbstractField implements Fieldable, Externalizable {
+ private static final long serialVersionUID = 10L;
/** Specifies whether and how a field should be stored. */
public static final class Store extends Parameter implements Serializable {
@@ -234,8 +240,13 @@
public void setValue(TokenStream value) {
fieldsData = value;
}
-
+
/**
+ * No argument constructor for Externalizable based serialization
+ */
+ public Field() {}
+
+ /**
* Create a field by specifying its name, value and how it will
* be saved in the index. Term vectors will not be stored in the index.
*
@@ -473,4 +484,18 @@
setStoreTermVector(TermVector.NO);
}
+
+ public boolean equals(Object o) {
+ return super.equals(o);
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ super.writeExternal(out);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ super.readExternal(in);
+ }
}
Index: src/java/org/apache/lucene/document/AbstractField.java
===================================================================
--- src/java/org/apache/lucene/document/AbstractField.java (revision 723418)
+++ src/java/org/apache/lucene/document/AbstractField.java (working copy)
@@ -15,13 +15,21 @@
* limitations under the License.
*/
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.io.Serializable;
+import java.io.NotSerializableException;
+import java.util.Arrays;
+import org.apache.lucene.util.SerializeUtils;
/**
*
*
**/
-public abstract class AbstractField implements Fieldable {
-
+public abstract class AbstractField implements Fieldable, Externalizable {
+ private static final long serialVersionUID = 10L;
protected String name = "body";
protected boolean storeTermVector = false;
protected boolean storeOffsetWithTermVector = false;
@@ -44,7 +52,7 @@
protected AbstractField()
{
}
-
+
protected AbstractField(String name, Field.Store store, Field.Index index, Field.TermVector termVector) {
if (name == null)
throw new NullPointerException("name cannot be null");
@@ -282,7 +290,75 @@
public boolean isLazy() {
return lazy;
}
-
+
+ public boolean equals(Object o) {
+ AbstractField other = (AbstractField)o;
+ return (storeTermVector == other.storeTermVector
+ && storeOffsetWithTermVector == other.storeOffsetWithTermVector
+ && storePositionWithTermVector == other.storePositionWithTermVector
+ && omitNorms == other.omitNorms
+ && isStored == other.isStored
+ && isIndexed == other.isIndexed
+ && isTokenized == other.isTokenized
+ && isBinary == other.isBinary
+ && isCompressed == other.isCompressed
+ && lazy == other.lazy
+ && omitTf == other.omitTf
+ && boost == other.boost
+ && binaryLength == other.binaryLength
+ && binaryOffset == other.binaryOffset
+ && equalsFieldData(fieldsData, other.fieldsData));
+ }
+
+ private static boolean equalsFieldData(Object o1, Object o2) {
+ if (o1 instanceof String && o2 instanceof String) {
+ return o1.equals(o2);
+ } else if (o1 instanceof byte[] && o2 instanceof byte[]) {
+ return Arrays.equals((byte[])o1, (byte[])o2);
+ }
+ return true;
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ out.writeUTF(name);
+ out.writeBoolean(storeTermVector);
+ out.writeBoolean(storeOffsetWithTermVector);
+ out.writeBoolean(storePositionWithTermVector);
+ out.writeBoolean(omitNorms);
+ out.writeBoolean(isStored);
+ out.writeBoolean(isIndexed);
+ out.writeBoolean(isTokenized);
+ out.writeBoolean(isBinary);
+ out.writeBoolean(isCompressed);
+ out.writeBoolean(lazy);
+ out.writeBoolean(omitTf);
+ out.writeFloat(boost);
+ SerializeUtils.writeVInt(out, binaryLength);
+ SerializeUtils.writeVInt(out, binaryOffset);
+ out.writeObject(fieldsData);
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ name = in.readUTF().intern();
+ storeTermVector = in.readBoolean();
+ storeOffsetWithTermVector = in.readBoolean();
+ storePositionWithTermVector = in.readBoolean();
+ omitNorms = in.readBoolean();
+ isStored = in.readBoolean();
+ isIndexed = in.readBoolean();
+ isTokenized = in.readBoolean();
+ isBinary = in.readBoolean();
+ isCompressed = in.readBoolean();
+ lazy = in.readBoolean();
+ omitTf = in.readBoolean();
+ boost = in.readFloat();
+ binaryLength = SerializeUtils.readVInt(in);
+ binaryOffset = SerializeUtils.readVInt(in);
+ fieldsData = in.readObject();
+ }
+
/** Prints a Field for human consumption. */
public final String toString() {
StringBuffer result = new StringBuffer();
Index: src/java/org/apache/lucene/document/Document.java
===================================================================
--- src/java/org/apache/lucene/document/Document.java (revision 723418)
+++ src/java/org/apache/lucene/document/Document.java (working copy)
@@ -18,8 +18,14 @@
*/
import java.util.*; // for javadoc
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
import org.apache.lucene.search.ScoreDoc; // for javadoc
import org.apache.lucene.search.Searcher; // for javadoc
+import org.apache.lucene.util.SerializeUtils;
import org.apache.lucene.index.IndexReader; // for javadoc
/** Documents are the unit of indexing and search.
@@ -36,14 +42,14 @@
* IndexReader#document(int)}.
*/
-public final class Document implements java.io.Serializable {
+public final class Document implements Externalizable {
+ private static final long serialVersionUID = 10L;
List fields = new ArrayList();
private float boost = 1.0f;
/** Constructs a new document with no fields. */
public Document() {}
-
-
+
/** Sets a boost factor for hits on any field of this document. This value
* will be multiplied into the score of all hits on this document.
*
@@ -315,6 +321,28 @@
return null;
}
+ public void writeExternal(ObjectOutput out) throws IOException {
+ SerializeUtils.writeVLong(out, serialVersionUID);
+ SerializeUtils.writeVInt(out, fields.size());
+ for (int x=0; x < fields.size(); x++) {
+ out.writeObject(fields.get(x));
+ }
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ long svuid = SerializeUtils.readVLong(in);
+ int fsize = SerializeUtils.readVInt(in);
+ for (int x=0; x < fsize; x++) {
+ fields.add(in.readObject());
+ }
+ }
+
+ public boolean equals(Object o) {
+ Document other = (Document)o;
+ return (boost == other.boost
+ && fields.equals(other.fields));
+ }
+
/** Prints the fields of a document for human consumption. */
public final String toString() {
StringBuffer buffer = new StringBuffer();