/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using StringHelper = Lucene.Net.Util.StringHelper;
namespace Lucene.Net.Index
{
/// A Term represents a word from text. This is the unit of search. It is
/// composed of two elements, the text of the word, as a string, and the name of
/// the field that the text occured in, an interned string.
/// Note that terms may represent more than words from text fields, but also
/// things like dates, email addresses, urls, etc.
///
[Serializable]
public sealed class Term : System.IComparable
{
internal System.String field;
internal System.String text;
/// Constructs a Term with the given field and text.
/// Note that a null field or null text value results in undefined
/// behavior for most Lucene APIs that accept a Term parameter.
///
public Term(System.String fld, System.String txt)
{
field = StringHelper.Intern(fld);
text = txt;
}
/// Constructs a Term with the given field and empty text.
/// This serves two purposes: 1) reuse of a Term with the same field.
/// 2) pattern for a query.
///
///
///
///
public Term(System.String fld):this(fld, "", true)
{
}
internal Term(System.String fld, System.String txt, bool intern)
{
field = intern?StringHelper.Intern(fld):fld; // field names are interned
text = txt; // unless already known to be
}
/// Returns the field of this term, an interned string. The field indicates
/// the part of a document which this term came from.
///
public string Field
{
get { return field; }
}
/// Returns the text of this term. In the case of words, this is simply the
/// text of the word. In the case of dates and other types, this is an
/// encoding of the object as a string.
///
public string Text
{
get { return text; }
}
/// Optimized construction of new Terms by reusing same field as this Term
/// - avoids field.intern() overhead
///
/// The text of the new term (field is implicitly same as this Term instance)
///
/// A new Term
///
public Term CreateTerm(System.String text)
{
return new Term(field, text, false);
}
//@Override
public override bool Equals(System.Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (GetType() != obj.GetType())
return false;
Term other = (Term) obj;
if (field == null)
{
if (other.field != null)
return false;
}
else if (!field.Equals(other.field))
return false;
if (text == null)
{
if (other.text != null)
return false;
}
else if (!text.Equals(other.text))
return false;
return true;
}
//@Override
public override int GetHashCode()
{
int prime = 31;
int result = 1;
result = prime*result + ((field == null) ? 0 : field.GetHashCode());
result = prime*result + ((text == null) ? 0 : text.GetHashCode());
return result;
}
/// Compares two terms, returning a negative integer if this
/// term belongs before the argument, zero if this term is equal to the
/// argument, and a positive integer if this term belongs after the argument.
/// The ordering of terms is first by field, then by text.
///
public int CompareTo(Term other)
{
if ((System.Object) field == (System.Object) other.field)
// fields are interned
return String.CompareOrdinal(text, other.text);
else
return String.CompareOrdinal(field, other.field);
}
///// Resets the field and text of a Term.
//internal void Set(System.String fld, System.String txt)
//{
// field = fld;
// text = txt;
//}
public override System.String ToString()
{
return field + ":" + text;
}
// private void ReadObject(System.IO.BinaryReader in_Renamed)
// {
// in_Renamed.defaultReadObject();
// field = StringHelper.Intern(field);
// }
[System.Runtime.Serialization.OnDeserialized]
internal void OnDeserialized(System.Runtime.Serialization.StreamingContext context)
{
field = StringHelper.Intern(field);
}
}
}