Browse Source
Merge in CORE/base-third from ~LOY/base-third:feature/10.0 to feature/10.0 * commit '61f0da25748ac54f436a9211687a105ce350d350': 修改信息 修复bug KERNEL-8448 提供RoaringBitmap兼容实现feature/10.0
loy
3 years ago
5 changed files with 219 additions and 0 deletions
@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
<modelVersion>4.0.0</modelVersion> |
||||
|
||||
<parent> |
||||
<groupId>com.fr.third</groupId> |
||||
<artifactId>step1</artifactId> |
||||
<version>${revision}</version> |
||||
<relativePath>../base-third-project/base-third-step1</relativePath> |
||||
</parent> |
||||
|
||||
<artifactId>fine-roaringbitmap</artifactId> |
||||
<version>${revision}</version> |
||||
|
||||
|
||||
</project> |
@ -0,0 +1,194 @@
|
||||
package com.fr.third.bitmap.roaringbitmap; |
||||
|
||||
import java.util.Iterator; |
||||
|
||||
/** |
||||
* Created by loy on 2021/7/13. |
||||
* |
||||
* <p>兼容新引擎插件中用到的这个类,后续会删除 |
||||
*/ |
||||
@Deprecated |
||||
public class RoaringBitmap { |
||||
|
||||
private byte[] value; |
||||
private int length; |
||||
private int cap; |
||||
|
||||
public RoaringBitmap() { |
||||
this(8192); |
||||
} |
||||
|
||||
public RoaringBitmap(int cap) { |
||||
this.cap = cap; |
||||
this.value = new byte[(cap + 7) / 8]; |
||||
} |
||||
|
||||
public void add(int n) { |
||||
checkIndex(n); |
||||
ensureCap(n); |
||||
int idx0 = n / 8; |
||||
int idx1 = n % 8; |
||||
if ((value[idx0] & (1 << idx1)) == 0) { |
||||
length++; |
||||
value[idx0] |= (1 << idx1); |
||||
} |
||||
} |
||||
|
||||
public void remove(int n) { |
||||
checkIndex(n); |
||||
if (n >= value.length * 8) { |
||||
return; |
||||
} |
||||
int idx0 = n / 8; |
||||
int idx1 = n % 8; |
||||
if ((value[idx0] & (1 << idx1)) != 0) { |
||||
length--; |
||||
value[idx0] &= ~(1 << idx1); |
||||
} |
||||
} |
||||
|
||||
public boolean contains(int n) { |
||||
checkIndex(n); |
||||
if (n >= value.length * 8) { |
||||
return false; |
||||
} |
||||
int idx0 = n / 8; |
||||
int idx1 = n % 8; |
||||
return (value[idx0] & (1 << idx1)) != 0; |
||||
} |
||||
|
||||
public void flip(long rangeStart, long rangeEnd) { |
||||
int sIdx0 = (int) ((rangeStart + 7) / 8); |
||||
int sIdx1 = (int) (rangeStart % 8); |
||||
int eIdx0 = (int) (rangeEnd / 8); |
||||
int eIdx1 = (int) (rangeEnd % 8); |
||||
int lenDiff = 0; |
||||
if (sIdx1 > 0) { |
||||
byte b = value[sIdx0 - 1]; |
||||
byte b2 = (byte) (~(b & 0xff) >> sIdx1 << sIdx1 + ((b & 0xff) << (32 - sIdx1) >> (32 - sIdx1))); |
||||
value[sIdx0 - 1] = b2; |
||||
lenDiff += countInByte(b2) - countInByte(b); |
||||
} |
||||
for (int i = sIdx0; i < eIdx0; i++) { |
||||
value[i] = (byte) ~(value[i]); |
||||
lenDiff += countInByte(value[i]) * 2 - 8; |
||||
} |
||||
if (eIdx1 > 0) { |
||||
byte b = value[eIdx0]; |
||||
byte b2 = (byte) (((b & 0xff) >> eIdx1 << eIdx1) + ~(b & 0xff) << (32 - eIdx1) >> (32 - eIdx1)); |
||||
value[eIdx0] = b2; |
||||
lenDiff += countInByte(b2) - countInByte(b); |
||||
} |
||||
length += lenDiff; |
||||
} |
||||
|
||||
public int getCardinality() { |
||||
return length; |
||||
} |
||||
|
||||
@Override |
||||
public RoaringBitmap clone() { |
||||
RoaringBitmap bm = new RoaringBitmap(cap); |
||||
bm.length = length; |
||||
bm.value = new byte[value.length]; |
||||
System.arraycopy(value, 0, bm.value, 0, value.length); |
||||
return bm; |
||||
} |
||||
|
||||
public static RoaringBitmap and(RoaringBitmap bm1, RoaringBitmap bm2) { |
||||
int len = Integer.min(bm1.value.length, bm2.value.length); |
||||
RoaringBitmap bm = new RoaringBitmap(Integer.max(bm1.cap, bm2.cap)); |
||||
bm.value = new byte[len]; |
||||
for (int i = 0; i < len; i++) { |
||||
byte b = (byte) (bm1.value[i] & bm2.value[i]); |
||||
if (b == 0) { |
||||
continue; |
||||
} |
||||
bm.value[i] = b; |
||||
bm.length += countInByte(b); |
||||
} |
||||
return bm; |
||||
} |
||||
|
||||
public static int andCardinality(RoaringBitmap bm1, RoaringBitmap bm2) { |
||||
int len = Integer.min(bm1.value.length, bm2.value.length); |
||||
int count = 0; |
||||
for (int i = 0; i < len; i++) { |
||||
byte b = (byte) (bm1.value[i] & bm2.value[i]); |
||||
if (b == 0) { |
||||
continue; |
||||
} |
||||
count += countInByte(b); |
||||
} |
||||
return count; |
||||
} |
||||
|
||||
public Iterator<Integer> iterator() { |
||||
return new Iterator<Integer>() { |
||||
private int idx0 = 0; |
||||
private int idx1 = 0; |
||||
@Override |
||||
public boolean hasNext() { |
||||
while (idx0 < value.length) { |
||||
if (value[idx0] != 0) { |
||||
byte b = value[idx0]; |
||||
while (idx1 < 8) { |
||||
if ((b & (1 << idx1)) != 0) { |
||||
return true; |
||||
} |
||||
idx1++; |
||||
} |
||||
} |
||||
idx0++; |
||||
idx1 = 0; |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
@Override |
||||
public Integer next() { |
||||
if (hasNext()) { |
||||
int v = idx0 * 8 + idx1; |
||||
idx1++; |
||||
if (idx1 >= 8) { |
||||
idx1 = 0; |
||||
idx0++; |
||||
} |
||||
return v; |
||||
} |
||||
return null; |
||||
} |
||||
}; |
||||
} |
||||
|
||||
private void ensureCap(int n) { |
||||
int idx = (n + 7) / 8; |
||||
int len = value.length; |
||||
while (len < idx) { |
||||
len <<= 1; |
||||
} |
||||
if (len > value.length) { |
||||
byte[] value2 = new byte[len]; |
||||
System.arraycopy(value, 0, value2, 0, value.length); |
||||
value = value2; |
||||
} |
||||
} |
||||
|
||||
private void checkIndex(int n) { |
||||
if (n < 0) { |
||||
throw new ArrayIndexOutOfBoundsException(); |
||||
} |
||||
} |
||||
|
||||
private static int countInByte(byte b) { |
||||
int count = 0; |
||||
while (b != 0) { |
||||
if ((b & 0x01) == 0x01) { |
||||
count++; |
||||
} |
||||
b = (byte) ((b & 0xff) >> 1); |
||||
} |
||||
return count; |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue