+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
+ }
+}