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

Modified Files:
        mil.c mil_dce.c milgen.brg milprint.c 
Log Message:
* Changed the names of the new types that were introduced for the docmgm
  functions. Now the types are:
  - aat_docmgmt
  - aat_path
  - aat_docnm
  - aat_colnm
  Note that we used only 1 more bit for these types since we re-used
  the types introduced for the update functions.
* Algebra and MIL implementation for the docmgm functions:
  - pf:add-doc(str,str)
  - pf:add-doc(str,str,str)
  - pf:add-doc(str,str,int)
  - pf:add-doc(str,str,str,int)
* Change the serialize operator to identify docmgm queries and produce
  the correct MIL code for that
* MIL implementation for the docmgmt_tape
* Dummy implementation of the DocmgmTape proc in pathfinder.mx
  For now it just prints the BAT parameters, but next commit will be
  with the correct implementation.

Everything works great, but for one *very very* strange thing. Inside the 1to1
function, case alg_fun_pf_add_doc_str_int reaches until logical level and then
disappears! This case has 4 params but that must not be the problem since case
alg_fun_fn_replace_flag has also 4 params and works fine. I could use some
help/suggestions on this one, since I have no idea why this is happening.
could it be some strange elimination/optimization code?



Index: milprint.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milprint.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- milprint.c  18 Jan 2008 16:11:38 -0000      1.61
+++ milprint.c  20 Jan 2008 22:35:05 -0000      1.62
@@ -692,6 +692,12 @@
             milprintf (")");
             break;
 
+        case m_docmgmt_tape:
+            milprintf ("DocmgmTape (");
+            print_args (n->child[0]);
+            milprintf (")");
+            break;
+
         default:
             debug_output;     /* Print MIL code so far when in debug mode. */
 #ifndef NDEBUG

Index: mil.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/mil.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- mil.c       18 Jan 2008 16:11:38 -0000      1.48
+++ mil.c       20 Jan 2008 22:35:04 -0000      1.49
@@ -2393,4 +2393,10 @@
     return wire1 (m_update_tape, args);
 }
 
+PFmil_t *
+PFmil_docmgmt (const PFmil_t *args)
+{
+    return wire1 (m_docmgmt_tape, args);
+}
+
 /* vim:set shiftwidth=4 expandtab: */

Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.99
retrieving revision 1.100
diff -u -d -r1.99 -r1.100
--- milgen.brg  18 Jan 2008 16:11:38 -0000      1.99
+++ milgen.brg  20 Jan 2008 22:35:05 -0000      1.100
@@ -471,7 +471,8 @@
          || ty == aat_afrag  || ty == aat_update || ty == aat_node1
          || ty == aat_anode1 || ty == aat_attr1  || ty == aat_afrag1
          || ty == aat_pnode1 || ty == aat_pre1   || ty == aat_pfrag1
-         || ty == aat_docmgmt|| ty == aat_str1   || ty == aat_str2 );
+         || ty == aat_docmgmt|| ty == aat_path   || ty == aat_docnm
+         || ty == aat_colnm );
 
     *(env_t *) PFarray_add (env)
         = (env_t) { .att = att, .ty = ty, .mvar = v };
@@ -622,23 +623,27 @@
 
 /** MIL implementation types for algebra types */
 static PFmil_type_t impl_types[] = {
-      [aat_nat]   = mty_oid
-    , [aat_int]   = mty_lng
-    , [aat_str]   = mty_str
-    , [aat_uA]    = mty_str
-    , [aat_dec]   = mty_dbl
-    , [aat_dbl]   = mty_dbl
-    , [aat_bln]   = mty_bit
-    , [aat_qname] = mty_oid
-    , [aat_pre]   = mty_oid
-    , [aat_attr]  = mty_oid
-    , [aat_pfrag] = mty_oid
-    , [aat_afrag] = mty_oid
-    , [aat_pre1]   = mty_oid
-    , [aat_attr1]  = mty_oid
-    , [aat_pfrag1] = mty_oid
-    , [aat_afrag1] = mty_oid
-    , [aat_update] = mty_lng
+      [aat_nat]     = mty_oid
+    , [aat_int]     = mty_lng
+    , [aat_str]     = mty_str
+    , [aat_uA]      = mty_str
+    , [aat_dec]     = mty_dbl
+    , [aat_dbl]     = mty_dbl
+    , [aat_bln]     = mty_bit
+    , [aat_qname]   = mty_oid
+    , [aat_pre]     = mty_oid
+    , [aat_attr]    = mty_oid
+    , [aat_pfrag]   = mty_oid
+    , [aat_afrag]   = mty_oid
+    , [aat_pre1]    = mty_oid
+    , [aat_attr1]   = mty_oid
+    , [aat_pfrag1]  = mty_oid
+    , [aat_afrag1]  = mty_oid
+    , [aat_update]  = mty_lng
+    , [aat_path]    = mty_str
+    , [aat_colnm]   = mty_str
+    , [aat_docnm]   = mty_str
+    , [aat_docmgmt] = mty_lng
 };
 
 /** implementation type for a given algebra type, as a MIL node */
@@ -1405,6 +1410,72 @@
                 unpin (pre_cont_ins, 1);
                 unpin (attr_ins, 1);
                 unpin (attr_cont_ins, 1);
