Added caching of TextCollection
[SXSI/XMLTree.git] / XMLTree.cpp
index b93e75a..cdfe952 100644 (file)
@@ -105,7 +105,15 @@ void XMLTree::Save(unsigned char *filename)
     // stores the texts   \r
     if (!disable_tc)\r
       Text->Save(fp);\r
-\r
+    if (!disable_tc){\r
+    int st = CachedText.size();\r
+    ufwrite(&st, sizeof(int),1,fp);\r
+    for (int i = 0; i< CachedText.size(); ++i){\r
+      st = CachedText.at(i).size();\r
+      ufwrite(&st, sizeof(int),1,fp);\r
+      ufwrite(CachedText.at(i).c_str(),sizeof(char),(1+strlen(CachedText.at(i).c_str())),fp);\r
+    };\r
+    };\r
     fclose(fp);\r
 \r
  }\r
@@ -120,7 +128,10 @@ XMLTree *XMLTree::Load(unsigned char *filename, int sample_rate_text)
     char buffer[1024];\r
     XMLTree *XML_Tree;\r
     int i;\r
-    \r
+    size_t s_tree = 0;\r
+    long s_text = 0;\r
+    size_t s_tags = 0;\r
+\r
     // first load the tree topology\r
     sprintf(buffer, "%s.srx", filename);\r
     fp = fopen(buffer, "r");\r
@@ -134,10 +145,18 @@ XMLTree *XMLTree::Load(unsigned char *filename, int sample_rate_text)
     XML_Tree->Par = (bp *)umalloc(sizeof(bp));\r
 \r
     loadTree(XML_Tree->Par, fp); \r
-    \r
+\r
+    s_tree += sizeof(bp);\r
+\r
     // stores the table with tag names\r
     ufread(&XML_Tree->ntagnames, sizeof(int), 1, fp);\r
+    \r
+    s_tree += sizeof(int);\r
+\r
     XML_Tree->TagName = (unsigned char **)umalloc(XML_Tree->ntagnames*sizeof(unsigned char *));\r
+    \r
+    s_tags += sizeof(unsigned char*)*XML_Tree->ntagnames;\r
+\r
 \r
     for (i=0; i<XML_Tree->ntagnames;i++) {\r
       \r
@@ -155,6 +174,7 @@ XMLTree *XMLTree::Load(unsigned char *filename, int sample_rate_text)
        int len = strlen((const char*)buffer);\r
        XML_Tree->TagName[i] = (unsigned char *)ucalloc(len,sizeof(char));\r
        strncpy((char *)XML_Tree->TagName[i], (const char *)buffer,len - 1);\r
+       s_tags+= len*sizeof(char);\r
     }\r
        \r
     // loads the flags\r
@@ -163,21 +183,53 @@ XMLTree *XMLTree::Load(unsigned char *filename, int sample_rate_text)
     ufread(&(XML_Tree->initialized), sizeof(bool), 1, fp);\r
     ufread(&(XML_Tree->finished), sizeof(bool), 1, fp);\r
     ufread(&(XML_Tree->disable_tc), sizeof(bool), 1, fp);\r
+    \r
+    s_tree+=sizeof(bool)*4;\r
 \r
     if (!(XML_Tree->indexing_empty_texts)) XML_Tree->EBVector = static_bitsequence_rrr02::load(fp);\r
-\r
+    \r
+    s_tree+= XML_Tree->EBVector->size();\r
+    \r
     // loads the tags\r
     XML_Tree->Tags = static_sequence::load(fp);\r
+    s_tree+= XML_Tree->Tags->size();\r
+\r
+    s_text = ftell(fp);\r
 \r
     // loads the texts\r
     if (!XML_Tree->disable_tc){\r
       XML_Tree->Text = TextCollection::InitTextCollection(sample_rate_text);\r
       XML_Tree->Text->Load(fp,sample_rate_text);\r
+      int sst;\r
+      int st;\r
+      ufread(&sst, sizeof(int),1,fp);\r
+      for (int i=0;i<sst;i++){\r
+       ufread(&st, sizeof(int),1,fp);\r
+       char* str = (char*) malloc(sizeof(char)*st+1);\r
+       ufread(str,sizeof(char),st+1,fp);\r
+       string cppstr = str;\r
+       XML_Tree->CachedText.push_back(cppstr);\r
+       free(str);\r
+      };\r
+\r
     }\r
     else\r
       XML_Tree->Text = NULL;\r
 \r
+    s_text = ftell(fp) - s_text;\r
+\r
+    \r
+\r
+\r
     fclose(fp);\r
