Changeset: 3c3df2363a78 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3c3df2363a78
Added Files:
        monetdb5/optimizer/opt_partition.c
        monetdb5/optimizer/opt_partition.h
Modified Files:
        clients/Tests/MAL-signatures.stable.out
        clients/Tests/MAL-signatures.stable.out.int128
        clients/Tests/exports.stable.out
        monetdb5/optimizer/Makefile.ag
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_support.c
        monetdb5/optimizer/opt_wrapper.c
        monetdb5/optimizer/optimizer.mal
Branch: partition
Log Message:

Add empty optimizer framework


diffs (290 lines):

diff --git a/clients/Tests/MAL-signatures.stable.out 
b/clients/Tests/MAL-signatures.stable.out
--- a/clients/Tests/MAL-signatures.stable.out
+++ b/clients/Tests/MAL-signatures.stable.out
@@ -8166,6 +8166,7 @@ Ready.
 [ "optimizer", "deadcode",     "pattern optimizer.deadcode():str ",    
"OPTwrapper;",  ""      ]
 [ "optimizer", "deadcode",     "pattern optimizer.deadcode(mod:str, 
fcn:str):str ",    "OPTwrapper;",  "Dead code optimizer"   ]
 [ "optimizer", "default_pipe", "function optimizer.default_pipe():void;",      
"",     ""      ]
+[ "optimizer", "default_pipe", "function optimizer.default_pipe():void;",      
"",     ""      ]
 [ "optimizer", "emptybind",    "pattern optimizer.emptybind():str ",   
"OPTwrapper;",  ""      ]
 [ "optimizer", "emptybind",    "pattern optimizer.emptybind(mod:str, 
fcn:str):str ",   "OPTwrapper;",  "Evaluate empty set expressions."       ]
 [ "optimizer", "evaluate",     "pattern optimizer.evaluate():str ",    
"OPTwrapper;",  ""      ]
@@ -8197,6 +8198,8 @@ Ready.
 [ "optimizer", "optimize",     "pattern optimizer.optimize(mod:str, 
fcn:str):void ",   "QOToptimize;", "Optimize a specific operation" ]
 [ "optimizer", "orcam",        "pattern optimizer.orcam(mod:str, fcn:str, 
targetmod:str, targetfcn:str):void ",        "OPTorcam;",    "Inverse macro, 
find pattern and replace with a function call." ]
 [ "optimizer", "orcam",        "pattern optimizer.orcam(targetmod:str, 
targetfcn:str):void ",  "OPTorcam;",    "Inverse macro processor for current 
function"  ]
+[ "optimizer", "partition",    "pattern optimizer.partition():str ",   
"OPTwrapper;",  ""      ]
+[ "optimizer", "partition",    "pattern optimizer.partition(mod:str, 
fcn:str):str ",   "OPTwrapper;",  "Partition a column for aggregates"     ]
 [ "optimizer", "postfix",      "pattern optimizer.postfix():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "postfix",      "pattern optimizer.postfix(mod:str, 
fcn:str):str ",     "OPTwrapper;",  "Postfix the plan,e.g. pushing projections" 
    ]
 [ "optimizer", "prelude",      "pattern optimizer.prelude():void ",    
"optimizer_prelude;",   "Initialize the optimizer"      ]
@@ -8655,6 +8658,7 @@ Ready.
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
+[ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "s2_1", "function user.s2_1():void;",   "",     ""      ]
 [ "user",      "sql.init",     "function user.sql.init():void;",       "",     
""      ]
 [ "uuid",      "#cmp", "command uuid.#cmp():void ",    "UUIDcompare;", ""      
]
diff --git a/clients/Tests/MAL-signatures.stable.out.int128 
b/clients/Tests/MAL-signatures.stable.out.int128
--- a/clients/Tests/MAL-signatures.stable.out.int128
+++ b/clients/Tests/MAL-signatures.stable.out.int128
@@ -10528,6 +10528,7 @@ Ready.
 [ "optimizer", "deadcode",     "pattern optimizer.deadcode():str ",    
"OPTwrapper;",  ""      ]
 [ "optimizer", "deadcode",     "pattern optimizer.deadcode(mod:str, 
fcn:str):str ",    "OPTwrapper;",  "Dead code optimizer"   ]
 [ "optimizer", "default_pipe", "function optimizer.default_pipe():void;",      
"",     ""      ]
+[ "optimizer", "default_pipe", "function optimizer.default_pipe():void;",      
"",     ""      ]
 [ "optimizer", "emptybind",    "pattern optimizer.emptybind():str ",   
"OPTwrapper;",  ""      ]
 [ "optimizer", "emptybind",    "pattern optimizer.emptybind(mod:str, 
fcn:str):str ",   "OPTwrapper;",  "Evaluate empty set expressions."       ]
 [ "optimizer", "evaluate",     "pattern optimizer.evaluate():str ",    
"OPTwrapper;",  ""      ]
@@ -10559,6 +10560,8 @@ Ready.
 [ "optimizer", "optimize",     "pattern optimizer.optimize(mod:str, 
fcn:str):void ",   "QOToptimize;", "Optimize a specific operation" ]
 [ "optimizer", "orcam",        "pattern optimizer.orcam(mod:str, fcn:str, 
targetmod:str, targetfcn:str):void ",        "OPTorcam;",    "Inverse macro, 
find pattern and replace with a function call." ]
 [ "optimizer", "orcam",        "pattern optimizer.orcam(targetmod:str, 
targetfcn:str):void ",  "OPTorcam;",    "Inverse macro processor for current 
function"  ]
+[ "optimizer", "partition",    "pattern optimizer.partition():str ",   
"OPTwrapper;",  ""      ]
+[ "optimizer", "partition",    "pattern optimizer.partition(mod:str, 
fcn:str):str ",   "OPTwrapper;",  "Partition a column for aggregates"     ]
 [ "optimizer", "postfix",      "pattern optimizer.postfix():str ",     
"OPTwrapper;",  ""      ]
 [ "optimizer", "postfix",      "pattern optimizer.postfix(mod:str, 
fcn:str):str ",     "OPTwrapper;",  "Postfix the plan,e.g. pushing projections" 
    ]
 [ "optimizer", "prelude",      "pattern optimizer.prelude():void ",    
"optimizer_prelude;",   "Initialize the optimizer"      ]
@@ -11020,6 +11023,7 @@ Ready.
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "main", "function user.main():void;",   "",     ""      ]
+[ "user",      "main", "function user.main():void;",   "",     ""      ]
 [ "user",      "s2_1", "function user.s2_1():void;",   "",     ""      ]
 [ "user",      "sql.init",     "function user.sql.init():void;",       "",     
""      ]
 [ "uuid",      "#cmp", "command uuid.#cmp():void ",    "UUIDcompare;", ""      
]
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -1582,6 +1582,7 @@ str OPTmultiplexSimple(Client cntxt, Mal
 str OPToltpImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
pci);
 str OPTorcam(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p);
 str OPTorcamImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
