Update of /cvsroot/monetdb/pathfinder/compiler/mil
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26181/compiler/mil

Modified Files:
      Tag: xquery-decomposition
        milgen.brg 
Log Message:
propagated changes of Friday 15 Feb 2008 - Monday Feb 18 2008
from the development trunk to the xquery-decomposition branch


Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.96.2.4
retrieving revision 1.96.2.5
diff -u -d -r1.96.2.4 -r1.96.2.5
--- milgen.brg  16 Feb 2008 01:02:15 -0000      1.96.2.4
+++ milgen.brg  18 Feb 2008 16:21:34 -0000      1.96.2.5
@@ -94,8 +94,6 @@
 #include "mil.h"
 /* XRPC function call context */
 #include "core.h"
-/* axis */
-#include "subtyping.h"
 
 /* abbreviate MIL constructor calls */
 #include "mil_mnemonic.h"
@@ -487,7 +485,7 @@
 
         default:
             PFoops (OOPS_FATAL, "illegal type in impl_types");
-            return 0;
+            return mty_oid;
     }
 }
 
@@ -1267,7 +1265,8 @@
         /* find all element nodes and extract their QName references */
         mvar_t  *kind      = new_var (1),
                 *elem      = new_var (1),
-                *elem_cont = new_var (1);
+                *elem_cont = new_var (1),
+                *map       = new_var (1);
         PFmil_t *pre       = VAR (p->env, att, aat_pre),
                 *pre_cont  = VAR (p->env, att, aat_frag);
 
@@ -1278,27 +1277,33 @@
                        pre_cont,
                        fetch (var (PF_MIL_VAR_WS),
                               var (PF_MIL_VAR_PRE_KIND)))),
-            assgn (var (kind->name),
-                   mirror (select_ (var (kind->name), 
-                                    var (PF_MIL_VAR_KIND_ELEM)))),
+            assgn (var (map->name),
+                   hmark (select_ (var (kind->name), 
+                                   var (PF_MIL_VAR_KIND_ELEM)),
+                          lit_oid (0))),
             assgn (var (elem->name),
-                   leftjoin (var (kind->name), pre)),
+                   leftfetchjoin (var (map->name), pre)),
             assgn (var (elem_cont->name),
-                   leftjoin (var (kind->name), pre_cont)),
+                   leftfetchjoin (var (map->name), pre_cont)),
             assgn (var (id->name),
-                   mposjoin (var (elem->name),
-                             var (elem_cont->name),
-                             fetch (var (PF_MIL_VAR_WS),
-                                    var (PF_MIL_VAR_PRE_PROP)))),
+                   leftfetchjoin (
+                       reverse (var (map->name)),
+                       mposjoin (var (elem->name),
+                                 var (elem_cont->name),
+                                 fetch (var (PF_MIL_VAR_WS),
+                                        var (PF_MIL_VAR_PRE_PROP))))),
             assgn (var (cont->name),
-                   mposjoin (var (elem->name),
-                             var (elem_cont->name),
-                             fetch (var (PF_MIL_VAR_WS),
-                                    var (PF_MIL_VAR_PRE_CONT)))));
+                   leftfetchjoin (
+                       reverse (var (map->name)),
+                       mposjoin (var (elem->name),
+                                 var (elem_cont->name),
+                                 fetch (var (PF_MIL_VAR_WS),
+                                        var (PF_MIL_VAR_PRE_CONT))))));
 
         unpin (kind, 1);
         unpin (elem, 1);
         unpin (elem_cont, 1);