+\r
+    std::cerr << "Tree part is " << s_tree/1024 << " Kbytes,\n"\r
+             << "with node->tagid part " << XML_Tree->Tags->size()/1024 << "Kbytes \n"\r
+             << "size of Tag part : " << XML_Tree->Tags->length () << " elements\n"\r
+             << "sizof(unsigned int)* " <<  XML_Tree->Tags->length () << " = " << \r
+      sizeof(unsigned int) * XML_Tree->Tags->length () / 1024 << " Kbytes\n"\r
+             << "Tag part is " << s_tags/1024 << " Kbytes,\n"\r
+             << "Text collection is " << s_text/1024 << " Kbytes \n";\r
     return XML_Tree;\r
  }\r
 \r
@@ -240,6 +292,9 @@ int XMLTree::SubtreeTags(treeNode x, TagType tag)
        fprintf(stderr, "Error: data structure has not been constructed properly\n");\r
        exit(1);\r
     }\r
+    if (x == Root())\r
+      x = first_child(Par,x);\r
+    \r
 \r
     int s = x + 2*subtree_size(Par, x) - 1;\r
  \r
@@ -340,7 +395,7 @@ TagType XMLTree::Tag(treeNode x)
        fprintf(stderr, "Error: data structure has not been constructed properly\n");\r
        exit(1);\r
     }\r
-\r
+    \r
     return Tags->access(node2tagpos(x));\r
  }\r
 \r
@@ -468,6 +523,9 @@ treeNode XMLTree::TaggedDesc(treeNode x, TagType tag)
 \r
     int r, s;\r
     treeNode y;\r
+    if (isleaf(Par,x))\r
+      return NULLT;\r
+\r
     r = (int) Tags->rank(tag, node2tagpos(x));\r
     s = (int) Tags->select(tag, r+1);\r
     if (s == -1) return NULLT; // there is no such node\r
@@ -476,6 +534,28 @@ treeNode XMLTree::TaggedDesc(treeNode x, TagType tag)
     else return y;\r
  }\r
 \r
+// TaggedNext(x,tag): returns the first node tagged tag with larger preorder than x \r
+// Returns NULLT if there is none.\r
+treeNode XMLTree::TaggedNext(treeNode x, TagType tag) \r
+ {\r
+    if (!finished) {\r
+       fprintf(stderr, "Error: data structure has not been constructed properly\n");\r
+       exit(1);\r
+    }\r
+\r
+    int r, s;\r
+    treeNode y;\r
+    if (x==NULLT)\r
+      return NULLT;\r
+\r
+    r = (int) Tags->rank(tag, node2tagpos(x));\r
+    s = (int) Tags->select(tag, r+1);\r
+    if (s == -1) return NULLT; // there is no such node\r
+    y = tagpos2node(s); // transforms the tag position into a node position  \r
+    return (y<=x ? NULLT : y);\r
+ }\r
+\r
+\r
 // TaggedPrec(x,tag): returns the first node tagged tag with smaller preorder than x and not an\r
 // ancestor of x. Returns NULLT if there is none.\r
 treeNode XMLTree::TaggedPrec(treeNode x, TagType tag) \r
@@ -511,6 +591,9 @@ treeNode XMLTree::TaggedFoll(treeNode x, TagType tag)
     }\r
 \r
     int r, s;\r
+    if (x ==NULLT || x == Root()|| (next_sibling(Par,x) == -1 ))\r
+      return NULLT;\r
+\r
     r = (int) Tags->rank(tag, node2tagpos(next_sibling(Par, x))-1);\r
     s = (int) Tags->select(tag, r+1);  // select returns -1 in case that there is no r+1-th tag.\r
     if (s==-1) return NULLT;\r
@@ -627,9 +710,10 @@ treeNode XMLTree::ParentNode(DocID d)
     if (d == NULLT)\r
       return NULLT;\r
     \r
-    int s = d;\r
-    // Kim : I added the d+1. before that, else was select1(d)\r
-    // and gave wrong results but I'm really poking a dead bear with a stick here.\r
+    int s;\r
+    // OJO : Kim : I added the d+1. before that, else branch was \r
+    // EBVector->select1(d)\r
+    // and gave wrong results (I'm really poking a bear with a stick here).\r
     if (indexing_empty_texts) s = d;\r
     else s = EBVector->select1(d+1);\r
     \r
@@ -782,7 +866,7 @@ int XMLTree::NewOpenTag(unsigned char *tagname)
     tags_aux[npar] = i; // inserts the new tag id within the preorder sequence of tags\r
     \r
     npar++;\r
-\r
+    \r
     return 1;\r
     \r
  }\r
@@ -855,6 +939,8 @@ int XMLTree::NewText(unsigned char *s)
     }\r
     \r
     Text->InsertText(s);\r
+    string cpps = (char*) s;\r
+    CachedText.push_back(cpps); \r
     \r
     return 1; // success\r
  }\r