This is an automated email from the ASF dual-hosted git repository.

emkornfield pushed a commit to branch production
in repository https://gitbox.apache.org/repos/asf/parquet-site.git


The following commit(s) were added to refs/heads/production by this push:
     new 562de32  Add dates for implementation features. (#144)
562de32 is described below

commit 562de32f40db9d53d9c34d8bfb4279848d3a1c11
Author: emkornfield <[email protected]>
AuthorDate: Fri Dec 19 08:29:21 2025 -0800

    Add dates for implementation features. (#144)
    
    * Add dates for implementation features.
    
    This adds dates to the data model for implementation features.
    
    - It then uses those dates to add hyperlinks to implementation notes
      when available.
    - It creates a new table summarizing implementation status per year
      based on dates.
    - Added an entry to extending BYTE_STREAM_SPLIT to additional types.
    
    The data here was backfilled with AI and spot-checked so it is possible
    some of it might be off.
    
    Co-authored-by: Gang Wu <[email protected]>
---
 .gitignore                                         |   3 +
 .../en/docs/File Format/implementationstatus.md    |   2 +-
 data/implementations/engines.yaml                  | 114 +++++++-
 data/implementations/features/encodings.yaml       |  10 +
 data/implementations/features/format-features.yaml |  12 +
 data/implementations/features/logical-types.yaml   |  12 +
 data/implementations/support/arrow-go.yaml         |  14 +
 data/implementations/support/arrow-rs.yaml         |  16 +
 data/implementations/support/arrow.yaml            |  22 ++
 data/implementations/support/cudf.yaml             |   5 +
 data/implementations/support/duckdb.yaml           |  14 +
 data/implementations/support/hyparquet.yaml        |   2 +
 data/implementations/support/parquet-java.yaml     |   8 +
 layouts/shortcodes/implementation-status.html      | 322 ++++++++++++++++++++-
 14 files changed, 541 insertions(+), 15 deletions(-)

diff --git a/.gitignore b/.gitignore
index 4e348da..b8022ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,6 @@ _vendor/
 *.iml
 out
 
+# Vim swp files
+*.swp
+
diff --git a/content/en/docs/File Format/implementationstatus.md 
b/content/en/docs/File Format/implementationstatus.md
index 7141d9a..1eb0d64 100644
--- a/content/en/docs/File Format/implementationstatus.md       
+++ b/content/en/docs/File Format/implementationstatus.md       
@@ -12,7 +12,7 @@ of this page by opening an issue or submitting a pull request.
 
 ### Legend
 The value in each box means:
-* ✅: supported. Footnote added when support is partial.
+* ✅: supported. Footnote added when support is partial. When data is 
available, links to release notes are provided on the implementing version.
 * ❌: not supported
 * (R): only read support
 * (W): only write support
diff --git a/data/implementations/engines.yaml 
b/data/implementations/engines.yaml
index 4d6fa6e..dde1572 100644
--- a/data/implementations/engines.yaml
+++ b/data/implementations/engines.yaml
@@ -4,7 +4,33 @@
   language: C++
   repo_url: https://github.com/apache/arrow/tree/main/cpp/src/parquet
   docs_url: https://arrow.apache.org/docs/cpp/parquet.html
-  versions: {}
+  versions:
+    default: "18.0.0"
+    releases:
+      "15.0.0":
+        release_date: "2024-01-21"
+        release_notes_url: "https://arrow.apache.org/release/15.0.0.html";
+      "16.0.0":
+        release_date: "2024-04-20"
+        release_notes_url: "https://arrow.apache.org/release/16.0.0.html";
+      "17.0.0":
+        release_date: "2024-07-16"
+        release_notes_url: "https://arrow.apache.org/release/17.0.0.html";
+      "18.0.0":
+        release_date: "2024-10-28"
+        release_notes_url: "https://arrow.apache.org/release/18.0.0.html";
+      "19.0.0":
+        release_date: "2025-01-16"
+        release_notes_url: "https://arrow.apache.org/release/19.0.0.html";
+      "20.0.0":
+        release_date: "2025-04-27"
+        release_notes_url: "https://arrow.apache.org/release/20.0.0.html";
+      "21.0.0":
+        release_date: "2025-07-17"
+        release_notes_url: "https://arrow.apache.org/release/21.0.0.html";
+      "22.0.0":
+        release_date: "2025-10-24"
+        release_notes_url: "https://arrow.apache.org/release/22.0.0.html";
 
 - id: parquet-java
   name: parquet-java
@@ -12,7 +38,18 @@
   language: Java
   repo_url: https://github.com/apache/parquet-java
   docs_url: null
-  versions: {}
+  versions:
+    default: "1.14.1"
+    releases:
+      "1.14.1":
+        release_date: "2024-07-16"
+        release_notes_url: 
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.14.1";
+      "1.15.0":
+        release_date: "2024-12-02"
+        release_notes_url: 
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.15.0";
+      "1.16.0":
+        release_date: "2025-09-03"
+        release_notes_url: 
"https://github.com/apache/parquet-java/releases/tag/apache-parquet-1.16.0";
 
 - id: arrow-go
   name: arrow-go
@@ -20,15 +57,49 @@
   language: Go
   repo_url: https://github.com/apache/arrow-go/tree/main/parquet
   docs_url: null
-  versions: {}
-
+  versions:
+    default: "18.4.0"
+    releases:
+      "18.0.0":
+        release_date: "2024-10-28"
+        release_notes_url: "https://arrow.apache.org/release/18.0.0.html";
+      "18.3.0":
+        release_date: "2024-05-09"
+        release_notes_url: 
"https://github.com/apache/arrow-go/releases/tag/v18.3.0";
+      "18.4.0":
+        release_date: "2025-07-21"
+        release_notes_url: 
"https://github.com/apache/arrow-go/releases/tag/v18.4.0";
+      
 - id: arrow-rs
   name: arrow-rs
   display_name: Apache Arrow Rust
   language: Rust
   repo_url: https://github.com/apache/arrow-rs/blob/main/parquet/README.md
   docs_url: null
-  versions: {}
+  versions:
+    default: "52.2.0"
+    releases:
+      "49.0.0":
+        release_date: "2024-07-28"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/49.0.0";
+      "52.2.0":
+        release_date: "2024-07-28"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/52.2.0";
+      "53.0.0":
+        release_date: "2024-08-31"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/53.0.0";
+      "54.3.0":
+        release_date: "2025-03-17"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/54.3.0";
+      "55.0.0":
+        release_date: "2025-04-08"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/55.0.0";
+      "56.0.0":
+        release_date: "2025-07-29"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/56.0.0";
+      "57.0.0":
+        release_date: "2025-10-19"
+        release_notes_url: 
"https://github.com/apache/arrow-rs/releases/tag/57.0.0";
 
 - id: cudf
   name: cudf
@@ -36,7 +107,18 @@
   language: C++
   repo_url: https://github.com/rapidsai/cudf
   docs_url: null
-  versions: {}
+  versions:
+    default: "25.12.00"
+    releases:
+      "25.04.00":
+        release_date: "2025-04-09"
+        release_notes_url: 
"https://github.com/rapidsai/cudf/releases/tag/v25.04.00";
+      "25.06.00":
+        release_date: "2025-06-05"
+        release_notes_url: 
"https://github.com/rapidsai/cudf/releases/tag/v25.06.00";
+      "25.12.00":
+        release_date: "2025-12-10"
+        release_notes_url: 
"https://github.com/rapidsai/cudf/releases/tag/v25.12.00";
 
 - id: hyparquet
   name: hyparquet
@@ -44,7 +126,12 @@
   language: JavaScript
   repo_url: https://github.com/hyparam/hyparquet
   docs_url: null
-  versions: {}
+  versions:
+    default: "1.23.0"
+    releases:
+      "1.23.0":
+        release_date: "2025-12-10"
+        release_notes_url: 
"https://github.com/hyparam/hyparquet/releases/tag/v1.23.0";
 
 - id: duckdb
   name: duckdb
@@ -52,4 +139,15 @@
   language: C++
   repo_url: https://github.com/duckdb/duckdb
   docs_url: null
-  versions: {}
+  versions:
+    default: "1.4.0"
+    releases:
+      "1.2.0":
+        release_date: "2025-02-05"
+        release_notes_url: 
"https://github.com/duckdb/duckdb/releases/tag/v1.2.0";
+      "1.3.0":
+        release_date: "2025-05-21"
+        release_notes_url: 
"https://github.com/duckdb/duckdb/releases/tag/v1.3.0";
+      "1.4.0":
+        release_date: "2025-09-16"
+        release_notes_url: 
"https://github.com/duckdb/duckdb/releases/tag/v1.4.0";
diff --git a/data/implementations/features/encodings.yaml 
b/data/implementations/features/encodings.yaml
index 485b19b..03614d9 100644
--- a/data/implementations/features/encodings.yaml
+++ b/data/implementations/features/encodings.yaml
@@ -26,3 +26,13 @@ features:
 
   - id: encoding-byte-stream-split
     display_name: BYTE_STREAM_SPLIT
+    format_version:
+      version: "2.8.0"
+      date: "2020-01-13"
+
+  - id: encoding-byte-stream-split-extended
+    display_name: BYTE_STREAM_SPLIT (Additional Types)
+    spec_url: 
https://github.com/apache/parquet-format/commit/e517ac4dbe08d518eb5c2e58576d4c711973db94
+    format_version:
+      version: "2.11.0"
+      date: "2024-03-21"
diff --git a/data/implementations/features/format-features.yaml 
b/data/implementations/features/format-features.yaml
index 703a5d9..5a2dbfa 100644
--- a/data/implementations/features/format-features.yaml
+++ b/data/implementations/features/format-features.yaml
@@ -3,6 +3,9 @@ features:
   - id: format-bloom-filters
     display_name: xxHash-based bloom filters
     spec_url: 
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
+    format_version:
+      version: "2.7.0"
+      date: "2019-09-25"
 
   - id: format-bloom-filter-length
     display_name: Bloom filter length
@@ -14,6 +17,9 @@ features:
   - id: format-page-index
     display_name: Page index
     spec_url: https://github.com/apache/parquet-format/blob/master/PageIndex.md
+    format_version:
+      version: "2.4.0"
+      date: "2018-05-04"
 
   - id: format-page-crc32
     display_name: Page CRC32 checksum
@@ -21,10 +27,16 @@ features:
   - id: format-modular-encryption
     display_name: Modular encryption
     spec_url: 
https://github.com/apache/parquet-format/blob/master/Encryption.md
+    format_version:
+      version: "2.7.0"
+      date: "2019-09-25"
 
   - id: format-size-statistics
     display_name: Size statistics
     note: "In parquet.thrift: ColumnMetaData->size_statistics"
+    format_version:
+      version: "2.10.0"
+      date: "2023-11-20"
 
   - id: format-data-page-v2
     display_name: Data Page V2
diff --git a/data/implementations/features/logical-types.yaml 
b/data/implementations/features/logical-types.yaml
index e6460b0..5d83b0b 100644
--- a/data/implementations/features/logical-types.yaml
+++ b/data/implementations/features/logical-types.yaml
@@ -26,6 +26,9 @@ features:
 
   - id: logical-float16
     display_name: FLOAT16
+    format_version:
+      version: "2.10.0"
+      date: "2023-11-20"
 
   - id: logical-date
     display_name: DATE
@@ -51,14 +54,23 @@ features:
   - id: logical-variant
     display_name: VARIANT
     spec_url: 
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
+    format_version:
+      version: "2.11.0"
+      date: "2025-03-23"
 
   - id: logical-geometry
     display_name: GEOMETRY
     spec_url: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+    format_version:
+      version: "2.11.0"
+      date: "2025-03-23"
 
   - id: logical-geography
     display_name: GEOGRAPHY
     spec_url: 
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+    format_version:
+      version: "2.11.0"
+      date: "2025-03-23"
 
   - id: logical-list
     display_name: LIST
diff --git a/data/implementations/support/arrow-go.yaml 
b/data/implementations/support/arrow-go.yaml
index d957660..a7174c0 100644
--- a/data/implementations/support/arrow-go.yaml
+++ b/data/implementations/support/arrow-go.yaml
@@ -35,6 +35,8 @@ support:
     status: full
   logical-float16:
     status: full
+    since_version_read: "18.4.0"
+    since_version_write: "18.4.0"
   logical-date:
     status: full
   logical-time-int32:
@@ -51,6 +53,8 @@ support:
     status: full
   logical-variant:
     status: full
+    since_version_read: "18.4.0"
+    since_version_write: "18.4.0"
   logical-geometry:
     status: none
   logical-geography:
@@ -79,6 +83,12 @@ support:
     status: full
   encoding-byte-stream-split:
     status: full
+    since_version_read: "18.0.0"
+    since_version_write: "18.0.0"
+  encoding-byte-stream-split-extended:
+    status: full
+    since_version_read: "18.0.0"
+    since_version_write: "18.0.0"
   compression-uncompressed:
     status: full
   compression-brotli:
@@ -97,8 +107,12 @@ support:
     status: full
   format-bloom-filters:
     status: full
+    since_version_read: "18.3.0"
+    since_version_write: "18.3.0"
   format-bloom-filter-length:
     status: full
+    since_version_read: "18.3.0"
+    since_version_write: "18.3.0"
   format-stats-min-max:
     status: full
   format-page-index:
diff --git a/data/implementations/support/arrow-rs.yaml 
b/data/implementations/support/arrow-rs.yaml
index 5873ecc..69b4940 100644
--- a/data/implementations/support/arrow-rs.yaml
+++ b/data/implementations/support/arrow-rs.yaml
@@ -37,6 +37,8 @@ support:
     status: full
   logical-float16:
     status: full
+    since_version_read: "49.0.0"
+    since_version_write: "49.0.0"
   logical-date:
     status: full
   logical-time-int32:
@@ -55,10 +57,16 @@ support:
     note: Only supported to use its annotated physical type
   logical-variant:
     status: full
+    since_version_read: "56.0.0"
+    since_version_write: "56.0.0"
   logical-geometry:
     status: full
+    since_version_read: "57.0.0"
+    since_version_write: "57.0.0"
   logical-geography:
     status: full
+    since_version_read: "57.0.0"
+    since_version_write: "57.0.0"
   logical-list:
     status: full
   logical-map:
@@ -84,6 +92,12 @@ support:
     status: full
   encoding-byte-stream-split:
     status: full
+    since_version_read: "52.2.0"
+    since_version_write: "52.2.0"
+  encoding-byte-stream-split-extended:
+    status: full
+    since_version_read: "53.0.0"
+    since_version_write: "53.0.0"
   compression-uncompressed:
     status: full
   compression-brotli:
@@ -112,6 +126,8 @@ support:
     status: full
   format-modular-encryption:
     status: full
+    since_version_read: "54.3.0"
+    since_version_write: "55.0.0"
   format-size-statistics:
     status: full
   format-data-page-v2:
diff --git a/data/implementations/support/arrow.yaml 
b/data/implementations/support/arrow.yaml
index 12d9f9e..b70a87e 100644
--- a/data/implementations/support/arrow.yaml
+++ b/data/implementations/support/arrow.yaml
@@ -35,6 +35,8 @@ support:
     status: full
   logical-float16:
     status: full
+    since_version_read: "15.0.0"
+    since_version_write: "15.0.0"
   logical-date:
     status: full
   logical-time-int32:
@@ -47,14 +49,20 @@ support:
     status: full
   logical-json:
     status: full
+    since_version_read: "18.0.0"
+    since_version_write: "18.0.0"
   logical-bson:
     status: none
   logical-variant:
     status: unknown
   logical-geometry:
     status: full
+    since_version_read: "21.0.0"
+    since_version_write: "21.0.0"
   logical-geography:
     status: full
+    since_version_read: "21.0.0"
+    since_version_write: "21.0.0"
   logical-list:
     status: full
   logical-map:
@@ -79,6 +87,12 @@ support:
     status: full
   encoding-byte-stream-split:
     status: full
+    since_version_read: "16.0.0"
+    since_version_write: "16.0.0"
+  encoding-byte-stream-split-extended:
+    status: full
+    since_version_read: "16.0.0"
+    since_version_write: "16.0.0"
   compression-uncompressed:
     status: full
   compression-brotli:
@@ -97,18 +111,26 @@ support:
     status: full
   format-bloom-filters:
     status: read
+    since_version_read: "15.0.0"
   format-bloom-filter-length:
     status: read
+    since_version_read: "15.0.0"
   format-stats-min-max:
     status: full
   format-page-index:
     status: full
+    since_version_read: "20.0.0"
+    since_version_write: "20.0.0"
   format-page-crc32:
     status: full
+    since_version_read: "15.0.0"
+    since_version_write: "15.0.0"
   format-modular-encryption:
     status: full
   format-size-statistics:
     status: full
+    since_version_read: "19.0.0"
+    since_version_write: "19.0.0"
   format-data-page-v2:
     status: full
   api-external-column-data:
diff --git a/data/implementations/support/cudf.yaml 
b/data/implementations/support/cudf.yaml
index 973339e..4c4986a 100644
--- a/data/implementations/support/cudf.yaml
+++ b/data/implementations/support/cudf.yaml
@@ -79,6 +79,8 @@ support:
     status: full
   encoding-byte-stream-split:
     status: full
+  encoding-byte-stream-split-extended:
+    status: unknown
   compression-uncompressed:
     status: full
   compression-brotli:
@@ -97,6 +99,7 @@ support:
     status: full
   format-bloom-filters:
     status: read
+    since_version_read: "25.06.00"
   format-bloom-filter-length:
     status: read
   format-stats-min-max:
@@ -119,6 +122,8 @@ support:
     status: full
   api-rowgroup-pruning-bloom:
     status: full
+    since_version_read: "25.06.00"
+    since_version_write: "25.06.00"
   api-column-projection:
     status: full
   api-page-pruning-stats:
diff --git a/data/implementations/support/duckdb.yaml 
b/data/implementations/support/duckdb.yaml
index 8e459b3..6112100 100644
--- a/data/implementations/support/duckdb.yaml
+++ b/data/implementations/support/duckdb.yaml
@@ -35,6 +35,8 @@ support:
     status: full
   logical-float16:
     status: full
+    since_version_read: "1.3.0"
+    since_version_write: "1.3.0"
   logical-date:
     status: full
   logical-time-int32:
@@ -51,10 +53,16 @@ support:
     status: none
   logical-variant:
     status: full
+    since_version_read: "1.4.0"
+    since_version_write: "1.4.0"
   logical-geometry:
     status: full
+    since_version_read: "1.4.0"
+    since_version_write: "1.4.0"
   logical-geography:
     status: full
+    since_version_read: "1.4.0"
+    since_version_write: "1.4.0"
   logical-list:
     status: full
   logical-map:
@@ -73,12 +81,18 @@ support:
     status: none
   encoding-delta-binary-packed:
     status: full
+    since_version_read: "1.2.0"
+    since_version_write: "1.2.0"
   encoding-delta-length-byte-array:
     status: full
   encoding-delta-byte-array:
     status: full
   encoding-byte-stream-split:
     status: full
+  encoding-byte-stream-split-extended:
+    status: full
+    since_version_read: "1.2.0"
+    since_version_write: "1.2.0"
   compression-uncompressed:
     status: full
   compression-brotli:
diff --git a/data/implementations/support/hyparquet.yaml 
b/data/implementations/support/hyparquet.yaml
index a570dbe..48bfc59 100644
--- a/data/implementations/support/hyparquet.yaml
+++ b/data/implementations/support/hyparquet.yaml
@@ -79,6 +79,8 @@ support:
     status: read
   encoding-byte-stream-split:
     status: read
+  encoding-byte-stream-split-extended:
+    status: unknown
   compression-uncompressed:
     status: full
   compression-brotli:
diff --git a/data/implementations/support/parquet-java.yaml 
b/data/implementations/support/parquet-java.yaml
index d6811ee..3430e9a 100644
--- a/data/implementations/support/parquet-java.yaml
+++ b/data/implementations/support/parquet-java.yaml
@@ -55,10 +55,16 @@ support:
     note: Only supported to use its annotated physical type
   logical-variant:
     status: full
+    since_version_read: "1.16.0"
+    since_version_write: "1.16.0"
   logical-geometry:
     status: full
+    since_version_read: "1.16.0"
+    since_version_write: "1.16.0"
   logical-geography:
     status: full
+    since_version_read: "1.16.0"
+    since_version_write: "1.16.0"
   logical-list:
     status: full
   logical-map:
@@ -83,6 +89,8 @@ support:
     status: full
   encoding-byte-stream-split:
     status: full
+  encoding-byte-stream-split-extended:
+    status: full
   compression-uncompressed:
     status: full
   compression-brotli:
diff --git a/layouts/shortcodes/implementation-status.html 
b/layouts/shortcodes/implementation-status.html
index 3113516..0008c44 100644
--- a/layouts/shortcodes/implementation-status.html
+++ b/layouts/shortcodes/implementation-status.html
@@ -55,7 +55,30 @@
               {{- else -}}
                 {{ .display_name }}
               {{- end -}}
-              
+
+              {{- /* Render format version inline if present */ -}}
+              {{- if .format_version -}}
+                {{- $year := "" -}}
+                {{- $dateStr := .format_version.date -}}
+                {{- if hasPrefix $dateStr "2025" -}}
+                  {{- $year = "2025" -}}
+                {{- else if hasPrefix $dateStr "2024" -}}
+                  {{- $year = "2024" -}}
+                {{- else if hasPrefix $dateStr "2023" -}}
+                  {{- $year = "2023" -}}
+                {{- else if hasPrefix $dateStr "2020" -}}
+                  {{- $year = "2020" -}}
+                {{- else if hasPrefix $dateStr "2019" -}}
+                  {{- $year = "2019" -}}
+                {{- else if hasPrefix $dateStr "2018" -}}
+                  {{- $year = "2018" -}}
+                {{- else -}}
+                  {{- $year = substr $dateStr 0 4 -}}
+                {{- end -}}
+                {{- $releaseUrl := printf 
"https://github.com/apache/parquet-format/releases/tag/apache-parquet-format-%s";
 .format_version.version -}}
+                <span class="format-version"> (<a href="{{ $releaseUrl }}">{{ 
$year }}</a>)</span>
+              {{- end -}}
+
               {{- if .note -}}
                {{- $present := false }}
                {{- $noteCounter := 0 -}}
@@ -81,26 +104,28 @@
 
               {{- /* Get support status inline */ -}}
               {{- $supportData := index site.Data.implementations.support 
$engineId -}}
+              {{- $support := false -}}
               {{- $status := "unknown" -}}
               {{- $noteHtml := "" -}}
 
               {{- $noteCounter := 0 -}}
               {{- $newNote := false -}}
               {{- if $supportData -}}
-                {{- $support := index $supportData.support $featureId -}}
+                {{- $support = index $supportData.support $featureId -}}
                 {{- if $support -}}
                   {{- $status = $support.status -}}
                   {{- if $support.note -}}
                      {{- $newNote = true -}}
                      {{- $present := false }}
+                     {{- $currentSupportNote := $support.note -}}
                      {{- range $noteRowIndex, $noteRow :=  $noteMap -}}
-                       {{- $noteStr := $support.note -}}
+                       {{- $noteStr := $currentSupportNote -}}
                        {{- if ne $noteStr (index $noteRow 1)  -}}
                          {{- $noteCounter = add $noteCounter 1 -}}
                        {{- end -}}
                      {{- end -}}
                      {{- if eq $noteCounter (len $noteMap)}}
-                       {{- $noteRow := slice (cast.ToString $noteCounter) 
$support.note $category.id }}
+                       {{- $noteRow := slice (cast.ToString $noteCounter) 
$currentSupportNote $category.id }}
                        {{- if eq (len $noteMap) 0 -}}
                          {{- $noteMap = $noteMap | append (slice $noteRow) -}}
                        {{- else -}}
@@ -113,8 +138,98 @@
               {{- end -}}
 
               {{- $statusInfo := index $legend.symbols $status -}}
+              {{- $releaseNotesUrl := "" -}}
+              {{- $sinceVersion := "" -}}
+              {{- $earlierReleaseNotesUrl := "" -}}
+              {{- $earlierIsRead := false -}}
+
+              {{- /* Determine which version to use based on status */ -}}
+              {{- if $support -}}
+                {{- if eq $status "full" -}}
+                  {{- /* For full support, use the max of read and write 
versions */ -}}
+                  {{- $readVersion := $support.since_version_read -}}
+                  {{- $writeVersion := $support.since_version_write -}}
+
+                  {{- if and $readVersion $writeVersion -}}
+                    {{- /* Find dates to compare */ -}}
+                    {{- $readDate := "" -}}
+                    {{- $writeDate := "" -}}
+                    {{- $currentEngine := . -}}
+
+                    {{- /* Get read version date */ -}}
+                    {{- $readRelease := index $currentEngine.versions.releases 
$readVersion -}}
+                    {{- if $readRelease -}}
+                      {{- $readDate = $readRelease.release_date -}}
+                    {{- end -}}
+
+                    {{- /* Get write version date */ -}}
+                    {{- $writeRelease := index 
$currentEngine.versions.releases $writeVersion -}}
+                    {{- if $writeRelease -}}
+                      {{- $writeDate = $writeRelease.release_date -}}
+                    {{- end -}}
+
+                    {{- /* Use the later version, track earlier if different 
*/ -}}
+                    {{- if and $readDate $writeDate -}}
+                      {{- if gt $writeDate $readDate -}}
+                        {{- $sinceVersion = $writeVersion -}}
+                        {{- if ne $readVersion $writeVersion -}}
+                          {{- $earlierReleaseNotesUrl = 
$readRelease.release_notes_url -}}
+                          {{- $earlierIsRead = true -}}
+                        {{- end -}}
+                      {{- else if lt $writeDate $readDate -}}
+                        {{- $sinceVersion = $readVersion -}}
+                        {{- if ne $readVersion $writeVersion -}}
+                          {{- $earlierReleaseNotesUrl = 
$writeRelease.release_notes_url -}}
+                          {{- $earlierIsRead = false -}}
+                        {{- end -}}
+                      {{- else -}}
+                        {{- $sinceVersion = $readVersion -}}
+                      {{- end -}}
+                    {{- else if $readDate -}}
+                      {{- $sinceVersion = $readVersion -}}
+                    {{- else if $writeDate -}}
+                      {{- $sinceVersion = $writeVersion -}}
+                    {{- end -}}
+                  {{- else if $readVersion -}}
+                    {{- $sinceVersion = $readVersion -}}
+                  {{- else if $writeVersion -}}
+                    {{- $sinceVersion = $writeVersion -}}
+                  {{- end -}}
+                {{- else if eq $status "read" -}}
+                  {{- if $support.since_version_read -}}
+                    {{- $sinceVersion = $support.since_version_read -}}
+                  {{- end -}}
+                {{- else if eq $status "write" -}}
+                  {{- if $support.since_version_write -}}
+                    {{- $sinceVersion = $support.since_version_write -}}
+                  {{- end -}}
+                {{- end -}}
+
+                {{- /* Find the release notes URL for this version */ -}}
+                {{- if $sinceVersion -}}
+                  {{- $currentEngine := . -}}
+                  {{- $release := index $currentEngine.versions.releases 
$sinceVersion -}}
+                  {{- if $release -}}
+                    {{- $releaseNotesUrl = $release.release_notes_url -}}
+                  {{- end -}}
+                {{- end -}}
+              {{- end -}}
+
               <td class="{{ $statusInfo.class }}">
-                {{ $statusInfo.display }}
+                {{- /* Hyperlink status symbol if release notes URL exists */ 
-}}
+                {{- if $releaseNotesUrl -}}
+                  <a href="{{ $releaseNotesUrl }}">{{ $statusInfo.display 
}}</a>
+                  {{- /* Add superscript link for earlier version if different 
*/ -}}
+                  {{- if $earlierReleaseNotesUrl -}}
+                    {{- if $earlierIsRead -}}
+                      <sup><a href="{{ $earlierReleaseNotesUrl }}">R</a></sup>
+                    {{- else -}}
+                      <sup><a href="{{ $earlierReleaseNotesUrl }}">W</a></sup>
+                    {{- end -}}
+                  {{- end -}}
+                {{- else -}}
+                  {{ $statusInfo.display }}
+                {{- end -}}
                 {{- if $newNote -}}
                   <a href="#note-{{ $category.id }}-{{ $noteCounter }}">({{ 
add $noteCounter 1 }})</a>
                 {{- end -}}
@@ -125,7 +240,7 @@
       </tbody>
     </table>
     {{- /* Render footnotes if any */ -}}
-    {{- if gt (len $noteMap) 0 -}}   
+    {{- if gt (len $noteMap) 0 -}}
       <b>Notes:</b>
       {{- range $noteRowIndex, $noteRow := $noteMap }}
         <div id="note-{{ index $noteRow 2}}-{{index $noteRow 0 }}">({{ add 
$noteRowIndex 1}})&nbsp{{ index $noteRow 1 }}</div>
@@ -133,3 +248,198 @@
     {{- end -}}
   {{- end -}}
 {{- end -}}
+
+{{- /* Render minimum version table by year */ -}}
+<h3 id="read-support-by-year"><a href="#read-support-by-year">Minimum Version 
for Read Support by Year</a></h3>
+<p>This table shows the minimum engine version required to read Parquet files 
using features introduced in each year. Only includes compression, encodings, 
physical types, and logical types. Features without a specified format version 
are assumed to have been added prior to 2023.</p>
+
+<p><b>Note:</b> This data was originally collected in December 2025, and not 
all data was backfilled. It is likely older releases of each engine support 
reading all features for 2023 and before. As volunteers have time they are 
invited to add more granular details on releases. Generally, versions are 
expected to be accurate for any year 2025 and after.</p>
+
+{{- /* Collect all features with format_version and group by year */ -}}
+{{- $featuresByYear := dict "2023" (slice) "2024" (slice) "2025" (slice) -}}
+{{- $excludedFeatures := slice "encoding-bit-packed" 
"compression-lz4-deprecated" "compression-lzo" "logical-enum" "logical-uuid" 
"logical-bson" "logical-json" "logical-interval" -}}
+{{- $includedCategories := slice "compressions" "encodings" "physical-types" 
"logical-types" -}}
+
+{{- range $categories -}}
+  {{- $categoryId := .id -}}
+  {{- /* Only include specific categories */ -}}
+  {{- if in $includedCategories $categoryId -}}
+    {{- $featuresData := index site.Data.implementations.features $categoryId 
-}}
+    {{- if $featuresData -}}
+      {{- range $featuresData.features -}}
+        {{- $feature := . -}}
+        {{- /* Skip excluded features */ -}}
+        {{- if not (in $excludedFeatures .id) -}}
+          {{- $year := "" -}}
+          {{- if .format_version -}}
+            {{- $dateStr := .format_version.date -}}
+            {{- if hasPrefix $dateStr "2025" -}}
+              {{- $year = "2025" -}}
+            {{- else if hasPrefix $dateStr "2024" -}}
+              {{- $year = "2024" -}}
+            {{- else -}}
+              {{- $year = "2023" -}}
+            {{- end -}}
+          {{- else -}}
+            {{- /* Features without format_version are assumed pre-2023 */ -}}
+            {{- $year = "2023" -}}
+          {{- end -}}
+
+          {{- $currentList := index $featuresByYear $year -}}
+          {{- $featuresByYear = merge $featuresByYear (dict $year 
($currentList | append $feature)) -}}
+        {{- end -}}
+      {{- end -}}
+    {{- end -}}
+  {{- end -}}
+{{- end -}}
+
+{{- /* Build list of excluded feature names for display */ -}}
+{{- $excludedFeatureNames := slice -}}
+{{- range $categories -}}
+  {{- $categoryId := .id -}}
+  {{- if in $includedCategories $categoryId -}}
+    {{- $featuresData := index site.Data.implementations.features $categoryId 
-}}
+    {{- if $featuresData -}}
+      {{- range $featuresData.features -}}
+        {{- if in $excludedFeatures .id -}}
+          {{- $excludedFeatureNames = $excludedFeatureNames | append 
.display_name -}}
+        {{- end -}}
+      {{- end -}}
+    {{- end -}}
+  {{- end -}}
+{{- end -}}
+
+{{- if gt (len $excludedFeatureNames) 0 -}}
+<p><strong>Note:</strong> The following features are excluded from this table: 
{{ delimit $excludedFeatureNames ", " }}.</p>
+{{- end -}}
+
+{{- /* Calculate minimum version for each engine and year */ -}}
+<table class="table table-striped">
+  <thead>
+    <tr>
+      <th>Engine</th>
+      <th>≤2023 Features</th>
+      <th>2024 Features</th>
+      <th>2025 Features</th>
+    </tr>
+  </thead>
+  <tbody>
+    {{- range $engines -}}
+      {{- $engine := . -}}
+      {{- $engineId := .id -}}
+      {{- $supportData := index site.Data.implementations.support $engineId -}}
+
+      <tr>
+        <td>{{ .display_name }}</td>
+
+        {{- /* Process each year bucket cumulatively */ -}}
+        {{- $cumulativeMinVersion := "" -}}
+        {{- $cumulativeMinReleaseDate := "" -}}
+        {{- $cumulativeMissingFeatures := slice -}}
+        {{- $hasPriorMissingFeatures := false -}}
+
+        {{- range $year := slice "2023" "2024" "2025" -}}
+          {{- $features := index $featuresByYear $year -}}
+          {{- $minVersion := $cumulativeMinVersion -}}
+          {{- $minReleaseDate := $cumulativeMinReleaseDate -}}
+          {{- $releaseNotesUrl := "" -}}
+          {{- $missingFeatures := slice -}}
+
+          {{- /* If prior years had missing features, carry them forward */ -}}
+          {{- if $hasPriorMissingFeatures -}}
+            {{- $missingFeatures = $cumulativeMissingFeatures -}}
+          {{- end -}}
+
+          {{- /* Find minimum version that supports all features in this year 
*/ -}}
+          {{- if $supportData -}}
+            {{- range $features -}}
+              {{- $featureId := .id -}}
+              {{- $support := index $supportData.support $featureId -}}
+
+              {{- /* Check if this feature has full or read support */ -}}
+              {{- if and $support (or (eq $support.status "full") (eq 
$support.status "read")) -}}
+                {{- $featureVersion := "" -}}
+                {{- $featureReleaseDate := "" -}}
+
+                {{- /* Use since_version_read if available, otherwise use 
default version */ -}}
+                {{- if $support.since_version_read -}}
+                  {{- $featureVersion = $support.since_version_read -}}
+
+                  {{- /* Find release date for this version */ -}}
+                  {{- if and $engine.versions $engine.versions.releases -}}
+                    {{- $release := index $engine.versions.releases 
$featureVersion -}}
+                    {{- if $release -}}
+                      {{- $featureReleaseDate = $release.release_date -}}
+                    {{- end -}}
+                  {{- end -}}
+                {{- else if and $engine.versions $engine.versions.default -}}
+                  {{- $featureVersion = $engine.versions.default -}}
+                  {{- if $engine.versions.releases -}}
+                    {{- $release := index $engine.versions.releases 
$featureVersion -}}
+                    {{- if $release -}}
+                      {{- $featureReleaseDate = $release.release_date -}}
+                    {{- end -}}
+                  {{- end -}}
+                {{- end -}}
+
+                {{- /* Update minimum if this is later than current minimum */ 
-}}
+                {{- if $featureVersion -}}
+                  {{- if not $minVersion -}}
+                    {{- $minVersion = $featureVersion -}}
+                    {{- $minReleaseDate = $featureReleaseDate -}}
+                  {{- else if and $featureReleaseDate $minReleaseDate -}}
+                    {{- if gt $featureReleaseDate $minReleaseDate -}}
+                      {{- $minVersion = $featureVersion -}}
+                      {{- $minReleaseDate = $featureReleaseDate -}}
+                    {{- end -}}
+                  {{- end -}}
+                {{- end -}}
+              {{- else -}}
+                {{- /* Feature is not supported or only has write support */ 
-}}
+                {{- $missingFeatures = $missingFeatures | append .display_name 
-}}
+              {{- end -}}
+            {{- end -}}
+
+            {{- /* Find release notes URL for minimum version */ -}}
+            {{- if $minVersion -}}
+              {{- if and $engine.versions $engine.versions.releases -}}
+                {{- $release := index $engine.versions.releases $minVersion -}}
+                {{- if $release -}}
+                  {{- $releaseNotesUrl = $release.release_notes_url -}}
+                {{- end -}}
+              {{- end -}}
+            {{- end -}}
+          {{- end -}}
+
+          {{- /* Update cumulative state for next iteration */ -}}
+          {{- $cumulativeMinVersion = $minVersion -}}
+          {{- $cumulativeMinReleaseDate = $minReleaseDate -}}
+          {{- if gt (len $missingFeatures) 0 -}}
+            {{- $hasPriorMissingFeatures = true -}}
+            {{- $cumulativeMissingFeatures = $missingFeatures -}}
+          {{- end -}}
+
+          <td>
+            {{- if gt (len $missingFeatures) 0 -}}
+              {{- /* Has missing features - show X with tooltip */ -}}
+              {{- $tooltip := delimit $missingFeatures ", " -}}
+              <span class="status-none" title="Missing: {{ $tooltip 
}}">❌</span>
+            {{- else if $minVersion -}}
+              {{- /* Has full support - show version */ -}}
+              {{- if $releaseNotesUrl -}}
+                <a href="{{ $releaseNotesUrl }}">{{ $minVersion }}</a>
+              {{- else -}}
+                {{ $minVersion }}
+              {{- end -}}
+              {{- if $minReleaseDate -}}
+                <br><small>({{ $minReleaseDate }})</small>
+              {{- end -}}
+            {{- else -}}
+              -
+            {{- end -}}
+          </td>
+        {{- end -}}
+      </tr>
+    {{- end -}}
+  </tbody>
+</table>


Reply via email to