+        unpin (map, 1);
     }
     else if (ty == aat_anode) {
         /* extract all QName references from the attributes */
@@ -1322,8 +1327,7 @@
         
         /* split up nodes and attributes,
            find all element nodes and extract their QName references */
-        mvar_t  *kind      = new_var (1),
-                *elem      = new_var (1),
+        mvar_t  *elem      = new_var (1),
                 *elem_cont = new_var (1),
                 *pre_sel   = new_var (1),
                 *attr_sel  = new_var (1),
@@ -1342,40 +1346,49 @@
         execute (
             /* get all attributes */
             assgn (var (attr_sel->name),
-                   mirror (
+                   hmark (
                        select2 (var (attr_col->name),
                                 cast (type (mty_oid), nil ()),
-                                cast (type (mty_oid), nil ())))),
+                                cast (type (mty_oid), nil ())),
+                       lit_oid (0))),
             /* get all attribute QNames */
             assgn (var (aid->name),
-                   mposjoin (leftjoin (var (attr_sel->name), attr),
-                             leftjoin (var (attr_sel->name), pre_cont),
+                   mposjoin (leftfetchjoin (var (attr_sel->name), attr),
+                             leftfetchjoin (var (attr_sel->name), pre_cont),
                              fetch (var (PF_MIL_VAR_WS),
                                     var (PF_MIL_VAR_ATTR_QN)))),
             assgn (var (acont->name),
-                   mposjoin (leftjoin (var (attr_sel->name), attr),
-                             leftjoin (var (attr_sel->name), pre_cont),
+                   mposjoin (leftfetchjoin (var (attr_sel->name), attr),
+                             leftfetchjoin (var (attr_sel->name), pre_cont),
                              fetch (var (PF_MIL_VAR_WS),
                                     var (PF_MIL_VAR_ATTR_CONT)))),
             /* get all other nodes */
             assgn (var (pre_sel->name),
-                   mirror (
+                   hmark (
                        select_ (
                            misnil (var (attr_col->name)),
-                           lit_bit (true)))),
+                           lit_bit (true)),
+                       lit_oid (0))),
             /* get all element nodes */
-            assgn (var (kind->name),
-                   mposjoin (leftjoin (var (pre_sel->name), pre),
-                             leftjoin (var (pre_sel->name), pre_cont),
-                             fetch (var (PF_MIL_VAR_WS),
-                                    var (PF_MIL_VAR_PRE_KIND)))),
-            assgn (var (kind->name),
-                   mirror (select_ (var (kind->name), 
-                                    var (PF_MIL_VAR_KIND_ELEM)))),
             assgn (var (elem->name),
-                   leftjoin (var (kind->name), pre)),
+                   leftfetchjoin (var (pre_sel->name), pre)),
             assgn (var (elem_cont->name),
-                   leftjoin (var (kind->name), pre_cont)),
+                   leftfetchjoin (var (pre_sel->name), pre_cont)),
+            assgn (var (pre_sel->name),
+                   leftfetchjoin (
+                       reverse (var (pre_sel->name)),
+                       mposjoin (var (elem->name),
+                                 var (elem_cont->name),
+                                 fetch (var (PF_MIL_VAR_WS),
+                                        var (PF_MIL_VAR_PRE_KIND))))),
+            assgn (var (pre_sel->name),
+                   hmark (select_ (var (pre_sel->name), 
+                                   var (PF_MIL_VAR_KIND_ELEM)),
+                          lit_oid (0))),
+            assgn (var (elem->name),
+                   leftfetchjoin (var (pre_sel->name), pre)),
+            assgn (var (elem_cont->name),
+                   leftfetchjoin (var (pre_sel->name), pre_cont)),
             /* get all element QNames */
             assgn (var (pid->name),
                    mposjoin (var (elem->name),
@@ -1390,16 +1403,12 @@
             /* combine the results */
             assgn (var (res->name),
                    merged_union (
-                       arg (hmark (var (aid->name), lit_oid (0)),
-                            arg (hmark (var (pid->name), lit_oid (0)),
-                                 arg (tmark (var (aid->name),
-                                             lit_oid (0)),
-                                      arg (tmark (var (pid->name),
-                                                  lit_oid (0)),
-                                           arg (tmark (var (acont->name),
-                                                       lit_oid (0)),
-                                                tmark (var (pcont->name),
-                                                       lit_oid (0))))))))),
+                       arg (var (attr_sel->name),
+                            arg (var (pre_sel->name),
+                                 arg (var (aid->name),
+                                      arg (var (pid->name),
+                                           arg (var (acont->name),
+                                                var (pcont->name)))))))),
             assgn (var (id->name),
                    leftfetchjoin (
                        reverse (fetch (var (res->name), lit_int (0))),
@@ -1409,7 +1418,6 @@
                        reverse (fetch (var (res->name), lit_int (0))),
                        fetch (var (res->name), lit_int (2)))));
 
-        unpin (kind, 1);
         unpin (elem, 1);
         unpin (elem_cont, 1);
         unpin (pre_sel, 1);
