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

Modified Files:
      Tag: PF_ROX
        mil.c milgen.brg milprint.c 
Log Message:
propagated changes of Wednesday Jan 30 2008 - Saturday Feb 09 2008
from the development trunk to the PF_ROX branch


Index: milprint.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milprint.c,v
retrieving revision 1.62
retrieving revision 1.62.2.1
diff -u -d -r1.62 -r1.62.2.1
--- milprint.c  20 Jan 2008 22:35:05 -0000      1.62
+++ milprint.c  9 Feb 2008 08:40:34 -0000       1.62.2.1
@@ -97,6 +97,7 @@
                  | '/(' expression ',' expression ')'       <m_div>
                  | '[/](' expression ',' expression ')'     <m_mdiv>
                  | '[%](' expression ',' expression ')'     <m_mmod>
+                 | '[max](' expression ',' expression ')'   <m_mmax>
                  | '[abs](' expression ')'                  <m_mabs>
                  | '[ceil](' expression ')'                 <m_mceiling>
                  | '[floor](' expression ')'                <m_mfloor>
@@ -109,6 +110,7 @@
                  | '[<](' expression ',' expression ')'     <m_mlt>
                  | '[<=](' expression ',' expression ')'    <m_mle>
                  | '[!=](' expression ',' expression ')'    <m_mne>
+                 | 'enumerate(' expr ',' expr ')'           <m_enum>
                  | 'not(' expression ')'                    <m_not>
                  | '[not](' expression ')'                  <m_mnot>
                  | '[-](' expression ')'                    <m_mneg>
@@ -275,6 +277,7 @@
     , [m_div]          = "/"
     , [m_mdiv]         = "[/]"
     , [m_mmod]         = "[%]"
+    , [m_mmax]         = "[max]"
     , [m_mabs]         = "[abs]"
     , [m_mceiling]     = "[ceil]"
     , [m_mfloor]       = "[floor]"
@@ -470,6 +473,7 @@
 
     , [m_sc_desc]  = "sc_desc"
 
+    , [m_enum]     = "enumerate"
     , [m_count]    = "count"
     , [m_gcount]   = "{count}"
     , [m_egcount]  = "{count}"
@@ -913,6 +917,8 @@
         case m_mdiv:
         /* expression : '[%](' expression ',' expression ')' */
         case m_mmod:
+        /* expression : '[max](' expression ',' expression ')' */
+        case m_mmax:
         /* expression : '>(' expression ',' expression ')' */
         case m_gt:
         /* expression : '=(' expression ',' expression ')' */
@@ -933,6 +939,8 @@
         case m_mand:
         /* expression : '[or](' expression ',' expression ')' */
         case m_mor:
+        /* expression : 'enumerate(' expression ',' expression ')' */
+        case m_enum:
             milprintf ("%s(", ID[n->kind]);
             print_expression (n->child[0]);
             milprintf (", ");

Index: mil.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/mil.c,v
retrieving revision 1.49
retrieving revision 1.49.2.1
diff -u -d -r1.49 -r1.49.2.1
--- mil.c       20 Jan 2008 22:35:04 -0000      1.49
+++ mil.c       9 Feb 2008 08:40:33 -0000       1.49.2.1
@@ -298,6 +298,7 @@
         case PF_MIL_VAR_KIND_TEXT:   return "TEXT";
         case PF_MIL_VAR_KIND_COM:    return "COMMENT";
         case PF_MIL_VAR_KIND_PI:     return "PI";
+        case PF_MIL_VAR_KIND_REF:    return "REFERENCE";
 
         case PF_MIL_VAR_ATTR:        return "ATTR";
         case PF_MIL_VAR_ELEM:        return "ELEM";
@@ -895,6 +896,16 @@
 }
 
 /**
+ * enumerate operator, return sequence of integers
+ * starting from @a a with the length @a l.
+ */
+PFmil_t *
+PFmil_enumerate (const PFmil_t *a, const PFmil_t *l)
+{
+    return wire2 (m_enum, a, l);
+}
+
+/**
  * Monet count operator, return number of items in @a a.
  */
 PFmil_t *
