in src/main/java/org/apache/datasketches/hll/Union.java [353:485]
private static HllSketchImpl unionImpl(final HllSketch source, final HllSketch gadget,
final int lgMaxK) {
assert gadget.getTgtHllType() == HLL_8;
if ((source == null) || source.isEmpty()) {
return gadget.hllSketchImpl;
}
final CurMode srcMode = source.getCurMode();
if (srcMode == CurMode.LIST ) {
source.mergeTo(gadget);
return gadget.hllSketchImpl;
}
final int srcLgK = source.getLgConfigK();
final int gadgetLgK = gadget.getLgConfigK();
final boolean srcIsMem = source.isMemory();
final boolean gdtIsMem = gadget.isMemory();
final boolean gdtEmpty = gadget.isEmpty();
if (srcMode == CurMode.SET ) {
if (gdtEmpty && (srcLgK == gadgetLgK) && (!srcIsMem) && (!gdtIsMem)) {
gadget.hllSketchImpl = source.copyAs(HLL_8).hllSketchImpl;
return gadget.hllSketchImpl;
}
source.mergeTo(gadget);
return gadget.hllSketchImpl;
}
//Hereafter, the source is in HLL mode.
final int bit0 = gdtIsMem ? 1 : 0;
final int bits1_2 = (gdtEmpty ? 3 : gadget.getCurMode().ordinal()) << 1;
final int bit3 = (srcLgK < gadgetLgK) ? 8 : 0;
final int bit4 = (srcLgK > lgMaxK) ? 16 : 0;
final int sw = bit4 | bit3 | bits1_2 | bit0;
HllSketchImpl hllSketchImpl = null; //never returned as null
switch (sw) {
case 0: //src <= max, src >= gdt, gdtLIST, gdtHeap
case 8: //src <= max, src < gdt, gdtLIST, gdtHeap
case 2: //src <= max, src >= gdt, gdtSET, gdtHeap
case 10://src <= max, src < gdt, gdtSET, gdtHeap
{ //Action: copy src, reverse merge w/autofold, ooof=src
final HllSketch srcHll8Heap = source.copyAs(HLL_8);
gadget.mergeTo(srcHll8Heap); //merge gdt(Hll8,heap,list/set) -> src(Hll8,heap,hll)
hllSketchImpl = srcHll8Heap.hllSketchImpl;
break;
}
case 16://src > max, src >= gdt, gdtList, gdtHeap
case 18://src > max, src >= gdt, gdtSet, gdtHeap
{ //Action: downsample src to MaxLgK, reverse merge w/autofold, ooof=src
final HllSketch srcHll8Heap = downsample(source, lgMaxK);
gadget.mergeTo(srcHll8Heap); //merge gdt(Hll8,heap,list/set) -> src(Hll8,heap,hll)
hllSketchImpl = srcHll8Heap.hllSketchImpl;
break;
}
case 1: //src <= max, src >= gdt, gdtLIST, gdtMemory
case 9: //src <= max, src < gdt, gdtLIST, gdtMemory
case 3: //src <= max, src >= gdt, gdtSET, gdtMemory
case 11://src <= max, src < gdt, gdtSET, gdtMemory
{ //Action: copy src, reverse merge w/autofold, use gdt memory, ooof=src
final HllSketch srcHll8Heap = source.copyAs(HLL_8);
gadget.mergeTo(srcHll8Heap); //merge gdt(Hll8,mem,list/set) -> src(Hll8,heap,hll)
hllSketchImpl = useGadgetMemory(gadget, srcHll8Heap, false).hllSketchImpl;
break;
}
case 17://src > max, src >= gdt, gdtList, gdtMemory
case 19://src > max, src >= gdt, gdtSet, gdtMemory
{ //Action: downsample src to MaxLgK, reverse merge w/autofold, use gdt memory, ooof=src
final HllSketch srcHll8Heap = downsample(source, lgMaxK);
gadget.mergeTo(srcHll8Heap); //merge gdt(Hll8,mem,list/set) -> src(Hll8,heap,hll), autofold
hllSketchImpl = useGadgetMemory(gadget, srcHll8Heap, false).hllSketchImpl;
break;
}
case 4: //src <= max, src >= gdt, gdtHLL, gdtHeap
case 20://src > max, src >= gdt, gdtHLL, gdtHeap
case 5: //src <= max, src >= gdt, gdtHLL, gdtMemory
case 21://src > max, src >= gdt, gdtHLL, gdtMemory
{ //Action: forward HLL merge w/autofold, ooof=True
//merge src(Hll4,6,8,heap/mem,Mode=HLL) -> gdt(Hll8,heap,Mode=HLL)
mergeHlltoHLLmode(source, gadget, srcLgK, gadgetLgK, srcIsMem, gdtIsMem);
hllSketchImpl = gadget.putOutOfOrderFlag(true).hllSketchImpl;
break;
}
case 12://src <= max, src < gdt, gdtHLL, gdtHeap
{ //Action: downsample gdt to srcLgK, forward HLL merge w/autofold, ooof=True
final HllSketch gdtHll8Heap = downsample(gadget, srcLgK);
//merge src(Hll4,6,8;heap/mem,Mode=HLL) -> gdt(Hll8,heap,hll)
mergeHlltoHLLmode(source, gdtHll8Heap, srcLgK, gadgetLgK, srcIsMem, false);
hllSketchImpl = gdtHll8Heap.putOutOfOrderFlag(true).hllSketchImpl;
break;
}
case 13://src <= max, src < gdt, gdtHLL, gdtMemory
{ //Action: downsample gdt to srcLgK, forward HLL merge w/autofold, use gdt memory, ooof=True
final HllSketch gdtHll8Heap = downsample(gadget, srcLgK);
//merge src(Hll4,6,8;heap/mem;Mode=HLL) -> gdt(Hll8,heap,Mode=HLL)
mergeHlltoHLLmode(source, gdtHll8Heap, srcLgK, gadgetLgK, srcIsMem, false);
hllSketchImpl = useGadgetMemory(gadget, gdtHll8Heap, true).hllSketchImpl;
break;
}
case 6: //src <= max, src >= gdt, gdtEmpty, gdtHeap
case 14://src <= max, src < gdt, gdtEmpty, gdtHeap
{ //Action: copy src, replace gdt, ooof=src
final HllSketch srcHll8Heap = source.copyAs(HLL_8);
hllSketchImpl = srcHll8Heap.hllSketchImpl;
break;
}
case 22://src > max, src >= gdt, gdtEmpty, gdtHeap
{ //Action: downsample src to lgMaxK, replace gdt, ooof=src
final HllSketch srcHll8Heap = downsample(source, lgMaxK);
hllSketchImpl = srcHll8Heap.hllSketchImpl;
break;
}
case 7: //src <= max, src >= gdt, gdtEmpty, gdtMemory
case 15://src <= max, src < gdt, gdtEmpty, gdtMemory
{ //Action: copy src, use gdt memory, ooof=src
final HllSketch srcHll8Heap = source.copyAs(HLL_8);
hllSketchImpl = useGadgetMemory(gadget, srcHll8Heap, false).hllSketchImpl;
break;
}
case 23://src > max, src >= gdt, gdtEmpty, gdtMemory, replace mem, downsample src, ooof=src
{ //Action: downsample src to lgMaxK, use gdt memory, ooof=src
final HllSketch srcHll8Heap = downsample(source, lgMaxK);
hllSketchImpl = useGadgetMemory(gadget, srcHll8Heap, false).hllSketchImpl;
break;
}
default: return gadget.hllSketchImpl; //not possible
}
return hllSketchImpl;
}