Lucene.Net  3.0.3
Lucene.Net is a port of the Lucene search engine library, written in C# and targeted at .NET runtime users.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Properties Pages
PhrasePositions.cs
Go to the documentation of this file.
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 
20 using Lucene.Net.Index;
21 
22 namespace Lucene.Net.Search
23 {
24 
25  /// <summary> Position of a term in a document that takes into account the term offset within the phrase. </summary>
26  sealed class PhrasePositions
27  {
28  internal int doc; // current doc
29  internal int position; // position in doc
30  internal int count; // remaining pos in this doc
31  internal int offset; // position in phrase
32  internal TermPositions tp; // stream of positions
33  internal PhrasePositions next; // used to make lists
34  internal bool repeats; // there's other pp for same term (e.g. query="1st word 2nd word"~1)
35 
36  internal PhrasePositions(TermPositions t, int o)
37  {
38  tp = t;
39  offset = o;
40  }
41 
42  internal bool Next()
43  {
44  // increments to next doc
45  if (!tp.Next())
46  {
47  tp.Close(); // close stream
48  doc = System.Int32.MaxValue; // sentinel value
49  return false;
50  }
51  doc = tp.Doc;
52  position = 0;
53  return true;
54  }
55 
56  internal bool SkipTo(int target)
57  {
58  if (!tp.SkipTo(target))
59  {
60  tp.Close(); // close stream
61  doc = System.Int32.MaxValue; // sentinel value
62  return false;
63  }
64  doc = tp.Doc;
65  position = 0;
66  return true;
67  }
68 
69 
70  internal void FirstPosition()
71  {
72  count = tp.Freq; // read first pos
73  NextPosition();
74  }
75 
76  /// <summary> Go to next location of this term current document, and set
77  /// <c>position</c> as <c>location - offset</c>, so that a
78  /// matching exact phrase is easily identified when all PhrasePositions
79  /// have exactly the same <c>position</c>.
80  /// </summary>
81  internal bool NextPosition()
82  {
83  if (count-- > 0)
84  {
85  // read subsequent pos's
86  position = tp.NextPosition() - offset;
87  return true;
88  }
89  else
90  return false;
91  }
92  }
93 }