Fixed bug in NextElement, improved caching
[SXSI/xpathcomp.git] / OCamlDriver.cpp
index a35cd75..9df73d6 100644 (file)
@@ -1,31 +1,30 @@
 /**************************************
  * OCamlDriver.cpp
  * -------------------
- * A Test Ocaml Driver which calls the C++ methods and
+ * An Ocaml Driver which calls the C++ methods and
  * adds a C wrapper interface with OCaml code.
  * 
  * Author: Kim Nguyen
  * Date: 04/11/08
  */
 
-/* OCaml memory managment */
+
+
 #include <unordered_set>
+#include <algorithm>
+#include "XMLDocShredder.h"
+#include "XMLTree.h"
+#include "Utils.h"
+
 extern "C" {
+/* OCaml memory managment */
 #include <caml/mlvalues.h>
 #include <caml/alloc.h>
 #include <caml/memory.h>
 #include <caml/callback.h>
 #include <caml/fail.h>
 #include <caml/custom.h>
-
-
-} //extern C  
-
-
-//#include "TextCollection/TextCollection.h"
-#include "XMLDocShredder.h"
-#include "XMLTree.h"
-#include "Utils.h"
+#include "results.h"
 
 #define CAMLRAISEMSG(msg) (caml_raise_with_string(*cpp_exception,(msg) ))
 #define NOT_IMPLEMENTED(s)  (caml_failwith(s))
