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

jerryshao 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 297f69eb2d [#11005] docs(view): improve view management documentation 
(#11129)
297f69eb2d is described below

commit 297f69eb2dc510ee2f216bd5a6358a65c556e38e
Author: mchades <[email protected]>
AuthorDate: Wed May 20 20:02:40 2026 +0800

    [#11005] docs(view): improve view management documentation (#11129)
    
    ### What changes were proposed in this pull request?
    
    This PR improves the user documentation for view management in
    Gravitino.
    
    The changes include:
    - Add a dedicated view management guide.
    - Clarify supported capabilities and interoperability.
    - Update related documentation links.
    
    ### Why are the changes needed?
    
    Issue #11005 asks for user documentation for table view management.
    
    A dedicated view document makes the feature easier to discover and
    maintain, and avoids overloading the relational metadata guide. The
    updated content also clarifies an important behavior of the feature:
    views created through Gravitino are persisted as native views in the
    underlying catalog, while existing native views in supported catalogs
    can be discovered and loaded through Gravitino without an extra import
    step.
    
    Fix: #11005
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes.
    
    - Adds a dedicated user documentation page for view management.
    - Clarifies supported view capabilities for Hive and Iceberg catalogs.
    - Documents view interoperability with underlying catalogs.
    - No user-facing API or configuration key changes.
    
    ### How was this patch tested?
    
    - `./gradlew :docs:build`
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
    Co-authored-by: Claude Opus 4.7 <[email protected]>
---
 docs/apache-hive-catalog.md                        |  14 +
 docs/index.md                                      |   2 +
 docs/lakehouse-iceberg-catalog.md                  |  12 +
 docs/lakehouse-paimon-catalog.md                   |  14 +
 docs/manage-relational-metadata-using-gravitino.md |   9 +-
 docs/manage-view-metadata-using-gravitino.md       | 288 +++++++++++++++++++++
 6 files changed, 338 insertions(+), 1 deletion(-)

diff --git a/docs/apache-hive-catalog.md b/docs/apache-hive-catalog.md
index 14facc6760..89ed09c1a3 100644
--- a/docs/apache-hive-catalog.md
+++ b/docs/apache-hive-catalog.md
@@ -208,6 +208,20 @@ As Gravitino has a separate interface for updating the 
comment of a table, the H
 Support for altering partitions is under development.
 :::
 
+## View
+
+### View capabilities
+
+- Supports list, create, load, alter, and drop for views stored in the Hive 
Metastore Service as `VIRTUAL_VIEW`.
+- Each view must contain exactly one SQL representation.
+- Supports the `hive`, `trino`, and `spark` dialects.
+- When loading an existing HMS view, Gravitino automatically detects whether 
the view uses the `hive`, `trino`, or `spark` dialect.
+- For the `hive` dialect, `defaultCatalog` and `defaultSchema` must be `null`.
+
+### View operations
+
+Refer to [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md) for more details.
+
 ## Hive catalog with S3 storage
 
 To create a Hive catalog with S3 storage, you can refer to the [Hive catalog 
with S3](./hive-catalog-with-s3.md) documentation. No special configurations 
are required for the Hive catalog to work with S3 storage.
diff --git a/docs/index.md b/docs/index.md
index 70320cb19f..bd48ce4924 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -55,6 +55,8 @@ You can use either to manage metadata. See
   metalakes.
 * [Manage relational metadata using 
Gravitino](./manage-relational-metadata-using-gravitino.md)
   to learn how to manage relational metadata.
+* [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md)
+  to learn how to manage view metadata.
 * [Manage fileset metadata using 
Gravitino](./manage-fileset-metadata-using-gravitino.md) to learn
   how to manage fileset metadata.
 * [Manage messaging metadata using 
Gravitino](./manage-messaging-metadata-using-gravitino.md) to learn how to 
manage
diff --git a/docs/lakehouse-iceberg-catalog.md 
b/docs/lakehouse-iceberg-catalog.md
index dfd476d7bf..252fd7d34f 100644
--- a/docs/lakehouse-iceberg-catalog.md
+++ b/docs/lakehouse-iceberg-catalog.md
@@ -377,6 +377,18 @@ The default column position is `LAST` when you add a 
column. If you add a non nu
 If you update a nullability column to non nullability, there may be 
compatibility issues.
 :::
 
+## View
+
+### View capabilities
+
+- Supports list, create, load, alter, and drop for views managed by the 
underlying Iceberg REST, JDBC, or Hive backend.
+- Supports dialects such as `trino`, `spark`, and `hive`.
+- Can preserve multiple SQL representations for the same logical view.
+
+### View operations
+
+Refer to [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md) for more details.
+
 ## HDFS configuration
 
 You can place `core-site.xml` and `hdfs-site.xml` in the 
`catalogs/lakehouse-iceberg/conf` directory to automatically load as the 
default HDFS configuration.
diff --git a/docs/lakehouse-paimon-catalog.md b/docs/lakehouse-paimon-catalog.md
index 3c15486f41..3de913e2c5 100644
--- a/docs/lakehouse-paimon-catalog.md
+++ b/docs/lakehouse-paimon-catalog.md
@@ -232,6 +232,20 @@ Bucket settings are defined via Gravitino table 
distribution (HASH strategy). Th
 
 Please refer to [Manage Relational Metadata Using 
Gravitino](./manage-relational-metadata-using-gravitino.md#table-operations) 
for more details.
 
+## View
+
+### View capabilities
+
+- Supports list, create, load, alter, and drop for views stored in the Paimon 
catalog.
+- Each view must include exactly one SQL representation with dialect `query`, 
which serves as the canonical view definition.
+- Additional dialect-specific SQL representations (for example, `spark` or 
`trino`) can be provided alongside the required `query` representation.
+- The `defaultCatalog` and `defaultSchema` fields are stored as Paimon view 
options and can be used to resolve unqualified identifiers in the SQL text.
+- View support depends on the selected Paimon backend and requires backend 
view API support.
+
+### View operations
+
+Refer to [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md) for more details.
+
 ## HDFS configuration
 
 You can place `core-site.xml` and `hdfs-site.xml` in the 
`catalogs/lakehouse-paimon/conf` directory to automatically load as the default 
HDFS configuration.
diff --git a/docs/manage-relational-metadata-using-gravitino.md 
b/docs/manage-relational-metadata-using-gravitino.md
index af014aa52c..ed82918449 100644
--- a/docs/manage-relational-metadata-using-gravitino.md
+++ b/docs/manage-relational-metadata-using-gravitino.md
@@ -10,9 +10,11 @@ import Tabs from '@theme/Tabs';
 import TabItem from '@theme/TabItem';
 
 This page introduces how to manage relational metadata by Apache Gravitino, 
relational metadata refers
-to relational catalog, schema, table and partitions. Through Gravitino, you 
can create, edit, and
+to relational catalog, schema, table, partitions, and views. Through 
Gravitino, you can create, edit, and
 delete relational metadata via unified REST APIs or Java client.
 
+For dedicated view examples and APIs, see [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md).
+
 In this document, Gravitino uses Apache Hive catalog as an example to show how 
to manage
 relational metadata by Gravitino. Other relational catalogs are similar to 
Hive catalog,
 but they may have some differences, especially in catalog property, table 
property, and column type.
@@ -1229,3 +1231,8 @@ NameIdentifier[] identifiers =
 
 </TabItem>
 </Tabs>
+
+## View operations
+
+View metadata is documented separately in [Manage view metadata using 
Gravitino](./manage-view-metadata-using-gravitino.md),
+including create, load, alter, drop, and list examples for the REST API and 
Java client.
diff --git a/docs/manage-view-metadata-using-gravitino.md 
b/docs/manage-view-metadata-using-gravitino.md
new file mode 100644
index 0000000000..5df3a635c4
--- /dev/null
+++ b/docs/manage-view-metadata-using-gravitino.md
@@ -0,0 +1,288 @@
+---
+title: "Manage view metadata using Apache Gravitino"
+slug: /manage-view-metadata-using-gravitino
+date: 2026-5-17
+keyword: Gravitino view metadata manage
+license: This software is licensed under the Apache License version 2.
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+This page introduces how to manage view metadata by Apache Gravitino. A view 
stores a logical
+query definition rather than physical data. Through Gravitino, you can create, 
load, alter,
+drop, and list views in supported catalogs via unified REST APIs or the Java 
client.
+
+When a catalog implements view management, Gravitino operates on the 
provider's native view
+metadata rather than a separate Gravitino-only view type. View capabilities 
are implemented by
+each catalog provider and may differ in operation coverage and SQL dialect 
behavior. For detailed
+support, see:
+
+- [Hive view capabilities](./apache-hive-catalog.md#view-capabilities)
+- [Iceberg view capabilities](./lakehouse-iceberg-catalog.md#view-capabilities)
+- [Paimon view capabilities](./lakehouse-paimon-catalog.md#view-capabilities)
+
+Unlike tables, views define query output and one or more representations, but 
do not manage
+partitions, sort orders, indexes, or physical storage locations. The 
representation model is
+extensible, but currently only SQL representations are supported.
+
+To use view management, please make sure that:
+
+ - Gravitino server has started, and the host and port are 
[http://localhost:8090](http://localhost:8090).
+ - A metalake has been created and 
[enabled](./manage-metalake-using-gravitino.md#enable-a-metalake).
+ - A relational catalog has been created within the metalake.
+ - A schema has been created within the catalog.
+
+## View operations
+
+:::tip
+Users should create a metalake, a catalog, and a schema, and ensure that the 
metalake and
+catalog are enabled before operating views.
+:::
+
+### Create a view
+
+You can create a view by sending a `POST` request to the
+`/api/metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/views` endpoint 
or just use the
+Gravitino Java client. The following is an example of creating a view:
+
+<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": "example_view",
+  "comment": "This is an example view",
+  "columns": [
+    {
+      "name": "id",
+      "type": "long",
+      "comment": "id column",
+      "nullable": true
+    }
+  ],
+  "representations": [
+    {
+      "type": "sql",
+      "dialect": "trino",
+      "sql": "SELECT id FROM example_table"
+    },
+    {
+      "type": "sql",
+      "dialect": "spark",
+      "sql": "SELECT id FROM example_table"
+    }
+  ],
+  "defaultCatalog": "iceberg_catalog",
+  "defaultSchema": "schema",
+  "properties": {
+    "key": "value"
+  }
+}' 
http://localhost:8090/api/metalakes/metalake/catalogs/iceberg_catalog/schemas/schema/views
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+ViewCatalog viewCatalog = catalog.asViewCatalog();
+
+View view = viewCatalog.createView(
+    NameIdentifier.of("schema", "example_view"),
+    "This is an example view",
+    new Column[] {
+        Column.of("id", Types.LongType.get(), "id column")
+    },
+    new Representation[] {
+        SQLRepresentation.builder()
+            .withSql("SELECT id FROM example_table")
+            .withDialect("trino")
+            .build(),
+        SQLRepresentation.builder()
+            .withSql("SELECT id FROM example_table")
+            .withDialect("spark")
+            .build()
+    },
+    "iceberg_catalog",
+    "schema",
+    ImmutableMap.of("key", "value")
+);
+// ...
+```
+
+</TabItem>
+</Tabs>
+
+:::caution
+The provided example uses an Iceberg catalog and includes `trino` and `spark` 
SQL
+representations for the same logical view. Supported dialects, representation 
counts, and
+default-resolution fields depend on the catalog provider.
+:::
+
+#### Create request fields
+
+Use the following fields when creating a view:
+
+- `columns`: Defines the output schema of the view.
+- `representations`: Provides one or more SQL definitions. The API uses the 
extensible
+  `Representation` model, but currently only the `sql` type is supported, 
which maps to
+  `SQLRepresentation` in Java.
+- `defaultCatalog` and `defaultSchema`: Optionally define how unqualified 
identifiers in the SQL
+  text are resolved for dialects that use them. For the `hive` dialect in Hive 
catalogs, both
+  fields must be `null`.
+- `properties`: Carries provider-specific metadata.
+
+Column types use the same Gravitino type system as table columns. For the full 
type list and the
+behavior of special types such as external and unparsed types, refer to 
[Apache Gravitino table column 
type](./manage-relational-metadata-using-gravitino.md#apache-gravitino-table-column-type).
+
+### Load a view
+
+You can load a view by sending a `GET` request to the
+`/api/metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/views/{view}` 
endpoint or just use
+the Gravitino Java client. The following is an example of loading a view:
+
+<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/schema/views/example_view
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+ViewCatalog viewCatalog = catalog.asViewCatalog();
+View view = viewCatalog.loadView(NameIdentifier.of("schema", "example_view"));
+// ...
+```
+
+</TabItem>
+</Tabs>
+
+:::note
+- Loading a view returns the metadata exposed by the underlying catalog, 
including output columns,
+stored representations, default catalog, default schema, comment, and 
properties.
+- If the provider already exposes a native view through its metadata API, 
Gravitino can load it
+directly without a separate import step.
+:::
+
+### Alter a view
+
+You can modify a view by sending a `PUT` request to the
+`/api/metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/views/{view}` 
endpoint or just use
+the Gravitino Java client. The following is an example of modifying a view:
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" -d '{
+  "updates": [
+    {
+      "@type": "rename",
+      "newName": "new_view_name"
+    }
+  ]
+}' 
http://localhost:8090/api/metalakes/metalake/catalogs/iceberg_catalog/schemas/schema/views/example_view
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+ViewCatalog viewCatalog = catalog.asViewCatalog();
+View view = viewCatalog.alterView(
+    NameIdentifier.of("schema", "example_view"),
+    ViewChange.rename("new_view_name"),
+    ViewChange.setProperty("key", "value")
+);
+// ...
+```
+
+</TabItem>
+</Tabs>
+
+Currently, Gravitino supports the following changes to a view:
+
+| Supported modification                                 | REST / JSON         
                                                                                
           | Java                                                               
                                   |
+|--------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|
+| Rename view                                            | 
`{"@type":"rename","newName":"new_view_name"}`                                  
                        | `ViewChange.rename("new_view_name")`                  
                                               |
+| Set a view property                                    | 
`{"@type":"setProperty","property":"key","value":"value"}`                      
                     | `ViewChange.setProperty("key", "value")`                 
                                          |
+| Remove a view property                                 | 
`{"@type":"removeProperty","property":"key"}`                                   
                         | `ViewChange.removeProperty("key")`                   
                                                |
+| Replace view definition (columns/representations/etc.) | Replace columns, 
representations, default catalog, default schema, and comment in one update 
request.         | `ViewChange.replaceView(columns, representations, 
defaultCatalog, defaultSchema, comment)`            |
+
+`ViewChange.replaceView(...)` performs a full replacement of the view body. If 
you only want to
+change one part of the body, load the current view first and pass the 
unchanged fields back in the
+replacement request.
+
+### Drop a view
+
+You can remove a view by sending a `DELETE` request to the
+`/api/metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/views/{view}` 
endpoint or just use
+the Gravitino Java client. The following is an example of dropping a view:
+
+<Tabs groupId='language' queryString>
+<TabItem value="shell" label="Shell">
+
+```shell
+curl -X DELETE -H "Accept: application/vnd.gravitino.v1+json" \
+-H "Content-Type: application/json" \
+http://localhost:8090/api/metalakes/metalake/catalogs/iceberg_catalog/schemas/schema/views/example_view
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+ViewCatalog viewCatalog = catalog.asViewCatalog();
+viewCatalog.dropView(NameIdentifier.of("schema", "example_view"));
+// ...
+```
+
+</TabItem>
+</Tabs>
+
+Dropping a view removes the view metadata definition only. It does not remove 
underlying table
+data because a view does not own storage.
+
+### List all views under a schema
+
+You can list all views in a schema by sending a `GET` request to the
+`/api/metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/views` endpoint 
or just use the
+Gravitino Java client. The following is an example of listing all the views in 
a schema:
+
+<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/schema/views
+```
+
+</TabItem>
+<TabItem value="java" label="Java">
+
+```java
+// Assuming you have just created an Iceberg catalog named `iceberg_catalog`
+Catalog catalog = gravitinoClient.loadCatalog("iceberg_catalog");
+ViewCatalog viewCatalog = catalog.asViewCatalog();
+NameIdentifier[] identifiers = viewCatalog.listViews(Namespace.of("schema"));
+// ...
+```
+
+</TabItem>
+</Tabs>
\ No newline at end of file

Reply via email to