p);
+str OPTpartitionImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr p);
 str OPTpostfixImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr p);
 str OPTprofilerImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr p);
 str OPTprojectionpathImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr p);
diff --git a/monetdb5/optimizer/Makefile.ag b/monetdb5/optimizer/Makefile.ag
--- a/monetdb5/optimizer/Makefile.ag
+++ b/monetdb5/optimizer/Makefile.ag
@@ -51,6 +51,7 @@ lib_optimizer = {
                opt_support.c opt_support.h \
                opt_pushselect.c opt_pushselect.h \
                opt_profiler.c opt_profiler.h \
+               opt_partition.c opt_partition.h \
                opt_postfix.c opt_postfix.h \
                opt_volcano.c opt_volcano.h \
                opt_wrapper.c
diff --git a/monetdb5/optimizer/opt_partition.c 
b/monetdb5/optimizer/opt_partition.c
new file mode 100644
--- /dev/null
+++ b/monetdb5/optimizer/opt_partition.c
@@ -0,0 +1,93 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
+ */
+
+/* example: select count(distinct userid) from hits_10m;
+ * Massage aggregate operations using value based partitioning
+    X_16 := algebra.projection(X_4, X_15);
+    (X_17, X_18, X_19) := group.groupdone(X_16);
+    X_20 := algebra.projection(X_18, X_16);
+    X_21 := aggr.count(X_20, true);
+
+   The new could should become:
+     X_16 := algebra.projection(X_4, X_15);
+    (P1,P2,P3,P4) := bat.partition(X_16)
+    (O1, G1 , S1) := group.groupdone(P1);
+    (O2, G2 , S2) := group.groupdone(P2);
+    (O3, G3 , S3) := group.groupdone(P3);
+    (O4, G4 , S4) := group.groupdone(P4);
+    X_17 := mat.pack(O1,O3,O3,O4)
+    X_18 := mat.pack(G1,G3,G3,G4)
+    X_19 := mat.pack(S1,S3,S3,S4)
+
+    Q1 := algebra.projection(G1, P1);
+    Q2 := algebra.projection(G2, P2);
+    Q3 := algebra.projection(G3, P3);
+    Q4 := algebra.projection(G4, P4);
+    X_20 := mat.pack(Q1,Q2,Q3,Q4);
+
+    X_21 := aggr.count(X_20, true);
+ */
+#include "monetdb_config.h"
+#include "mal_instruction.h"
+#include "opt_partition.h"
+
+#define isCandidateList(M,P,I) ((M)->var[getArg(P,I)].id[0]== 'C')
+
+str
+OPTpartitionImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr 
p)
+{
+       int i, slimit, limit, actions=0;
+       InstrPtr *old = 0;
+       lng usec = GDKusec();
+       char buf[256];
+
+       (void) stk;
+       (void) cntxt;
+
+       limit = mb->stop;
+       slimit = mb->ssize;
+       /* check for aggregates */
+       for ( i = 0; i < limit; i++){
+               p= getInstrPtr(mb,i);
+               if( getFunctionId(p) == groupdoneRef  && getModuleId(p)== 
groupRef && p->argc == 2){
+                       actions ++;
+               }
+       }
+       if( actions == 0)
+               goto finished;
+
+       old = mb->stmt;
+       if (newMalBlkStmt(mb, mb->ssize) < 0)
+               throw(MAL,"optimizer.postfix", SQLSTATE(HY001) MAL_MALLOC_FAIL);
+
+       /* construct the new plan */
+       for ( i = 0; i < limit; i++)
+       {
+               p= old[i];
+               pushInstruction(mb,p);
+       }
+       for( ;i < slimit; i++)
+               if( old[i])
+                       freeInstruction(old[i]);
+
+       /* Defense line against incorrect plans */
+       if( actions ){
+               chkTypes(cntxt->usermodule, mb, FALSE);
+               chkFlow(mb);
+               chkDeclarations(mb);
+       }
+       /* keep all actions taken as a post block comment and update statics */
+       GDKfree(old);
+finished:
+       usec= GDKusec() - usec;
+       snprintf(buf,256,"%-20s actions=%2d time=" LLFMT " usec", "postfix", 
actions, usec);
+       newComment(mb,buf);
+       addtoMalBlkHistory(mb);
+
+       return MAL_SUCCEED;
+}
diff --git a/monetdb5/optimizer/opt_partition.h 
b/monetdb5/optimizer/opt_partition.h
new file mode 100644
--- /dev/null
+++ b/monetdb5/optimizer/opt_partition.h
@@ -0,0 +1,17 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2017 MonetDB B.V.
+ */
+
+#ifndef _OPT_PARTITION_
+#define _OPT_PARTITION_
+#include "opt_prelude.h"
+#include "opt_support.h"
+#include "mal_exception.h"
+
+mal_export str OPTpartitionImplementation(Client cntxt, MalBlkPtr mb, 
MalStkPtr stk, InstrPtr p);
+
+#endif
diff --git a/monetdb5/optimizer/opt_pipes.c b/monetdb5/optimizer/opt_pipes.c
--- a/monetdb5/optimizer/opt_pipes.c
+++ b/monetdb5/optimizer/opt_pipes.c
@@ -96,6 +96,41 @@ static struct PIPELINES {
         "optimizer.wlc();"
         "optimizer.garbageCollector();",
         "stable", NULL, NULL, 1},
