Changeset: afbf998b23f2 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=afbf998b23f2
Modified Files:
        monetdb5/extras/bwd/operations.c
        monetdb5/extras/bwd/optimizer.c
Branch: bwd
Log Message:

* using a translucent join for grouping refinement now (instead of an explicit 
left join)


Unterschiede (108 Zeilen):

diff --git a/monetdb5/extras/bwd/operations.c b/monetdb5/extras/bwd/operations.c
--- a/monetdb5/extras/bwd/operations.c
+++ b/monetdb5/extras/bwd/operations.c
@@ -1571,7 +1571,7 @@ str BWDMulticolumnGroupApproximate(Clien
                        result = NOT_DECOMPOSED;
                }
                assert(batTailResidualBits(inputs[i]) == 0); // we don't yet do 
A&R grouping, thus we need all data on the GPU
-
+               assert(batTailPositions(inputs[i]) == 
batTailPositions(inputs[0])); //make sure inputs are projected from the same 
selection
        }
                
        if(result == MAL_SUCCEED){ // get input objects and parameters
@@ -1597,6 +1597,8 @@ str BWDMulticolumnGroupApproximate(Clien
                                groupIDSlot->approximationBits = sizeof(int)*8;
                                groupIDSlot->tailOffsetBits = sizeof(int)*8;
 
+
+                               groupIDSlot->tailPositions = 
batTailPositions(inputs[0]);
                                groupIDSlot->tailApproximation = 
bwdClCreateBuffer(getCLContext(), CL_MEM_READ_WRITE, 
sizeof(int)*newTailDefinition.count+sizeof(clHead), NULL, &err);
                                err = clEnqueueWriteBuffer(getCommandQueue(), 
groupIDSlot->tailApproximation, CL_TRUE, 0, sizeof(clTail), &newTailDefinition, 
0, NULL, NULL); 
                                if(err) printf("#%s, clEnqueueWriteBuffer: 
%s;\n", __func__, clError(err));
@@ -1802,23 +1804,59 @@ str BWDMulticolumnGroupRefine(Client cnt
        int i;
        BAT **inputs = (BAT**) GDKzalloc(sizeof(BAT*) * pci->argc);
 
-       for (i = 0; i < pci->argc-4; ++i){
+       for (i = 0; i < pci->argc-5; ++i){
     inputs[i] = BATdescriptor(*(int*) getArgReference(stk,pci,i+2));
                if (inputs[i] == NULL) 
                        throw(MAL, __func__, RUNTIME_OBJECT_MISSING);
        }
 
        {
-               BAT *approximationrethisto = BATdescriptor(*(int*) 
getArgReference(stk,pci, pci->argc-2));      
-               BAT *approximationretbid = BATdescriptor(*(int*) 
getArgReference(stk,pci,pci->argc-1));
+               BAT *approximationrethisto = BATdescriptor(*(int*) 
getArgReference(stk,pci, pci->argc-3));      
+               BAT *approximationretbid = BATdescriptor(*(int*) 
getArgReference(stk,pci,pci->argc-2));
+               BAT *refinedOIDs = BATdescriptor(*(int*) 
getArgReference(stk,pci,pci->argc-1));
                /* BBPincref(*retbid = 
materializeBATInHostMemory(approximationretbid)->batCacheid, 1); */
                /* BBPincref(*rethisto = 
materializeBATInHostMemory(approximationrethisto)->batCacheid, 1); */
-               BBPkeepref(*retbid = 
materializeBATInHostMemory(approximationretbid)->batCacheid);
+               assert(batTailResidualBits(approximationretbid) == 0);
+               {
+                       unsigned int count = 
getCount(batTailApproximation(approximationretbid));
+                       BAT* result = BATnew(BAThtype(approximationretbid), 
BATttype(approximationretbid), count);
+                       clHead* positionsColumn;
+                       size_t bufferSize;
+                       
getPositionsColumn(batTailPositions(approximationretbid), NULL, &bufferSize);
+                       positionsColumn = 
getPositionsColumn(batTailPositions(approximationretbid), 
GDKmalloc(bufferSize), &bufferSize);
+                       assert(count == positionsColumn->count);
+                       BATseqbase(result, 0);
+                       {
+                               register oid* outputRegion = (oid*) 
Tloc(result, BUNfirst(result));
+                               unsigned int i, outI, refinedPositionsI;
+               
+                               clTail* valueColumn;
+                               size_t bufferSize;
+                               
getApproximateValuesColumn(batTailApproximation(approximationretbid), NULL, 
&bufferSize);
+                               valueColumn = 
getApproximateValuesColumn(batTailApproximation(approximationretbid), 
GDKmalloc(bufferSize), &bufferSize);
+                               assert(count == valueColumn->count);
+                               for (i = outI = refinedPositionsI = 0; i < 
count; i++)  {
+                                       outputRegion[outI] = ((unsigned 
int*)valueColumn->elements)[i];
+                                       outI += (positionsColumn->positions[i] 
== ((oid*)refinedOIDs->T->heap.base)[refinedPositionsI]);
+                                       refinedPositionsI += 
(positionsColumn->positions[i] == 
((oid*)refinedOIDs->T->heap.base)[refinedPositionsI]);
+                               }
+                               count = outI;
+                                       
+                       }
+                       BATsetcount(result, count);
+                       if(BAThtype(result) != TYPE_void)
+                               result->hsorted = FALSE;
+                       if(BATttype(result) != TYPE_void)
+                               result->tsorted = FALSE;
+                       BBPkeepref(*retbid = result->batCacheid);
+               }
+               
                BBPkeepref(*rethisto = 
materializeBATInHostMemory(approximationrethisto)->batCacheid);
                BBPreleaseref(approximationrethisto->batCacheid);
                BBPreleaseref(approximationretbid->batCacheid);
+               BBPreleaseref(refinedOIDs->batCacheid);
        }
-       for (i = 0; i< pci->argc-4; ++i)
+       for (i = 0; i< pci->argc-5; ++i)
                BBPreleaseref(inputs[i]->batCacheid);    
        
        return result;
diff --git a/monetdb5/extras/bwd/optimizer.c b/monetdb5/extras/bwd/optimizer.c
--- a/monetdb5/extras/bwd/optimizer.c
+++ b/monetdb5/extras/bwd/optimizer.c
@@ -139,16 +139,11 @@ static inline int OPTBWDImplementation(C
                                for (j = 0; j < oldProgram[i]->retc; ++j) 
                                        /* refineLeftjoin = 
pushReturn(malBlock, refineLeftjoin, getArg(oldProgram[i], j)); */
                                        refineLeftjoin = pushArgument(malBlock, 
refineLeftjoin, approximations[getArg(oldProgram[i], j)]);
+                               if(match_function(oldProgram[i], groupRef, 
multicolumnsRef))
+                                       refineLeftjoin = pushArgument(malBlock, 
refineLeftjoin, leftJoinResultLeftInputs[getArg(oldProgram[i], 2)]);
                                pushInstruction(malBlock, refineLeftjoin);
                                if(match_function(oldProgram[i], algebraRef, 
leftjoinRef)){
                                        
leftJoinResultLeftInputs[getDestVar(refineLeftjoin)] = getArg(refineLeftjoin, 
1);
-                               } else if(match_function(oldProgram[i], 
groupRef, multicolumnsRef)){
-                                       InstrPtr groupReduction = 
newInstruction(malBlock, ASSIGNsymbol);
-                                       rename_function(groupReduction, 
GDKstrdup(algebraRef), GDKstrdup(leftjoinRef), (int[]){0}, client);
-                                       groupReduction = pushReturn(malBlock, 
groupReduction, getArg(oldProgram[i], 1));
-                                       groupReduction = pushArgument(malBlock, 
groupReduction, leftJoinResultLeftInputs[getArg(oldProgram[i], 2)]);
-                                       groupReduction = pushArgument(malBlock, 
groupReduction, getArg(oldProgram[i], 1));
-                                       pushInstruction(malBlock, 
groupReduction);
                                }
                        }
                } else {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to