Changeset: 0cb1e805c577 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0cb1e805c577 Modified Files: monetdb5/extras/bwd/operations.c Branch: bwd Log Message:
* fixed single sided selections
Unterschiede (73 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
@@ -434,11 +434,13 @@ static inline unsigned int refinementLoo
const clHead* compressedHead, const clTail* compressedTail, const
unsigned char* residuals, const oid* inputPositions,
const int tailApproximationBytes, const int tailResidualBits,
oid* positionRegion){
+
const int tailApproximationMask = (1<<(tailApproximationBytes*8))-1;
const unsigned int residualMask = (1 << tailResidualBits)-1;
- const unsigned int residualBytes = tailResidualBits/8;
unsigned int i=0, j=0, inputPositionsI = 0;
+
if(1){/* use cpp | egrep -v "^#" | indent | pbcopy to expand */
+
#define refineLoopDoubleOperator(comparator, comparator2,
positionIsTruePositiveCondition, residualPosition) \
while(i < candidateCount) {
\
const unsigned int index = compressedHead->positions[i];
\
@@ -465,14 +467,20 @@ static inline unsigned int refinementLoo
i++;
\
}
\
}
+
#define refineLoopSingleOperator(comparator, positionIsTruePositiveCondition,
residualPosition) \
while(i < candidateCount) {
\
- const unsigned int index = compressedHead->positions[i];
\
- const unsigned int offset = (tailApproximationBytes)*i;
\
- const int compressedValue = *(int*)&(compressedTail->elements[offset])
& tailApproximationMask; \
- const int deCompressedValue = compressedTail->base+
\
- (compressedValue << tailResidualBits)
\
- + (*(unsigned int*)&residuals[residualPosition*residualBytes] &
residualMask); \
+ const unsigned int index = compressedHead->positions[i];
\
+ const int slotI = tailApproximationBytes*8*i/(sizeof(int)*8);
\
+ const int offset =
(tailApproximationBytes*8*i)%(sizeof(int)*8); \
+ const unsigned int compressedValue = (((unsigned
int*)compressedTail->elements)[slotI] >>
(8*sizeof(int)-offset-tailApproximationBytes*8)) & tailApproximationMask; \
+ const size_t residualSlotI =
(residualPosition*tailResidualBits)/32;
\
+ const unsigned int residualOffset =
(residualPosition*tailResidualBits)%32;
\
+ const unsigned int residual = (((unsigned
int*)residuals)[residualSlotI] \
+
>>
(32-residualOffset-tailResidualBits))&residualMask; \
+ const int deCompressedValue = compressedTail->base+
\
+ (compressedValue << tailResidualBits)
\
+ + residual;
\
{
\
const int positionIsCorrectPositive =
\
(positionIsTruePositiveCondition);
\
@@ -482,7 +490,8 @@ static inline unsigned int refinementLoo
inputPositionsI += positionIsCorrectPositive;
\
i++;
\
}
\
-}
+ }
+
#define refineLoop(comparator, comparator2, positionIsTruePositiveCondition,
residualPosition) \
if(comparator2 == NULL) {
\
refineLoopSingleOperator(comparator,
positionIsTruePositiveCondition, residualPosition); \
@@ -506,6 +515,7 @@ static inline unsigned int refinementLoo
refineLoopDoubleOperator(comparator, ==,
positionIsTruePositiveCondition, residualPosition); \
}
\
}
+
switch (OP[0]){
case '<':
switch(OP[1]){
@@ -533,7 +543,8 @@ case '=': {
if(inputPositions == NULL) {refineLoop(==, OP2, 1, index);}
else {refineLoop(==, OP2, (index == inputPositions[inputPositionsI]),
inputPositionsI)};
}
-}
+ }
+
#undef refineLoop
#undef refineLoopSingleOperator
#undef refineLoopDoubleOperator
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