+
+            /* docmgmt query */
+            } else if (aat_docmgmt & type_of (R(p), pa_item)) {
+
+                mvar_t *docmgmt, *docname, *colname, *filepath;
+
+                docmgmt  = new_var(1);
+                docname  = new_var(1);
+                colname  = new_var(1);
+                filepath = new_var(1);
+
+                ty = type_of (R(p), pa_item);
+
+                /* consider docmgmt kind / percentage */
+                execute (
+                    assgn (var (docmgmt->name),
+                           VAR (R(p)->env, pa_item, aat_docmgmt))
+                );
+
+                /* consider file path */
+                if (ty & aat_path) {
+                    execute (
+                        assgn (var (filepath->name),
+                               VAR (R(p)->env, pa_item, aat_path))
+                    );
+                } else {
+                    execute (
+                        assgn (var (filepath->name),
+                               project (var (docmgmt->name),
+                                        nil()))
+                    );
+                }
+
+
+                /* consider document names */
+                execute (
+                    assgn (var (docname->name),
+                           VAR (R(p)->env, pa_item, aat_docnm))
+                );
+
+                /* consider colection names */
+                if (ty & aat_colnm) {
+                    execute (
+                        assgn (var (colname->name),
+                               VAR (R(p)->env, pa_item, aat_colnm))
+                    );
+                } else {
+                    execute (
+                        assgn (var (colname->name),
+                               project (var (docmgmt->name),
+                                        nil()))
+                    );
+                }
+
+                execute (
+                    docmgmt_tape (
+                        arg (var (PF_MIL_VAR_WS),
+                            arg (var (filepath->name),
+                                arg (var (docname->name),
+                                    arg (var (colname->name),
+                                         var (docmgmt->name)))))));
+                unpin (docmgmt, 1);
+                unpin (docname, 1);
+                unpin (colname, 1);
+                unpin (filepath, 1);
+
             } else {                     /* else, is not an update query */
 
                 /* Set up all the value containers for print_result().
@@ -4346,13 +4417,124 @@
                     assert (!"no implementation here");
                     break;
 
-                case alg_fun_pf_add_doc:
                 case alg_fun_pf_add_doc_str:
-                case alg_fun_pf_add_doc_int:
+                {
+                    PFalg_att_t filepath   = p->sem.fun_1to1.refs.atts[0],
+                                docname    = p->sem.fun_1to1.refs.atts[1],
+                                collection = p->sem.fun_1to1.refs.atts[2];
+
+                    assert (env_count (L(p)->env));
+
+                    /* relink all filepath strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == filepath) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_path,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* relink all document name strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == docname) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_docnm,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* relink all colection name strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == collection) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_colnm,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* update percentage is the result BAT */
+                    res_type = aat_docmgmt;
+                    execute (
+                        assgn ( var (res->name),
+                                project (VAR (L(p)->env, docname, aat_str),
+                                         lit_lng(0)))); 
+
+                }   break;
+
                 case alg_fun_pf_add_doc_str_int:
+                {
+                    PFalg_att_t filepath   = p->sem.fun_1to1.refs.atts[0],
+                                docname    = p->sem.fun_1to1.refs.atts[1],
+                                collection = p->sem.fun_1to1.refs.atts[2],
+                                percentage = p->sem.fun_1to1.refs.atts[3];
+
+                    assert (env_count (L(p)->env));
+
+                    /* relink all filepath strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == filepath) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_path,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* relink all document name strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == docname) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_docnm,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* relink all colection name strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == collection) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_colnm,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* update percentage is the result BAT */
+                    res_type = aat_docmgmt;
+                    execute (
+                        assgn ( var (res->name),
+                                VAR (L(p)->env, percentage, aat_int))); 
+
+                }   break;
+
                 case alg_fun_pf_del_doc:
+                {
+                    PFalg_att_t docname   = p->sem.fun_1to1.refs.atts[0];
+
+                    assert (env_count (L(p)->env));
+
+                    /* relink all document name strings to the result BATs */
+                    for (unsigned int i = 0; i < env_count (L(p)->env); i++)
+                        if (env_at (L(p)->env, i).att == docname) {
+                            pin (env_at (L(p)->env, i).mvar, p->refctr);
+                            env_add (p->env,
+                                     p->sem.fun_1to1.res,
+                                     aat_docnm,
+                                     env_at (L(p)->env, i).mvar);
+                        }
+
+                    /* update percentage is the result BAT */
                     res_type = aat_docmgmt;
-                    break;
+                    execute (
+                        assgn ( var (res->name),
+                                project (VAR (L(p)->env, docname, aat_str),
+                                         lit_lng(-1)))); 
+
+                }   break;
 
                 case alg_fun_upd_delete:
                 {
@@ -4392,7 +4574,7 @@
                 case alg_fun_upd_replace_element:
                 case alg_fun_upd_replace_node:
                 {
-                    PFalg_att_t tgt = p->sem.fun_1to1.refs.atts[0],
+                    PFalg_att_t tgt     = p->sem.fun_1to1.refs.atts[0],
                                 changes = p->sem.fun_1to1.refs.atts[1];
                     mvar_t *loop = NULL;
                     int update_str;

Index: mil_dce.c
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/mil_dce.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- mil_dce.c   11 Jan 2008 10:47:10 -0000      1.17
+++ mil_dce.c   20 Jan 2008 22:35:05 -0000      1.18
@@ -441,6 +441,7 @@
         case m_error:
         case m_print:
         case m_update_tape:
+        case m_docmgmt_tape:
 
 #ifndef NDEBUG
             /* update dirty vars */


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