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 440fe9c Record implementation status as structured data. (#143)
440fe9c is described below
commit 440fe9c6fcd7c61128d4166434a4486439d58b28
Author: emkornfield <[email protected]>
AuthorDate: Sat Dec 13 21:26:38 2025 -0800
Record implementation status as structured data. (#143)
Converts status page to render data stored in YAML files.
---
.../en/docs/File Format/implementationstatus.md | 151 +--------------------
data/implementations/categories.yaml | 30 ++++
data/implementations/engines.yaml | 55 ++++++++
data/implementations/features/api-features.yaml | 21 +++
data/implementations/features/compressions.yaml | 25 ++++
data/implementations/features/encodings.yaml | 28 ++++
data/implementations/features/format-features.yaml | 31 +++++
data/implementations/features/logical-types.yaml | 70 ++++++++++
data/implementations/features/physical-types.yaml | 26 ++++
data/implementations/legend.yaml | 25 ++++
data/implementations/support/arrow-go.yaml | 128 +++++++++++++++++
data/implementations/support/arrow-rs.yaml | 130 ++++++++++++++++++
data/implementations/support/arrow.yaml | 125 +++++++++++++++++
data/implementations/support/cudf.yaml | 125 +++++++++++++++++
data/implementations/support/duckdb.yaml | 126 +++++++++++++++++
data/implementations/support/hyparquet.yaml | 125 +++++++++++++++++
data/implementations/support/parquet-java.yaml | 129 ++++++++++++++++++
layouts/shortcodes/implementation-status.html | 135 ++++++++++++++++++
18 files changed, 1340 insertions(+), 145 deletions(-)
diff --git a/content/en/docs/File Format/implementationstatus.md
b/content/en/docs/File Format/implementationstatus.md
index 110679e..7141d9a 100644
--- a/content/en/docs/File Format/implementationstatus.md
+++ b/content/en/docs/File Format/implementationstatus.md
@@ -12,12 +12,13 @@ of this page by opening an issue or submitting a pull
request.
### Legend
The value in each box means:
-* ✅: supported
+* ✅: supported. Footnote added when support is partial.
* ❌: not supported
-* (R/W): partial reader/writer only support
+* (R): only read support
+* (W): only write support
* (blank): no data
-Implementations:
+### Implementations
* [arrow](https://github.com/apache/arrow/tree/main/cpp/src/parquet) (C++)
* [parquet-java](https://github.com/apache/parquet-java) (Java)
* [arrow-go](https://github.com/apache/arrow-go/tree/main/parquet) (Go)
@@ -26,145 +27,5 @@ Implementations:
* [hyparquet](https://github.com/hyparam/hyparquet) (JavaScript)
* [duckdb](https://github.com/duckdb/duckdb) (C++)
-### Physical types
-
-Physical types are defined by the [`enum Type` in parquet.thrift]
-
-[`enum Type` in parquet.thrift]:
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L32
-
-
-| Data type | arrow | parquet-java | arrow-go
| arrow-rs | cudf | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | --------
| -------- | ----- | --------- | ------ |
-| BOOLEAN | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| INT32 | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| INT64 | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| INT96 (1) | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | (R) |
-| FLOAT | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| DOUBLE | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| BYTE_ARRAY | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| FIXED_LEN_BYTE_ARRAY | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-
-* \(1) This type is deprecated, but as of 2024 it's common in currently
produced parquet files
-
-
-### Logical types
-
-Logical types are defined by the [`union LogicalType` in parquet.thrift] and
described in [LogicalTypes.md]
-
-[`union LogicalType` in parquet.thrift]:
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L471
-[LogicalTypes.md]:
https://github.com/apache/parquet-format/blob/master/LogicalTypes.md
-
-| Data type | arrow | parquet-java | arrow-go |
arrow-rs | cudf | hyparquet | duckdb |
-|-----------------------------------------|------| ------------- | ------- |
--------- | ---- | -------- |--------|
-| STRING | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| ENUM | ❌ | ✅ | ✅ | ✅
(1) | ❌ | ✅ | ✅ |
-| UUID | ❌ | ✅ | ✅ | ✅
(1) | ❌ | ✅ | ✅ |
-| 8, 16, 32, 64 bit signed and unsigned INT | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| DECIMAL (INT32) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| DECIMAL (INT64) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| DECIMAL (BYTE_ARRAY) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | (R) |
-| DECIMAL (FIXED_LEN_BYTE_ARRAY) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| FLOAT16 | ✅ | ✅ (1) | ✅ | ✅
| ✅ | ✅ | ✅ |
-| DATE | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| TIME (INT32) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| TIME (INT64) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| TIMESTAMP (INT64) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-| INTERVAL | ✅ | ✅ (1) | ✅ | ✅
| ❌ | ✅ | ✅ |
-| JSON | ✅ | ✅ (1) | ✅ | ✅
(1) | ❌ | ✅ | ✅ |
-| BSON | ❌ | ✅ (1) | ✅ | ✅
(1) | ❌ | ❌ | ❌ |
-| [VARIANT] | | ✅ | ✅ | ✅
| ❌ | ❌ | ✅ |
-| [GEOMETRY] | ✅ | ✅ | ❌ | ✅
| ❌ | ✅ | ✅ |
-| [GEOGRAPHY] | ✅ | ✅ | ❌ | ✅
| ❌ | ✅ | ✅ |
-| LIST | ✅ | ✅ | ✅ | ✅
| ✅ | (R) | ✅ |
-| MAP | ✅ | ✅ | ✅ | ✅
| ✅ | (R) | ✅ |
-| UNKNOWN (always null) | ✅ | ✅ | ✅ | ✅
| ✅ | ✅ | ✅ |
-
-* \(1) Only supported to use its annotated physical type
-
-[VARIANT]:
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
-[GEOMETRY]:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
-[GEOGRAPHY]:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
-
-
-### Encodings
-
-Encodings are defined by the [`enum Encoding` in parquet.thrift] and described
in [Encodings.md]
-
-[`enum Encoding` in parquet.thrift]:
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L566
-[Encodings.md]:
https://github.com/apache/parquet-format/blob/master/Encodings.md
-
-| Encoding | arrow | parquet-java | arrow-go
| arrow-rs | cudf | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | --------
| -------- | ----- | --------- | ------ |
-| PLAIN | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| PLAIN_DICTIONARY | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | (R) |
-| RLE_DICTIONARY | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| RLE | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| BIT_PACKED (deprecated) | ✅ | ✅ | ✅ |
❌ (1) | (R) | (R) | ❌ |
-| DELTA_BINARY_PACKED | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-| DELTA_LENGTH_BYTE_ARRAY | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-| DELTA_BYTE_ARRAY | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-| BYTE_STREAM_SPLIT | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-
-* \(1) Partial read support, but only in the case of level data with a
bitwidth of 0
-
-### Compressions
-
-Compressions are defined by the [`enum CompressionCodec` in parquet.thrift]
and described in [Compression.md]
-
-[`enum CompressionCodec` in parquet.thrift]:
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L642
-[Compression.md]:
https://github.com/apache/parquet-format/blob/master/Compression.md
-
-| Compression | arrow | parquet-java | arrow-go
| arrow-rs | cudf | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | --------
| -------- | ----- | --------- | ------ |
-| UNCOMPRESSED | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| BROTLI | ✅ | ✅ | ✅ |
✅ | (R) | (R) | ✅ |
-| GZIP | ✅ | ✅ | ✅ |
✅ | (R) | (R) | ✅ |
-| LZ4 (deprecated) | ✅ | ❌ | ❌ |
✅ | ❌ | (R) | ❌ |
-| LZ4_RAW | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-| LZO | ❌ | ❌ | ❌ |
❌ | ❌ | ❌ | ❌ |
-| SNAPPY | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| ZSTD | ✅ | ✅ | ✅ |
✅ | ✅ | (R) | ✅ |
-
-### Other format level features
-
-| Feature | arrow | parquet-java | arrow-go |
arrow-rs | cudf | hyparquet | duckdb |
-|---------------------------------| ----- | ------------- | -------- |
-------- | ---- | --------- | ------ |
-| [xxHash-based bloom filters] | (R) | ✅ | ✅ | ✅ |
(R) | | ✅ |
-| Bloom filter length (1) | (R) | ✅ | ✅ | ✅ |
(R) | | ✅ |
-| Statistics min_value, max_value | ✅ | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ |
-| [Page index] | ✅ | ✅ | ✅ | ✅ |
✅ | (R) | (R) |
-| Page CRC32 checksum | ✅ | ✅ | ❌ | ✅ |
❌ | ❌ | (R) |
-| [Modular encryption] | ✅ | ✅ | ✅ | ✅ |
❌ | ❌ | ✅ (*) |
-| Size statistics (2) | ✅ | ✅ | (R) | ✅ |
✅ | | (R) |
-| Data Page V2 (3) | ✅ | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ |
-
-* \(1) In [parquet.thrift]: ColumnMetaData->bloom_filter_length
-
-* \(2) In [parquet.thrift]: ColumnMetaData->size_statistics
-
-* \(3) In [parquet.thrift]: DataPageHeaderV2
-
-[xxHash-based bloom filters]:
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
-[parquet.thrift]:
https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift
-[Page index]: https://github.com/apache/parquet-format/blob/master/PageIndex.md
-[Modular encryption]:
https://github.com/apache/parquet-format/blob/master/Encryption.md
-
-
-* (*) Partial support
-
-### High level data APIs for Parquet feature usage
-
-| Feature | arrow | parquet-java | arrow-go
| arrow-rs | cudf | hyparquet | duckdb |
-| ----------------------------------------- | ----- | ------------- | --------
| -------- | ----- | --------- | ------ |
-| External column data (1) | ✅ | ✅ | ❌ |
❌ | (W) | ✅ | ❌ |
-| Row group "Sorting column" metadata (2) | ✅ | ❌ | ✅ |
✅ | (W) | ❌ | (R) |
-| Row group pruning using statistics | ❌ | ✅ | ✅ (*) |
✅ | ✅ | ❌ | ✅ |
-| Row group pruning using bloom filter | ❌ | ✅ | ✅ (*) |
✅ | ✅ | ❌ | ✅ |
-| Reading select columns only | ✅ | ✅ | ✅ |
✅ | ✅ | ✅ | ✅ |
-| Page pruning using statistics | ❌ | ✅ | ✅ (*) |
✅ | ❌ | ❌ | ❌ |
-
-* \(1) In parquet.thrift: ColumnChunk->file_path
-
-* \(2) In parquet.thrift: RowGroup->sorting_columns
-
-* (*) Partial Support
+<!-- Status source in data/implementations -->
+{{< implementation-status >}}
diff --git a/data/implementations/categories.yaml
b/data/implementations/categories.yaml
new file mode 100644
index 0000000..93d9f95
--- /dev/null
+++ b/data/implementations/categories.yaml
@@ -0,0 +1,30 @@
+- id: physical-types
+ name: Physical types
+ description: "Physical types are defined by the [`enum Type` in
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L32)"
+ spec_doc_url: null
+ header: "Data Type"
+
+- id: logical-types
+ header: Data Type
+ name: Logical types
+ description: "Logical types are defined by the [`union LogicalType` in
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L471)
and described in
[LogicalTypes.md](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md)"
+
+- id: encodings
+ header: Encoding
+ name: Encodings
+ description: "Encodings are defined by the [`enum Encoding` in
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L566)
and described in
[Encodings.md](https://github.com/apache/parquet-format/blob/master/Encodings.md)"
+
+- id: compressions
+ header: Compression
+ name: Compression Codecs
+ description: "Compressions are defined by the [`enum CompressionCodec` in
parquet.thrift](https://github.com/apache/parquet-format/blob/master/src/main/thrift/parquet.thrift#L642)
and described in
[Compression.md](https://github.com/apache/parquet-format/blob/master/Compression.md)"
+
+- id: format-features
+ header: Feature
+ name: Other format level features
+ description: null
+
+- id: api-features
+ header: Feature
+ name: High level data APIs for Parquet feature usage
+ description: null
diff --git a/data/implementations/engines.yaml
b/data/implementations/engines.yaml
new file mode 100644
index 0000000..4d6fa6e
--- /dev/null
+++ b/data/implementations/engines.yaml
@@ -0,0 +1,55 @@
+- id: arrow
+ name: arrow
+ display_name: Apache Arrow C++
+ 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: {}
+
+- id: parquet-java
+ name: parquet-java
+ display_name: Parquet Java
+ language: Java
+ repo_url: https://github.com/apache/parquet-java
+ docs_url: null
+ versions: {}
+
+- id: arrow-go
+ name: arrow-go
+ display_name: Apache Arrow Go
+ language: Go
+ repo_url: https://github.com/apache/arrow-go/tree/main/parquet
+ docs_url: null
+ versions: {}
+
+- 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: {}
+
+- id: cudf
+ name: cudf
+ display_name: cuDF
+ language: C++
+ repo_url: https://github.com/rapidsai/cudf
+ docs_url: null
+ versions: {}
+
+- id: hyparquet
+ name: hyparquet
+ display_name: Hyparquet
+ language: JavaScript
+ repo_url: https://github.com/hyparam/hyparquet
+ docs_url: null
+ versions: {}
+
+- id: duckdb
+ name: duckdb
+ display_name: DuckDB
+ language: C++
+ repo_url: https://github.com/duckdb/duckdb
+ docs_url: null
+ versions: {}
diff --git a/data/implementations/features/api-features.yaml
b/data/implementations/features/api-features.yaml
new file mode 100644
index 0000000..2388354
--- /dev/null
+++ b/data/implementations/features/api-features.yaml
@@ -0,0 +1,21 @@
+category_id: api-features
+features:
+ - id: api-external-column-data
+ display_name: External column data
+ note: "In parquet.thrift: ColumnChunk->file_path"
+
+ - id: api-sorting-columns
+ display_name: Row group "Sorting column" metadata
+ note: "In parquet.thrift: RowGroup->sorting_columns"
+
+ - id: api-rowgroup-pruning-stats
+ display_name: Row group pruning using statistics
+
+ - id: api-rowgroup-pruning-bloom
+ display_name: Row group pruning using bloom filter
+
+ - id: api-column-projection
+ display_name: Reading select columns only
+
+ - id: api-page-pruning-stats
+ display_name: Page pruning using statistics
diff --git a/data/implementations/features/compressions.yaml
b/data/implementations/features/compressions.yaml
new file mode 100644
index 0000000..fec73a0
--- /dev/null
+++ b/data/implementations/features/compressions.yaml
@@ -0,0 +1,25 @@
+category_id: compressions
+features:
+ - id: compression-uncompressed
+ display_name: UNCOMPRESSED
+
+ - id: compression-brotli
+ display_name: BROTLI
+
+ - id: compression-gzip
+ display_name: GZIP
+
+ - id: compression-lz4-deprecated
+ display_name: LZ4 (deprecated)
+
+ - id: compression-lz4-raw
+ display_name: LZ4_RAW
+
+ - id: compression-lzo
+ display_name: LZO
+
+ - id: compression-snappy
+ display_name: SNAPPY
+
+ - id: compression-zstd
+ display_name: ZSTD
diff --git a/data/implementations/features/encodings.yaml
b/data/implementations/features/encodings.yaml
new file mode 100644
index 0000000..485b19b
--- /dev/null
+++ b/data/implementations/features/encodings.yaml
@@ -0,0 +1,28 @@
+category_id: encodings
+features:
+ - id: encoding-plain
+ display_name: PLAIN
+
+ - id: encoding-plain-dictionary
+ display_name: PLAIN_DICTIONARY
+
+ - id: encoding-rle-dictionary
+ display_name: RLE_DICTIONARY
+
+ - id: encoding-rle
+ display_name: RLE
+
+ - id: encoding-bit-packed
+ display_name: BIT_PACKED (deprecated)
+
+ - id: encoding-delta-binary-packed
+ display_name: DELTA_BINARY_PACKED
+
+ - id: encoding-delta-length-byte-array
+ display_name: DELTA_LENGTH_BYTE_ARRAY
+
+ - id: encoding-delta-byte-array
+ display_name: DELTA_BYTE_ARRAY
+
+ - id: encoding-byte-stream-split
+ display_name: BYTE_STREAM_SPLIT
diff --git a/data/implementations/features/format-features.yaml
b/data/implementations/features/format-features.yaml
new file mode 100644
index 0000000..703a5d9
--- /dev/null
+++ b/data/implementations/features/format-features.yaml
@@ -0,0 +1,31 @@
+category_id: format-features
+features:
+ - id: format-bloom-filters
+ display_name: xxHash-based bloom filters
+ spec_url:
https://github.com/apache/parquet-format/blob/master/BloomFilter.md
+
+ - id: format-bloom-filter-length
+ display_name: Bloom filter length
+ note: "In parquet.thrift: ColumnMetaData->bloom_filter_length"
+
+ - id: format-stats-min-max
+ display_name: Statistics min_value, max_value
+
+ - id: format-page-index
+ display_name: Page index
+ spec_url: https://github.com/apache/parquet-format/blob/master/PageIndex.md
+
+ - id: format-page-crc32
+ display_name: Page CRC32 checksum
+
+ - id: format-modular-encryption
+ display_name: Modular encryption
+ spec_url:
https://github.com/apache/parquet-format/blob/master/Encryption.md
+
+ - id: format-size-statistics
+ display_name: Size statistics
+ note: "In parquet.thrift: ColumnMetaData->size_statistics"
+
+ - id: format-data-page-v2
+ display_name: Data Page V2
+ note: "In parquet.thrift: DataPageHeaderV2"
diff --git a/data/implementations/features/logical-types.yaml
b/data/implementations/features/logical-types.yaml
new file mode 100644
index 0000000..e6460b0
--- /dev/null
+++ b/data/implementations/features/logical-types.yaml
@@ -0,0 +1,70 @@
+category_id: logical-types
+features:
+ - id: logical-string
+ display_name: STRING
+
+ - id: logical-enum
+ display_name: ENUM
+
+ - id: logical-uuid
+ display_name: UUID
+
+ - id: logical-int-types
+ display_name: 8, 16, 32, 64 bit signed and unsigned INT
+
+ - id: logical-decimal-int32
+ display_name: DECIMAL (INT32)
+
+ - id: logical-decimal-int64
+ display_name: DECIMAL (INT64)
+
+ - id: logical-decimal-byte-array
+ display_name: DECIMAL (BYTE_ARRAY)
+
+ - id: logical-decimal-fixed-len-byte-array
+ display_name: DECIMAL (FIXED_LEN_BYTE_ARRAY)
+
+ - id: logical-float16
+ display_name: FLOAT16
+
+ - id: logical-date
+ display_name: DATE
+
+ - id: logical-time-int32
+ display_name: TIME (INT32)
+
+ - id: logical-time-int64
+ display_name: TIME (INT64)
+
+ - id: logical-timestamp-int64
+ display_name: TIMESTAMP (INT64)
+
+ - id: logical-interval
+ display_name: INTERVAL
+
+ - id: logical-json
+ display_name: JSON
+
+ - id: logical-bson
+ display_name: BSON
+
+ - id: logical-variant
+ display_name: VARIANT
+ spec_url:
https://github.com/apache/parquet-format/blob/master/VariantEncoding.md
+
+ - id: logical-geometry
+ display_name: GEOMETRY
+ spec_url:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+
+ - id: logical-geography
+ display_name: GEOGRAPHY
+ spec_url:
https://github.com/apache/parquet-format/blob/master/Geospatial.md#logical-types
+
+ - id: logical-list
+ display_name: LIST
+
+ - id: logical-map
+ display_name: MAP
+
+ - id: logical-unknown
+ display_name: UNKNOWN (always null)
diff --git a/data/implementations/features/physical-types.yaml
b/data/implementations/features/physical-types.yaml
new file mode 100644
index 0000000..38d1871
--- /dev/null
+++ b/data/implementations/features/physical-types.yaml
@@ -0,0 +1,26 @@
+category_id: physical-types
+features:
+ - id: physical-boolean
+ display_name: BOOLEAN
+
+ - id: physical-int32
+ display_name: INT32
+
+ - id: physical-int64
+ display_name: INT64
+
+ - id: physical-int96
+ display_name: INT96
+ note: "This type is deprecated, but as of 2024 it's common in currently
produced parquet files"
+
+ - id: physical-float
+ display_name: FLOAT
+
+ - id: physical-double
+ display_name: DOUBLE
+
+ - id: physical-byte-array
+ display_name: BYTE_ARRAY
+
+ - id: physical-fixed-len-byte-array
+ display_name: FIXED_LEN_BYTE_ARRAY
diff --git a/data/implementations/legend.yaml b/data/implementations/legend.yaml
new file mode 100644
index 0000000..51400ee
--- /dev/null
+++ b/data/implementations/legend.yaml
@@ -0,0 +1,25 @@
+symbols:
+ full:
+ display: "✅"
+ description: supported
+ class: status-full
+
+ read:
+ display: "(R)"
+ description: partial reader only support
+ class: status-read
+
+ write:
+ display: "(W)"
+ description: partial writer only support
+ class: status-write
+
+ none:
+ display: "❌"
+ description: not supported
+ class: status-none
+
+ unknown:
+ display: ""
+ description: no data
+ class: status-unknown
diff --git a/data/implementations/support/arrow-go.yaml
b/data/implementations/support/arrow-go.yaml
new file mode 100644
index 0000000..d957660
--- /dev/null
+++ b/data/implementations/support/arrow-go.yaml
@@ -0,0 +1,128 @@
+engine_id: arrow-go
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: full
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: full
+ logical-uuid:
+ status: full
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ logical-json:
+ status: full
+ logical-bson:
+ status: full
+ logical-variant:
+ status: full
+ logical-geometry:
+ status: none
+ logical-geography:
+ status: none
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: full
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: full
+ compression-gzip:
+ status: full
+ compression-lz4-deprecated:
+ status: none
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: full
+ format-bloom-filter-length:
+ status: full
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: full
+ format-page-crc32:
+ status: none
+ format-modular-encryption:
+ status: full
+ format-size-statistics:
+ status: read
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: none
+ api-sorting-columns:
+ status: full
+ api-rowgroup-pruning-stats:
+ status: full
+ note: Partial support
+ api-rowgroup-pruning-bloom:
+ status: full
+ note: Partial support
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: full
+ note: Partial support
diff --git a/data/implementations/support/arrow-rs.yaml
b/data/implementations/support/arrow-rs.yaml
new file mode 100644
index 0000000..5873ecc
--- /dev/null
+++ b/data/implementations/support/arrow-rs.yaml
@@ -0,0 +1,130 @@
+engine_id: arrow-rs
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: full
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-uuid:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ logical-json:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-bson:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-variant:
+ status: full
+ logical-geometry:
+ status: full
+ logical-geography:
+ status: full
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: none
+ note: Partial read support, but only in the case of level data with a
bitwidth of 0
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: full
+ compression-gzip:
+ status: full
+ compression-lz4-deprecated:
+ status: full
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: full
+ format-bloom-filter-length:
+ status: full
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: full
+ format-page-crc32:
+ status: full
+ format-modular-encryption:
+ status: full
+ format-size-statistics:
+ status: full
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: none
+ api-sorting-columns:
+ status: full
+ api-rowgroup-pruning-stats:
+ status: full
+ api-rowgroup-pruning-bloom:
+ status: full
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: full
diff --git a/data/implementations/support/arrow.yaml
b/data/implementations/support/arrow.yaml
new file mode 100644
index 0000000..12d9f9e
--- /dev/null
+++ b/data/implementations/support/arrow.yaml
@@ -0,0 +1,125 @@
+engine_id: arrow
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: full
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: none
+ logical-uuid:
+ status: none
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ logical-json:
+ status: full
+ logical-bson:
+ status: none
+ logical-variant:
+ status: unknown
+ logical-geometry:
+ status: full
+ logical-geography:
+ status: full
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: full
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: full
+ compression-gzip:
+ status: full
+ compression-lz4-deprecated:
+ status: full
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: read
+ format-bloom-filter-length:
+ status: read
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: full
+ format-page-crc32:
+ status: full
+ format-modular-encryption:
+ status: full
+ format-size-statistics:
+ status: full
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: full
+ api-sorting-columns:
+ status: full
+ api-rowgroup-pruning-stats:
+ status: none
+ api-rowgroup-pruning-bloom:
+ status: none
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: none
diff --git a/data/implementations/support/cudf.yaml
b/data/implementations/support/cudf.yaml
new file mode 100644
index 0000000..973339e
--- /dev/null
+++ b/data/implementations/support/cudf.yaml
@@ -0,0 +1,125 @@
+engine_id: cudf
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: full
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: none
+ logical-uuid:
+ status: none
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: none
+ logical-json:
+ status: none
+ logical-bson:
+ status: none
+ logical-variant:
+ status: none
+ logical-geometry:
+ status: none
+ logical-geography:
+ status: none
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: read
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: read
+ compression-gzip:
+ status: read
+ compression-lz4-deprecated:
+ status: none
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: read
+ format-bloom-filter-length:
+ status: read
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: full
+ format-page-crc32:
+ status: none
+ format-modular-encryption:
+ status: none
+ format-size-statistics:
+ status: full
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: write
+ api-sorting-columns:
+ status: write
+ api-rowgroup-pruning-stats:
+ status: full
+ api-rowgroup-pruning-bloom:
+ status: full
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: none
diff --git a/data/implementations/support/duckdb.yaml
b/data/implementations/support/duckdb.yaml
new file mode 100644
index 0000000..8e459b3
--- /dev/null
+++ b/data/implementations/support/duckdb.yaml
@@ -0,0 +1,126 @@
+engine_id: duckdb
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: read
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: full
+ logical-uuid:
+ status: full
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: read
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ logical-json:
+ status: full
+ logical-bson:
+ status: none
+ logical-variant:
+ status: full
+ logical-geometry:
+ status: full
+ logical-geography:
+ status: full
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: read
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: none
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: full
+ compression-gzip:
+ status: full
+ compression-lz4-deprecated:
+ status: none
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: full
+ format-bloom-filter-length:
+ status: full
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: read
+ format-page-crc32:
+ status: read
+ format-modular-encryption:
+ status: full
+ note: Partial support
+ format-size-statistics:
+ status: read
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: none
+ api-sorting-columns:
+ status: read
+ api-rowgroup-pruning-stats:
+ status: full
+ api-rowgroup-pruning-bloom:
+ status: full
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: none
diff --git a/data/implementations/support/hyparquet.yaml
b/data/implementations/support/hyparquet.yaml
new file mode 100644
index 0000000..a570dbe
--- /dev/null
+++ b/data/implementations/support/hyparquet.yaml
@@ -0,0 +1,125 @@
+engine_id: hyparquet
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: read
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: full
+ logical-uuid:
+ status: full
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ logical-json:
+ status: full
+ logical-bson:
+ status: none
+ logical-variant:
+ status: none
+ logical-geometry:
+ status: full
+ logical-geography:
+ status: full
+ logical-list:
+ status: read
+ logical-map:
+ status: read
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: read
+ encoding-delta-binary-packed:
+ status: read
+ encoding-delta-length-byte-array:
+ status: read
+ encoding-delta-byte-array:
+ status: read
+ encoding-byte-stream-split:
+ status: read
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: read
+ compression-gzip:
+ status: read
+ compression-lz4-deprecated:
+ status: read
+ compression-lz4-raw:
+ status: read
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: read
+ format-bloom-filters:
+ status: unknown
+ format-bloom-filter-length:
+ status: unknown
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: read
+ format-page-crc32:
+ status: none
+ format-modular-encryption:
+ status: none
+ format-size-statistics:
+ status: unknown
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: full
+ api-sorting-columns:
+ status: none
+ api-rowgroup-pruning-stats:
+ status: none
+ api-rowgroup-pruning-bloom:
+ status: none
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: none
diff --git a/data/implementations/support/parquet-java.yaml
b/data/implementations/support/parquet-java.yaml
new file mode 100644
index 0000000..d6811ee
--- /dev/null
+++ b/data/implementations/support/parquet-java.yaml
@@ -0,0 +1,129 @@
+engine_id: parquet-java
+last_updated: "2025-12-09"
+support:
+ physical-boolean:
+ status: full
+ physical-int32:
+ status: full
+ physical-int64:
+ status: full
+ physical-int96:
+ status: full
+ physical-float:
+ status: full
+ physical-double:
+ status: full
+ physical-byte-array:
+ status: full
+ physical-fixed-len-byte-array:
+ status: full
+ logical-string:
+ status: full
+ logical-enum:
+ status: full
+ logical-uuid:
+ status: full
+ logical-int-types:
+ status: full
+ logical-decimal-int32:
+ status: full
+ logical-decimal-int64:
+ status: full
+ logical-decimal-byte-array:
+ status: full
+ logical-decimal-fixed-len-byte-array:
+ status: full
+ logical-float16:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-date:
+ status: full
+ logical-time-int32:
+ status: full
+ logical-time-int64:
+ status: full
+ logical-timestamp-int64:
+ status: full
+ logical-interval:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-json:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-bson:
+ status: full
+ note: Only supported to use its annotated physical type
+ logical-variant:
+ status: full
+ logical-geometry:
+ status: full
+ logical-geography:
+ status: full
+ logical-list:
+ status: full
+ logical-map:
+ status: full
+ logical-unknown:
+ status: full
+ encoding-plain:
+ status: full
+ encoding-plain-dictionary:
+ status: full
+ encoding-rle-dictionary:
+ status: full
+ encoding-rle:
+ status: full
+ encoding-bit-packed:
+ status: full
+ encoding-delta-binary-packed:
+ status: full
+ encoding-delta-length-byte-array:
+ status: full
+ encoding-delta-byte-array:
+ status: full
+ encoding-byte-stream-split:
+ status: full
+ compression-uncompressed:
+ status: full
+ compression-brotli:
+ status: full
+ compression-gzip:
+ status: full
+ compression-lz4-deprecated:
+ status: none
+ compression-lz4-raw:
+ status: full
+ compression-lzo:
+ status: none
+ compression-snappy:
+ status: full
+ compression-zstd:
+ status: full
+ format-bloom-filters:
+ status: full
+ format-bloom-filter-length:
+ status: full
+ format-stats-min-max:
+ status: full
+ format-page-index:
+ status: full
+ format-page-crc32:
+ status: full
+ format-modular-encryption:
+ status: full
+ format-size-statistics:
+ status: full
+ format-data-page-v2:
+ status: full
+ api-external-column-data:
+ status: full
+ api-sorting-columns:
+ status: none
+ api-rowgroup-pruning-stats:
+ status: full
+ api-rowgroup-pruning-bloom:
+ status: full
+ api-column-projection:
+ status: full
+ api-page-pruning-stats:
+ status: full
diff --git a/layouts/shortcodes/implementation-status.html
b/layouts/shortcodes/implementation-status.html
new file mode 100644
index 0000000..3113516
--- /dev/null
+++ b/layouts/shortcodes/implementation-status.html
@@ -0,0 +1,135 @@
+{{- /*
+ Render implementation status tables from structured data in
`data/implementation`
+ Usage: {{< implementation-status >}}
+*/ -}}
+
+{{- $engines := site.Data.implementations.engines -}}
+{{- $categories := site.Data.implementations.categories -}}
+{{- $legend := site.Data.implementations.legend -}}
+
+
+{{- /* Render each category */ -}}
+{{- range $categories -}}
+
+ {{- $noteMap := slice -}}
+ {{- $category := . -}}
+ {{- $categoryId := .id -}}
+ {{- $featuresData := index site.Data.implementations.features $categoryId -}}
+
+ {{- if $featuresData -}}
+ {{- $features := $featuresData.features -}}
+
+ {{- /* Render category header */ -}}
+ <h3 id="{{ $categoryId }}"><a href="#{{ $categoryId }}">{{ $category.name
}}</a></h3>
+
+ {{- /* Render category description */ -}}
+ {{- if $category.description -}}
+ <p>{{ $category.description | markdownify }}</p>
+ {{- if $category.spec_url -}}
+ <p><a href="{{ $category.spec_url }}"><code>{{ path.Base
$category.spec_url }}</code></a></p>
+ {{- end -}}
+ {{- if $category.spec_doc_url -}}
+ <p><a href="{{ $category.spec_doc_url }}">{{ path.Base
$category.spec_doc_url }}</a></p>
+ {{- end -}}
+ {{- end -}}
+
+ {{- /* Render table */ -}}
+ <table class="table table-striped">
+ <thead>
+ <tr>
+ <th>{{ $category.header }}</th>
+ {{- range $engines -}}
+ <th>{{ .name }}</th>
+ {{- end -}}
+ </tr>
+ </thead>
+ <tbody>
+ {{- range $features -}}
+ {{- $feature := . -}}
+ {{- $featureId := .id -}}
+
+ <tr>
+ <td>
+ {{- if .spec_url -}}
+ <a href="{{ .spec_url }}">{{ .display_name }}</a>
+ {{- else -}}
+ {{ .display_name }}
+ {{- end -}}
+
+ {{- if .note -}}
+ {{- $present := false }}
+ {{- $noteCounter := 0 -}}
+ {{- range $noteRowIndex, $noteRow := $noteMap -}}
+ {{- $noteStr := $feature.note -}}
+ {{- if ne $noteStr (index $noteRow 1) -}}
+ {{- $noteCounter = add $noteCounter 1 -}}
+ {{- end -}}
+ {{- end -}}
+ {{- if eq $noteCounter (len $noteMap)}}
+ {{- $noteRow := slice (cast.ToString $noteCounter) .note
$category.id }}
+ {{- if eq (len $noteMap) 0 -}}
+ {{- $noteMap = $noteMap | append (slice $noteRow) -}}
+ {{- else -}}
+ {{- $noteMap = $noteMap | append $noteRow -}}
+ {{- end -}}
+ {{- end -}}
+ <a href="#note-{{ $category.id }}-{{ $noteCounter }}"><sup>{{
add $noteCounter 1 }}</sup></a>
+ {{- end -}}
+ </td>
+ {{- range $engines -}}
+ {{- $engineId := .id -}}
+
+ {{- /* Get support status inline */ -}}
+ {{- $supportData := index site.Data.implementations.support
$engineId -}}
+ {{- $status := "unknown" -}}
+ {{- $noteHtml := "" -}}
+
+ {{- $noteCounter := 0 -}}
+ {{- $newNote := false -}}
+ {{- if $supportData -}}
+ {{- $support := index $supportData.support $featureId -}}
+ {{- if $support -}}
+ {{- $status = $support.status -}}
+ {{- if $support.note -}}
+ {{- $newNote = true -}}
+ {{- $present := false }}
+ {{- range $noteRowIndex, $noteRow := $noteMap -}}
+ {{- $noteStr := $support.note -}}
+ {{- 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 }}
+ {{- if eq (len $noteMap) 0 -}}
+ {{- $noteMap = $noteMap | append (slice $noteRow) -}}
+ {{- else -}}
+ {{- $noteMap = $noteMap | append $noteRow -}}
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+
+ {{- end -}}
+ {{- end -}}
+
+ {{- $statusInfo := index $legend.symbols $status -}}
+ <td class="{{ $statusInfo.class }}">
+ {{ $statusInfo.display }}
+ {{- if $newNote -}}
+ <a href="#note-{{ $category.id }}-{{ $noteCounter }}">({{
add $noteCounter 1 }})</a>
+ {{- end -}}
+ </td>
+ {{- end -}}
+ </tr>
+ {{- end -}}
+ </tbody>
+ </table>
+ {{- /* Render footnotes if any */ -}}
+ {{- if gt (len $noteMap) 0 -}}
+ <b>Notes:</b>
+ {{- range $noteRowIndex, $noteRow := $noteMap }}
+ <div id="note-{{ index $noteRow 2}}-{{index $noteRow 0 }}">({{ add
$noteRowIndex 1}}) {{ index $noteRow 1 }}</div>
+ {{- end -}}
+ {{- end -}}
+ {{- end -}}
+{{- end -}}