X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=src%2Flexindex_stub.cpp;h=aad2333fd5d8b0b1392bc452bd21df8e92091760;hb=8fc8254d75a8970b7f08f81e4a809da089e567e6;hp=00694b7c90b22d48f8d1aeba7aa009a2c8376840;hpb=ef481dfd7be52d928012f612f9016d31d9bf5122;p=SXSI%2Fxpathcomp.git diff --git a/src/lexindex_stub.cpp b/src/lexindex_stub.cpp index 00694b7..aad2333 100644 --- a/src/lexindex_stub.cpp +++ b/src/lexindex_stub.cpp @@ -10,24 +10,44 @@ // #include using namespace std; -vector myvector; -vector::iterator it=myvector.begin(); -vector myvector2; -vector::iterator it2=myvector2.begin(); -xml_tree * tree; -xml_tree::tag_t tag; -xml_tree::tag_t tag2; +struct myclass { + xml_tree * tree; + bool operator() (int32_t i,int32_t j) { + return (strcmp((const char*) tree->get_text(i), + (const char*) tree->get_text(j))<0);} +} myobject; //define a type for the lexicographic index - class lex_index { public: - //The tag ID + //The tag IDs xml_tree::tag_t tag; + xml_tree::tag_t tag2; //The text data - std::vector > data; + vector tagVector; + vector::iterator tagVectorIt; + vector tag2Vector; + vector::iterator tag2VectorIt; + void printVector(xml_tree::tag_t t, vector v); + void print(); }; +void lex_index::printVector(xml_tree::tag_t t, vector v){ + vector::iterator i=v.begin(); + if (i!=v.end()) { + printf("%i-vector: [%i", t, *i); + for (++i; i!=v.end(); ++i) + printf(",%i", *i); + printf("]\n"); + } +} + +void lex_index::print(){ + printf("Print called\n"); + printVector(tag, tagVector); + printVector(tag2, tag2Vector); +} + // class prefix_treeNode { // public: // std::map Children; @@ -37,7 +57,6 @@ public: using namespace SXSI; - static xml_tree*& XMLTREE(value v) { return Obj_val(v); @@ -58,20 +77,17 @@ static xml_tree::tag_t TAG(value i) return static_cast(Int_val(i)); } -void preorderTraverse(xml_tree::tag_t parent_tag, xml_tree::node_t node){ +void preorderTraverse(xml_tree * tree, xml_tree::tag_t parent_tag, xml_tree::node_t node, lex_index* lindex){ if (tree->tag(node)==tree->PCDATA_OPEN_TAG_ID) - if (parent_tag==tag) it = myvector.insert(it, tree->text_id(node)); - else if (parent_tag==tag2) it2 = myvector2.insert(it2, tree->text_id(node)); - if (tree->tag(tree->first_child(node))!=0) preorderTraverse(tree->tag(node), tree->first_child(node)); - if (tree->tag(tree->next_sibling(node))!=0) preorderTraverse(parent_tag, tree->next_sibling(node)); -} - -bool myfunction (int32_t i,int32_t j) { - return (strcmp((const char*) tree->get_text(i), - (const char*) tree->get_text(j))<0); + if (parent_tag==lindex->tag) lindex->tagVectorIt = + lindex->tagVector.insert(lindex->tagVectorIt, tree->text_id(node)); + else if (parent_tag==lindex->tag2) lindex->tag2VectorIt = + lindex->tag2Vector.insert(lindex->tag2VectorIt, tree->text_id(node)); + if (tree->tag(tree->first_child(node))!=0) preorderTraverse(tree,tree->tag(node),tree->first_child(node),lindex); + if (tree->tag(tree->next_sibling(node))!=0) preorderTraverse(tree,parent_tag,tree->next_sibling(node),lindex); } -vector mergeJoin(vector v1, vector v2){ +vector mergeJoin(xml_tree * tree, vector v1, vector v2){ vector v; vector::iterator i=v.begin(); vector::iterator i1=v1.begin(); @@ -95,7 +111,7 @@ vector mergeJoin(vector v1, vector v2){ return(v); } -void printIndex(const char * label, vector v){ +void printVector(const char * label, vector v){ vector::iterator i=v.begin(); if (i!=v.end()) { printf("%s-vector: [%i", label, *i); @@ -109,23 +125,33 @@ ML_BINDING value caml_build_lex_index(value vtree, value vtag, value vtag2) { CAMLparam2(vtree, vtag); CAMLlocal1(vindex); - const char * s; vindex = sxsi_alloc_custom(); - tree = XMLTREE(vtree); - tag = TAG(vtag); - tag2 = TAG(vtag2); - - //Uncomment the following and comment the failwith line - //LEXINDEX(vindex) = ... return a lex_index* .... + xml_tree * tree = XMLTREE(vtree); + myobject.tree = tree; + + //allocate a lex index + lex_index* mylindex = new lex_index(); - if ((tag==-1) || (tag2==-1)) caml_failwith(""); + //take the tag parameter given by ocaml and convert + //it to a C++ tag and store it in the tag field of mylindex + if ((TAG(vtag)==-1) || (TAG(vtag2)==-1)) caml_failwith(""); + mylindex->tag = TAG(vtag); + mylindex->tag2 = TAG(vtag2); - preorderTraverse(0, tree->first_child(tree->ROOT)); - sort(myvector.begin(), myvector.end(), myfunction); - sort(myvector2.begin(), myvector2.end(), myfunction); - printIndex(tree->get_tag_name_by_ref(tag), myvector); - printIndex(tree->get_tag_name_by_ref(tag2), myvector2); - printIndex("Result" , mergeJoin(myvector, myvector2)); + //initialize iterators for the two vectors + mylindex->tagVectorIt=mylindex->tagVector.begin(); + mylindex->tag2VectorIt=mylindex->tag2Vector.begin(); + + preorderTraverse(tree, 0, tree->first_child(tree->ROOT), mylindex); + sort(mylindex->tagVector.begin(), mylindex->tagVector.end(), myobject); + sort(mylindex->tag2Vector.begin(), mylindex->tag2Vector.end(), myobject); + printVector(tree->get_tag_name_by_ref(mylindex->tag), mylindex->tagVector); + printVector(tree->get_tag_name_by_ref(mylindex->tag2), mylindex->tag2Vector); + printVector("Result" , mergeJoin(tree, mylindex->tagVector, mylindex->tag2Vector)); + + //Uncomment the following and comment the failwith line + //LEXINDEX(vindex) = ... return a lex_index* .... + LEXINDEX(vindex)=mylindex; } ML_BINDING value caml_print_lex_index(value vindex) @@ -134,8 +160,7 @@ ML_BINDING value caml_print_lex_index(value vindex) lex_index* index = LEXINDEX(vindex); //Print the index to the terminal - - caml_failwith("print_lex_index not implemented"); - + // caml_failwith("print_lex_index not implemented"); + index->print(); CAMLreturn (Val_unit); }