summaryrefslogtreecommitdiffstats
path: root/3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp')
-rw-r--r--3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp b/3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp
new file mode 100644
index 000000000..85ac784ad
--- /dev/null
+++ b/3rdparty/clucene/src/CLucene/index/SegmentMergeInfo.cpp
@@ -0,0 +1,104 @@
+/*------------------------------------------------------------------------------
+* Copyright (C) 2003-2006 Ben van Klinken and the CLucene Team
+*
+* Distributable under the terms of either the Apache License (Version 2.0) or
+* the GNU Lesser General Public License, as specified in the COPYING file.
+------------------------------------------------------------------------------*/
+#include "CLucene/StdHeader.h"
+#include "SegmentMergeInfo.h"
+
+#include "SegmentTermEnum.h"
+#include "SegmentHeader.h"
+
+CL_NS_DEF(index)
+
+SegmentMergeInfo::SegmentMergeInfo(const int32_t b, TermEnum* te, IndexReader* r):
+ reader(r),termEnum(te),base(b), docMap(NULL) {
+//Func - Constructor
+//Pre - b >= 0
+// te contains a valid reference to a SegmentTermEnum instance
+// r contains a valid reference to a SegmentReader instance
+//Post - The instance has been created
+
+ CND_PRECONDITION(b >= 0, "b is a negative number");
+
+ postings=NULL;
+ term = te->term();
+}
+
+SegmentMergeInfo::~SegmentMergeInfo(){
+//Func - Destructor
+//Pre - true
+//Post - The instance has been destroyed
+
+ close();
+}
+
+int32_t* SegmentMergeInfo::getDocMap(){
+ if ( docMap == NULL ){
+ // build array which maps document numbers around deletions
+ if (reader->hasDeletions()) {
+ //Get the total number of documents managed by the reader including the deleted ones
+ int32_t maxDoc = reader->maxDoc();
+ //Create a map for all documents
+ docMap = _CL_NEWARRAY(int32_t,maxDoc);
+ int32_t j = 0;
+ //Iterate through all the document numbers
+ for (int32_t i = 0; i < maxDoc; i++) {
+ //Check if document i is marked deleted
+ if (reader->isDeleted(i)){
+ //Document i has not been marked deleted so assign -1
+ docMap[i] = -1;
+ }else{
+ docMap[i] = j++;
+ }
+ }
+ }
+ }
+ return docMap;
+}
+
+TermPositions* SegmentMergeInfo::getPositions() {
+ if (postings == NULL) {
+ postings = reader->termPositions();
+ }
+ return postings;
+}
+
+
+bool SegmentMergeInfo::next() {
+//Func - Moves the current term of the enumeration termEnum to the next and term
+// points to this new current term
+//Pre - true
+//Post - Returns true if the term has been moved to the next otherwise false
+ if (termEnum->next()) {
+ _CLDECDELETE(term);
+ term = termEnum->term();
+ return true;
+ } else {
+ _CLDECDELETE(term); //TODO: test HighFreqTerms errors with this
+ term = NULL;
+ return false;
+ }
+}
+
+void SegmentMergeInfo::close() {
+//Func - Closes the the resources
+//Pre - true
+//Post - The resources have been closed
+
+ //First make sure posting has been closed
+ if ( postings != NULL ){
+ postings->close();
+ _CLVDELETE(postings); //todo: not a clucene object... should be
+ }
+
+ if ( termEnum != NULL ){
+ termEnum->close();
+ _CLDELETE(termEnum);
+ }
+ _CLDECDELETE(term);
+ _CLDELETE_ARRAY(docMap);
+}
+
+CL_NS_END