@@ -1091,6 +1102,15 @@
 }
 
 /**
+ * Multiplexed arithmetic maximum operator
+ */
+PFmil_t *
+PFmil_mmax (const PFmil_t *a, const PFmil_t *b)
+{
+    return wire2 (m_mmax, a, b);
+}
+
+/**
  * Multiplexed operator abs
  */
 PFmil_t *

Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.103
retrieving revision 1.103.2.1
diff -u -d -r1.103 -r1.103.2.1
--- milgen.brg  25 Jan 2008 10:36:32 -0000      1.103
+++ milgen.brg  9 Feb 2008 08:40:34 -0000       1.103.2.1
@@ -112,6 +112,7 @@
 %term bool_or        =  47
 %term bool_and_atom  =  48
 %term bool_or_atom   =  49
+%term to             =  50
 %term hash_count     =  55
 %term avg            =  56
 %term max_           =  57
@@ -203,11 +204,12 @@
 Rel:      eq_atom (Rel)                                            =  51 (10);
 Rel:      gt (Rel)                                                 =  52 (10);
 Rel:      gt_atom (Rel)                                            =  53 (10);
-Rel:      bool_not (Rel)                                           =  61 (10);
-Rel:      bool_and (Rel)                                           =  62 (10);
-Rel:      bool_or (Rel)                                            =  63 (10);
-Rel:      bool_and_atom (Rel)                                      =  64 (10);
-Rel:      bool_or_atom (Rel)                                       =  65 (10);
+Rel:      bool_not (Rel)                                           =  60 (10);
+Rel:      bool_and (Rel)                                           =  61 (10);
+Rel:      bool_or (Rel)                                            =  62 (10);
+Rel:      bool_and_atom (Rel)                                      =  63 (10);
+Rel:      bool_or_atom (Rel)                                       =  64 (10);
+Rel:      to (Rel)                                                 =  65 (10);
 Rel:      hash_count (Rel)                                         =  66 (10);
 Rel:      avg (Rel)                                                =  67 (10);
 Rel:      max_ (Rel)                                               =  68 (10);