@@ -34,20 +33,19 @@ extern "C" {
 #define TEXTCOLLECTION(x)
 #define TREENODEVAL(i) ((treeNode) (Int_val(i)))
 #define XMLTREE_ROOT 0
-
-
-
-extern "C" {
+  
   static struct custom_operations ops;
   static struct custom_operations set_ops;
   static value * cpp_exception = NULL;
   static bool ops_initialized = false;
-
+  
 }
+
 extern "C" void caml_xml_tree_finalize(value tree){
   delete XMLTREE(tree);
   return;
 }
+
 extern "C" void caml_hset_finalize(value hblock){
   delete HSET(hblock);
   return;
@@ -56,7 +54,7 @@ extern "C" void caml_hset_finalize(value hblock){
 extern "C" CAMLprim value caml_init_lib (value unit) {
   CAMLparam1(unit);
   if (!ops_initialized){
-  
+    
   
   ops.identifier = (char*) "XMLTree";
   ops.finalize = caml_xml_tree_finalize;
@@ -64,6 +62,11 @@ extern "C" CAMLprim value caml_init_lib (value unit) {
   set_ops.finalize = caml_hset_finalize;
   
   cpp_exception = caml_named_value("CPlusPlusError");
+  if (cpp_exception == NULL){
+    string s = "FATAL: Unregistered exception ";
+    s += "CPlusPlusError";
+    caml_failwith(s.c_str());
+  };
   
   ops_initialized = true;
   
@@ -147,16 +150,14 @@ extern "C" CAMLprim value caml_text_collection_get_text(value tree, value id){
   CAMLlocal1(str);
   uchar* txt = XMLTREE(tree)->GetText((DocID) Int_val(id));
   str = caml_copy_string((const char*)txt);
-  delete (txt);
   CAMLreturn (str);
 }
 
 extern "C" CAMLprim value caml_text_collection_get_cached_text(value tree, value id){
   CAMLparam2(tree,id);
   CAMLlocal1(str);
-  char* txt = (char*) XMLTREE(tree)->GetCachedText((DocID) Int_val(id));
+  char* txt = (char*) XMLTREE(tree)->GetText((DocID) Int_val(id));
   str = caml_copy_string(txt);
-  free(txt);
   CAMLreturn (str);
 }
 
@@ -185,6 +186,7 @@ extern "C" CAMLprim value caml_text_collection_count(value tree,value str){
   CAMLreturn (Val_unit);
   
 }
+bool docId_comp(DocID x, DocID y) { return x < y; };
 
 extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){
   CAMLparam2(tree,str);
@@ -193,13 +195,16 @@ extern "C" CAMLprim value caml_text_collection_contains(value tree,value str){
   std::vector<DocID> results;
   results = XMLTREE(tree)->Contains(cstr);
   //free(cstr);
-  resarray = caml_alloc_tuple(results.size());
+  std::sort(results.begin(), results.end(), docId_comp);
+  size_t s = results.size();
+  resarray = caml_alloc_tuple(s);
 
-  for (unsigned int i=0; i<results.size();i++){
+  for (size_t i = 0; i < s ;i++){
     caml_initialize(&Field(resarray,i),Val_int(results[i]));
   };
   CAMLreturn (resarray);  
 }
+
 extern "C" CAMLprim value caml_text_collection_unsorted_contains(value tree,value str){
   CAMLparam2(tree,str);
   uchar * cstr = (uchar *) String_val(str);  
@@ -228,7 +233,6 @@ extern "C" CAMLprim value caml_xml_tree_parent_doc(value tree, value id){
   return (Val_int (XMLTREE(tree)->ParentNode((DocID) Int_val(id))));
 }
 
-
 extern "C" CAMLprim value caml_xml_tree_is_ancestor(value tree,value id1, value id2) {
   CAMLparam3(tree,id1,id2);
   CAMLreturn(Val_bool (XMLTREE(tree)->IsAncestor(TREENODEVAL(id1),TREENODEVAL(id2))));
@@ -257,7 +261,7 @@ extern "C" CAMLprim value caml_xml_tree_next_sibling(value tree, value id){
 }
 
 extern "C" CAMLprim value caml_xml_tree_next_element(value tree, value id){
-  return(Val_int (XMLTREE(tree)->NextSibling(TREENODEVAL(id))));
+  return(Val_int (XMLTREE(tree)->NextElement(TREENODEVAL(id))));
 }
 
 extern "C" CAMLprim value caml_xml_tree_tagged_sibling(value tree, value id, value tag){
@@ -312,6 +316,10 @@ extern "C" CAMLprim value caml_xml_tree_subtree_tags(value tree,value id,value t
   return (Val_int(XMLTREE(tree)->SubtreeTags(TREENODEVAL(id),Int_val(tag))));
 }
 
+extern "C" CAMLprim value caml_xml_tree_subtree_size(value tree,value id){
+  return (Val_int(XMLTREE(tree)->SubtreeSize(TREENODEVAL(id))));
+}
+
 
 extern "C" CAMLprim value caml_xml_tree_register_tag(value tree,value str){
   CAMLparam2(tree,str);
@@ -373,3 +381,32 @@ extern "C" CAMLprim value caml_xml_tree_doc_ids(value tree, value node){
   caml_initialize(&Field(tuple,1),Val_int(r.max));
   CAMLreturn (tuple);
 }
+
+extern "C" CAMLprim value caml_result_set_create(value size){
+  CAMLparam1(size);
+  results* res = (results*) malloc(sizeof(results));
+  results r = createResults (Int_val(size));
+  res->n = r.n;
+  res->lgn = r.lgn;
+  res->tree = r.tree;
+  CAMLreturn ((value) (res));
+}
+
+extern "C" CAMLprim value caml_result_set_set(value result,value p){
+  CAMLparam2(result,p);
+  setResult (  *((results*) result), Int_val(p));
+  CAMLreturn (Val_unit);
+}
+
+extern "C" CAMLprim value caml_result_set_clear(value result,value p1,value p2){
+  CAMLparam3(result,p1,p2);
+  clearRange ( *((results*) result), Int_val(p1), Int_val(p2));
+  CAMLreturn (Val_unit);
+}
+
+extern "C" CAMLprim value caml_result_set_next(value result,value p){
+  CAMLparam2(result,p);
+  CAMLreturn (Val_int(nextResult(*((results*) result), Int_val(p))));
+}
+
+