Update of /cvsroot/monetdb/pathfinder/runtime
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv27805
Modified Files:
pathfinder.mx pf_support.mx
Log Message:
vx_maintain is now called with four parameters instead of three.
The fourth parameter (actually, the new second parameter) is the element QN.
It's over to Peter now.
Index: pathfinder.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/pathfinder.mx,v
retrieving revision 1.377
retrieving revision 1.378
diff -u -d -r1.377 -r1.378
--- pathfinder.mx 6 Aug 2007 12:54:52 -0000 1.377
+++ pathfinder.mx 8 Aug 2007 12:27:32 -0000 1.378
@@ -475,6 +475,10 @@
const MODIFIED_PAGE := MODIFIED_ATTR + 1;
const NEW_PAGE := MODIFIED_PAGE + 1;
const DEL_PAGE := NEW_PAGE + 1;
+const DELETED_NID := DEL_PAGE + 1;
+const ADDED_NID := DELETED_NID + 1;
+const DELETED_ATTR := ADDED_NID + 1;
+const ADDED_ATTR := DELETED_ATTR + 1;
# transaction debugging / performance profiling
@@ -592,7 +596,12 @@
.insert(oid,"modified_attr")
.insert(oid,"modified_page")
.insert(oid,"new_page")
- .insert(oid,"del_page").access(BAT_READ).rename("ws_update");
+ .insert(oid,"del_page")
+ .insert(oid,"deleted_nid")
+ .insert(oid,"added_nid")
+ .insert(oid,"deleted_attr")
+ .insert(oid,"added_attr")
+ .access(BAT_READ).rename("ws_update");
# the bats that get changed using the logger in case of updates reach up until
qn_histogram
# (i.e. these are the ones that need to be registered in the logger)
@@ -2678,13 +2687,14 @@
# helper to compute [hsh,nid] combinations for the VX index
PROC vx_maintain(BAT[oid,oid] nid,
- BAT[oid,oid] qn,
+ BAT[oid,oid] elemqn, # not yet used
+ BAT[oid,oid] attrqn,
BAT[oid,str] val) : BAT[int,oid]
{
- return reverse([:rotate_xor_hash=]([int](qn).access(BAT_WRITE), 13,
val)).leftfetchjoin(nid);
+ return reverse([:rotate_xor_hash=]([int](attrqn).access(BAT_WRITE), 13,
val)).leftfetchjoin(nid);
}
-PROC vx_maintain(BAT[oid,oid] nid,
+PROC vx_maintain1(BAT[oid,oid] nid,
BAT[oid,str] val) : BAT[int,oid]
{
return reverse([hash](val)).leftfetchjoin(nid);
Index: pf_support.mx
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/runtime/pf_support.mx,v
retrieving revision 1.259
retrieving revision 1.260
diff -u -d -r1.259 -r1.260
--- pf_support.mx 2 Aug 2007 22:36:11 -0000 1.259
+++ pf_support.mx 8 Aug 2007 12:27:33 -0000 1.260
@@ -2679,6 +2679,10 @@
ws.fetch(MODIFIED_ATTR).reverse().accbuild("hash");
ws.fetch(MODIFIED_PAGE).reverse().accbuild("hash");
ws.fetch(NEW_PAGE).reverse().accbuild("hash");
+ ws.fetch(DELETED_NID).reverse().accbuild("hash");
+ ws.fetch(ADDED_NID).reverse().accbuild("hash");
+ ws.fetch(DELETED_ATTR).reverse().accbuild("hash");
+ ws.fetch(ADDED_ATTR).reverse().accbuild("hash");
[EMAIL PROTECTED]() {
ws.fetch(MAP_PID_UPDATE).insert($t,
ws.fetch(MAP_PID).find($t).copy().access(BAT_WRITE).key(true));
@@ -2829,50 +2833,42 @@
#fix_consecutive_texts(ws, texts);
# prepare for postcommit
+
+ var deleted_nid := ws.fetch(DELETED_NID);
+ var deleted_attr := ws.fetch(DELETED_ATTR);
+
var old_attr := new(oid,bat);
var old_text := new(oid,bat);
- var new_attr := new(oid,bat);
var new_text := new(oid,bat);
[EMAIL PROTECTED]() {
var cont := $t;
- # first do attr
extend_protect(ws, cont);
- var attr_prop_update := ws.fetch(ATTR_PROP_UPDATE).find(cont); #
[ATID,PROPID]
- # delattr: attributes of deleted nodes
- var delattr := get_attr_own(ws,
ws.fetch(NID_RID_UPDATE).find(cont).uselect(oid_nil).hmark([EMAIL PROTECTED]),
cont);
- if ((attr_prop_update.count() > 0) or (delattr.count() > 0)) {
- # combine attrs from deleted nodes (delattr) with updated
- # attributes (attr_prop_update) and figure out old values by
- # joining with ATTR_PROP
- var oldprop := kunion(delattr.reverse().mirror(),
attr_prop_update.mirror()).leftjoin(ws.fetch(ATTR_PROP).find(cont)).ord_select(oid_nil,
oid_nil); # [ATID,PROPID]
- var oldvx;
- if (oldprop.count() > 0) {
- var oldval := oldprop.leftfetchjoin(ws.fetch(PROP_VAL).find(cont)); #
[ATID,str]
- var map_new_old := oldprop.hmark([EMAIL PROTECTED]); # [i,ATID]
- oldval := oldval.tmark([EMAIL PROTECTED]); # [i,str]
- var oldqn := map_new_old.leftfetchjoin(ws.fetch(ATTR_QN).find(cont));
- var oldown := map_new_old.leftfetchjoin(ws.fetch(ATTR_OWN).find(cont));
- oldvx := vx_maintain(oldown, oldqn, oldval);
- } else {
- oldvx := new(int,oid);
- }
- # only keep attributes that are set to new values (i.e. not deleted)
- attr_prop_update := attr_prop_update.ord_select(oid_nil,
oid_nil).sort(); # [ATID,PROP]
- var map_new_old := attr_prop_update.hmark([EMAIL PROTECTED]); # [i,ATID]
- var newval :=
attr_prop_update.leftjoin(ws.fetch(PROP_VAL).find(cont)).access(BAT_WRITE); #
[i,str]
- newval :=
newval.insert(attr_prop_update.leftjoin(ws.fetch(PROP_VAL_UPDATE).find(cont))).order().tmark([EMAIL
PROTECTED]);
- var newqn :=
map_new_old.join(ws.fetch(ATTR_QN).find(cont)).copy().access(BAT_WRITE).key(true).myupdate(map_new_old.join(ws.fetch(ATTR_QN_UPDATE).find(cont))).order();
# [i,QNID]
- var newown :=
map_new_old.join(ws.fetch(ATTR_OWN).find(cont)).copy().access(BAT_WRITE).key(true).myupdate(map_new_old.join(ws.fetch(ATTR_OWN_UPDATE).find(cont))).order();
# [i,OWN]
- var newvx := vx_maintain(newown, newqn, newval);
- old_attr.insert(cont, sdiff(oldvx, newvx));
- new_attr.insert(cont, sdiff(newvx, oldvx));
- } else {
- old_attr.insert(cont, new(int,oid));
- new_attr.insert(cont, new(int,oid));
- }
+ # first do attributes
+ var nid_rid := ws.fetch(NID_RID).find(cont);
+ var map_pid := ws.fetch(MAP_PID).find(cont);
+ var pre_prop := ws.fetch(PRE_PROP).find(cont);
+ var attr_own := ws.fetch(ATTR_OWN).find(cont);
+ var attr_qn := ws.fetch(ATTR_QN).find(cont);
+ var attr_prop := ws.fetch(ATTR_PROP).find(cont);
+ var prop_val := ws.fetch(PROP_VAL).find(cont);
+
+ var nids := deleted_nid.reverse().uselect(cont).reverse(); # [nil,NID]
+
+ var elemqns := nids.leftjoin(nid_rid).select(oid_nil,
oid_nil).[swizzle](map_pid).leftjoin(pre_prop); # [nil,QNID]
+ var attrids := nids.leftjoin(attr_own.reverse()); # [nil,ATID]
+ # combine with deleted attributes (with double elimination)
+ var attrs := deleted_attr.reverse().uselect(cont); # [ATID,nil]
+ attrids := attrids.reverse().kunion(attrs).hmark([EMAIL PROTECTED]); #
[j,ATID]
+
+ var attrqns := attrids.leftjoin(attr_qn); # [j,ATQN]
+ var attrvals := attrids.leftjoin(attr_prop).leftjoin(prop_val); #
[j,ATVAL(str)]
+ var elemnids := attrids.leftjoin(attr_own); # [j,NID]
+ var elemqns :=
elemnids.leftjoin(nid_rid).[swizzle](map_pid).leftjoin(pre_prop); # [j,QNID]
+
+ old_attr.insert(cont, vx_maintain(elemnids, elemqns, attrqns, attrvals));
# then do text
{
@@ -3037,6 +3033,9 @@
ws_log(ws, "===================== WAL RELEASED exec" + str(ws_logtime -
(ws_logtime := usec())));
+ var added_nid := ws.fetch(ADDED_NID);
+ var added_attr := ws.fetch(ADDED_ATTR);
+
ws.seqbase(oid_nil); # indicate that we are done reading our snapshot
# upgrade locks, isolate the masters, apply deltas to them, maintain
indices, and release all coll-lock(s)
@@ -3063,9 +3062,31 @@
if (ws_log_active)
ws_log(ws, "commit-apply exec" + str(ws_logtime - (ws_logtime :=
usec())));
+ var nid_rid := ws.fetch(_NID_RID).find(cont);
+ var rid_prop := ws.fetch(_RID_PROP).find(cont);
+ var attr_own := ws.fetch(_ATTR_OWN).find(cont);
+ var attr_qn := ws.fetch(_ATTR_QN).find(cont);
+ var attr_prop := ws.fetch(_ATTR_PROP).find(cont);
+ var prop_val := ws.fetch(_PROP_VAL).find(cont);
+
+ var nids := added_nid.reverse().uselect(cont).reverse(); # [nil,NID]
+
+ var elemqns := nids.leftjoin(nid_rid).select(oid_nil,
oid_nil).leftjoin(rid_prop); # [nil,QNID]
+ var attrids := nids.leftjoin(attr_own.reverse()); # [nil,ATID]
+ # combine with deleted attributes (with double elimination)
+ var attrs := added_attr.reverse().uselect(cont); # [ATID,nil]
+ attrids := attrids.reverse().kunion(attrs).hmark([EMAIL PROTECTED]); #
[j,ATID]
+
+ var attrqns := attrids.leftjoin(attr_qn); # [j,ATQN]
+ var attrvals := attrids.leftjoin(attr_prop).leftjoin(prop_val); #
[j,ATVAL(str)]
+ var elemnids := attrids.leftjoin(attr_own); # [j,NID]
+ var elemqns := elemnids.leftjoin(nid_rid).leftjoin(rid_prop); # [j,QNID]
+
+ var newattr := vx_maintain(elemnids, elemqns, attrqns, attrvals);
+
# ws_postcommit maintains the indices and releases the collection lock
__ws_postcommit(ws, cont,
- new_attr.find(cont),
+ newattr,
old_attr.find(cont),
new_text.find(cont),
old_text.find(cont),
@@ -3189,12 +3210,16 @@
var elems := types.ord_uselect(ELEM);
if (attrs.count() > 0) {
+ # do rename $elem/@attr as(into) "newname"
+ # renaming of attributes, i.e., the attributes get a new QN but keep their
value
attrs := attrs.mirror();
var aitem := attrs.leftjoin(update_node_item); # [i,ATID]
var aconts := attrs.leftjoin(conts); # [i,CONT]
{
- var modified_attr := ws.fetch(MODIFIED_ATTR);
- modified_attr.insert(aconts.reverse().join(aitem));
+ var contattr := aconts.reverse().join(aitem);
+ ws.fetch(MODIFIED_ATTR).insert(contattr);
+ ws.fetch(DELETED_ATTR).insert(contattr);
+ ws.fetch(ADDED_ATTR).insert(contattr);
}
aconts.tunique()@batloop() {
var cont := $h;
@@ -3210,9 +3235,13 @@
}
if (elems.count() > 0) {
+ # do rename $elem as(into) "newname"
+ # renaming an element or processing instruction
elems := elems.mirror();
var eitem := elems.leftjoin(update_node_item); # [i,PRE]
var econts := elems.leftjoin(conts); # [i,CONT]
+ var deleted_nid := ws.fetch(DELETED_NID);
+ var added_nid := ws.fetch(ADDED_NID);
econts.tunique()@batloop() {
var cont := $h;
@@ -3252,6 +3281,9 @@
var enewnidqn := eelemnid.reverse().join(eqnid); # [NID,newQNID]
ws.fetch(NID_QN_INS_UPDATE).find(cont).insert(enewnidqn);
ws.fetch(NID_QN_DEL_UPDATE).find(cont).insert(eoldnidqn);
+ var contnid := eelemnid.reverse().project(cont).reverse(); #
[cont,NID]
+ deleted_nid.insert(contnid);
+ added_nid.insert(contnid);
}
var upd := eelem.leftjoin(erids).reverse().join(eqnid); # [RID,QNID]
rid_prop_update.insert(upd);
@@ -3281,12 +3313,16 @@
}
if (attrs.count() > 0) {
+ # do replace value of $elem/@attr with "new value"
+ # replacing the value of an attribute
attrs := attrs.mirror(); # [i,i]
var aitem := attrs.leftjoin(update_node_item); # [i,ATID]
var aconts := attrs.leftjoin(conts); # [i,CONT]
{
- var modified_attr := ws.fetch(MODIFIED_ATTR);
- modified_attr.insert(aconts.reverse().join(aitem));
+ var contattr := aconts.reverse().join(aitem);
+ ws.fetch(MODIFIED_ATTR).insert(contattr);
+ ws.fetch(DELETED_ATTR).insert(contattr);
+ ws.fetch(ADDED_ATTR).insert(contattr);
}
aconts.tunique()@batloop() {
var cont := $h;
@@ -3438,6 +3474,8 @@
attr_own_update.insert(aownid.tmark(attrid));
attr_qn_update.insert(aqnid.tmark(attrid));
attr_prop_update.insert(avalid.tmark(attrid));
+ var newattrs := list.hmark(attrid).project(cont).reverse(); # [cont,ATID]
+ ws.fetch(ADDED_ATTR).insert(newattrs);
}
}
@@ -3447,6 +3485,7 @@
var modified_nid := ws.fetch(MODIFIED_NID);
var ancestor_nid := ws.fetch(ANCESTOR_NID);
var new_page := ws.fetch(NEW_PAGE);
+ var added_nid := ws.fetch(ADDED_NID);
# one at a time
elements.leftjoin(update_insert_node_item)@batloop() {
# if (debug) printf("\nstart of loop for argument %d\n", int($h));
@@ -4094,8 +4133,10 @@
var elemids := e.reverse().leftjoin(find_qn_bulk(ws, doccont,
prefurilocval, true));
insprop.replace(elemids);
}
- var newnidqn :=
elems.leftjoin(insnnids).reverse().join(insprop); # [newNID,newQNID]
+ var newelemnids := elems.leftjoin(insnnids).reverse(); #
[newNID,i]
+ var newnidqn := newelemnids.join(insprop); # [newNID,newQNID]
nid_qn_ins_update.insert(newnidqn);
+ added_nid.insert(newelemnids.project(doccont).reverse());
}
var lastsize := inssize.find(oid((lng(insertitem) + batchsize) -
1));
if (isnil(niland(lastsize, int_nil))) {
@@ -4164,6 +4205,8 @@
var nid_qn_del_update := ws.fetch(NID_QN_DEL_UPDATE).find(cont);
var modified_page := ws.fetch(MODIFIED_PAGE);
var modified_nid := ws.fetch(MODIFIED_NID);
+ var deleted_nid := ws.fetch(DELETED_NID);
+ var added_nid := ws.fetch(ADDED_NID);
var pageno := oid(lng(newpre) >> REMAP_PAGE_BITS);
var pageid := map_pid_update.reverse().find(pageno);
@@ -4278,6 +4321,7 @@
# Note that update_data contains RID/NID values of nodes being
# deleted, where the RID refers to the new RID value.
var nid_qn_del;
+ var delnid;
if (isoldpage) {
var rk :=
update_data.mirror().outerjoin(rid_kind_update).access(BAT_WRITE); #
[RID,KIND/nil]
rk.replace(rk.uselect(chr_nil).mirror().[swizzle](map_pid).join(pre_kind)); #
[RID,KIND]
@@ -4289,24 +4333,28 @@
.[swizzle](map_pid) # [RID,oldPRE]
.join(pre_prop); # [RID,oldPROP]
nid_qn_del := rn.reverse().join(rp);
+ delnid := rn.reverse().project(cont).reverse();
} else {
- nid_qn_del := update_data.mirror() # [newRID,newRID]
+ var nr := update_data.mirror() # [newRID,newRID]
.join(rid_kind) # [newRID,KIND]
.uselect(ELEMENT) # [newRID,nil] (elements)
.mirror() # [newRID,newRID]
.join(rid_nid) # [newRID,NID]
- .reverse() # [NID,newRID]
- .mirror() # [NID,NID]
+ .reverse(); # [NID,newRID]
+ nid_qn_del := nr.mirror() # [NID,NID]
.join(nid_rid) # [NID,oldRID]
.select(oid_nil, oid_nil) # [NID,oldRID] (non-nil)
.[swizzle](map_pid) # [NID,oldPRE]
.join(pre_prop); # [NID,QN]
+ delnid := nr.project(cont).reverse();
}
# remove all NIDs in update_data from the nid_qn_ins_update; no
# need to figure out which QNs go with them: we remove them all
nid_qn_ins_update.delete(update_data.reverse());
# add actual deleted NID/QN combinations to nid_qn_del_update
nid_qn_del_update.insert(nid_qn_del);
+ deleted_nid.insert(delnid);
+ added_nid.deleteBuns(added_nid.sintersect(delnid));
}
var rid_nid_page;
@@ -4440,8 +4488,11 @@
attrs := attrs.mirror(); # [i,i]
var aconts := attrs.leftjoin(conts); # [i,CONT]
{
- var modified_attr := ws.fetch(MODIFIED_ATTR);
- modified_attr.insert(aconts.reverse().join(update_node_item));
+ var contattr := aconts.reverse().join(update_node_item);
+ ws.fetch(MODIFIED_ATTR).insert(contattr);
+ ws.fetch(DELETED_ATTR).insert(contattr);
+ var added_attr := ws.fetch(ADDED_ATTR);
+ added_attr.deleteBuns(added_attr.sintersect(contattr));
}
aconts.tunique()@batloop() {
var cont := $h;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins