Optimize isFirstChild
[SXSI/XMLTree.git] / XMLTreeBuilder.cpp
index 9c7e3f6..d9b0832 100644 (file)
@@ -1,16 +1,19 @@
-#include "basics.h"\r
+#include "common.h"\r
 #include "XMLTreeBuilder.h"\r
 #include "timings.h"\r
 using std::string;\r
 \r
 XMLTreeBuilder::~XMLTreeBuilder(){\r
-  \r
+  //free(par_aux);\r
+  free(tags_aux);\r
+  //delete other stuff.\r
+\r
 }\r
 \r
 // OpenDocument(empty_texts): it starts the construction of the data structure for\r
 // the XML document. Parameter empty_texts indicates whether we index empty texts\r
 // in document or not. Returns a non-zero value upon success, NULLT in case of error.\r
-int XMLTreeBuilder::OpenDocument(bool empty_texts, \r
+int XMLTreeBuilder::OpenDocument(bool empty_texts,\r
                                 int sample_rate_text,\r
                                 bool dtc,\r
                                 TextCollectionBuilder::index_type_t index_type)\r
@@ -20,11 +23,11 @@ int XMLTreeBuilder::OpenDocument(bool empty_texts,
     disable_tc = dtc;\r
     text_index_type = index_type;\r
     STARTTIMER();\r
-   \r
+\r
     par_aux = (pb *)umalloc(sizeof(pb)*parArraySize);\r
-    \r
+\r
     tags_aux = (TagType *) umalloc(sizeof(TagType));\r
-    \r
+\r
     TagName = new vector<string>();\r
     tIdMap = new std::unordered_map<string,int>();\r
 \r
@@ -41,7 +44,7 @@ int XMLTreeBuilder::OpenDocument(bool empty_texts,
 \r
     if (disable_tc)\r
         TextBuilder = 0;\r
-    else \r
+    else\r
         TextBuilder = TextCollectionBuilder::create((unsigned)sample_rate_text, index_type);\r
 \r
     Text = 0;\r
@@ -51,42 +54,32 @@ int XMLTreeBuilder::OpenDocument(bool empty_texts,
  }\r
 \r
 // CloseDocument(): it finishes the construction of the data structure for the XML\r
-// document. Tree and tags are represented in the final form, dynamic data \r
-// structures are made static, and the flag "finished" is set to true. After that, \r
+// document. Tree and tags are represented in the final form, dynamic data\r
+// structures are made static, and the flag "finished" is set to true. After that,\r
 // the data structure can be queried.\r
 XMLTree *XMLTreeBuilder::CloseDocument()\r
- {    \r
+ {\r
     //closing parenthesis for the tree root\r
     //par_aux = (pb *)urealloc(par_aux, sizeof(pb)*(1+npar/(8*sizeof(pb))));\r
     //setbit(par_aux, npar, CP);\r
     //npar++;\r
-    \r
+\r
     // makes the text collection static\r
    STOPTIMER(Parsing);\r
    PRINTTIME("Parsing XML Document", Parsing);\r
 \r
-    if (!disable_tc) {\r
-       assert(Text == 0);\r
-       assert(TextBuilder != 0);\r
-       STARTTIMER();\r
-       Text = TextBuilder->InitTextCollection();\r
-       delete TextBuilder;\r
-       TextBuilder = 0;\r
-       STOPTIMER(Building);\r
-       PRINTTIME("Building TextCollection", Building);\r
-\r
-    }\r
-    \r
     XMLTree *T = new XMLTree(par_aux,\r
-                            npar, \r
+                            npar,\r
                             TagName,\r
                             tIdMap,\r
-                            empty_texts_aux,                // freed by the constructor\r
-                            tags_aux,                       //freed by the constructor\r
-                            Text,\r
+                            empty_texts_aux, // freed by the constructor\r
+                            tags_aux,        // freed by the constructor\r
+                            TextBuilder,     // freed by the constructor\r
                             disable_tc,\r
                             text_index_type);\r
-    return T; \r
+    tags_aux = 0;\r
+    empty_texts_aux = 0;\r
+    return T;\r
  }\r
 \r
 \r
@@ -96,17 +89,21 @@ XMLTree *XMLTreeBuilder::CloseDocument()
 int XMLTreeBuilder::NewOpenTag(string tagname)\r
  {\r
     int i;\r
-    \r
     // inserts a new opening parentheses in the bit sequence\r
     if (sizeof(pb)*8*parArraySize == npar) { // no space left for the new parenthesis\r
-       par_aux = (pb *)urealloc(par_aux, sizeof(pb)*2*parArraySize);\r
-       parArraySize *= 2;\r
-    }\r
-    \r
-    setbit(par_aux,npar,OP);  // marks a new opening parenthesis\r
-    \r
+\r
+      // If array is already 1GB, be gentler when resizing:\r
+      if (sizeof(pb)*parArraySize >= 1024*1024*1024)\r
+       parArraySize += (128*1024*1024);\r
+      else\r
+       parArraySize *= 2;\r
+      par_aux = (pb *) urealloc(par_aux, sizeof(pb)*parArraySize);\r
+    };\r
+\r
+    bp_setbit(par_aux,npar,OP);  // marks a new opening parenthesis\r
+\r
     TagIdMapIT tag_id = tIdMap->find(tagname);\r
-   \r
+\r
     if (tag_id == tIdMap->end()){\r
       REGISTER_TAG(TagName,tIdMap,tagname);\r
       i = TagName->size() - 1;\r
@@ -117,14 +114,15 @@ int XMLTreeBuilder::NewOpenTag(string tagname)
     if (tagname.compare(PCDATA_OPEN_TAG) == 0 ||\r
        tagname.compare(ATTRIBUTE_DATA_OPEN_TAG) == 0){\r
     };\r
-    \r
+\r
+\r
     tags_aux = (TagType *) urealloc(tags_aux, sizeof(TagType)*(npar + 1));\r
-    \r
+\r
     tags_aux[npar] = i; // inserts the new tag id within the preorder sequence of tags\r
-    \r
+\r
     npar++;\r
-    \r
-    return 1; // success    \r
+\r
+    return 1; // success\r
  }\r
 \r
 \r
@@ -134,18 +132,21 @@ int XMLTreeBuilder::NewOpenTag(string tagname)
 int XMLTreeBuilder::NewClosingTag(string tagname)\r
  {\r
     int i;\r
-    \r
     // inserts a new closing parentheses in the bit sequence\r
     if (sizeof(pb)*8*parArraySize == npar) { // no space left for the new parenthesis\r
-       par_aux = (pb *)urealloc(par_aux, sizeof(pb)*2*parArraySize);\r
-       parArraySize *= 2;\r
-    }\r
-    \r
-    setbit(par_aux,npar,CP);  // marks a new closing parenthesis\r
-    \r
+      // If array is already 1GB, be gentler when resizing:\r
+      if (sizeof(pb)*parArraySize >= 1024*1024*1024)\r
+       parArraySize += (128*1024*1024);\r
+      else\r
+       parArraySize *= 2;\r
+      par_aux = (pb *)urealloc(par_aux, sizeof(pb)*parArraySize);\r
+    };\r
+\r
+    bp_setbit(par_aux,npar,CP);  // marks a new closing parenthesis\r
+\r
     //tagname.insert(0,"/");\r
 \r
-    //TagIdMapIT tag_id = tIdMap->find(tagname);    \r
+    //TagIdMapIT tag_id = tIdMap->find(tagname);\r
 \r
     // if (tag_id == tIdMap->end()){\r
     //   REGISTER_TAG(TagName,tIdMap,tagname);\r
@@ -154,10 +155,10 @@ int XMLTreeBuilder::NewClosingTag(string tagname)
     // else\r
     //   i = tag_id->second;\r
 \r
-    tags_aux = (TagType *)urealloc(tags_aux, sizeof(TagType)*(npar + 1));\r
+      tags_aux = (TagType *)urealloc(tags_aux, sizeof(TagType)*(npar + 1));\r
 \r
     tags_aux[npar] = CLOSING_TAG_ID; // inserts the new tag id within the preorder sequence of tags\r
-    \r
+\r
     npar++;\r
 \r
     return 1; // success\r
@@ -178,7 +179,7 @@ int XMLTreeBuilder::NewText(string text)
 \r
    int n_eta_size = sizeof(uint)*(1+(npar-1)/(8*sizeof(uint)));\r
    //see basics.h, recalloc resizes and sets the new area to 0.\r
-   \r
+\r
    empty_texts_aux = (uint *)urecalloc(empty_texts_aux,eta_size,n_eta_size);\r
    eta_size = n_eta_size;\r
    bitset(empty_texts_aux, npar-1);  // marks the non-empty text with a 1 in the bit vector\r