@@ -1841,7 +1843,7 @@
 
                 /* consider bit results */
                 if (ty & aat_bln) {
-                    if (ty == aat_int) {
+                    if (ty == aat_bln) {
                         execute (
                             assgn (
                                 var (item->name),
@@ -4352,20 +4354,19 @@
 
                 case alg_fun_fn_qname:
                 {
-                    PFalg_att_t att1, att2;
-                    att1 = p->sem.fun_1to1.refs.atts[0];
-                    att2 = p->sem.fun_1to1.refs.atts[0];
+                    PFalg_att_t uri, pfx_loc;
+                    uri = p->sem.fun_1to1.refs.atts[0];
+                    pfx_loc = p->sem.fun_1to1.refs.atts[1];
 
                     PFmil_t *str = NULL;
                     mvar_t  *offset  = new_var (1);
                     mvar_t  *prefix  = new_var (1);
                     mvar_t  *local   = new_var (1);
                     mvar_t  *err_str = new_var (1);
-                    PFmil_t *v_cast  = VAR (L(p)->env, att1, aat_str),
-                            *v_uri   = VAR (L(p)->env, att2, aat_str);
+                    PFmil_t *v_cast  = VAR (L(p)->env, pfx_loc, aat_str),
+                            *v_uri   = VAR (L(p)->env, uri, aat_str);
 
                     /* split up strings using ``:'' as delimiter */
-                    /* FIXME: currently we we don't retrieve the URI */
                     execute (
                         assgn (var (err_str->name),
                                check_qnames (v_cast)),
@@ -4384,8 +4385,9 @@
                                mstring (v_cast,
                                         madd (lit_int (1),
                                               var (offset->name)))));
-                    /* FIXME: do not allow "|" uris if we have
-                       no namespace prefix */
+
+                    /* FIXME: do not allow missing uris (encoded by the string 
"|")
+                       if we have no namespace prefix */
 
                     /* add_qnames changes the working set
                        in 'var (PF_MIL_VAR_WS)' as side effect */
@@ -4676,74 +4678,135 @@
             break;
 
         /* Rel:      bool_not (Rel) */
-        case 61:
+        case 60:
             unary_op (PFmil_mnot, p);
             break;
 
         /* Rel:      bool_and (Rel) */
-        case 62:
+        case 61:
             bin_bool (PFmil_mand, p);
             break;
 
         /* Rel:      bool_or (Rel) */
-        case 63:
+        case 62:
             bin_bool (PFmil_mor, p);
             break;
 
         /* Rel:      bool_and_atom (Rel) */
-        case 64:
+        case 63:
             bin_bool_atom (PFmil_mand, p);
             break;
 
         /* Rel:      bool_or_atom (Rel) */
-        case 65:
+        case 64:
             bin_bool_atom (PFmil_mor, p);
             break;
 
+        /* Rel:      to (Rel) */
+        case 65:
+        {
+            mvar_t *v              = new_var (1);
+            mvar_t *res            = new_var (p->refctr);
+            
+            execute (
+                /* v := in2.[-](in1).[+](1LL).[max](0LL);
+                   v := enumerate(in1, v);
+                   res := v.reverse().mark([EMAIL PROTECTED]).reverse();
+                   v := v.mark([EMAIL PROTECTED]).reverse();
+                   
+                   out_n := v.leftjoin(in_n);
+                   out_n := out_n.tmark([EMAIL PROTECTED]); */
+                assgn (
+                    var (v->name),
+                    mmax (lit_lng (0),
+                          madd (lit_lng (1),
+                                msub (VAR (L(p)->env,
+                                           p->sem.binary.att2,
+                                           aat_int),
+                                      VAR (L(p)->env,
+                                           p->sem.binary.att1,
+                                           aat_int))))),
+                assgn (
+                    var (v->name),
+                    enumerate (VAR (L(p)->env, p->sem.binary.att1, aat_int),
+                               var (v->name))),
+                assgn (
+                    var (res->name),
+                    tmark (var (v->name), lit_oid (0))),
+                assgn (
+                    var (v->name),
+                    reverse (mark (var (v->name), lit_oid (0)))));
+            
+            for (unsigned int i = 0; i < env_count (L(p)->env); i++) {
+                 mvar_t *w = new_var (p->refctr);
+
+                 execute (
+                      assgn (var (w->name),
+                             leftjoin (
+                                 var (v->name),
+                                 var (env_at (L(p)->env, i).mvar->name))),
+                      /* because leftjoin does not know that we have
+                         exactly one match for each tuple in v,
+                         we need to make the heads void ourselves */
+                      assgn (var (w->name),
+                             tmark (var (w->name), lit_oid (0)))
+                      );
+
+                 env_add (p->env,
+                          env_at (L(p)->env, i).att,
+                          env_at (L(p)->env, i).ty,
+                          w);
+            }
+            env_add (p->env, p->sem.binary.res, aat_int, res);
+
+            unpin (v, 1);
+        }   break;
+
+
         /* Rel:      hash_count (Rel) */
         case 66:
             if (p->sem.count.part != att_NULL) {
-                for (unsigned int i = 0; i < L(p)->schema.count; i++)
-                    for (PFalg_simple_type_t t = 1; t; t <<= 1)
-                        if (t & L(p)->schema.items[i].type) {
-
-                            if (t != L(p)->schema.items[i].type)
-                                PFoops (OOPS_FATAL,
-                                        "HashCount not implemented for "
-                                        "polymorphic groups");
-
-                            mvar_t *v    = new_var (1);
-                            mvar_t *res  = new_var (p->refctr);
-                            mvar_t *part = new_var (p->refctr);
+                mvar_t *v              = new_var (1);
+                mvar_t *res            = new_var (p->refctr);
+                mvar_t *part           = new_var (p->refctr);
+                PFalg_simple_type_t ty = type_of (L(p), p->sem.count.part);
+                
+                for (PFalg_simple_type_t t = 1; t; t <<= 1)
+                    if (t & ty) {
+                        if  (t != ty)
+                            PFoops (OOPS_FATAL,
+                                    "HashCount not implemented for "
+                                    "polymorphic groups");
+                        break;
+                    }
 
-                            execute (
-                                /* v := {count}(p_in.reverse ()) */
-                                assgn (
-                                    var (v->name),
-                                    gcount (
-                                        reverse (VAR (L(p)->env,
-                                                      p->sem.count.part, t)))),
-                                /* align with integer representation (lng) */
-                                assgn (var (v->name),
-                                       mcast (type (mty_lng), var (v->name))),
-                                /* res := v.reverse ().mark ([EMAIL 
PROTECTED]).reverse (); */
-                                assgn (
-                                    var (res->name),
-                                    reverse (
-                                        mark (
-                                            reverse (var (v->name)),
-                                            lit_oid (0)))),
-                                /* part := v.mark ([EMAIL PROTECTED]).reverse 
(); */
-                                assgn (
-                                    var (part->name),
-                                    reverse (
-                                        mark (var (v->name), lit_oid (0)))));
+                execute (
+                    /* v := {count}(p_in.reverse ()) */
+                    assgn (
+                        var (v->name),
+                        gcount (
+                            reverse (VAR (L(p)->env,
+                                          p->sem.count.part, ty)))),
+                    /* align with integer representation (lng) */
+                    assgn (var (v->name),
+                           mcast (type (mty_lng), var (v->name))),
+                    /* res := v.reverse ().mark ([EMAIL PROTECTED]).reverse 
(); */
+                    assgn (
+                        var (res->name),
+                        reverse (
+                            mark (
+                                reverse (var (v->name)),
+                                lit_oid (0)))),
+                    /* part := v.mark ([EMAIL PROTECTED]).reverse (); */
+                    assgn (
+                        var (part->name),
+                        reverse (
+                            mark (var (v->name), lit_oid (0)))));
 
-                            env_add (p->env, p->sem.count.res, aat_int, res);
-                            env_add (p->env, p->sem.count.part, t, part);
+                env_add (p->env, p->sem.count.res, aat_int, res);
+                env_add (p->env, p->sem.count.part, ty, part);
 
-                            unpin (v, 1);
-                        }
+                unpin (v, 1);
             }
             else {
 
@@ -5602,31 +5665,23 @@
         /* FragRel:  doc_tbl (Rel) */
         case 100:
         {
-            mvar_t *time;
-
-            /* copy the iter BAT */
-            mvar_t *iter = env_mvar (L(p)->env, p->sem.ii.iter, aat_nat);
+            /* temporary variables */
+            mvar_t *time = new_var (1),
+                   *v    = new_var (1),
+                    /* result BATs */
+                   *frag = new_var (p->refctr),
+                   *pre  = new_var (p->refctr);
 
-            env_add (p->env, p->sem.ii.iter, aat_nat, iter);
-            pin (iter, p->refctr);
+            env_add (p->env, p->sem.unary.res, aat_pre, pre);
+            env_add (p->env, p->sem.unary.res, aat_pfrag, frag);
 
             /* add timing information */
-            time = new_var (1);
             execute (assgn (var (time->name), usec ()));
 
-            /* temporary variable */
-            mvar_t *v = new_var (1);
-            /* result BATs */
-            mvar_t *frag = new_var (p->refctr);
-            mvar_t *pre  = new_var (p->refctr);
-
-            env_add (p->env, p->sem.ii.item, aat_pre, pre);
-            env_add (p->env, p->sem.ii.item, aat_pfrag, frag);
-
             execute (
                  assgn (var (v->name),
                         doc_tbl (var (PF_MIL_VAR_WS),
-                                 VAR (L(p)->env, p->sem.ii.item, aat_str))),
+                                 VAR (L(p)->env, p->sem.unary.att, aat_str))),
                  assgn (var (pre->name), fetch (var (v->name), lit_int (1))),
                  assgn (var (frag->name), fetch (var (v->name), lit_int (2))),
                  assgn (var (PF_MIL_VAR_WS), fetch (var (v->name), lit_int 
(0)))
@@ -5642,6 +5697,15 @@
                                  var (time->name)))));
             unpin (time, 1);
 
+            /* copy p's child environment */
+            for (unsigned int i = 0; i < PFarray_last (L(p)->env); i++) {
+
+                env_t entry = env_at (L(p)->env, i);
+
+                env_add (p->env, entry.att, entry.ty, entry.mvar);
+
+                pin (entry.mvar, p->refctr);
+            }
         } break;
 
         /* Rel:      doc_access (FragList, Rel) */
@@ -7227,7 +7291,7 @@
                 *(mvar_t **) PFarray_add (twig_state->attr_vars) = v;
             }
 
