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

roryqi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new c10d51ab76 [MINOR] docs: Add hierarchical schema documentation and 
OpenAPI (#11203)
c10d51ab76 is described below

commit c10d51ab766976e5e68af70e079c1aa90b989195
Author: roryqi <[email protected]>
AuthorDate: Mon May 25 11:50:38 2026 +0800

    [MINOR] docs: Add hierarchical schema documentation and OpenAPI (#11203)
    
    ### What changes were proposed in this pull request?
    
    Add user-facing documentation and OpenAPI for the hierarchical
    (multi-level) schema feature:
    
    - **OpenAPI** (`docs/open-api/schemas.yaml`): add the optional
    `parentSchema` query parameter to `listSchemas`, and note that a schema
    name may encode a nested path joined by the configured separator.
    - **Server config** (`docs/gravitino-server-config.md`): new Schema
    configuration subsection documenting `gravitino.schema.separator`
    (default `:`, since 1.3.0).
    - **Schema management guide**
    (`docs/manage-relational-metadata-using-gravitino.md`):
    - **Iceberg docs** (`docs/iceberg-rest-service.md`,
    `docs/lakehouse-iceberg-catalog.md`):
        capability notes linking to the new section.
    new "Hierarchical schema" subsection with Shell/Java/Python examples for
    creating nested schemas and listing children via `parentSchema`.
    
    ### Why are the changes needed?
    
    The hierarchical schema feature (#11118 for Iceberg REST, #11175 for
    Gravitino REST) was merged without user-facing documentation ("Will add
    the document later"). This PR fills that gap.
    
    
    ### Does this PR introduce _any_ user-facing change?
    
    Documentation only. It documents the new `gravitino.schema.separator`
    server config and the new `parentSchema` query parameter on `GET
    .../schemas`.
    
    ### How was this patch tested?
    
    `./gradlew :docs:build` passes (the OpenAPI spec validates).
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    ---------
    
    Co-authored-by: Claude Opus 4.7 <[email protected]>
---
 docs/gravitino-server-config.md   |  6 +++
 docs/iceberg-rest-service.md      |  1 +
 docs/lakehouse-iceberg-catalog.md | 89 +++++++++++++++++++++++++++++++++++++++
 docs/open-api/schemas.yaml        | 24 ++++++++++-
 4 files changed, 119 insertions(+), 1 deletion(-)

diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index f957514b48..65d549d0a5 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -146,6 +146,12 @@ Gravitino server uses tree lock to ensure the consistency 
of the data. The tree
 | `gravitino.catalog.cache.evictionIntervalMs` | The interval in milliseconds 
to evict the catalog cache; default 3600000ms(1h).                              
                                                                                
       | `3600000`     | No       | 0.1.0         |
 | `gravitino.catalog.classloader.isolated`     | Whether to use an isolated 
classloader for catalog. If `true`, an isolated classloader loads all 
catalog-related libraries and configurations, not the AppClassLoader. The 
default value is `true`. | `true`        | No       | 0.1.0         |
 
+### Schema configuration
+
+| Configuration item          | Description                                    
                                                                                
                                                                                
                                                                                
                                                                                
      | Default value | Required | Since version |
+|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------|
+| `gravitino.schema.separator` | The separator used to represent a 
hierarchical (multi-level) schema in schema names at the API boundary, e.g. `:` 
for `A:B:C`. It only takes effect for catalogs that support hierarchical 
schemas (currently the Iceberg catalog). The value must not be blank and must 
not contain `.` or the internal physical separator (ASCII-1, `\u0001`). See 
[Hierarchical schema](./lakehouse-iceberg-catalog.md#hierarchical-schema). | 
`:`           | No       | 1.3.0         |
+
 ### Auxiliary service configuration
 
 | Configuration item            | Description                                  
                                                                                
  | Default value | Since Version |
diff --git a/docs/iceberg-rest-service.md b/docs/iceberg-rest-service.md
index 9844bc7c69..03289cbee8 100644
--- a/docs/iceberg-rest-service.md
+++ b/docs/iceberg-rest-service.md
@@ -23,6 +23,7 @@ There are some key difference between Gravitino Iceberg REST 
server and Gravitin
   - multi table transaction
   - pagination
   - register view
+- Supports hierarchical (multi-level) namespaces.
 - Works as a catalog proxy, supporting `Hive` and `JDBC` as catalog backend.
 - Supports credential vending for `S3`、`GCS`、`OSS` and `ADLS`.
 - Supports different storages like `S3`, `HDFS`, `OSS`, `GCS`, `ADLS` and 
provides the capability to support other storages.
diff --git a/docs/lakehouse-iceberg-catalog.md 
b/docs/lakehouse-iceberg-catalog.md
index 28c500f29d..adf142e74a 100644
--- a/docs/lakehouse-iceberg-catalog.md
+++ b/docs/lakehouse-iceberg-catalog.md
@@ -235,6 +235,7 @@ Please refer to [Manage Relational Metadata Using 
Gravitino](./manage-relational
 ### Schema capabilities
 
 - doesn't support cascade drop schema.
+- supports hierarchical (multi-level) schemas, mapping each level to an 
Iceberg namespace level. See [Hierarchical schema](#hierarchical-schema).
 
 ### Schema properties
 
@@ -244,6 +245,94 @@ You could put properties except `comment`.
 
 Please refer to [Manage Relational Metadata Using 
Gravitino](./manage-relational-metadata-using-gravitino.md#schema-operations) 
for more details.
 
+### Hierarchical schema
+
+The Iceberg catalog supports a hierarchical (multi-level) schema, where a 
schema can be nested under
+another schema, mapping each level to an Iceberg multi-level namespace.
+
+A hierarchical schema name is a path whose levels are joined by the configured 
separator
+`gravitino.schema.separator` (default `:`, see [Gravitino server 
configuration](./gravitino-server-config.md#schema-configuration)).
+For example, with the default separator the name `a:b:c` denotes a schema `c` 
nested under `a:b`,
+which in turn is nested under `a`. The separator is only used at the API 
boundary; Gravitino stores
+the name internally using a physical separator that never collides with user 
input.
+
+To create a hierarchical schema, just supply its full hierarchical name. Any 
missing ancestor schemas are
+created automatically, so creating `a:b:c` also creates `a` and `a:b` if they 
don't already exist.
+The following example creates the schema `a:b:c`:
+
+<Tabs groupId="language" queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X POST -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+  "name": "a:b:c",
+  "comment": "a hierarchical schema",
+  "properties": {}
+}' 
http://localhost:8090/api/metalakes/metalake/catalogs/iceberg_catalog/schemas
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+
+SupportsSchemas supportsSchemas = catalog.asSchemas();
+// missing ancestors `a` and `a:b` are created automatically
+Schema schema = supportsSchemas.createSchema("a:b:c", "a hierarchical schema", 
Collections.emptyMap());
+```
+
+</TabItem>
+<TabItem value="python" label="Python">
+
+```python
+gravitino_client: GravitinoClient = 
GravitinoClient(uri="http://127.0.0.1:8090";, metalake_name="metalake")
+catalog: Catalog = gravitino_client.load_catalog(name="iceberg_catalog")
+# missing ancestors `a` and `a:b` are created automatically
+catalog.as_schemas().create_schema(name="a:b:c", comment="a hierarchical 
schema", properties={})
+```
+
+</TabItem>
+</Tabs>
+
+To list the schemas directly under a parent schema, pass the parent schema 
name. Over REST this is
+the optional `parentSchema` query parameter; in the clients it is an argument 
to the list-schemas
+method. Given the schemas `a`, `a:b` and `a:b:c`, listing the children of 
`a:b` returns `[a:b:c]`.
+When the parent is omitted, only the top-level schemas under the catalog are 
returned (the direct
+children of the catalog root, e.g. `a`), not the nested ones.
+
+<Tabs groupId="language" queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" \
+"http://localhost:8090/api/metalakes/metalake/catalogs/iceberg_catalog/schemas?parentSchema=a:b";
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+SupportsSchemas supportsSchemas = catalog.asSchemas();
+String[] children = supportsSchemas.listSchemas("a:b");
+```
+
+</TabItem>
+<TabItem value="python" label="Python">
+
+```python
+gravitino_client: GravitinoClient = 
GravitinoClient(uri="http://127.0.0.1:8090";, metalake_name="metalake")
+catalog: Catalog = gravitino_client.load_catalog(name="iceberg_catalog")
+children: List[str] = catalog.as_schemas().list_schemas(parent_schema="a:b")
+```
+
+</TabItem>
+</Tabs>
+
 ## Table
 
 ### Table capabilities
diff --git a/docs/open-api/schemas.yaml b/docs/open-api/schemas.yaml
index b6fed43992..06f90f5056 100644
--- a/docs/open-api/schemas.yaml
+++ b/docs/open-api/schemas.yaml
@@ -29,6 +29,8 @@ paths:
         - schema
       summary: List schemas
       operationId: listSchemas
+      parameters:
+        - $ref: "#/components/parameters/parentSchema"
       responses:
         "200":
           $ref: "./openapi.yaml#/components/responses/EntityListResponse"
@@ -151,6 +153,22 @@ paths:
 
 components:
 
+  parameters:
+    parentSchema:
+      name: parentSchema
+      in: query
+      description: >
+        The parent schema whose direct child schemas are listed. Only 
meaningful for catalogs that
+        support hierarchical (multi-level) schemas, such as an Iceberg catalog 
accessed through the
+        Gravitino REST server with a configured schema separator 
(`gravitino.schema.separator`,
+        default `:`). For example, when the schemas `a`, `a:b` and `a:b:c` 
exist, listing with
+        `parentSchema=a:b` returns `[a:b:c]`. When omitted, only the top-level 
schemas under the
+        catalog are returned (the direct children of the catalog root, e.g. 
`a`), not the nested
+        ones.
+      required: false
+      schema:
+        type: string
+
   schemas:
 
     SchemaCreateRequest:
@@ -160,7 +178,11 @@ components:
       properties:
         name:
           type: string
-          description: The name of the schema
+          description: >
+            The name of the schema. For catalogs that support hierarchical 
(multi-level) schemas,
+            the name may encode a nested path joined by the configured schema 
separator
+            (`gravitino.schema.separator`, default `:`), e.g. `a:b:c` creates 
schema `c` under the
+            existing parent schema `a:b`.
         comment:
           type: string
           description: A comment describing the schema

Reply via email to