pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / src / java / org / apache / lucene / index / TermsHashPerThread.java
1 package org.apache.lucene.index;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.io.IOException;
21
22 final class TermsHashPerThread extends InvertedDocConsumerPerThread {
23
24   final TermsHash termsHash;
25   final TermsHashConsumerPerThread consumer;
26   final TermsHashPerThread nextPerThread;
27
28   final CharBlockPool charPool;
29   final IntBlockPool intPool;
30   final ByteBlockPool bytePool;
31   final boolean primary;
32   final DocumentsWriter.DocState docState;
33
34   public TermsHashPerThread(DocInverterPerThread docInverterPerThread, final TermsHash termsHash, final TermsHash nextTermsHash, final TermsHashPerThread primaryPerThread) {
35     docState = docInverterPerThread.docState;
36
37     this.termsHash = termsHash;
38     this.consumer = termsHash.consumer.addThread(this);
39
40     if (nextTermsHash != null) {
41       // We are primary
42       charPool = new CharBlockPool(termsHash.docWriter);
43       primary = true;
44     } else {
45       charPool = primaryPerThread.charPool;
46       primary = false;
47     }
48
49     intPool = new IntBlockPool(termsHash.docWriter);
50     bytePool = new ByteBlockPool(termsHash.docWriter.byteBlockAllocator);
51
52     if (nextTermsHash != null)
53       nextPerThread = nextTermsHash.addThread(docInverterPerThread, this);
54     else
55       nextPerThread = null;
56   }
57
58   @Override
59   InvertedDocConsumerPerField addField(DocInverterPerField docInverterPerField, final FieldInfo fieldInfo) {
60     return new TermsHashPerField(docInverterPerField, this, nextPerThread, fieldInfo);
61   }
62
63   @Override
64   synchronized public void abort() {
65     reset(true);
66     try {
67       consumer.abort();
68     } finally {
69       if (nextPerThread != null) {
70         nextPerThread.abort();
71       }
72     }
73   }
74
75   @Override
76   public void startDocument() throws IOException {
77     consumer.startDocument();
78     if (nextPerThread != null)
79       nextPerThread.consumer.startDocument();
80   }
81
82   @Override
83   public DocumentsWriter.DocWriter finishDocument() throws IOException {
84     final DocumentsWriter.DocWriter doc = consumer.finishDocument();
85
86     final DocumentsWriter.DocWriter doc2;
87     if (nextPerThread != null)
88       doc2 = nextPerThread.consumer.finishDocument();
89     else
90       doc2 = null;
91     if (doc == null)
92       return doc2;
93     else {
94       doc.setNext(doc2);
95       return doc;
96     }
97   }
98
99   // Clear all state
100   void reset(boolean recyclePostings) {
101     intPool.reset();
102     bytePool.reset();
103
104     if (primary)
105       charPool.reset();
106   }
107 }