001: package org.apache.lucene.index;
002:
003: /**
004: * Licensed to the Apache Software Foundation (ASF) under one or more
005: * contributor license agreements. See the NOTICE file distributed with
006: * this work for additional information regarding copyright ownership.
007: * The ASF licenses this file to You under the Apache License, Version 2.0
008: * (the "License"); you may not use this file except in compliance with
009: * the License. You may obtain a copy of the License at
010: *
011: * http://www.apache.org/licenses/LICENSE-2.0
012: *
013: * Unless required by applicable law or agreed to in writing, software
014: * distributed under the License is distributed on an "AS IS" BASIS,
015: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016: * See the License for the specific language governing permissions and
017: * limitations under the License.
018: */
019:
020: /**
021: A Term represents a word from text. This is the unit of search. It is
022: composed of two elements, the text of the word, as a string, and the name of
023: the field that the text occured in, an interned string.
024:
025: Note that terms may represent more than words from text fields, but also
026: things like dates, email addresses, urls, etc. */
027:
028: public final class Term implements Comparable, java.io.Serializable {
029: String field;
030: String text;
031:
032: /** Constructs a Term with the given field and text.
033: * <p>Note that a null field or null text value results in undefined
034: * behavior for most Lucene APIs that accept a Term parameter. */
035: public Term(String fld, String txt) {
036: this (fld, txt, true);
037: }
038:
039: Term(String fld, String txt, boolean intern) {
040: field = intern ? fld.intern() : fld; // field names are interned
041: text = txt; // unless already known to be
042: }
043:
044: /** Returns the field of this term, an interned string. The field indicates
045: the part of a document which this term came from. */
046: public final String field() {
047: return field;
048: }
049:
050: /** Returns the text of this term. In the case of words, this is simply the
051: text of the word. In the case of dates and other types, this is an
052: encoding of the object as a string. */
053: public final String text() {
054: return text;
055: }
056:
057: /**
058: * Optimized construction of new Terms by reusing same field as this Term
059: * - avoids field.intern() overhead
060: * @param text The text of the new term (field is implicitly same as this Term instance)
061: * @return A new Term
062: */
063: public Term createTerm(String text) {
064: return new Term(field, text, false);
065: }
066:
067: /** Compares two terms, returning true iff they have the same
068: field and text. */
069: public final boolean equals(Object o) {
070: if (o == this )
071: return true;
072: if (o == null)
073: return false;
074: if (!(o instanceof Term))
075: return false;
076: Term other = (Term) o;
077: return field == other.field && text.equals(other.text);
078: }
079:
080: /** Combines the hashCode() of the field and the text. */
081: public final int hashCode() {
082: return field.hashCode() + text.hashCode();
083: }
084:
085: public int compareTo(Object other) {
086: return compareTo((Term) other);
087: }
088:
089: /** Compares two terms, returning a negative integer if this
090: term belongs before the argument, zero if this term is equal to the
091: argument, and a positive integer if this term belongs after the argument.
092:
093: The ordering of terms is first by field, then by text.*/
094: public final int compareTo(Term other) {
095: if (field == other.field) // fields are interned
096: return text.compareTo(other.text);
097: else
098: return field.compareTo(other.field);
099: }
100:
101: /** Resets the field and text of a Term. */
102: final void set(String fld, String txt) {
103: field = fld;
104: text = txt;
105: }
106:
107: public final String toString() {
108: return field + ":" + text;
109: }
110:
111: private void readObject(java.io.ObjectInputStream in)
112: throws java.io.IOException, ClassNotFoundException {
113: in.defaultReadObject();
114: field = field.intern();
115: }
116: }
|