a whole bunch of fixes and some ugly conversion code

This commit is contained in:
fjy 2014-11-07 16:03:22 -08:00
parent 253009d208
commit 3c21f62afd
4 changed files with 39 additions and 10 deletions

View File

@ -36,10 +36,15 @@ import com.google.common.primitives.Ints;
import com.google.inject.Binder; import com.google.inject.Binder;
import com.google.inject.Injector; import com.google.inject.Injector;
import com.google.inject.Module; import com.google.inject.Module;
import com.metamx.collections.bitmap.BitmapFactory;
import com.metamx.collections.bitmap.ConciseBitmapFactory; import com.metamx.collections.bitmap.ConciseBitmapFactory;
import com.metamx.collections.bitmap.ImmutableBitmap; import com.metamx.collections.bitmap.ImmutableBitmap;
import com.metamx.collections.bitmap.MutableBitmap; import com.metamx.collections.bitmap.MutableBitmap;
import com.metamx.collections.spatial.ImmutablePoint;
import com.metamx.collections.spatial.ImmutableRTree; import com.metamx.collections.spatial.ImmutableRTree;
import com.metamx.collections.spatial.RTree;
import com.metamx.collections.spatial.RTreeUtils;
import com.metamx.collections.spatial.split.LinearGutmanSplitStrategy;
import com.metamx.common.IAE; import com.metamx.common.IAE;
import com.metamx.common.ISE; import com.metamx.common.ISE;
import com.metamx.common.guava.FunctionalIterable; import com.metamx.common.guava.FunctionalIterable;
@ -441,10 +446,25 @@ public class IndexIO
VSizeIndexedInts singleValCol = null; VSizeIndexedInts singleValCol = null;
VSizeIndexed multiValCol = VSizeIndexed.readFromByteBuffer(dimBuffer.asReadOnlyBuffer()); VSizeIndexed multiValCol = VSizeIndexed.readFromByteBuffer(dimBuffer.asReadOnlyBuffer());
GenericIndexed<ImmutableBitmap> bitmaps = bitmapIndexes.get(dimension); GenericIndexed<ImmutableBitmap> bitmaps = bitmapIndexes.get(dimension);
ImmutableRTree spatialIndex = spatialIndexes.get(dimension);
// TODO: this is some UGLY shizzle
// All V8 segments use concise sets for bitmap indexes. Starting in V9, we can optionally choose other // All V8 segments use concise sets for bitmap indexes. Starting in V9, we can optionally choose other
// methods to store and compress these bitmap methods. // methods to store and compress these bitmap methods.
final BitmapFactory bitmapFactory = bitmapSerdeFactory.getBitmapFactory();
if (!(bitmapSerdeFactory instanceof ConciseBitmapSerdeFactory)) { if (!(bitmapSerdeFactory instanceof ConciseBitmapSerdeFactory)) {
if (spatialIndex != null) {
RTree convertedTree = new RTree(2, new LinearGutmanSplitStrategy(0, 50, bitmapFactory), bitmapFactory);
for (ImmutablePoint point : RTreeUtils.getBitmaps(spatialIndex)) {
IntIterator iterator = point.getImmutableBitmap().iterator();
while (iterator.hasNext()) {
convertedTree.insert(point.getCoords(), iterator.next());
}
}
spatialIndex = ImmutableRTree.newImmutableFromMutable(convertedTree);
}
bitmaps = GenericIndexed.fromIterable( bitmaps = GenericIndexed.fromIterable(
FunctionalIterable.create( FunctionalIterable.create(
bitmaps bitmaps
@ -457,13 +477,16 @@ public class IndexIO
ImmutableBitmap bitmap ImmutableBitmap bitmap
) )
{ {
if (bitmap == null) {
return bitmapFactory.makeEmptyImmutableBitmap();
}
IntIterator intIter = bitmap.iterator(); IntIterator intIter = bitmap.iterator();
MutableBitmap mutableBitmap = bitmapSerdeFactory.getBitmapFactory().makeEmptyMutableBitmap(); MutableBitmap mutableBitmap = bitmapFactory.makeEmptyMutableBitmap();
// TODO: is there a faster way to do this? I don't think so // TODO: is there a faster way to do this? I don't think so
while (intIter.hasNext()) { while (intIter.hasNext()) {
mutableBitmap.add(intIter.next()); mutableBitmap.add(intIter.next());
} }
return bitmapSerdeFactory.getBitmapFactory().makeImmutableBitmap(mutableBitmap); return bitmapFactory.makeImmutableBitmap(mutableBitmap);
} }
} }
), ),
@ -471,8 +494,6 @@ public class IndexIO
); );
} }
ImmutableRTree spatialIndex = spatialIndexes.get(dimension);
boolean onlyOneValue = true; boolean onlyOneValue = true;
MutableBitmap nullsSet = null; MutableBitmap nullsSet = null;
for (int i = 0; i < multiValCol.size(); ++i) { for (int i = 0; i < multiValCol.size(); ++i) {
@ -485,7 +506,7 @@ public class IndexIO
} }
if (rowValue.size() == 0) { if (rowValue.size() == 0) {
if (nullsSet == null) { if (nullsSet == null) {
nullsSet = bitmapSerdeFactory.getBitmapFactory().makeEmptyMutableBitmap(); nullsSet = bitmapFactory.makeEmptyMutableBitmap();
} }
nullsSet.add(i); nullsSet.add(i);
} }
@ -496,7 +517,7 @@ public class IndexIO
final boolean bumpedDictionary; final boolean bumpedDictionary;
if (nullsSet != null) { if (nullsSet != null) {
log.info("Dimension[%s] has null rows.", dimension); log.info("Dimension[%s] has null rows.", dimension);
final ImmutableBitmap theNullSet = bitmapSerdeFactory.getBitmapFactory().makeImmutableBitmap(nullsSet); final ImmutableBitmap theNullSet = bitmapFactory.makeImmutableBitmap(nullsSet);
if (dictionary.get(0) != null) { if (dictionary.get(0) != null) {
log.info("Dimension[%s] has no null value in the dictionary, expanding...", dimension); log.info("Dimension[%s] has no null value in the dictionary, expanding...", dimension);
@ -518,8 +539,8 @@ public class IndexIO
bitmaps = GenericIndexed.fromIterable( bitmaps = GenericIndexed.fromIterable(
Iterables.concat( Iterables.concat(
Arrays.asList( Arrays.asList(
bitmapSerdeFactory.getBitmapFactory() bitmapFactory
.union(Arrays.asList(theNullSet, bitmaps.get(0))) .union(Arrays.asList(theNullSet, bitmaps.get(0)))
), ),
Iterables.skip(bitmaps, 1) Iterables.skip(bitmaps, 1)
), ),

View File

@ -26,7 +26,7 @@ import com.metamx.collections.bitmap.ImmutableBitmap;
/** /**
*/ */
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = ConciseBitmapSerdeFactory.class) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = RoaringBitmapSerdeFactory.class)
@JsonSubTypes(value = { @JsonSubTypes(value = {
@JsonSubTypes.Type(name = "concise", value = ConciseBitmapSerdeFactory.class), @JsonSubTypes.Type(name = "concise", value = ConciseBitmapSerdeFactory.class),
@JsonSubTypes.Type(name = "roaring", value = RoaringBitmapSerdeFactory.class) @JsonSubTypes.Type(name = "roaring", value = RoaringBitmapSerdeFactory.class)

View File

@ -44,7 +44,11 @@ public class SpatialFilter implements Filter
@Override @Override
public ImmutableBitmap getBitmapIndex(final BitmapIndexSelector selector) public ImmutableBitmap getBitmapIndex(final BitmapIndexSelector selector)
{ {
return selector.getBitmapFactory().union(selector.getSpatialIndex(dimension).search(bound)); Iterable<ImmutableBitmap> search = selector.getSpatialIndex(dimension).search(bound);
for (ImmutableBitmap immutableBitmap : search) {
System.out.println(immutableBitmap);
}
return selector.getBitmapFactory().union(search);
} }
@Override @Override

View File

@ -50,6 +50,10 @@ public class ArbitraryGranularitySpec implements GranularitySpec
this.queryGranularity = queryGranularity; this.queryGranularity = queryGranularity;
this.intervals = Sets.newTreeSet(Comparators.intervalsByStartThenEnd()); this.intervals = Sets.newTreeSet(Comparators.intervalsByStartThenEnd());
if (inputIntervals == null) {
inputIntervals = Lists.newArrayList();
}
// Insert all intervals // Insert all intervals
for (final Interval inputInterval : inputIntervals) { for (final Interval inputInterval : inputIntervals) {
intervals.add(inputInterval); intervals.add(inputInterval);