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

Modified Files:
      Tag: PF_ROX
        milgen.brg 
Log Message:
propagated changes of Tuesday Jun 10 2008
from the development trunk to the PF_ROX branch



U milgen.brg
Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.103.2.18
retrieving revision 1.103.2.19
diff -u -d -r1.103.2.18 -r1.103.2.19
--- milgen.brg  6 Jun 2008 14:25:40 -0000       1.103.2.18
+++ milgen.brg  10 Jun 2008 14:47:37 -0000      1.103.2.19
@@ -4814,18 +4814,44 @@
                 case alg_fun_fn_matches_flag: /* fold( */
                 {
                     PFalg_att_t att1, att2, att3;
+                    mvar_t *chk = new_var(1),
+                           *err = new_var(1);
 
                     att1 = p->sem.fun_1to1.refs.atts[0];
                     att2 = p->sem.fun_1to1.refs.atts[1];
                     att3 = p->sem.fun_1to1.refs.atts[2];
                     res_type = aat_bln;
 
+                    /* check flags for validity */
+                    execute (
+                        catch_ (var (err->name),
+                                seq ( assgn (var (chk->name),
+                                             mpcre_match (
+                                                 VAR (L(p)->env,
+                                                      att3,
+                                                      aat_str),
+                                                 lit_str("[^imsx]"))))),
+                        if_ (not (isnil (var (err->name))),
+                             error (
+                                 arg (lit_str ("Should not happen: "
+                                      "error occurred while checking flags: "),
+                                      var (err->name))),
+                             nop ()),
+                        if_ (texist (var (chk->name), lit_bit(true)),
+                             error (lit_str ("err:FORX0001: flags of "
+                                             "fn:matches containing "
+                                             "undefined character(s)")),
+                             nop ()));
+
                     execute (
                         assgn (var (res->name),
                                mpcre_match_flag (
                                    VAR (L(p)->env, att1, aat_str),
                                    VAR (L(p)->env, att2, aat_str),
                                    VAR (L(p)->env, att3, aat_str))));
+
+                    unpin (chk, 1);
+                    unpin (err, 1);
                 }   break; /* fold) */
                 case alg_fun_fn_replace: /* fold( */
                 case alg_fun_fn_replace_flag:
