put the mergeJoin function into its own class
[SXSI/xpathcomp.git] / src / lexindex_stub.cpp
index ab595ae..7e5eba6 100644 (file)
 // #include <algorithm>
 using namespace std;
 
-vector<int32_t> myvector;           
-vector<int32_t>::iterator it=myvector.begin();
-vector<int32_t> myvector2;           
-vector<int32_t>::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
+void printVector(vector<int32_t> v){
+  vector<int32_t>::iterator i=v.begin();
+  if (i!=v.end()) {
+      printf("[%i", *i);
+      for (++i; i!=v.end(); ++i)
+       printf(",%i",  *i);
+      printf("]\n");
+    }
+}
 
+//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<std::pair<std::string, xml_tree::node_t> > data;
+  vector<int32_t> tagVector;           
+  vector<int32_t>::iterator tagVectorIt;
+  vector<int32_t> tag2Vector;           
+  vector<int32_t>::iterator tag2VectorIt;
+  void preorderTraverse(xml_tree * tree, xml_tree::tag_t parent_tag, xml_tree::node_t node);
+  void createIndex(xml_tree * tree);
+  void print();
+};
+
+void lex_index::preorderTraverse(xml_tree * tree, xml_tree::tag_t parent_tag, xml_tree::node_t node){  
+  if (tree->tag(node)==tree->PCDATA_OPEN_TAG_ID)
+  if (parent_tag==tag) tagVectorIt = tagVector.insert(tagVectorIt, tree->text_id(node));
+  else if (parent_tag==tag2) tag2VectorIt = tag2Vector.insert(tag2VectorIt, tree->text_id(node));
+  if (tree->tag(tree->first_child(node))!=0) preorderTraverse(tree,tree->tag(node),tree->first_child(node));
+  if (tree->tag(tree->next_sibling(node))!=0) preorderTraverse(tree,parent_tag,tree->next_sibling(node));
+}
+
+void lex_index::createIndex(xml_tree * tree){
+  tagVectorIt=tagVector.begin();
+  tag2VectorIt=tag2Vector.begin();
+  preorderTraverse(tree, 0, tree->first_child(tree->ROOT));
+  sort(tagVector.begin(), tagVector.end(), myobject); 
+  sort(tag2Vector.begin(), tag2Vector.end(), myobject); 
+}
+
+void lex_index::print(){
+  printf("%i-vector: ", tag);
+  printVector(tagVector);
+  printf("%i-vector: ", tag2);
+  printVector(tag2Vector);
+}
+
+class VectorMergeJoin {
+public: 
+  xml_tree * tree;
+  //The tag IDs to be semi-joined
+  const char * tagname1;
+  const char * tagname2;
+  vector<int32_t> resultVector;
+  void mergeJoin(vector<int32_t> v1, vector<int32_t> v2);
 };
 
+void VectorMergeJoin::mergeJoin(vector<int32_t> v1, vector<int32_t> v2){
+  vector<int32_t>::iterator i=resultVector.begin();
+  vector<int32_t>::iterator i1=v1.begin();
+  vector<int32_t>::iterator i2=v2.begin();
+  int k;
+
+  while((i1!=v1.end()) && (i2!=v2.end())){
+    k = strcmp((const char*) tree->get_text(*i1),
+              (const char*) tree->get_text(*i2));
+    if (k==0) 
+      {
+       i = resultVector.insert( i, *i1 );
+       //advance left
+       i1++;
+       //advance right     
+       i2++;
+      }
+    else if (k<0) i1++; //advance left
+    else i2++; //advance right
+  }
+}
+
 // class prefix_treeNode {
 // public:
   //  std::map<char, prefix_treeNode> Children;
@@ -37,7 +107,6 @@ public:
 
 using namespace SXSI;
 
-
 static xml_tree*& XMLTREE(value v)
 {
   return Obj_val<xml_tree*>(v);
@@ -58,80 +127,38 @@ static xml_tree::tag_t TAG(value i)
   return static_cast<xml_tree::tag_t>(Int_val(i));
 }
 
-void preorderTraverse(xml_tree::tag_t parent_tag, xml_tree::node_t node){  
-  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);
-}
-
-vector<int32_t> mergeJoin(vector<int32_t> v1, vector<int32_t> v2){
-  vector<int32_t> v;
-  vector<int32_t>::iterator i=v.begin();
-  vector<int32_t>::iterator i1=v1.begin();
-  vector<int32_t>::iterator i2=v2.begin();
-  int k;
-
-  while((i1!=v1.end()) && (i2!=v2.end())){
-    k = strcmp((const char*) tree->get_text(*i1),
-              (const char*) tree->get_text(*i2));
-    if (k==0) 
-      {
-       i = v.insert( i, *i1 );
-       //advance left
-       i1++;
-       //advance right     
-       i2++;
-      }
-    else if (k<0) i1++; //advance left
-    else i2++; //advance right
-  }
-  return(v);
-}
-
-void printIndex(const char * label, vector<int32_t> v){
-  vector<int32_t>::iterator i=v.begin();
-  if (i!=v.end()) {
-      printf("%s-vector: [%i", label, *i);
-      for (++i; i!=v.end(); ++i)
-       printf(",%i",  *i);
-      printf("]\n");
-    }
-}
-
-extern "C" value caml_build_lex_index(value vtree, value vtag, value vtag2)
+ML_BINDING value caml_build_lex_index(value vtree, value vtag, value vtag2)
 {
+  if ((TAG(vtag)==-1) || (TAG(vtag2)==-1)) caml_failwith("<INVALID TAG>");
   CAMLparam2(vtree, vtag);
   CAMLlocal1(vindex);
-  const char * s;
   vindex = sxsi_alloc_custom<lex_index*>();
-  tree = XMLTREE(vtree);
-  tag = TAG(vtag);
-  tag2 = TAG(vtag2);
-  //Uncomment the following and comment the failwith line
-  //LEXINDEX(vindex) = ... return a lex_index* ....
-
-  if ((tag==-1) || (tag2==-1)) caml_failwith("<INVALID TAG>");
-  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));
+  xml_tree * tree = XMLTREE(vtree);
+  myobject.tree = tree;
+
+  //create the index
+  lex_index* mylindex = new lex_index();
+  mylindex->tag = TAG(vtag);
+  mylindex->tag2 = TAG(vtag2);
+  mylindex->createIndex(tree);
+
+  //do a join
+  VectorMergeJoin* myVMJoin = new VectorMergeJoin();
+  myVMJoin->tree = tree;
+  myVMJoin->mergeJoin(mylindex->tagVector, mylindex->tag2Vector);
+  printf("Result-vector: ");
+  printVector(myVMJoin->resultVector);
+
+  LEXINDEX(vindex)=mylindex;
 }
 
-extern "C" value caml_print_lex_index(value vindex)
+ML_BINDING value caml_print_lex_index(value vindex)
 {
   CAMLparam1(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);
 }