+// Experiment with partition
+       {"default_pipe",
+        "optimizer.inline();"
+        "optimizer.remap();"
+        "optimizer.costModel();"
+        "optimizer.coercions();"
+        "optimizer.evaluate();"
+        "optimizer.emptybind();"
+        "optimizer.pushselect();"
+        "optimizer.aliases();"
+        "optimizer.partition();"
+        "optimizer.mitosis();"
+        "optimizer.mergetable();"
+        "optimizer.deadcode();"
+        "optimizer.aliases();"
+        "optimizer.constants();"
+        "optimizer.commonTerms();"
+        "optimizer.projectionpath();"
+        "optimizer.deadcode();"
+        "optimizer.reorder();"
+//      "optimizer.reduce();" deprecated
+        "optimizer.matpack();"
+        "optimizer.dataflow();"
+        "optimizer.querylog();"
+        "optimizer.multiplex();"
+        "optimizer.generator();"
+        "optimizer.profiler();"
+        "optimizer.candidates();"
+        "optimizer.postfix();"
+        "optimizer.deadcode();"
+//      "optimizer.jit();" awaiting the new batcalc api
+//      "optimizer.oltp();"awaiting the autocommit front-end changes
+        "optimizer.wlc();"
+        "optimizer.garbageCollector();",
+        "stable", NULL, NULL, 1},
 /*
  * Volcano style execution produces a sequence of blocks from the source 
relation
  */