@@ -2000,10 +2008,12 @@
 llscj (const PFpa_op_t *p)
 { /* fold( */
     /* abbreviations for input expressions */
-    PFty_t           ty  = p->sem.scjoin.ty;
     PFord_ordering_t in  = p->sem.scjoin.in;
     PFord_ordering_t out = p->sem.scjoin.out;
 
+    char *uri = PFqname_uri (p->sem.scjoin.spec.qname),
+         *loc = PFqname_loc (p->sem.scjoin.spec.qname);
+
     /* MIL equivalents of input expression */
     PFmil_t *iter;
     PFmil_t *item;
@@ -2074,95 +2084,64 @@
 
     order = lit_int (o);
 
-    if (PFty_subtype (ty, PFty_xs_anyElement ())) {
-
+    if (p->sem.scjoin.spec.kind == node_kind_elem) {
         /* This is a test for element nodes */
 
-        /* Is it just a generic element kind test? (e.g. .../element()) */
-        if (PFty_subtype (PFty_xs_anyElement (), ty))
-
-            scj = llscj_elem (p->sem.scjoin.axis, iter, item, frag,
-                              var (PF_MIL_VAR_WS), order);
-
-        /* Is it a test on element kind and local name only? */
-        else if (PFty_subtype (
-                    PFty_elem (
-                        PFqname (PFns_wild,
-                                 PFqname_loc (PFty_name (PFty_defn (ty)))),
-                        PFty_xs_anyType ()),
-                    ty))
-            scj = llscj_elem_loc (p->sem.scjoin.axis, iter, item, frag,
-                                  var (PF_MIL_VAR_WS), order,
-                                  lit_str (PFqname_loc (
-                                               PFty_name (PFty_defn (ty)))));
-
-        /* Or maybe a test on element kind and namespace only? */
-        else if (PFty_subtype (
-                    PFty_elem (PFqname (PFqname_ns (PFty_name (PFty_defn 
(ty))),
-                                        NULL),
-                               PFty_xs_anyType ()),
-                    ty))
-            scj = llscj_elem_ns (p->sem.scjoin.axis, iter, item, frag,
-                                 var (PF_MIL_VAR_WS), order,
-                                 lit_str (PFqname_uri (
-                                              PFty_name (PFty_defn (ty)))));
-
-        /* A test on element kind and full QName? */
-        else if (PFty_subtype (
-                    PFty_elem (PFty_name (PFty_defn (ty)),
-                               PFty_xs_anyType ()),
-                    ty))
+        if (uri && loc)
+            /* A test on element kind and full QName? */
             scj = llscj_elem_nsloc (
-                    p->sem.scjoin.axis,
+                    p->sem.scjoin.spec.axis,
                     iter, item, frag, var (PF_MIL_VAR_WS), order,
-                    lit_str (PFqname_uri (PFty_name (PFty_defn (ty)))),
-                    lit_str (PFqname_loc (PFty_name (PFty_defn (ty)))));
-        /*
-         * If we couldn't figure out what element test we got, give up.
-         *
-         * NOTE: The surface language actually allows such tests. We
-         *       just cannot implement them (yet):
-         *
-         *        doc("foo")/child::element(shoeSize, xs:integer)
-         */
+                    lit_str (uri), lit_str (loc));
+        else if (uri)
+            /* Or maybe a test on element kind and namespace only? */
+            scj = llscj_elem_ns (p->sem.scjoin.spec.axis, iter, item, frag,
+                                 var (PF_MIL_VAR_WS), order,
+                                 lit_str (uri));
+        else if (loc)
+            /* Is it a test on element kind and local name only? */
+            scj = llscj_elem_loc (p->sem.scjoin.spec.axis, iter, item, frag,
+                                  var (PF_MIL_VAR_WS), order,
+                                  lit_str (loc));
         else
-            PFoops (OOPS_FATAL,
-                    "Problem with an XPath step: cannot evaluate "
-                    "node test `%s'", PFty_str (ty));
+            /* Is it just a generic element kind test? (e.g. .../element()) */
+            scj = llscj_elem (p->sem.scjoin.spec.axis, iter, item, frag,
+                              var (PF_MIL_VAR_WS), order);
     }
     /* If the node test wasn't some element test, maybe it is a text() test? */
-    else if (PFty_subtype (ty, PFty_text ())) {
-        scj = llscj_text (p->sem.scjoin.axis,
+    else if (p->sem.scjoin.spec.kind == node_kind_text) {
+        scj = llscj_text (p->sem.scjoin.spec.axis,
                           iter, item, frag, var (PF_MIL_VAR_WS), order);
     }
     /* or a comment() test? */
-    else if (PFty_subtype (ty, PFty_comm ())) {
-        scj = llscj_comm (p->sem.scjoin.axis,
+    else if (p->sem.scjoin.spec.kind == node_kind_comm) {
+        scj = llscj_comm (p->sem.scjoin.spec.axis,
                           iter, item, frag, var (PF_MIL_VAR_WS), order);
     }
     /* some test for processing-instructions? */
-    else if (PFty_subtype (ty, PFty_pi (NULL))) {
+    else if (p->sem.scjoin.spec.kind == node_kind_pi) {
         /* maybe we look for _any_ pi, regardless of its target? */
-        if (PFty_subtype (PFty_pi (NULL), ty))
-            scj = llscj_pi (p->sem.scjoin.axis,
+        if (!loc)
+            scj = llscj_pi (p->sem.scjoin.spec.axis,
                             iter, item, frag, var (PF_MIL_VAR_WS), order);
         /* or was there a target specified? */
         else
             scj = llscj_pi_targ (
-                    p->sem.scjoin.axis,
+                    p->sem.scjoin.spec.axis,
                     iter, item, frag, var (PF_MIL_VAR_WS), order,
-                    lit_str (PFqname_loc (PFty_name (PFty_defn (ty)))));
+                    lit_str (loc));
     }
     /* If all these cases did not apply, it is probably a node() test. */
-    else if (PFty_subtype (PFty_xs_anyNode (), ty)) {
-        scj = llscj_node (p->sem.scjoin.axis,
+    else if (p->sem.scjoin.spec.kind == node_kind_node) {
+        scj = llscj_node (p->sem.scjoin.spec.axis,
                           iter, item, frag, var (PF_MIL_VAR_WS), order);
     }
     /* If we still couldn't find out, we probably need to give up. */
     else
         PFoops (OOPS_FATAL,
                 "Problem with an XPath step: cannot evaluate "
-                "node test `%s'", PFty_str (ty));
+                "node test `%s'",
+                PFalg_node_kind_str (p->sem.scjoin.spec.kind));
 
     assert (scj);
 
@@ -4883,8 +4862,8 @@
                     /* get all prefixes */
                     execute (
                         assgn (var (prefix->name),
-                               mposjoin (var (id->name),
-                                         var (cont->name),
+                               mposjoin (tmark (var (id->name), lit_oid (0)),
+                                         tmark (var (cont->name), lit_oid (0)),
                                          fetch (var (PF_MIL_VAR_WS),
                                                 var (PF_MIL_VAR_QN_PREFIX)))),
                         /* add ":" only to prefix that are not "" */
@@ -4915,8 +4894,10 @@
                                    fetch (var (mu->name), lit_int (1)))),
                         assgn (var (name->name),
                                madd (var (prefix->name),
-                                     mposjoin (var (id->name),
-                                               var (cont->name),
+                                     mposjoin (tmark (var (id->name),
+                                                      lit_oid (0)),
+                                               tmark (var (cont->name),
+                                                      lit_oid (0)),
                                                fetch (
                                                    var (PF_MIL_VAR_WS),
                                                    var (PF_MIL_VAR_QN_LOC))))),
@@ -4927,11 +4908,10 @@
                                         lit_str (""))),
                         assgn (var (mu->name),
                                merged_union (
-                                   arg (hmark (var (name->name), lit_oid (0)),
+                                   arg (hmark (var (id->name), lit_oid (0)),
                                         arg (hmark (var (empty_str->name),
                                                     lit_oid (0)),
-                                             arg (tmark (var (name->name),
-                                                         lit_oid (0)),
+                                             arg (var (name->name),
                                                   tmark (var (empty_str->name),
                                                          lit_oid (0))))))),
                         assgn (var (res->name),
@@ -4976,8 +4956,8 @@
                     /* get all prefixes */
                     execute (
                         assgn (var (name->name),
-                               mposjoin (var (id->name),
-                                         var (cont->name),
+                               mposjoin (tmark (var (id->name), lit_oid (0)),
+                                         tmark (var (cont->name), lit_oid (0)),
                                          fetch (var (PF_MIL_VAR_WS),
                                                 var (uri_loc)))),
                         /* empty names for nodes that have no QName */
@@ -4987,11 +4967,10 @@
                                         lit_str (""))),
                         assgn (var (mu->name),
                                merged_union (
-                                   arg (hmark (var (name->name), lit_oid (0)),
+                                   arg (hmark (var (id->name), lit_oid (0)),
                                         arg (hmark (var (empty_str->name),
                                                     lit_oid (0)),
-                                             arg (tmark (var (name->name),
-                                                         lit_oid (0)),
+                                             arg (var (name->name),
                                                   tmark (var (empty_str->name),
                                                          lit_oid (0))))))),
                         assgn (var (res->name),
@@ -6056,13 +6035,14 @@
         /* Rel:      llscjoin (Rel) */
         /* FIXME: This code needs to be cleaned up. */
         case 80: /* fold( */
-            if (p->sem.scjoin.axis != alg_attr)
+            if (p->sem.scjoin.spec.axis == alg_self)
+                PFoops (OOPS_FATAL, "self step not implemented yet.");
+            if (p->sem.scjoin.spec.axis != alg_attr)
                 llscj (p);
             else
         {
-            
-            /* abbreviations for input expressions */
-            PFty_t           ty  = p->sem.scjoin.ty;
+            char *uri = PFqname_uri (p->sem.scjoin.spec.qname),
+                 *loc = PFqname_loc (p->sem.scjoin.spec.qname);
 
             /* MIL equivalents of input expression */
             PFmil_t *iter;
@@ -6136,188 +6116,134 @@
 
             unpin (tmp2, 1);
 
-            /* ... then filter out all nodes, whose name test does not match */
-            if (PFty_subtype (ty, PFty_xs_anyAttribute ())) {
-
-                /* Is it just a generic attribute kind test?
-                   (e.g. .../attribute()) */
-                if (PFty_subtype (PFty_xs_anyAttribute (), ty))
-                    ;
+            assert (p->sem.scjoin.spec.kind == node_kind_attr);
 
-                /* Is it a test on attribute kind and local name only? */
-                else if (PFty_subtype (
-                            PFty_attr (
-                                PFqname (PFns_wild,
-                                         PFqname_loc (
-                                             PFty_name (PFty_defn (ty)))),
-                                PFty_xs_anySimpleType ()),
-                            ty))
-                    execute (
-                        assgn (var (tmp->name),
+            /* Is it a test on attribute kind and local name only? */
+            if (loc && !uri)
+                execute (
+                    assgn (var (tmp->name),
+                           mposjoin (
                                mposjoin (
-                                   mposjoin (
-                                       var (ret_attr->name),
-                                       var (ret_frag->name),
-                                       fetch (var (PF_MIL_VAR_WS),
-                                              var (PF_MIL_VAR_ATTR_QN))),
-                                   mposjoin (
-                                       var (ret_attr->name),
-                                       var (ret_frag->name),
-                                       fetch (var (PF_MIL_VAR_WS),
-                                              var (PF_MIL_VAR_ATTR_CONT))),
-                               fetch (var (PF_MIL_VAR_WS),
-                                      var (PF_MIL_VAR_QN_LOC)))),
-                        assgn (var (tmp->name),
-                               uselect (var (tmp->name),
-                                        lit_str (
-                                            PFqname_loc (
-                                                PFty_name (
-                                                    PFty_defn (ty)))))),
-                        assgn (var (tmp->name),
-                               reverse (mark (var (tmp->name), lit_oid (0)))),
-                        assgn (var (ret_attr->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_attr->name))),
-                        assgn (var (ret_pre->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_pre->name))),
-                        assgn (var (ret_frag->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_frag->name))),
-                        assgn (var (ret_iter->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_iter->name))));
-
-                /* Or maybe a test on attribute kind and namespace only? */
-                else if (PFty_subtype (
-                            PFty_attr (
-                                PFqname (
-                                    PFqname_ns (PFty_name (PFty_defn (ty))),
-                                    NULL),
-                                PFty_xs_anySimpleType ()),
-                            ty))
-                    execute (
-                        assgn (var (tmp->name),
+                                   var (ret_attr->name),
+                                   var (ret_frag->name),
+                                   fetch (var (PF_MIL_VAR_WS),
+                                          var (PF_MIL_VAR_ATTR_QN))),
                                mposjoin (
-                                   mposjoin (var (ret_attr->name),
-                                             var (ret_frag->name),
-                                             fetch (var (PF_MIL_VAR_WS),
-                                                    var (PF_MIL_VAR_ATTR_QN))),
-                                   mposjoin (
-                                       var (ret_attr->name),
-                                       var (ret_frag->name),
-                                       fetch (var (PF_MIL_VAR_WS),
-                                              var (PF_MIL_VAR_ATTR_CONT))),
+                                   var (ret_attr->name),
+                                   var (ret_frag->name),
                                    fetch (var (PF_MIL_VAR_WS),
-                                          var (PF_MIL_VAR_QN_URI)))),
-                        assgn (var (tmp->name),
-                               uselect (var (tmp->name),
-                                        lit_str (
-                                            PFqname_uri (
-                                                PFty_name (
-                                                    PFty_defn (ty)))))),
-                        assgn (var (tmp->name),
-                               reverse (mark (var (tmp->name), lit_oid (0)))),
-                        assgn (var (ret_attr->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_attr->name))),
-                        assgn (var (ret_frag->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_frag->name))),
-                        assgn (var (ret_iter->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_iter->name))));
-
-                /* A test on attribute kind and full QName? */
-                else if (PFty_subtype (
-                            PFty_attr (PFty_name (PFty_defn (ty)),
-                                       PFty_xs_anySimpleType ()),
-                            ty))
-                    execute (
-                        assgn (var (tmp->name),
+                                          var (PF_MIL_VAR_ATTR_CONT))),
+                           fetch (var (PF_MIL_VAR_WS),
+                                  var (PF_MIL_VAR_QN_LOC)))),
+                    assgn (var (tmp->name),
+                           uselect (var (tmp->name),
+                                    lit_str (loc))),
+                    assgn (var (tmp->name),
+                           reverse (mark (var (tmp->name), lit_oid (0)))),
+                    assgn (var (ret_attr->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_attr->name))),
+                    assgn (var (ret_pre->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_pre->name))),
+                    assgn (var (ret_frag->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_frag->name))),
+                    assgn (var (ret_iter->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_iter->name))));
+            /* Or maybe a test on attribute kind and namespace only? */
+            else if (!loc && uri)
+                execute (
+                    assgn (var (tmp->name),
+                           mposjoin (
+                               mposjoin (var (ret_attr->name),
+                                         var (ret_frag->name),
+                                         fetch (var (PF_MIL_VAR_WS),
+                                                var (PF_MIL_VAR_ATTR_QN))),
                                mposjoin (
-                                  mposjoin (var (ret_attr->name),
-                                            var (ret_frag->name),
-                                            fetch (var (PF_MIL_VAR_WS),
-                                                   var (PF_MIL_VAR_ATTR_QN))),
-                                  mposjoin (var (ret_attr->name),
-                                            var (ret_frag->name),
-                                            fetch (var (PF_MIL_VAR_WS),
-                                                   var 
(PF_MIL_VAR_ATTR_CONT))),
-                                  fetch (var (PF_MIL_VAR_WS),
-                                         var (PF_MIL_VAR_QN_LOC)))),
-                        assgn (var (tmp->name),
-                               uselect (var (tmp->name),
-                                        lit_str (
-                                            PFqname_loc (
-                                                PFty_name (
-                                                    PFty_defn (ty)))))),
-                        assgn (var (tmp->name),
-                               reverse (mark (var (tmp->name), lit_oid (0)))),
-                        assgn (var (ret_attr->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_attr->name))),
-                        assgn (var (ret_pre->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_pre->name))),
-                        assgn (var (ret_frag->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_frag->name))),
-                        assgn (var (ret_iter->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_iter->name))),
-                        assgn (var (tmp->name),
+                                   var (ret_attr->name),
+                                   var (ret_frag->name),
+                                   fetch (var (PF_MIL_VAR_WS),
+                                          var (PF_MIL_VAR_ATTR_CONT))),
+                               fetch (var (PF_MIL_VAR_WS),
+                                      var (PF_MIL_VAR_QN_URI)))),
+                    assgn (var (tmp->name),
+                           uselect (var (tmp->name),
+                                    lit_str (uri))),
+                    assgn (var (tmp->name),
+                           reverse (mark (var (tmp->name), lit_oid (0)))),
+                    assgn (var (ret_attr->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_attr->name))),
+                    assgn (var (ret_frag->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_frag->name))),
+                    assgn (var (ret_iter->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_iter->name))));
+            /* A test on attribute kind and full QName? */
+            else if (loc && uri)
+                execute (
+                    assgn (var (tmp->name),
+                           mposjoin (
+                              mposjoin (var (ret_attr->name),
+                                        var (ret_frag->name),
+                                        fetch (var (PF_MIL_VAR_WS),
+                                               var (PF_MIL_VAR_ATTR_QN))),
+                              mposjoin (var (ret_attr->name),
+                                        var (ret_frag->name),
+                                        fetch (var (PF_MIL_VAR_WS),
+                                               var (PF_MIL_VAR_ATTR_CONT))),
+                              fetch (var (PF_MIL_VAR_WS),
+                                     var (PF_MIL_VAR_QN_LOC)))),
+                    assgn (var (tmp->name),
+                           uselect (var (tmp->name),
+                                    lit_str (loc))),
+                    assgn (var (tmp->name),
+                           reverse (mark (var (tmp->name), lit_oid (0)))),
+                    assgn (var (ret_attr->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_attr->name))),
+                    assgn (var (ret_pre->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_pre->name))),
+                    assgn (var (ret_frag->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_frag->name))),
+                    assgn (var (ret_iter->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_iter->name))),
+                    assgn (var (tmp->name),
+                           mposjoin (
+                               mposjoin (var (ret_attr->name),
+                                         var (ret_frag->name),
+                                         fetch (var (PF_MIL_VAR_WS),
+                                                var (PF_MIL_VAR_ATTR_QN))),
                                mposjoin (
-                                   mposjoin (var (ret_attr->name),
-                                             var (ret_frag->name),
-                                             fetch (var (PF_MIL_VAR_WS),
-                                                    var (PF_MIL_VAR_ATTR_QN))),
-                                   mposjoin (
-                                       var (ret_attr->name),
-                                       var (ret_frag->name),
-                                       fetch (var (PF_MIL_VAR_WS),
-                                              var (PF_MIL_VAR_ATTR_CONT))),
+                                   var (ret_attr->name),
+                                   var (ret_frag->name),
                                    fetch (var (PF_MIL_VAR_WS),
-                                          var (PF_MIL_VAR_QN_URI)))),
-                        assgn (var (tmp->name),
-                               uselect (var (tmp->name),
-                                        lit_str (
-                                            PFqname_uri (
-                                                PFty_name (
-                                                    PFty_defn (ty)))))),
-                        assgn (var (tmp->name),
-                               reverse (mark (var (tmp->name), lit_oid (0)))),
-                        assgn (var (ret_attr->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_attr->name))),
-                        assgn (var (ret_pre->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_pre->name))),
-                        assgn (var (ret_frag->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_frag->name))),
-                        assgn (var (ret_iter->name),
-                               leftjoin (var (tmp->name),
-                                         var (ret_iter->name))));
-
-                /*
-                 * If we couldn't figure out what attribute test we got,
-                 * give up.
-                 *
-                 * NOTE: The surface language actually allows such tests. We
-                 *       just cannot implement them (yet):
-                 *
-                 *        doc("foo")/attribute::attribute(shoeSize, xs:integer)
-                 */
-                else
-                    PFoops (OOPS_FATAL,
-                            "Problem with an XPath step: cannot evaluate "
-                            "node test `%s'", PFty_str (ty));
-            }
-            else
-                PFoops (OOPS_FATAL,
-                        "Problem with an XPath step: cannot evaluate "
-                        "node test `%s'", PFty_str (ty));
+                                          var (PF_MIL_VAR_ATTR_CONT))),
+                               fetch (var (PF_MIL_VAR_WS),
+                                      var (PF_MIL_VAR_QN_URI)))),
+                    assgn (var (tmp->name),
+                           uselect (var (tmp->name),
+                                    lit_str (uri))),
+                    assgn (var (tmp->name),
+                           reverse (mark (var (tmp->name), lit_oid (0)))),
+                    assgn (var (ret_attr->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_attr->name))),
+                    assgn (var (ret_pre->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_pre->name))),
+                    assgn (var (ret_frag->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_frag->name))),
+                    assgn (var (ret_iter->name),
+                           leftjoin (var (tmp->name),
+                                     var (ret_iter->name))));
 
             /* because leftjoin does not know that we have
                exactly one match for each tuple in v,


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to