@@ -7014,11 +7040,12 @@
             execute (
                 assgn (var (map->name),
                        hmark (
-                           select_ (meq (VAR (LL(p)->env,
-                                              L(p)->sem.ii.item,
-                                              aat_str),
-                                         lit_str ("")),
-                                    lit_bit (false)),
+                           select_ (
+                               PFmil_mne (VAR (LL(p)->env,
+                                               L(p)->sem.ii.item,
+                                               aat_str),
+                                          lit_str ("")),
+                               lit_bit (true)),
                            lit_oid (0))),
                 assgn (var (iter->name),
                        leftjoin (var (map->name),
@@ -7614,52 +7641,121 @@
             assert (type_of (L(p), p->sem.ii.iter) == aat_nat);
             assert (type_of (L(p), p->sem.ii.item) == aat_str);
         {
-            mvar_t  *v = new_var (1);
-            mvar_t  *prop = new_var (1);
-            PFmil_t *iter = VAR (L(p)->env, p->sem.ii.iter, aat_nat);
-            PFmil_t *item = VAR (L(p)->env, p->sem.ii.item, aat_str);
+            mvar_t  *v    = new_var (1),
+                    *prop = new_var (1),
+                    *iter = new_var (1),
+                    *item = new_var (1);
+
+            /* check for constant non-empty string */
+            if (PFprop_const (p->prop, p->sem.ii.item) &&
+                strcmp (PFprop_const_val (p->prop, p->sem.ii.item).val.str, 
"")) {
+                execute (
+                    assgn (var (iter->name),
+                           VAR (L(p)->env, p->sem.ii.iter, aat_nat)),
+                    assgn (var (item->name),
+                           VAR (L(p)->env, p->sem.ii.item, aat_str)));
+
+                /* stable size + 1 */
+                twig_state->size++;
+            }
+            /* we need to prune empty textnodes and calculate the
+               resulting sizes for the consuming parents */
+            else {
+                mvar_t *bool_list = new_var (1),
+                       *map       = new_var (1),
+                       *size      = new_var (1);
+                
+                /* prune all empty textnodes */
+                execute (
+                    assgn (var (bool_list->name),
+                           PFmil_mne (VAR (L(p)->env,
+                                           p->sem.ii.item,
+                                           aat_str),
+                                      lit_str (""))),
+                    assgn (var (map->name),
+                           hmark (
+                               select_ (var (bool_list->name),
+                                        lit_bit (true)),
+                               lit_oid (0))),
+                    assgn (var (iter->name),
+                           leftjoin (var (map->name),
+                                     VAR (L(p)->env,
+                                          p->sem.ii.iter,
+                                          aat_nat))),
+                    assgn (var (item->name),
+                           leftjoin (var (map->name),
+                                     VAR (L(p)->env,
+                                          p->sem.ii.item,
+                                          aat_str))));
+                unpin (map, 1);
 
+                assert (twig_state->loop);
+
+                /* calculate the sizes and map them to the head
+                   of the loop relation */
+                execute (
+                    assgn (var (size->name),
+                           leftjoin (
+                               twig_state->loop,
+                               leftjoin (
+                                   reverse (VAR (L(p)->env,
+                                                 p->sem.ii.iter,
+                                                 aat_nat)),
+                                   mcast (type (mty_int),
+                                          var (bool_list->name))))));
+                unpin (bool_list, 1);
+                
+                /* add the correct sizes to the variable environment */
+                env_add (p->env, att_NULL, aat_int, size);
+            }
+            
             execute (
                 assgn (var (prop->name),
-                       add_content (item,
+                       add_content (var (item->name),
                                     var (PF_MIL_VAR_WS),
                                     var (PF_MIL_VAR_PROP_TEXT))),
                 assgn (var (v->name),
                        seqbase (new (type (mty_void), type (mty_bat)),
                                 lit_oid (0))),
                 /* iter */
-                bappend (var (v->name), iter),
+                bappend (var (v->name), var (iter->name)),
                 /* pre */
                 bappend (var (v->name),
-                         project (iter, lit_oid (twig_state->pre))),
+                         project (var (iter->name),
+                                  lit_oid (twig_state->pre))),
                 /* size */
                 bappend (var (v->name),
-                         project (iter, lit_int (0))),
+                         project (var (iter->name), lit_int (0))),
                 /* level */
                 bappend (var (v->name),
-                         project (iter,
+                         project (var (iter->name),
                                   cast (type (mty_chr),
                                         lit_int (twig_state->level)))),
                 /* kind */
                 bappend (var (v->name),
-                         project (iter, var (PF_MIL_VAR_KIND_TEXT))),
+                         project (var (iter->name),
+                                  var (PF_MIL_VAR_KIND_TEXT))),
                 /* prop */
                 bappend (var (v->name), var (prop->name)),
                 /* cont */
                 bappend (var (v->name),
-                         project (iter, var (PF_MIL_VAR_WS_CONT))),
+                         project (var (iter->name),
+                                  var (PF_MIL_VAR_WS_CONT))),
                 /* old_pre */
                 bappend (var (v->name),
-                         project (iter, cast (type (mty_oid), nil ()))),
+                         project (var (iter->name),
+                                  cast (type (mty_oid), nil ()))),
                 /* old_cont */
                 bappend (var (v->name),
-                         project (iter, cast (type (mty_oid), nil ()))));
+                         project (var (iter->name),
+                                  cast (type (mty_oid), nil ()))));
 
+            unpin (iter, 1);
+            unpin (item, 1);
             unpin (prop, 1);
 
             *(mvar_t **) PFarray_add (twig_state->elem_vars) = v;
             twig_state->pre++;
-            twig_state->size++;
         }
             break; /* fold) */
 


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to