diff --git a/monetdb5/optimizer/opt_support.c b/monetdb5/optimizer/opt_support.c
--- a/monetdb5/optimizer/opt_support.c
+++ b/monetdb5/optimizer/opt_support.c
@@ -50,6 +50,7 @@ struct OPTcatalog {
 {"multiplex",  0,      0,      0},
 {"oltp",               0,      0,      0},
 {"postfix",            0,      0,      0},
+{"partition",          0,      0,      0},
 {"reduce",             0,      0,      0},
 {"remap",              0,      0,      0},
 {"remote",             0,      0,      0},
diff --git a/monetdb5/optimizer/opt_wrapper.c b/monetdb5/optimizer/opt_wrapper.c
--- a/monetdb5/optimizer/opt_wrapper.c
+++ b/monetdb5/optimizer/opt_wrapper.c
@@ -39,6 +39,7 @@
 #include "opt_json.h"
 #include "opt_oltp.h"
 #include "opt_postfix.h"
+#include "opt_partition.h"
 #include "opt_mergetable.h"
 #include "opt_mitosis.h"
 #include "opt_multiplex.h"
@@ -79,6 +80,7 @@ struct{
        {"multiplex", &OPTmultiplexImplementation,0,0},
        {"oltp", &OPToltpImplementation,0,0},
        {"postfix", &OPTpostfixImplementation,0,0},
+       {"partition", &OPTpartitionImplementation,0,0},
        {"profiler", &OPTprofilerImplementation,0,0},
        {"projectionpath", &OPTprojectionpathImplementation,0,0},
        {"pushselect", &OPTpushselectImplementation,0,0},
diff --git a/monetdb5/optimizer/optimizer.mal b/monetdb5/optimizer/optimizer.mal
--- a/monetdb5/optimizer/optimizer.mal
+++ b/monetdb5/optimizer/optimizer.mal
@@ -281,5 +281,13 @@ pattern optimizer.postfix(mod:str, fcn:s
 address OPTwrapper
 comment "Postfix the plan,e.g. pushing projections";
 
+#opt_postfix.mal
+
+pattern optimizer.partition():str
+address OPTwrapper;
+pattern optimizer.partition(mod:str, fcn:str):str
+address OPTwrapper
+comment "Partition a column for aggregates";
+
 optimizer.prelude();
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to