1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 using System;
19 using Attribute = Lucene.Net.Util.Attribute;
20 using TokenStream = Lucene.Net.Analysis.TokenStream;
21 
22 namespace Lucene.Net.Analysis.Tokenattributes
23 {
24 
25 	/// <summary>The positionIncrement determines the position of this token
26 	/// relative to the previous Token in a <see cref="TokenStream" />, used in phrase
27 	/// searching.
28 	///
29 	/// <p/>The default value is one.
30 	///
31 	/// <p/>Some common uses for this are:<list>
32 	///
33 	/// <item>Set it to zero to put multiple terms in the same position.  This is
34 	/// useful if, e.g., a word has multiple stems.  Searches for phrases
35 	/// including either stem will match.  In this case, all but the first stem's
36 	/// increment should be set to zero: the increment of the first instance
37 	/// should be one.  Repeating a token with an increment of zero can also be
38 	/// used to boost the scores of matches on that token.</item>
39 	///
40 	/// <item>Set it to values greater than one to inhibit exact phrase matches.
41 	/// If, for example, one does not want phrases to match across removed stop
42 	/// words, then one could build a stop word filter that removes stop words and
43 	/// also sets the increment to the number of stop words removed before each
44 	/// non-stop word.  Then exact phrase queries will only match when the terms
45 	/// occur with no intervening stop words.</item>
46 	///
47 	/// </list>
48 	/// </summary>
49 	[Serializable]
50 	public class PositionIncrementAttribute:Attribute, IPositionIncrementAttribute, System.ICloneable
51 	{
52 		private int positionIncrement = 1;
53 
54 	    /// <summary>Set the position increment. The default value is one.
55 	    ///
56 	    /// </summary>
57 	    /// <value> the distance from the prior term </value>
58 	    public virtual int PositionIncrement
59 	    {
60 	        set
61 	        {
62 	            if (value < 0)
63 	                throw new System.ArgumentException("Increment must be zero or greater: " + value);
64 	            this.positionIncrement = value;
65 	        }
66 	        get { return positionIncrement; }
67 	    }
68 
Clear()69 	    public override void  Clear()
70 		{
71 			this.positionIncrement = 1;
72 		}
73 
Equals(System.Object other)74 		public  override bool Equals(System.Object other)
75 		{
76 			if (other == this)
77 			{
78 				return true;
79 			}
80 
81 			if (other is PositionIncrementAttribute)
82 			{
83 				return positionIncrement == ((PositionIncrementAttribute) other).positionIncrement;
84 			}
85 
86 			return false;
87 		}
88 
GetHashCode()89 		public override int GetHashCode()
90 		{
91 			return positionIncrement;
92 		}
93 
CopyTo(Attribute target)94 		public override void  CopyTo(Attribute target)
95 		{
96 			IPositionIncrementAttribute t = (IPositionIncrementAttribute) target;
97 			t.PositionIncrement = positionIncrement;
98 		}
99 
Clone()100 		override public System.Object Clone()
101 		{
102             PositionIncrementAttribute impl = new PositionIncrementAttribute();
103             impl.positionIncrement = positionIncrement;
104             return impl;
105 		}
106 	}
107 }