1
/*------------------------------------------------------------------------------
2
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
4
* Distributable under the terms of either the Apache License (Version 2.0) or
5
* the GNU Lesser General Public License, as specified in the COPYING file.
6
------------------------------------------------------------------------------*/
7
/*------------------------------------------------------------------------------
8
* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
10
* Distributable under the terms of either the Apache License (Version 2.0) or
11
* the GNU Lesser General Public License, as specified in the COPYING file.
12
------------------------------------------------------------------------------*/
13
#include "CLucene/_ApiHeader.h"
14
#include "IndexModifier.h"
16
#include "IndexWriter.h"
17
#include "IndexReader.h"
18
#include "CLucene/store/FSDirectory.h"
19
#include "CLucene/document/Document.h"
20
#include "MergeScheduler.h"
28
IndexModifier::IndexModifier(Directory* directory, Analyzer* analyzer, bool create) {
29
init(directory, analyzer, create);
32
IndexModifier::IndexModifier(const char* dirName, Analyzer* analyzer, bool create) {
33
Directory* dir = FSDirectory::getDirectory(dirName);
34
init(dir, analyzer, create);
37
void IndexModifier::init(Directory* directory, Analyzer* analyzer, bool create) {
43
useCompoundFile = true;
44
this->maxBufferedDocs = IndexWriter::DEFAULT_MAX_BUFFERED_DOCS;
45
this->maxFieldLength = IndexWriter::DEFAULT_MAX_FIELD_LENGTH;
46
this->mergeFactor = IndexWriter::DEFAULT_MERGE_FACTOR;
48
this->directory = _CL_POINTER(directory);
49
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
50
this->analyzer = analyzer;
51
indexWriter = _CLNEW IndexWriter(directory, analyzer, create);
55
IndexModifier::~IndexModifier(){
61
void IndexModifier::assureOpen() const{
63
_CLTHROWA(CL_ERR_IllegalState,"Index is closed");
67
void IndexModifier::createIndexWriter(bool create) {
68
if (indexWriter == NULL) {
69
if (indexReader != NULL) {
71
_CLDELETE(indexReader);
74
indexWriter = _CLNEW IndexWriter(directory, analyzer, false);
75
// IndexModifier cannot use ConcurrentMergeScheduler
76
// because it synchronizes on the directory which can
78
indexWriter->setMergeScheduler(_CLNEW SerialMergeScheduler());
79
indexWriter->setInfoStream(infoStream);
80
indexWriter->setUseCompoundFile(useCompoundFile);
81
if (maxBufferedDocs != IndexWriter::DISABLE_AUTO_FLUSH)
82
indexWriter->setMaxBufferedDocs(maxBufferedDocs);
83
indexWriter->setMaxFieldLength(maxFieldLength);
84
indexWriter->setMergeFactor(mergeFactor);
88
void IndexModifier::createIndexReader() {
89
if (indexReader == NULL) {
90
if (indexWriter != NULL) {
92
_CLDELETE(indexWriter);
94
indexReader = IndexReader::open(directory);
98
void IndexModifier::flush() {
99
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
101
if (indexWriter != NULL) {
102
indexWriter->close();
103
_CLDELETE(indexWriter);
106
indexReader->close();
107
_CLDELETE(indexReader);
112
void IndexModifier::addDocument(Document* doc, Analyzer* docAnalyzer) {
113
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
116
if (docAnalyzer != NULL)
117
indexWriter->addDocument(doc, docAnalyzer);
119
indexWriter->addDocument(doc);
122
int32_t IndexModifier::deleteDocuments(Term* term) {
123
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
126
return indexReader->deleteDocuments(term);
129
void IndexModifier::deleteDocument(int32_t docNum) {
130
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
133
indexReader->deleteDocument(docNum);
136
int32_t IndexModifier::docCount() {
137
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
139
if (indexWriter != NULL)
140
return indexWriter->docCount();
142
return indexReader->numDocs();
145
void IndexModifier::optimize() {
146
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
149
indexWriter->optimize();
152
void IndexModifier::setUseCompoundFile(bool useCompoundFile) {
153
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
155
if (indexWriter != NULL)
156
indexWriter->setUseCompoundFile(useCompoundFile);
157
this->useCompoundFile = useCompoundFile;
160
bool IndexModifier::getUseCompoundFile() {
161
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
164
return indexWriter->getUseCompoundFile();
167
void IndexModifier::setMaxFieldLength(int32_t maxFieldLength) {
168
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
170
if (indexWriter != NULL)
171
indexWriter->setMaxFieldLength(maxFieldLength);
172
this->maxFieldLength = maxFieldLength;
175
int32_t IndexModifier::getMaxFieldLength() {
176
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
179
return indexWriter->getMaxFieldLength();
182
void IndexModifier::setMaxBufferedDocs(int32_t maxBufferedDocs) {
183
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
185
if (indexWriter != NULL)
186
indexWriter->setMaxBufferedDocs(maxBufferedDocs);
187
this->maxBufferedDocs = maxBufferedDocs;
190
int32_t IndexModifier::getMaxBufferedDocs() {
191
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
194
return indexWriter->getMaxBufferedDocs();
196
void IndexModifier::setMergeFactor(int32_t mergeFactor) {
197
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
199
if (indexWriter != NULL)
200
indexWriter->setMergeFactor(mergeFactor);
201
this->mergeFactor = mergeFactor;
204
int32_t IndexModifier::getMergeFactor() {
205
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
208
return indexWriter->getMergeFactor();
211
void IndexModifier::close() {
213
_CLTHROWA(CL_ERR_IllegalState, "Index is closed already");
214
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
215
if (indexWriter != NULL) {
216
indexWriter->close();
217
_CLDELETE(indexWriter);
218
} else if (indexReader != NULL) {
219
indexReader->close();
220
_CLDELETE(indexReader);
222
_CLDECDELETE(directory)
226
string IndexModifier::toString() const{
227
return string("Index@") + directory->toString();
232
int64_t IndexModifier::getCurrentVersion() const{
233
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
234
return IndexReader::getCurrentVersion(directory);
237
TermDocs* IndexModifier::termDocs(Term* term){
238
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
241
return indexReader->termDocs(term);
244
TermEnum* IndexModifier::terms(Term* term){
245
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
249
return indexReader->terms(term);
251
return indexReader->terms();
255
CL_NS(document)::Document* IndexModifier::document(const int32_t n){
256
Document* ret = _CLNEW Document;
257
if (!document(n, *ret) )
261
bool IndexModifier::document(int32_t n, CL_NS(document)::Document* doc){
262
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
265
return indexReader->document(n, *doc);
267
bool IndexModifier::document(int32_t n, CL_NS(document)::Document& doc){
268
SCOPED_LOCK_MUTEX(directory->THIS_LOCK)
271
return indexReader->document(n, doc);
273
CL_NS(store)::Directory* IndexModifier::getDirectory(){