-            if (treat_pre) {
+            if (treat_pre && true) {
                 mvar_t  *unq_iter, *scj_res, *root_level, *content_level;
                 mvar_t  *iter = new_var (1);
                 mvar_t  *item = new_var (1);
@@ -7437,6 +7501,102 @@
                     env_add (p->env, att_NULL, aat_int, gsize);
                 }
             }
+            else if (treat_pre && false) {
+                mvar_t  *v    = new_var (1);
+
+                /* add the node references into list of twig constructors
+                   (size = 0, kind = REFERENCE, prop = p_prop, cont = p_cont):
+                   v := new(void, bat).seqbase([EMAIL PROTECTED]);
+                   v.append(p_iter);
+                   v.append(p_iter.project(%twig_state->pre%));
+                   v.append(p_iter.project(0));
+                   v.append(p_iter.project(%twig_state->level%));
+                   v.append(p_iter.project(REFERENCE));
+                   # store the references to look up the reference 
+                   # in the PRE_PROP column
+                   v.append(p_item);
+                   # store the node container to look up the reference
+                   # in the PRE_CONT column
+                   v.append(p_cont);
+                   v.append(p_iter.project(oid(nil)));
+                   v.append(p_iter.project(oid(nil)));
+                   */
+                execute (
+                    assgn (var (v->name),
+                           seqbase (new (type (mty_void), type (mty_bat)),
+                                    lit_oid (0))),
+                    /* iter */
+                    bappend (var (v->name),
+                             var (p_iter->name)),
+                    /* pre */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 lit_oid (twig_state->pre))),
+                    /* size */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 lit_int (0))),
+                    /* level */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 cast (
+                                     type (mty_chr),
+                                     lit_int (twig_state->level)))),
+                    /* kind */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 var (PF_MIL_VAR_KIND_REF))),
+                    /* prop */
+                    bappend (var (v->name),
+                             var (p_item->name)),
+                    /* cont */
+                    bappend (var (v->name),
+                             var (p_cont->name)),
+                    /* old_pre */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 cast (type (mty_oid), nil ()))),
+                    /* old_cont */
+                    bappend (var (v->name),
+                             project (
+                                 var (p_iter->name),
+                                 cast (type (mty_oid), nil ()))));
+
+                *(mvar_t **) PFarray_add (twig_state->elem_vars) = v;
+                twig_state->pre++;
+                /* do not tell the twig constructor to handle
+                   subtree attribute copies */
+                /* twig_state->elem_content = false; */
+
+                /* add count of the references to the environment */
+                if (twig_state->loop) {
+                    mvar_t *gsize = new_var (1);
+
+                    /* gsize := {count}(p_iter.reverse(),
+                                        %twig_state->loop%.reverse());
+                       # map back to head values
+                       gsize := %twig_state->loop%.leftjoin(gsize); */
+                    execute (
+                        assgn (
+                            var (gsize->name),
+                            egcount (
+                                reverse (var (p_iter->name)),
+                                reverse (twig_state->loop))),
+                        assgn (
+                            var (gsize->name),
+                            leftjoin (
+                                twig_state->loop,
+                                var (gsize->name))));
+
+                    /* add the grouped sizes to the variable environment */
+                    env_add (p->env, att_NULL, aat_int, gsize);
+                }
+            }
 
             if (treat_pre && treat_attr) {
                 unpin (p_iter, 1);
@@ -7531,16 +7691,37 @@
                 if_ (eq (count (VAR (L(p)->env, p->sem.err.att, aat_str)),
                          lit_int (0)),
                      nop(),
-                     error (fetch ( VAR (L(p)->env, p->sem.err.att, aat_str),
-                                    lit_int (0)))));
+                     error (fetch (VAR (L(p)->env, p->sem.err.att, aat_str),
+                                   lit_int (0)))));
 
             /* copy all the attributes */
             for (unsigned int i = 0; i < env_count (L(p)->env); i++) {
-                pin (env_at (L(p)->env, i).mvar, p->refctr);
-                env_add (p->env,
-                         env_at (L(p)->env, i).att,
-                         env_at (L(p)->env, i).ty,
-                         env_at (L(p)->env, i).mvar);
+                /* make sure that the implicit type change
+                   is correctly implemented */
+                if (env_at (L(p)->env, i).att == p->sem.err.att) {
+                    PFalg_simple_type_t ty = type_of (p, p->sem.err.att);
+                    assert (env_at (L(p)->env, i).ty == aat_str);
+                    
+                    for (PFalg_simple_type_t t = 1; t; t <<= 1)
+                        if (t & ty) {
+                            /* create new variable */
+                            mvar_t *v  = new_var (p->refctr);
+                            /* dummy assignment */
+                            execute (
+                                assgn (var (v->name),
+                                       seqbase (new (type (mty_void),
+                                                     implty (t)),
+                                                lit_oid (0))));
+                            env_add (p->env, p->sem.err.att, t, v);
+                        }
+                }
+                else {
+                    pin (env_at (L(p)->env, i).mvar, p->refctr);
+                    env_add (p->env,
+                             env_at (L(p)->env, i).att,
+                             env_at (L(p)->env, i).ty,
+                             env_at (L(p)->env, i).mvar);
+                }
             }
             break;
 


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