Welcome to mirror list, hosted at ThFree Co, Russian Federation.

FormatPostingsPositionsWriter.cs « Index « core « src - github.com/mono/Lucene.Net.Light.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8b70fcc3e3dcd347dd87fb56a5b4347b7bb831fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* 
 * 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 IndexInput = Lucene.Net.Store.IndexInput;
using IndexOutput = Lucene.Net.Store.IndexOutput;

namespace Lucene.Net.Index
{
	
	sealed class FormatPostingsPositionsWriter:FormatPostingsPositionsConsumer
	{
		internal FormatPostingsDocsWriter parent;
		internal IndexOutput out_Renamed;
		
		internal bool omitTermFreqAndPositions;
		internal bool storePayloads;
		internal int lastPayloadLength = - 1;
		
		internal FormatPostingsPositionsWriter(SegmentWriteState state, FormatPostingsDocsWriter parent)
		{
			this.parent = parent;
			omitTermFreqAndPositions = parent.omitTermFreqAndPositions;
			if (parent.parent.parent.fieldInfos.HasProx())
			{
				// At least one field does not omit TF, so create the
				// prox file
				System.String fileName = IndexFileNames.SegmentFileName(parent.parent.parent.segment, IndexFileNames.PROX_EXTENSION);
				state.flushedFiles.Add(fileName);
				out_Renamed = parent.parent.parent.dir.CreateOutput(fileName);
				parent.skipListWriter.SetProxOutput(out_Renamed);
			}
			// Every field omits TF so we will write no prox file
			else
				out_Renamed = null;
		}
		
		internal int lastPosition;
		
		/// <summary>Add a new position &amp; payload </summary>
		internal override void  AddPosition(int position, byte[] payload, int payloadOffset, int payloadLength)
		{
			System.Diagnostics.Debug.Assert(!omitTermFreqAndPositions, "omitTermFreqAndPositions is true");
			System.Diagnostics.Debug.Assert(out_Renamed != null);
			
			int delta = position - lastPosition;
			lastPosition = position;
			
			if (storePayloads)
			{
				if (payloadLength != lastPayloadLength)
				{
					lastPayloadLength = payloadLength;
					out_Renamed.WriteVInt((delta << 1) | 1);
					out_Renamed.WriteVInt(payloadLength);
				}
				else
					out_Renamed.WriteVInt(delta << 1);
				if (payloadLength > 0)
					out_Renamed.WriteBytes(payload, payloadLength);
			}
			else
				out_Renamed.WriteVInt(delta);
		}
		
		internal void  SetField(FieldInfo fieldInfo)
		{
			omitTermFreqAndPositions = fieldInfo.omitTermFreqAndPositions;
			storePayloads = omitTermFreqAndPositions?false:fieldInfo.storePayloads;
		}
		
		/// <summary>Called when we are done adding positions &amp; payloads </summary>
		internal override void  Finish()
		{
			lastPosition = 0;
			lastPayloadLength = - 1;
		}
		
        public void Dispose()
        {
            // Move to protected method if class becomes unsealed
            if (out_Renamed != null)
                out_Renamed.Close();
        }
	}
}