Skip to content

Commit f6e6a33

Browse files
authored
Merge branch 'main' into geospatialStatsAndBboxMetadataSupport
2 parents b19a1cf + 05118c5 commit f6e6a33

164 files changed

Lines changed: 7534 additions & 1629 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/settings.local.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@
118118
"Bash(git reset *)",
119119
"Bash(git ls-tree *)",
120120
"Bash(git fetch *)",
121-
"Bash(gh label *)"
121+
"Bash(gh label *)",
122+
"Bash(git tag *)",
123+
"Bash(git apply *)",
124+
"Bash(gh run *)"
122125
]
123126
}
124127
}

.github/workflows/docs-publish.yml

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#
2+
# SPDX-License-Identifier: Apache-2.0
3+
#
4+
# Copyright The original authors
5+
#
6+
# Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
7+
#
8+
9+
name: Publish versioned documentation
10+
11+
# Manual follow-up to a release: fires the publish-docs repository_dispatch
12+
# at the site repo for a specific version. Run this once any post-release
13+
# touch-ups (blog post link, errata) have landed on a `-docs` tag, so the
14+
# release tag itself stays immutable.
15+
16+
on:
17+
workflow_dispatch:
18+
inputs:
19+
ref:
20+
description: 'Git ref to build from (tag, branch, or SHA — e.g. v1.0.0.Beta2-docs)'
21+
required: true
22+
version:
23+
description: 'Version label on the site (e.g. 1.0.0.Beta2)'
24+
required: true
25+
update-latest:
26+
description: 'Point the site''s "latest" alias at this version (uncheck for back-ports)'
27+
required: true
28+
type: boolean
29+
default: true
30+
31+
jobs:
32+
dispatch:
33+
runs-on: ubuntu-latest
34+
steps:
35+
- name: 'Resolve ref to a commit SHA'
36+
id: resolve
37+
env:
38+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39+
GH_REPO: ${{ github.repository }}
40+
REF: ${{ inputs.ref }}
41+
run: |
42+
SHA=$(gh api "repos/$GH_REPO/commits/$REF" --jq '.sha')
43+
if [ -z "$SHA" ]; then
44+
echo "Could not resolve $REF to a commit"
45+
exit 1
46+
fi
47+
echo "sha=$SHA" >> "$GITHUB_OUTPUT"
48+
49+
- name: 'Fire repository_dispatch to site repo'
50+
env:
51+
GH_TOKEN: ${{ secrets.DOCS_DISPATCH_TOKEN }}
52+
SHA: ${{ steps.resolve.outputs.sha }}
53+
VERSION: ${{ inputs.version }}
54+
UPDATE_LATEST: ${{ inputs.update-latest }}
55+
run: |
56+
jq -n \
57+
--arg ref "$SHA" \
58+
--arg ver "$VERSION" \
59+
--argjson latest "$UPDATE_LATEST" \
60+
'{event_type: "publish-docs", client_payload: {source_ref: $ref, version: $ver, update_latest: $latest}}' \
61+
| gh api repos/hardwood-hq/hardwood-hq.github.io/dispatches --input -

.github/workflows/docs-trigger.yml

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
name: Trigger documentation publish
1010

11+
# Refreshes the `dev` docs after a successful Main Build on main. Versioned
12+
# release docs are published manually via docs-publish.yml once any post-
13+
# release follow-ups (blog post link, etc.) have been added.
14+
1115
on:
12-
push:
13-
tags: ['v*']
1416
workflow_run:
1517
workflows: [Main Build]
1618
types: [completed]
@@ -19,29 +21,15 @@ on:
1921
jobs:
2022
dispatch:
2123
runs-on: ubuntu-latest
22-
if: >-
23-
github.event_name == 'push'
24-
|| github.event.workflow_run.conclusion == 'success'
24+
if: github.event.workflow_run.conclusion == 'success'
2525

2626
steps:
2727
- name: Fire repository_dispatch to site repo
2828
env:
2929
GH_TOKEN: ${{ secrets.DOCS_DISPATCH_TOKEN }}
30+
SHA: ${{ github.event.workflow_run.head_sha }}
3031
run: |
31-
if [ "${{ github.event_name }}" = "push" ]; then
32-
REF="${{ github.ref_name }}"
33-
SHA="${{ github.sha }}"
34-
else
35-
REF="${{ github.event.workflow_run.head_branch }}"
36-
SHA="${{ github.event.workflow_run.head_sha }}"
37-
fi
38-
if [[ "$REF" == v* ]]; then
39-
VERSION_LABEL="${REF#v}"
40-
else
41-
VERSION_LABEL="dev"
42-
fi
4332
jq -n \
4433
--arg ref "$SHA" \
45-
--arg ver "$VERSION_LABEL" \
46-
'{event_type: "publish-docs", client_payload: {source_ref: $ref, version: $ver, update_latest: true}}' \
34+
'{event_type: "publish-docs", client_payload: {source_ref: $ref, version: "dev", update_latest: false}}' \
4735
| gh api repos/hardwood-hq/hardwood-hq.github.io/dispatches --input -

