Update of /cvsroot/monetdb/pathfinder/compiler/mil
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv7138/compiler/mil
Modified Files:
milgen.brg
Log Message:
Re-implement reduce function for updates.
We first check if there are attribute nodes and not any other,
then if there are mixed attributes and pnodes
and then if there are no attributes at all.
The same check is done for pnodes alone, or mixed with attributes or
no pnodes at all.
U milgen.brg
Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.135
retrieving revision 1.136
diff -u -d -r1.135 -r1.136
--- milgen.brg 11 Apr 2008 07:02:36 -0000 1.135
+++ milgen.brg 11 Apr 2008 12:04:31 -0000 1.136
@@ -2541,13 +2541,46 @@
);
/* consider node tgt */
- if (ty & aat_nkind)
+ if (ty & aat_pnode1 && !(ty & aat_attr1)) {
+ /* all nodes but not attributes */
execute (
assgn (var (pre_tgt->name),
VAR (L(p)->env, pa_item, aat_pre1)),
assgn (var (pre_cont_tgt->name),
VAR (L(p)->env, pa_item, aat_frag1)));
- else
+ }
+ else if (ty & aat_nkind1 && ty & aat_attr1) {
+ /* We have a mixed set of result nodes here
+ and need to use the attr column to find
+ all non-attribute nodes. */
+ mvar_t *v = new_var (1);
+ execute (
+ assgn (var (v->name),
+ select2 (
+ VAR (L(p)->env, pa_item, aat_pre1),
+ cast (type (mty_oid), nil ()),
+ cast (type (mty_oid), nil ()))),
+ assgn (var (v->name),
+ mirror (
+ select_ (
+ misnil (
+ leftjoin (
+ mirror (var (v->name)),
+ VAR (L(p)->env,
+ pa_item,
+ aat_attr1))),
+ lit_bit (true)))),
+ assgn (var (pre_tgt->name),
+ leftjoin (
+ var (v->name),
+ VAR (L(p)->env, pa_item, aat_pre1))),
+ assgn (var (pre_cont_tgt->name),
+ leftjoin (
+ var (v->name),
+ VAR (L(p)->env, pa_item, aat_frag1))));
+ unpin (v, 1);
+ }
+ else {
execute (
assgn (var (pre_tgt->name),
project (var (upd_kind->name),
@@ -2555,15 +2588,38 @@
assgn (var (pre_cont_tgt->name),
project (var (upd_kind->name),
cast (type (mty_oid), nil()))));
+ }
/* consider attribute tgt */
- if (ty & aat_attr)
+ if (ty & aat_anode1 && !(ty & aat_nkind1)) {
+ /* only attr and no nkinds */
execute (
assgn (var (attr_tgt->name),
VAR (L(p)->env, pa_item, aat_attr1)),
assgn (var (attr_cont_tgt->name),
VAR (L(p)->env, pa_item, aat_frag1)));
- else
+ }
+ else if (ty & aat_attr1) {
+ /* Because frag is shared for all nodes
+ we need the attr column to distinct
+ between attributes and non-attributes. */
+ mvar_t *v = new_var (1);
+ execute (
+ assgn (var (v->name),
+ select2 (
+ VAR (L(p)->env, pa_item, aat_attr1),
+ cast (type (mty_oid), nil ()),
+ cast (type (mty_oid), nil ()))),
+ assgn (var (attr_tgt->name),
+ var (v->name)),
+ assgn (var (attr_cont_tgt->name),
+ leftjoin (
+ mirror (var (v->name)),
+ VAR (L(p)->env, pa_item, aat_frag1))));
+ unpin (v, 1);
+ }
+ else {
+ /* no attributes */
execute (
assgn (var (attr_tgt->name),
project (var (upd_kind->name),
@@ -2571,6 +2627,8 @@
assgn (var (attr_cont_tgt->name),
project (var (upd_kind->name),
cast (type (mty_oid), nil()))));
+ }
+
/* consider strings (which are arriving as aat_uA...) */
if (ty & aat_uA)
@@ -2583,25 +2641,20 @@
project (var (upd_kind->name),
cast (type (mty_str), nil()))));
- /* consider qnames */
+ /* consider qnames */
if (ty & aat_qname)
execute (
assgn (var (replace_qn_uristrings->name),
- mposjoin (VAR (L(p)->env,
- pa_item,
- aat_qname_id),
- VAR (L(p)->env,
- pa_item,
- aat_qname_cont),
- var (PF_MIL_VAR_QN_URI))),
+ mposjoin (VAR (L(p)->env, pa_item, aat_qname_id),
+ VAR (L(p)->env, pa_item, aat_qname_cont),
+ var (PF_MIL_VAR_QN_URI_LOC)
+ fetch (var (PF_MIL_VAR_WS),
+ var (PF_MIL_VAR_QN_URI)))),
assgn (var (replace_qn_loc_strings->name),
- mposjoin (VAR (L(p)->env,
- pa_item,
- aat_qname_id),
- VAR (L(p)->env,
- pa_item,
- aat_qname_cont),
- var (PF_MIL_VAR_QN_LOC))));
+ mposjoin (VAR (L(p)->env, pa_item, aat_qname_id),
+ VAR (L(p)->env, pa_item, aat_qname_cont),
+ fetch (var (PF_MIL_VAR_WS),
+ var (PF_MIL_VAR_QN_LOC)))));
else
execute (
assgn (var (replace_qn_uristrings->name),
@@ -2612,13 +2665,46 @@
cast (type (mty_str), nil()))));
/* consider node ins */
- if (ty & aat_nkind)
+ if (ty & aat_pnode && !(ty & aat_attr)) {
+ /* all nodes but not attributes */
execute (
assgn (var (pre_ins->name),
VAR (L(p)->env, pa_item, aat_pre)),
assgn (var (pre_cont_ins->name),
VAR (L(p)->env, pa_item, aat_frag)));
- else
+ }
+ else if (ty & aat_nkind && ty & aat_attr) {
+ /* We have a mixed set of result nodes here
+ and need to use the attr column to find
+ all non-attribute nodes. */
+ mvar_t *v = new_var (1);
+ execute (
+ assgn (var (v->name),
+ select2 (
+ VAR (L(p)->env, pa_item, aat_pre),
+ cast (type (mty_oid), nil ()),
+ cast (type (mty_oid), nil ()))),
+ assgn (var (v->name),
+ mirror (
+ select_ (
+ misnil (
+ leftjoin (
+ mirror (var (v->name)),
+ VAR (L(p)->env,
+ pa_item,
+ aat_attr))),
+ lit_bit (true)))),
+ assgn (var (pre_ins->name),
+ leftjoin (
+ var (v->name),
+ VAR (L(p)->env, pa_item, aat_pre))),
+ assgn (var (pre_cont_ins->name),
+ leftjoin (
+ var (v->name),
+ VAR (L(p)->env, pa_item, aat_frag))));
+ unpin (v, 1);
+ }
+ else {
execute (
assgn (var (pre_ins->name),
project (var (upd_kind->name),
@@ -2626,15 +2712,38 @@
assgn (var (pre_cont_ins->name),
project (var (upd_kind->name),
cast (type (mty_oid), nil()))));
+ }
/* consider attribute ins */
- if (ty & aat_attr)
+ if (ty & aat_anode && !(ty & aat_nkind)) {
+ /* only attr and no nkinds */
execute (
assgn (var (attr_ins->name),
VAR (L(p)->env, pa_item, aat_attr)),
assgn (var (attr_cont_ins->name),
VAR (L(p)->env, pa_item, aat_frag)));
- else
+ }
+ else if (ty & aat_attr) {
+ /* Because frag is shared for all nodes
+ we need the attr column to distinct
+ between attributes and non-attributes. */
+ mvar_t *v = new_var (1);
+ execute (
+ assgn (var (v->name),
+ select2 (
+ VAR (L(p)->env, pa_item, aat_attr),
+ cast (type (mty_oid), nil ()),
+ cast (type (mty_oid), nil ()))),
+ assgn (var (attr_ins->name),
+ var (v->name)),
+ assgn (var (attr_cont_ins->name),
+ leftjoin (
+ mirror (var (v->name)),
+ VAR (L(p)->env, pa_item, aat_frag))));
+ unpin (v, 1);
+ }
+ else {
+ /* no attributes */
execute (
assgn (var (attr_ins->name),
project (var (upd_kind->name),
@@ -2642,6 +2751,7 @@
assgn (var (attr_cont_ins->name),
project (var (upd_kind->name),
cast (type (mty_oid), nil()))));
+ }
/* execute update_tape */
execute (
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins