From 3eef81bc6551a304e415f9af625ac365c96e8f11 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sat, 4 Oct 2025 21:40:52 +0200 Subject: [PATCH 01/34] Fix handling of output offset in SkippableComposition classes Previously, when outpos passed to headlessUncompress was greater than zero, the second scheme would receive an incorrect number of remaining integers to decode. --- .../SkippableComposition.java | 4 +- .../SkippableIntegratedComposition.java | 4 +- .../SkippableLongComposition.java | 4 +- .../SkippableBasicTest.java | 49 +++++++++++++++++++ .../SkippableLongBasicTest.java | 24 +++++++++ 5 files changed, 82 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/lemire/integercompression/SkippableComposition.java b/src/main/java/me/lemire/integercompression/SkippableComposition.java index 7dd4736..fc3c18e 100644 --- a/src/main/java/me/lemire/integercompression/SkippableComposition.java +++ b/src/main/java/me/lemire/integercompression/SkippableComposition.java @@ -52,12 +52,14 @@ public void headlessCompress(int[] in, IntWrapper inpos, int inlength, int[] out public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, int[] out, IntWrapper outpos, int num) { int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } diff --git a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java index a1379ad..4786ec5 100644 --- a/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java +++ b/src/main/java/me/lemire/integercompression/differential/SkippableIntegratedComposition.java @@ -66,13 +66,15 @@ public void headlessUncompress(int[] in, IntWrapper inpos, int inlength, if (inlength == 0) return; int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos,num,initvalue); } diff --git a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java index 0f9800e..eb03b72 100644 --- a/src/main/java/me/lemire/longcompression/SkippableLongComposition.java +++ b/src/main/java/me/lemire/longcompression/SkippableLongComposition.java @@ -53,12 +53,14 @@ public void headlessCompress(long[] in, IntWrapper inpos, int inlength, long[] o public void headlessUncompress(long[] in, IntWrapper inpos, int inlength, long[] out, IntWrapper outpos, int num) { int init = inpos.get(); + int outposInit = outpos.get(); + F1.headlessUncompress(in, inpos, inlength, out, outpos, num); if (inpos.get() == init) { inpos.increment(); } inlength -= inpos.get() - init; - num -= outpos.get(); + num -= outpos.get() - outposInit; F2.headlessUncompress(in, inpos, inlength, out, outpos, num); } diff --git a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java index 57a07e3..881dada 100644 --- a/src/test/java/me/lemire/integercompression/SkippableBasicTest.java +++ b/src/test/java/me/lemire/integercompression/SkippableBasicTest.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.differential.SkippableIntegratedIntegerCODEC; import org.junit.Test; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; /** @@ -236,4 +237,52 @@ private static void testMaxHeadlessCompressedLength(SkippableIntegerCODEC codec, } } } + + @Test + public void testUncompressOutputOffset_SkippableComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableComposition codec = new SkippableComposition(new BinaryPacking(), new VariableByte()); + + int[] input = { 2, 3, 4, 5 }; + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + int[] uncompressed = new int[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } + + @Test + public void testUncompressOutputOffset_SkippableIntegratedComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableIntegratedComposition codec = new SkippableIntegratedComposition(new IntegratedBinaryPacking(), new IntegratedVariableByte()); + + int[] input = { 2, 3, 4, 5 }; + int[] compressed = new int[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + int[] uncompressed = new int[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + IntWrapper initValue = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset, initValue); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + initValue = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length, initValue); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } } diff --git a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java index 4309e9d..c4b7e01 100644 --- a/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java +++ b/src/test/java/me/lemire/longcompression/SkippableLongBasicTest.java @@ -15,6 +15,7 @@ import me.lemire.integercompression.TestUtils; import me.lemire.integercompression.VariableByte; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; /** @@ -167,4 +168,27 @@ private static void testMaxHeadlessCompressedLength(SkippableLongCODEC codec, in assertTrue(maxOutputLength <= outPos.get() + 1); // +1 because SkippableLongComposition always adds one extra integer for the potential header } } + + @Test + public void testUncompressOutputOffset_SkippableLongComposition() { + for (int offset : new int[] {0, 1, 6}) { + SkippableLongComposition codec = new SkippableLongComposition(new LongBinaryPacking(), new LongVariableByte()); + + long[] input = { 2, 3, 4, 5 }; + long[] compressed = new long[codec.maxHeadlessCompressedLength(new IntWrapper(0), input.length)]; + long[] uncompressed = new long[offset + input.length]; + + IntWrapper inputOffset = new IntWrapper(0); + IntWrapper compressedOffset = new IntWrapper(0); + + codec.headlessCompress(input, inputOffset, input.length, compressed, compressedOffset); + + int compressedLength = compressedOffset.get(); + IntWrapper uncompressedOffset = new IntWrapper(offset); + compressedOffset = new IntWrapper(0); + codec.headlessUncompress(compressed, compressedOffset, compressedLength, uncompressed, uncompressedOffset, input.length); + + assertArrayEquals(input, Arrays.copyOfRange(uncompressed, offset, offset + input.length)); + } + } } From 182f19168793be444c7336a59210247ab63558bb Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 5 Oct 2025 13:02:31 -0400 Subject: [PATCH 02/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 928a3d2..a76e4aa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.3-SNAPSHOT + 0.3.3 jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.3 From 0e6bab01c5f1b4103138afd83aa505322b40a224 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Sun, 5 Oct 2025 13:02:33 -0400 Subject: [PATCH 03/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index a76e4aa..09e48fa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.3 + 0.3.4-SNAPSHOT jar 21 @@ -22,7 +22,7 @@ scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git scm:git:git@github.com:fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.3 + HEAD From 21252a7008ecb9c1cf13df0015eb6aa9d9dd3ce3 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sun, 19 Oct 2025 10:03:08 +0200 Subject: [PATCH 04/34] Include IntelliJ files in .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 88b3320..5a78c84 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ tags target/ tmp/ /bin +.idea +*.iml From aac18eee72ac1c6c6e72a765c9ff906561c6d1d9 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Sun, 19 Oct 2025 10:05:00 +0200 Subject: [PATCH 05/34] Add release action --- .github/release-settings.xml | 20 ++++++++++ .github/workflows/release.yml | 75 +++++++++++++++++++++++++++++++++++ pom.xml | 47 ++++++++++++++++++++-- 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 .github/release-settings.xml create mode 100644 .github/workflows/release.yml diff --git a/.github/release-settings.xml b/.github/release-settings.xml new file mode 100644 index 0000000..be56a53 --- /dev/null +++ b/.github/release-settings.xml @@ -0,0 +1,20 @@ + + + + eu.maveniverse.maven.plugins + + + + + sonatype-central-portal + ${env.MAVEN_USER} + ${env.MAVEN_PASSWORD} + + sonatype-cp + njord:template:release-sca + + + + + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..12e1db6 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,75 @@ +name: Release + +on: + workflow_dispatch: + inputs: + releaseVersion: + description: "Release version, e.g. 0.3.6 (optional — auto-detected from the current POM)" + required: false + +jobs: + release: + runs-on: ubuntu-latest + + steps: + - name: Validate release version + if: ${{ github.event.inputs.releaseVersion != '' }} + run: | + RELEASE=${{ github.event.inputs.releaseVersion }} + if [[ ! $RELEASE =~ ^[0-9]+\.[0-9]+\.[0-9]+(-SNAPSHOT)?$ ]]; then + echo "Error: releaseVersion '$RELEASE' is not in the correct format x.y.z or x.y.z-SNAPSHOT" + exit 1 + fi + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Java + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'adopt' + + - name: Configure git + run: | + git config user.email "actions@github.com" + git config user.name "GitHub Actions" + + - name: Prepare Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + MVN_ARGS="" + if [ -n "${{ github.event.inputs.releaseVersion }}" ]; then + MVN_ARGS="$MVN_ARGS -DreleaseVersion=${{ github.event.inputs.releaseVersion }}" + fi + mvn -B release:prepare $MVN_ARGS + + - name: Determine release version + id: version + run: | + export TAG=$(grep 'scm.tag=' release.properties | cut -d'=' -f2) + export VERSION=${TAG#JavaFastPFOR-} + + echo "released_tag=${TAG}" >> $GITHUB_OUTPUT + echo "released_version=${VERSION}" >> $GITHUB_OUTPUT + + echo "Releasing tag: ${TAG}" + echo "Releasing version: ${VERSION}" + + - name: Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + MAVEN_GPG_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + MAVEN_USER: ${{ secrets.MAVEN_USER }} + MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} + run: | + mvn -B release:perform -Darguments="-DskipTests -Dnjord.autoPublish -s .github/release-settings.xml" + + - name: Create GitHub Release + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/pom.xml b/pom.xml index 09e48fa..2bfe5e8 100644 --- a/pom.xml +++ b/pom.xml @@ -9,6 +9,7 @@ 21 21 UTF-8 + 0.8.5 @@ -19,11 +20,25 @@ - scm:git:git@github.com:fast-pack/JavaFastPFOR.git - scm:git:git@github.com:fast-pack/JavaFastPFOR.git - scm:git:git@github.com:fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git + scm:git:https://github.com/fast-pack/JavaFastPFOR.git HEAD + + + + sonatype-central-portal + Sonatype Central Portal + https://central.sonatype.com/repository/maven-snapshots/ + + + sonatype-central-portal + Sonatype Central Portal + https://repo.maven.apache.org/maven2/ + + + lemire @@ -60,6 +75,13 @@ https://github.com/fast-pack/JavaFastPFOR/issues + + + eu.maveniverse.maven.njord + extension3 + ${njord.version} + + org.apache.maven.plugins @@ -174,10 +196,29 @@ true + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.8 + + + sign-artifacts + verify + + sign + + + + + + eu.maveniverse.maven.plugins + njord + ${njord.version} + maven-clean-plugin 2.5 From 729b2603f6589327df672631d8f46b8689e85cf1 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 05:30:22 +0000 Subject: [PATCH 06/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2bfe5e8..113cbc1 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.4-SNAPSHOT + 0.3.4 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.4 From 53fa8e8fe8afbf8f7bd8354dc7adff5c8f6d74fe Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 05:30:23 +0000 Subject: [PATCH 07/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 113cbc1..139a82d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.4 + 0.3.5-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.4 + HEAD From b1be2d85b9474764cfe9368d402fc5772e49513e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 08:58:56 +0000 Subject: [PATCH 08/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.5 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 139a82d..6ad5a19 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.5-SNAPSHOT + 0.3.5 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.5 From 077c0a2055f6873ba7f9bc84158777886adb4663 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 08:58:58 +0000 Subject: [PATCH 09/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 6ad5a19..67e904f 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.5 + 0.3.6-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.5 + HEAD From 5504fcbe0dcfcb37319e1ebf3d1990932beff3df Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 11:50:26 +0200 Subject: [PATCH 10/34] Set maven-release-plugin goals to deploy --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67e904f..26864d0 100644 --- a/pom.xml +++ b/pom.xml @@ -192,7 +192,7 @@ maven-release-plugin 3.0.1 - install + deploy true From 806a712b063ef14643f554909a127e5bb79fa2b8 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 06:42:52 +0200 Subject: [PATCH 11/34] Add missing env variables in release action --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 12e1db6..8630f07 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,6 +31,8 @@ jobs: with: java-version: '21' distribution: 'adopt' + gpg-private-key: ${{ secrets.GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE - name: Configure git run: | @@ -40,6 +42,7 @@ jobs: - name: Prepare Release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} run: | MVN_ARGS="" if [ -n "${{ github.event.inputs.releaseVersion }}" ]; then From dd8461908ec33cd35fca97e6031b9f11e790109a Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 07:27:13 +0200 Subject: [PATCH 12/34] Allow release action to create tags --- .github/workflows/release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8630f07..79a9686 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -10,6 +10,8 @@ on: jobs: release: runs-on: ubuntu-latest + permissions: + contents: write # to automatically create tags steps: - name: Validate release version From 6b167c42a5c24bbca4768a6ffde3db86d0d77e33 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 10:51:53 +0200 Subject: [PATCH 13/34] Fix njord configuration --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 79a9686..0b2f1c4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -72,7 +72,7 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -Dnjord.autoPublish -s .github/release-settings.xml" + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - name: Create GitHub Release run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" From 12177805238aa06cf1a217bc8837c2b9175b34c1 Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Mon, 20 Oct 2025 10:20:58 +0200 Subject: [PATCH 14/34] [tmp] checkout master --- .github/workflows/release.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b2f1c4..291318f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -27,6 +27,7 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 + ref: master - name: Set up Java uses: actions/setup-java@v4 @@ -74,7 +75,7 @@ jobs: run: | mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# - name: Create GitHub Release +# run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" +# env: +# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9caa716d489848a928279264f585ab66d5e19b3c Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 09:55:40 +0000 Subject: [PATCH 15/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.6 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 26864d0..d8d30c1 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.6-SNAPSHOT + 0.3.6 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.6 From f7ff2bd53b513fa6a82d6f0d02ad598fb9c9c5ff Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 09:55:42 +0000 Subject: [PATCH 16/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d8d30c1..00de0dc 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.6 + 0.3.7-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.6 + HEAD From 1ca1e014e8fe7a1e74bb729944dd95f567bcb710 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 17:44:06 +0000 Subject: [PATCH 17/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.7 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 00de0dc..1c80152 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.7-SNAPSHOT + 0.3.7 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.7 From 6d5b4c926c7ed81edfe4167c118422675c7f7009 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 17:44:07 +0000 Subject: [PATCH 18/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1c80152..f240455 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.7 + 0.3.8-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.7 + HEAD From 1fcfa0b41cb7bd8b8c47a6ae29693f77d9e77273 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 14:08:49 -0400 Subject: [PATCH 19/34] can we make publishing automated ? --- .github/workflows/release.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 291318f..ac28c0f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,9 +73,4 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish" -s .github/release-settings.xml - -# - name: Create GitHub Release -# run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" -# env: -# GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml \ No newline at end of file From eb8f27fdc585aa6b4a570303a288ca8b0bf88690 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 19:30:07 -0400 Subject: [PATCH 20/34] minor change to the random generator (excuse to trigger a release). --- .../lemire/integercompression/synth/UniformDataGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java index bbd386a..a50497c 100644 --- a/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java +++ b/src/main/java/me/lemire/integercompression/synth/UniformDataGenerator.java @@ -42,7 +42,7 @@ int[] generateUniformHash(int N, int Max) { int[] ans = new int[N]; HashSet s = new HashSet(); while (s.size() < N) - s.add(new Integer(this.rand.nextInt(Max))); + s.add(this.rand.nextInt(Max)); Iterator i = s.iterator(); for (int k = 0; k < N; ++k) ans[k] = i.next().intValue(); From 7e7567fda5eb20c7b1df6ea8d2ea33bb1ec6dbf1 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 19:37:00 -0400 Subject: [PATCH 21/34] putting back GitHub Release --- .github/workflows/release.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ac28c0f..29bc28a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -73,4 +73,9 @@ jobs: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }} run: | - mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml \ No newline at end of file + mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml + + - name: Create GitHub Release + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 78c5799dcdd2fac1b11f159f024b4f29562da01e Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 23:49:55 +0000 Subject: [PATCH 22/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.8 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f240455..ac78f6d 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.8-SNAPSHOT + 0.3.8 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.8 From 41fa4c03d500870955db901209d19305e787a5e5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 20 Oct 2025 23:49:56 +0000 Subject: [PATCH 23/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ac78f6d..9b53d0e 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.8 + 0.3.9-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.8 + HEAD From 763bd2ddc61a8e66d39c62bea1b43b0a815e80b4 Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:42:16 -0400 Subject: [PATCH 24/34] update name --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 29bc28a..ec0e674 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -76,6 +76,6 @@ jobs: mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "${{ steps.version.outputs.released_version }}" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 6025cd079eb932617a09b18abbbcbd053e8e17cc Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:43:46 -0400 Subject: [PATCH 25/34] adding a check --- .github/workflows/release.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ec0e674..2098fe9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -53,6 +53,15 @@ jobs: fi mvn -B release:prepare $MVN_ARGS + - name: Check release.properties + run: | + if [ ! -f release.properties ]; then + echo "release.properties not found" + exit 1 + fi + echo "Contents of release.properties:" + cat release.properties + - name: Determine release version id: version run: | From 58b142eaa1795003d54d85c8d872549783af2eff Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 20 Oct 2025 21:47:58 -0400 Subject: [PATCH 26/34] undoing --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2098fe9..d6ad167 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -85,6 +85,6 @@ jobs: mvn -B release:perform -Darguments="-DskipTests -DaltDeploymentRepository=id::default::njord: -Dnjord.autoPublish=true -Dnjord.publishingType=automatic" -s .github/release-settings.xml - name: Create GitHub Release - run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "${{ steps.version.outputs.released_version }}" + run: gh release create "${{ steps.version.outputs.released_tag }}" --generate-notes --title "Version ${{ steps.version.outputs.released_version }}" env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From 8b59184298825781dffb46c6fcb50f3dbd5a055c Mon Sep 17 00:00:00 2001 From: Piotr Rzysko Date: Tue, 21 Oct 2025 06:49:54 +0200 Subject: [PATCH 27/34] Add information about Maven Central to README --- README.md | 66 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 2ef8fc5..8fcd32c 100644 --- a/README.md +++ b/README.md @@ -104,53 +104,62 @@ non-vectorized implementation. For an example usage, see examples/vector/Example.java. The feature requires JDK 19+ and is currently for advanced users. -JavaFastPFOR as a dependency (JitPack) +JavaFastPFOR as a dependency ------------------------ +JavaFastPFOR is available both on Maven Central and JitPack, so you can easily +include it in your project using either source. + We have a demo project using JavaFastPFOR as a dependency (both Maven and Gradle). See... https://github.com/fast-pack/JavaFastPFORDemo -1. **Maven** +### Maven Central + +You can add JavaFastPFOR directly from Maven Central — no extra repository configuration needed: -Using this code in your own project is easy with maven, just add -the following code in your pom.xml file: +**Maven** ```xml - - com.github.fast-pack - JavaFastPFor - JavaFastPFOR-0.3.2 - + + me.lemire.integercompression + JavaFastPFOR + 0.3.8 + ``` -as well as jitpack as a repository... +**Gradle (Groovy)** -```xml - - - jitpack.io - https://jitpack.io - - +```groovy +dependencies { + implementation 'me.lemire.integercompression:JavaFastPFOR:0.3.8' +} ``` -Naturally, you should replace "version" by the version -you desire. +### JitPack +If you prefer or need to use JitPack, you can include the dependency like this: -2. **Gradle (groovy)** +**Maven** +```xml + + + jitpack.io + https://jitpack.io + + + + + com.github.fast-pack + JavaFastPFOR + JavaFastPFOR-0.3.8 + +``` -Then all you need is to edit your `build.gradle` file like so: - +**Gradle (groovy)** ```groovy -plugins { - id 'java' -} - - repositories { mavenCentral() maven { @@ -159,11 +168,10 @@ repositories { } dependencies { - implementation 'com.github.fast-pack:JavaFastPFor:JavaFastPFOR-0.3.2' + implementation 'com.github.fast-pack:JavaFastPFOR:JavaFastPFOR-0.3.8' } ``` - Naturally, you should replace "version" by the version you desire. From 7f2f5fcdf074bc7c5d1c32119d5d32f0320ed34b Mon Sep 17 00:00:00 2001 From: lifeinwild <49356704+lifeinwild@users.noreply.github.com> Date: Sun, 23 Nov 2025 00:02:35 +0900 Subject: [PATCH 28/34] bugfix of LongDelta fix(longdelta): Add support for empty arrays in fastInverseDelta --- .../differential/LongDelta.java | 2 +- .../lemire/longcompression/LongDeltaTest.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 src/test/java/me/lemire/longcompression/LongDeltaTest.java diff --git a/src/main/java/me/lemire/longcompression/differential/LongDelta.java b/src/main/java/me/lemire/longcompression/differential/LongDelta.java index 184e53c..8399f94 100644 --- a/src/main/java/me/lemire/longcompression/differential/LongDelta.java +++ b/src/main/java/me/lemire/longcompression/differential/LongDelta.java @@ -107,7 +107,7 @@ public static void fastinverseDelta(long[] data) { } } - for (; i != data.length; ++i) { + for (; i < data.length; ++i) { data[i] += data[i - 1]; } } diff --git a/src/test/java/me/lemire/longcompression/LongDeltaTest.java b/src/test/java/me/lemire/longcompression/LongDeltaTest.java new file mode 100644 index 0000000..bfa1e6f --- /dev/null +++ b/src/test/java/me/lemire/longcompression/LongDeltaTest.java @@ -0,0 +1,23 @@ +package me.lemire.longcompression; + +import me.lemire.longcompression.differential.LongDelta; +import org.junit.Test; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; + +public class LongDeltaTest { + @Test + public void testEmptyArrayFastInverseDelta() { + LongCompressor compressor = new LongCompressor(); + long[] input = new long[0]; + + LongDelta.delta(input); + long[] compressed = compressor.compress(input); + long[] result = compressor.uncompress(compressed); + LongDelta.fastinverseDelta(result); + + assertNotNull(result); + assertArrayEquals(input, result); + } +} From a4ded943814aa28d26466e821788cbc3b7121a05 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 25 Nov 2025 16:31:26 +0000 Subject: [PATCH 29/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.9 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9b53d0e..769bd98 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.9-SNAPSHOT + 0.3.9 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.9 From 5eb542b2c35dfab1d9a3bb1f8b2e61f0cb4335b2 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 25 Nov 2025 16:31:27 +0000 Subject: [PATCH 30/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 769bd98..2efc724 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.9 + 0.3.10-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.9 + HEAD From 6559221f3c5df38b9e2407294653c19a715e874a Mon Sep 17 00:00:00 2001 From: lifeinwild <49356704+lifeinwild@users.noreply.github.com> Date: Wed, 17 Dec 2025 19:41:32 +0900 Subject: [PATCH 31/34] Export differential packages for JPMS This change makes differential compression algorithms accessible to other JPMS modules, allowing external projects to directly use these variants. --- src/main/java/module-info.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index d254c12..f134601 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -6,5 +6,7 @@ // requires jdk.incubator.vector; exports me.lemire.integercompression; exports me.lemire.longcompression; + exports me.lemire.longcompression.differential; + exports me.lemire.integercompression.differential; // exports me.lemire.integercompression.vector; } From f033dcf93620f9f7afb2170b11da50c5c215345c Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 18 Dec 2025 04:57:54 +0000 Subject: [PATCH 32/34] [maven-release-plugin] prepare release JavaFastPFOR-0.3.10 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2efc724..31d6f61 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.10-SNAPSHOT + 0.3.10 jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - HEAD + JavaFastPFOR-0.3.10 From babc646de163d9b36c852f978d6cc0c30428efa8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Thu, 18 Dec 2025 04:57:55 +0000 Subject: [PATCH 33/34] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 31d6f61..33db8e6 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 me.lemire.integercompression JavaFastPFOR - 0.3.10 + 0.3.11-SNAPSHOT jar 21 @@ -23,7 +23,7 @@ scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git scm:git:https://github.com/fast-pack/JavaFastPFOR.git - JavaFastPFOR-0.3.10 + HEAD From d74e397c35eb70cba8394b0aeedea21500e5d59f Mon Sep 17 00:00:00 2001 From: Daniel Lemire Date: Mon, 22 Dec 2025 16:10:07 -0500 Subject: [PATCH 34/34] adding ref --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 2ef8fc5..490b93c 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,21 @@ API Documentation http://www.javadoc.io/doc/me.lemire.integercompression/JavaFastPFOR/ + +Citing this work +----------------- + +If you use JavaFastPFOR in your work, please consider citing the project. A recommended BibTeX entry is: + +```bibtex +@misc{lemire2025_javafastpfor, + author = {Daniel Lemire}, + title = {{JavaFastPFOR: A simple integer compression library in Java}}, + year = {2025}, + howpublished = {\url{https://github.com/fast-pack/JavaFastPFOR}}, +} +``` + Want to read more? ------------------