Added Count
[SXSI/TextCollection.git] / CSA.cpp
diff --git a/CSA.cpp b/CSA.cpp
index a86407d..04ace79 100644 (file)
--- a/CSA.cpp
+++ b/CSA.cpp
@@ -40,7 +40,7 @@ const uchar CSA::versionFlag = 2;
 
 ////////////////////////////////////////////////////////////////////////////
 // Class CSA::THuffAlphabetRank
-
+// FIXME Unused code
 CSA::THuffAlphabetRank::THuffAlphabetRank(uchar *s, TextPosition n, TCodeEntry *codetable, unsigned level) {
     left = NULL;
     right = NULL;
@@ -122,26 +122,8 @@ CSA::THuffAlphabetRank::~THuffAlphabetRank() {
         delete bitrank;
 }
 
-/**
- * Saving data fields:
-        BitRank *bitrank;
-        bool leaf;
-        uchar ch;
-        left child;
-        right child;
-*/
-void CSA::THuffAlphabetRank::Save(FILE *file)
-{
 
-}
-
-CSA::THuffAlphabetRank::THuffAlphabetRank(FILE *file)
-{
-
-
-}
-
-/////////////////////////////////////////////f///////////////////////////////
+////////////////////////////////////////////////////////////////////////////
 // Class CSA
 
 /**
@@ -290,8 +272,10 @@ uchar* CSA::GetText(DocId k) const
     k -= textRank; //emptyTextRank->rank(k);
     
     TextPosition i = k;
-    // FIXME
-    string result; //TextPosition j = (*textLength)[k] - 1;
+
+    string result;
+    // Reserve average string length to avoid reallocs
+    result.reserve(n/numberOfTexts);
 
     uchar c = alphabetrank->access(i);
     while (c != '\0')
@@ -406,6 +390,17 @@ bool CSA::IsLessThan(uchar const*) const
 /******************************************************************
  * Counting queries
  */
+ulong CSA::Count(uchar const * pattern) const
+{
+    TextPosition m = strlen((char *)pattern);
+    if (m == 0)
+        return 0;
+
+    TextPosition sp = 0, ep = 0;
+    unsigned count = (unsigned) Search(pattern, m, &sp, &ep);
+    return count;
+}
+
 unsigned CSA::CountPrefix(uchar const * pattern) const
 {
     TextPosition m = strlen((char *)pattern);
@@ -743,12 +738,12 @@ void CSA::Save(FILE *file) const
 
     if (std::fwrite(&(this->bwtEndPos), sizeof(TextPosition), 1, file) != 1)
         throw std::runtime_error("CSA::Save(): file write error (bwt end position).");
-
+    
     alphabetrank->save(file);
     sampled->Save(file);
     suffixes->Save(file);
     suffixDocId->Save(file);
-
+    
     if (std::fwrite(&(this->numberOfTexts), sizeof(unsigned), 1, file) != 1)
         throw std::runtime_error("CSA::Save(): file write error (numberOfTexts).");
     if (std::fwrite(&(this->numberOfAllTexts), sizeof(unsigned), 1, file) != 1)
@@ -758,6 +753,7 @@ void CSA::Save(FILE *file) const
 
     endmarkerDocId->Save(file);
     emptyTextRank->Save(file);
+    fflush(file);
 }
 
 
@@ -1017,7 +1013,7 @@ void CSA::makewavelet(uchar *bwt)
     bwt = 0;
 
     alphabet_mapper * am = new alphabet_mapper_none();
-    static_bitsequence_builder * bmb = new static_bitsequence_builder_rrr02(16); // FIXME samplerate?
+    static_bitsequence_builder * bmb = new static_bitsequence_builder_brw32(16); // FIXME samplerate?
     
     //cout << "Building Huffman table..."; cout.flush();