Changeset: 4c50e4a4a503 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4c50e4a4a503
Modified Files:
        monetdb5/optimizer/opt_geospatial.c
Branch: geo
Log Message:

grouped common code in optimiser


diffs (202 lines):

diff --git a/monetdb5/optimizer/opt_geospatial.c 
b/monetdb5/optimizer/opt_geospatial.c
--- a/monetdb5/optimizer/opt_geospatial.c
+++ b/monetdb5/optimizer/opt_geospatial.c
@@ -1,7 +1,56 @@
 #include "monetdb_config.h"
 #include "opt_geospatial.h"
-//#include "mal_instruction.h"
-//#include "mal_interpreter.h"
+
+static void createFilterInstruction(MalBlkPtr mb, InstrPtr *oldInstrPtr, int 
intructionNum, int filterFirstArgument) {
+       InstrPtr filterInstrPtr, projectInstrPtr, projectXInstrPtr, 
projectYInstrPtr;
+       int filterReturnId, subselectReturnId, projectXReturnId, 
projectYReturnId;
+
+       //create and put in the MAL plan the new instructions
+       filterInstrPtr = newStmt(mb, "batgeom", "Filter");
+       projectXInstrPtr = newStmt(mb, "algebra", "leftfetchjoin");             
                
+       projectYInstrPtr = newStmt(mb, "algebra", "leftfetchjoin");             
                
+       pushInstruction(mb, oldInstrPtr[intructionNum]);
+       pushInstruction(mb, oldInstrPtr[intructionNum+1]);
+       projectInstrPtr = newStmt(mb, "algebra", "leftfetchjoin");              
                
+
+       //make new return variables
+       filterReturnId = newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid));
+       projectXReturnId = newVariable(mb, GDKstrdup("xBATfiltered"), 
getArgType(mb,oldInstrPtr[intructionNum],2));
+       projectYReturnId = newVariable(mb, GDKstrdup("yBATfiltered"), 
getArgType(mb,oldInstrPtr[intructionNum],3));
+       subselectReturnId = newTmpVariable(mb, newBatType(TYPE_oid, TYPE_oid));
+
+       //set the arguments for filter
+       setReturnArgument(filterInstrPtr, filterReturnId);
+       filterInstrPtr = pushArgument(mb, filterInstrPtr, filterFirstArgument);
+       filterInstrPtr = pushArgument(mb, filterInstrPtr, 
getArg(oldInstrPtr[intructionNum],2));
+       filterInstrPtr = pushArgument(mb, filterInstrPtr, 
getArg(oldInstrPtr[intructionNum],3));
+
+       //set the arguments for the x project
+       setReturnArgument(projectXInstrPtr, projectXReturnId);
+       projectXInstrPtr = pushArgument(mb, projectXInstrPtr, filterReturnId);
+       projectXInstrPtr = pushArgument(mb, projectXInstrPtr, 
getArg(oldInstrPtr[intructionNum], 2));
+                                       
+       //set the arguments for the y project
+       setReturnArgument(projectYInstrPtr, projectYReturnId);
+       projectYInstrPtr = pushArgument(mb, projectYInstrPtr, filterReturnId);
+       projectYInstrPtr = pushArgument(mb, projectYInstrPtr, 
getArg(oldInstrPtr[intructionNum], 3));
+
+       //set the arguments of the spatial function
+       delArgument(oldInstrPtr[intructionNum], 2);
+       setArgument(mb, oldInstrPtr[intructionNum], 2, projectXReturnId);
+       delArgument(oldInstrPtr[intructionNum], 3);
+       setArgument(mb, oldInstrPtr[intructionNum], 3, projectYReturnId);
+
+       //the new subselect does not use candidates
+       setReturnArgument(projectInstrPtr, 
getArg(oldInstrPtr[intructionNum+1],0)); //get the variable before changing it
+       setReturnArgument(oldInstrPtr[intructionNum+1], subselectReturnId);
+       delArgument(oldInstrPtr[intructionNum+1], 2);
+                                       
+       //add a new function that gets the oids of the original BAT that 
qualified the spatial function
+       projectInstrPtr = pushArgument(mb, projectInstrPtr, subselectReturnId);
+       projectInstrPtr = pushArgument(mb, projectInstrPtr, filterReturnId);
+
+}
 
 
 int OPTgeospatialImplementation(Client cntxt, MalBlkPtr mb, MalStkPtr stk, 
InstrPtr pci) {
@@ -26,60 +75,9 @@ int OPTgeospatialImplementation(Client c
                if(getModuleId(oldInstrPtr[i]) && 
!strcasecmp(getModuleId(oldInstrPtr[i]),"batgeom"))   {
                        if(strcasecmp(getFunctionId(oldInstrPtr[i]), 
"contains1") == 0)  {
                                if(oldInstrPtr[i]->argc == 5) {
-                                       //replace the instruction with two new 
ones
-                                       InstrPtr filterInstrPtr, 
/*fcnInstrPtr,*/ projectInstrPtr, projectXInstrPtr, projectYInstrPtr;
-                                       int filterReturnId, subselectReturnId, 
projectXReturnId, projectYReturnId;
-                                       //create and put in the MAL plan the 
new instructions
-                                       filterInstrPtr = newStmt(mb, "batgeom", 
"Filter");
-                                       projectXInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                             
-                                       projectYInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                             
-                                       //fcnInstrPtr = newStmt(mb, "batgeom", 
"Contains1");
-                                       pushInstruction(mb, oldInstrPtr[i]);
-                                       pushInstruction(mb, oldInstrPtr[i+1]);
-                                       projectInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                              
+                                       //call all necessary intructions for 
the filter and the evaluation of the spatial relation      
+                                       createFilterInstruction(mb, 
oldInstrPtr, i, getArg(oldInstrPtr[i],1));
 
-                                       //set the return argument of the filter
-                                       filterReturnId = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-                                       setReturnArgument(filterInstrPtr, 
filterReturnId);
-                                       //set the input arguments of the filter
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, getArg(oldInstrPtr[i],1));
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, getArg(oldInstrPtr[i],2));
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, getArg(oldInstrPtr[i],3));
-
-                                       //set the arguments for the X, Y 
projections
-                                       projectXReturnId = newVariable(mb, 
GDKstrdup("xBATfiltered"), getArgType(mb,oldInstrPtr[i],2));
-                                       setReturnArgument(projectXInstrPtr, 
projectXReturnId);
-                                       projectXInstrPtr = pushArgument(mb, 
projectXInstrPtr, filterReturnId);
-                                       projectXInstrPtr = pushArgument(mb, 
projectXInstrPtr, getArg(oldInstrPtr[i], 2));
-                                       
-                                       projectYReturnId = newVariable(mb, 
GDKstrdup("yBATfiltered"), getArgType(mb,oldInstrPtr[i],3));
-                                       setReturnArgument(projectYInstrPtr, 
projectYReturnId);
-                                       projectYInstrPtr = pushArgument(mb, 
projectYInstrPtr, filterReturnId);
-                                       projectYInstrPtr = pushArgument(mb, 
projectYInstrPtr, getArg(oldInstrPtr[i], 3));
-                                       
-                                       ////set the arguments of the contains 
function
-                                       //setReturnArgument(fcnInstrPtr, 
getArg(oldInstrPtr[i],0));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],1));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],2));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],3));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, filterReturnId);
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],4));
-                                       //replace the x, y BATs with the 
filtered version of them
-                                       delArgument(oldInstrPtr[i], 2);
-                                       setArgument(mb, oldInstrPtr[i], 2, 
projectXReturnId);
-                                       delArgument(oldInstrPtr[i], 3);
-                                       setArgument(mb, oldInstrPtr[i], 3, 
projectYReturnId);
-
-                                       //the new subselect does not use 
candidates
-                                       subselectReturnId = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-                                       setReturnArgument(projectInstrPtr, 
getArg(oldInstrPtr[i+1],0)); //get the variable before changing it
-                                       setReturnArgument(oldInstrPtr[i+1], 
subselectReturnId);
-                                       delArgument(oldInstrPtr[i+1], 2);
-                                       
-                                       //add a new function that gets the oids 
of the original BAT that qualified the distance subselect
-                                       projectInstrPtr = pushArgument(mb, 
projectInstrPtr, subselectReturnId);
-                                       projectInstrPtr = pushArgument(mb, 
projectInstrPtr, filterReturnId);
-                                       
                                        //skip the algebra.subselect command
                                        i++;
 