.github/workflows/release.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ jobs:
9797
release-cli:
9898
if: inputs.release-cli
9999
needs: release
100+
permissions:
101+
contents: write
100102
uses: ./.github/workflows/release-cli.yml
101103
with:
102104
release-version: ${{ inputs.release-version }}

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,17 @@ nb-configuration.xml
4242
.venv
4343
.docker-venv
4444
.release-env
45+
__pycache__/
4546
docs/hooks/__pycache__/
4647

4748
# JReleaser
4849
out/
4950
release-output.log
5051

52+
# `hardwood dive --log-file` defaults
53+
dive.log
54+
dive.log.lck
55+
5156
# Extracted CLI distribution artifacts
5257
hardwood-cli-early-access-*/
5358

CLAUDE.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ Before starting new work, check whether a corresponding GitHub issue exists. If
6363
Commit messages must begin with the GitHub issue key (e.g. `#90 Include file name in all exceptions raised during reading`). This applies to every commit, including fixups and amendments.
6464
Focus the body on **why**, not **what** — the diff already shows the what. A short paragraph is usually enough; do not restate the change as a bullet list. See [CONTRIBUTING.md](CONTRIBUTING.md#commit-messages).
6565

66+
# Dive TUI
67+
68+
When changing visual styling in the `hardwood dive` TUI (any code under `cli/src/main/java/dev/hardwood/cli/dive/`), follow the visual-hierarchy decision tree in [_designs/DIVE_THEME.md](_designs/DIVE_THEME.md). Style spans through one of `Theme.primary()` / `Theme.accent()` / `Theme.selection()` / `Theme.dim()`, or leave them at default fg via `Style.EMPTY`. Direct use of `Color.*` constants or literal `Style.EMPTY.bold()` / `Style.EMPTY.fg(...)` outside `Theme.java` is a smell — review against the decision tree before introducing any.
69+
70+
List-shaped screens must build `Row` objects only for the visible viewport, never for the whole collection. Use `RowWindow.bottomPinned(selection, total, viewport)` to derive the slice and pass `window.selectionInWindow()` to `TableState.select(...)`. Building rows for the entire list is invisible on small inputs but turns navigation O(N) on dictionaries with hundreds of thousands of entries, page lists with thousands of pages, or wide-schema files. See [_designs/DIVE_LIST_VIEWPORT_VIRTUALIZATION.md](_designs/DIVE_LIST_VIEWPORT_VIRTUALIZATION.md).
71+
6672
# Code Reviews
6773

6874
When reviewing a pull request, make sure the principles described here are applied.
75+
When asked to review a PR, write the findings to a Markdown file with a `[ ]` checkbox in front of each actionable item. When subsequently asked to address those review remarks, check the items off (`[x]`) as they are resolved.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Goals of the project are:
1010
* Be fast: Be as fast or faster as parquet-java
1111
* Be complete: Add a Parquet file writer (after 1.0)
1212

13-
Latest version: 1.0.0.Beta1, 2026-04-02
13+
Latest version: 1.0.0.Beta2, 2026-04-29
1414

1515
## Documentation
1616

@@ -22,7 +22,7 @@ Full documentation is available at **[hardwood.dev](https://hardwood.dev/)**.
2222
<dependency>
2323
<groupId>dev.hardwood</groupId>
2424
<artifactId>hardwood-core</artifactId>
25-
<version>1.0.0.Beta1</version>
25+
<version>1.0.0.Beta2</version>
2626
</dependency>
2727
```
2828

@@ -32,7 +32,7 @@ import dev.hardwood.reader.ParquetFileReader;
3232
import dev.hardwood.reader.RowReader;
3333

3434
try (ParquetFileReader fileReader = ParquetFileReader.open(InputFile.of(path));
35-
RowReader rowReader = fileReader.createRowReader()) {
35+
RowReader rowReader = fileReader.rowReader()) {
3636

3737
while (rowReader.hasNext()) {
3838
rowReader.next();

RELEASING.md

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,50 @@ Configure the following secrets in the repository settings:
3535
| `JRELEASER_MAVENCENTRAL_USERNAME` | Maven Central (Sonatype) username |
3636
| `JRELEASER_MAVENCENTRAL_TOKEN` | Maven Central (Sonatype) token |
3737

38+
## Preparing the release notes
39+
40+
Before triggering the release, land an `[release] <VERSION> release notes` commit on `main` that updates `docs/content/release-notes.md` with the new section, milestone link, and contributor list.
41+
42+
`tools/contributors.py` produces the contributor line, alphabetised and with display names resolved from each GitHub profile:
43+
44+
```shell
45+
# Two tags: contributors with commits in (<since>, <until>]
46+
tools/contributors.py v1.0.0.Beta1 HEAD
47+
48+
# One tag: contributors up to and including <since> (initial release)
49+
tools/contributors.py v1.0.0.Alpha1
50+
```
51+
52+
It reads commit authors and `Co-authored-by` trailers, skips bots, and resolves emails via `gh api` (so authentication needs to be set up — `gh auth status`). Emails on accounts with email privacy enabled may not resolve; the script reports them on stderr.
53+
3854
## Running the Release
3955

4056
Trigger the `Release` workflow from the GitHub Actions UI with the following inputs:
4157

4258
- **Release version**: The version to release (e.g., `1.0.0`)
4359
- **Development version**: The next snapshot version (e.g., `1.1.0-SNAPSHOT`)
44-
- **Stage**: `UPLOAD` to upload the release to the deploy to the Maven Central portal (you can examine it at https://central.sonatype.com/publishing/deployments then), or `PUBLISH` to publish directly to Maven Central
60+
- **Stage**: `UPLOAD` to upload the release to the deploy to the Maven Central portal (you can examine it at https://central.sonatype.com/publishing/deployments then), or `FULL` to publish directly to Maven Central
4561

46-
To test a staged release, run the following:
62+
To test a staged release, check out the release tag and run:
4763

4864
```shell
49-
MAVEN_CENTRAL_BEARER_TOKEN=`printf "${MAVENCENTRAL_USERNAME}:${MAVENCENTRAL_TOKEN}" | base64` ./mvnw clean verify -pl :hardwood-integration-test -Pcentral.manual.testing -s release-test-settings.xml -Dhardwood.version=<VERSION>
65+
git checkout v<VERSION>
66+
MAVEN_CENTRAL_BEARER_TOKEN=`printf "${MAVENCENTRAL_USERNAME}:${MAVENCENTRAL_TOKEN}" | base64` ./mvnw clean verify -pl :hardwood-integration-test -Pcentral.manual.testing -s release-test-settings.xml
5067
```
68+
69+
## Publishing the documentation
70+
71+
Versioned documentation is published as a manual follow-up to the release, so post-release touch-ups (announcement blog post link, release-notes errata) can be folded in without mutating the release tag itself. The convention is:
72+
73+
1. After the release, write the announcement and add the blog post link plus any errata to `docs/content/release-notes.md` on `main`.
74+
2. Tag that commit `v<VERSION>-docs` and push the tag:
75+
```shell
76+
git tag v<VERSION>-docs
77+
git push origin v<VERSION>-docs
78+
```
79+
3. Run the **Publish versioned documentation** workflow from the GitHub Actions UI with:
80+
- **ref**: `v<VERSION>-docs`
81+
- **version**: `<VERSION>` (e.g. `1.0.0.Beta2`)
82+
- **update-latest**: leave checked for forward releases; uncheck for back-ports of an earlier line that should not displace the newer one.
83+
84+
The workflow fires a `repository_dispatch` at `hardwood-hq/hardwood-hq.github.io`, which builds the site at the resolved commit. The `dev` label is refreshed automatically on every successful Main Build of `main` and never claims `latest`.

ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ A from-scratch implementation of Apache Parquet reader/writer in Java with no de
446446
- [x] Page indexes (OffsetIndex for page scanning, ColumnIndex for page-level predicate filtering)
447447
- [x] Predicate pushdown (row group filtering via statistics, page filtering via ColumnIndex)
448448
- [x] Page-range I/O for filtered reads (only matching pages fetched from remote backends)
449-
- [x] Coalesced reads for remote backends (`ChunkRange`, `RowGroupIndexBuffers`)
449+
- [x] Coalesced reads for remote backends (`ChunkRange`, `RowGroupIndexBuffers`, cross-column `SharedRegion`)
450450
- [ ] Bloom filters
451451
- [x] **Validate**: Performance improvement with filtering
452452

0 commit comments

Comments
 (0)