@@ -122,69 +120,21 @@ int OPTgeospatialImplementation(Client c
                        } else if(strcasecmp(getFunctionId(oldInstrPtr[i]), 
"distance") == 0 && strcasecmp(getFunctionId(oldInstrPtr[i+1]), 
"thetasubselect") == 0) {
                                //I should check the theta comparison. In case 
it is > OR >= then there should be no filtering
                                if(oldInstrPtr[i]->argc == 5) {
-                                       //replace the instruction with the new 
ones
-                                       InstrPtr bufferInstrPtr, 
filterInstrPtr,/* fcnInstrPtr,*/ projectInstrPtr, projectXInstrPtr, 
projectYInstrPtr;
-                                       int bufferReturnId, filterReturnId, 
subselectReturnId, projectXReturnId, projectYReturnId;
+                                       InstrPtr bufferInstrPtr;
+                                       int bufferReturnId;
                                        
-                                       //create and put in the MAL plan the 
new instructions
+                                       //create a buffer that will be used for 
the filter
                                        bufferInstrPtr = newStmt(mb, "geom", 
"Buffer");
-                                       filterInstrPtr = newStmt(mb, "batgeom", 
"Filter");
-                                       projectXInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                             
-                                       projectYInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                             
-                                       //fcnInstrPtr = newStmt(mb, "batgeom", 
"Distance");
-                                       pushInstruction(mb, oldInstrPtr[i]);
-                                       pushInstruction(mb, oldInstrPtr[i+1]);
-                                       projectInstrPtr = newStmt(mb, 
"algebra", "leftfetchjoin");                              
-               
                                        //make new return variables
                                        bufferReturnId = newTmpVariable(mb, 
getArgType(mb, oldInstrPtr[i], 1));
-                                       filterReturnId = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-                                       subselectReturnId = newTmpVariable(mb, 
newBatType(TYPE_oid, TYPE_oid));
-
-                                       //set the arguments for the Buffer
+                                       //set the arguments
                                        setReturnArgument(bufferInstrPtr, 
bufferReturnId);
                                        bufferInstrPtr = pushArgument(mb, 
bufferInstrPtr, getArg(oldInstrPtr[i], 1)); //a TYPE_wkb would be usufull
                                        bufferInstrPtr = pushArgument(mb, 
bufferInstrPtr, getArg(oldInstrPtr[i+1], 3));
+                               
+                                       //call all necessary intructions for 
the filter and the evaluation of the spatial relation      
+                                       createFilterInstruction(mb, 
oldInstrPtr, i, bufferReturnId);
 
-                                       //set the arguments for the Filter
-                                       setReturnArgument(filterInstrPtr, 
filterReturnId);
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, bufferReturnId);
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, getArg(oldInstrPtr[i],2));
-                                       filterInstrPtr = pushArgument(mb, 
filterInstrPtr, getArg(oldInstrPtr[i],3));
-
-                                       //set the arguments for the X, Y 
projections
-                                       projectXReturnId = newVariable(mb, 
GDKstrdup("xBATfiltered"), getArgType(mb,oldInstrPtr[i],2));
-                                       setReturnArgument(projectXInstrPtr, 
projectXReturnId);
-                                       projectXInstrPtr = pushArgument(mb, 
projectXInstrPtr, filterReturnId);
-                                       projectXInstrPtr = pushArgument(mb, 
projectXInstrPtr, getArg(oldInstrPtr[i], 2));
-                                       
-                                       projectYReturnId = newVariable(mb, 
GDKstrdup("yBATfiltered"), getArgType(mb,oldInstrPtr[i],3));
-                                       setReturnArgument(projectYInstrPtr, 
projectYReturnId);
-                                       projectYInstrPtr = pushArgument(mb, 
projectYInstrPtr, filterReturnId);
-                                       projectYInstrPtr = pushArgument(mb, 
projectYInstrPtr, getArg(oldInstrPtr[i], 3));
-
-
-                                       ////set the arguments of the distance 
function
-                                       //setReturnArgument(fcnInstrPtr, 
getArg(oldInstrPtr[i],0));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],1));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],2));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],3));
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, filterReturnId);
-                                       //fcnInstrPtr = pushArgument(mb, 
fcnInstrPtr, getArg(oldInstrPtr[i],4));
-                                       delArgument(oldInstrPtr[i], 2);
-                                       setArgument(mb, oldInstrPtr[i], 2, 
projectXReturnId);
-                                       delArgument(oldInstrPtr[i], 3);
-                                       setArgument(mb, oldInstrPtr[i], 3, 
projectYReturnId);
-
-                                       //the new subselect does not use 
candidates
-                                       setReturnArgument(projectInstrPtr, 
getArg(oldInstrPtr[i+1],0)); //get the variable before changing it
-                                       setReturnArgument(oldInstrPtr[i+1], 
subselectReturnId);
-                                       delArgument(oldInstrPtr[i+1], 2);
-                                       
-                                       //add a new function that gets the oids 
of the original BAT that qualified the distance subselect
-                                       projectInstrPtr = pushArgument(mb, 
projectInstrPtr, subselectReturnId);
-                                       projectInstrPtr = pushArgument(mb, 
projectInstrPtr, filterReturnId);
-                                       
                                        //skip the algebra.thetasubselect 
command
                                        i++;
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to