# OpenMetadata SDK
A modern Java SDK for OpenMetadata that provides a fluent API for all operations.
## Installation
Add the OpenMetadata SDK to your project:
```xml
org.open-metadata
openmetadata-sdk
1.5.0-SNAPSHOT
```
## Quick Start
### Initialize the SDK
```java
import org.openmetadata.sdk.config.OpenMetadataConfig;
import org.openmetadata.sdk.client.OpenMetadataClient;
import org.openmetadata.sdk.entities.*;
import org.openmetadata.sdk.api.*;
// Configure the client
OpenMetadataConfig config = OpenMetadataConfig.builder()
.serverUrl("http://localhost:8585")
.apiKey("your-api-key")
.build();
// Initialize the client
OpenMetadataClient.initialize(config);
// Set default client for static APIs
Table.setDefaultClient(OpenMetadataClient.getInstance());
User.setDefaultClient(OpenMetadataClient.getInstance());
Search.setDefaultClient(OpenMetadataClient.getInstance());
Lineage.setDefaultClient(OpenMetadataClient.getInstance());
Bulk.setDefaultClient(OpenMetadataClient.getInstance());
```
## Entity Operations
### Tables
```java
// Create a table
CreateTable request = new CreateTable()
.withName("my_table")
.withDatabase("my_database")
.withColumns(columns);
Table table = Table.create(request);
// Retrieve a table by ID
Table table = Table.retrieve("table-id");
// Retrieve by fully qualified name with specific fields
Table table = Table.retrieveByName(
"service.database.schema.table",
"owners,tags,columns"
);
// List tables with pagination
for (Table table : Table.list().autoPagingIterable()) {
System.out.println(table.getName());
}
// List with filters
TableListParams params = TableListParams.builder()
.limit(50)
.database("my_database")
.fields("owners,tags")
.build();
TableCollection tables = Table.list(params);
// Update a table
table.setDescription("Updated description");
Table updated = table.save();
// Delete a table
Table.delete("table-id");
// Delete with options
Table.delete("table-id", true, true); // recursive, hardDelete
// Export/Import CSV
String csv = Table.exportCsv("table-name");
Table.importCsv("table-name", csvData);
```
### Users
```java
// Create a user
CreateUser request = new CreateUser()
.withName("john.doe")
.withEmail("john@example.com")
.withIsAdmin(false);
User user = User.create(request);
// Retrieve a user
User user = User.retrieve("user-id");
User user = User.retrieveByName("john.doe", "teams,roles");
// List users
for (User user : User.list().autoPagingIterable()) {
System.out.println(user.getEmail());
}
// Update a user
user.setDisplayName("John Doe");
User updated = user.save();
// Delete a user
User.delete("user-id");
```
### All Entity Types Supported
The SDK provides the same fluent API for all 40+ OpenMetadata entity types:
- **Data Assets**: Table, Database, DatabaseSchema, Dashboard, Pipeline, Topic, Container, Query, StoredProcedure, DashboardDataModel, SearchIndex, MlModel, Report
- **Services**: DatabaseService, MessagingService, DashboardService, PipelineService, MlModelService, StorageService, SearchService, MetadataService, ApiService
- **Teams & Users**: User, Team, Role, Policy
- **Governance**: Glossary, GlossaryTerm, Classification, Tag, DataProduct, Domain
- **Quality**: TestCase, TestSuite, TestDefinition, DataQualityDashboard
- **Ingestion**: Ingestion, Workflow, Connection
- **Other**: Type, Webhook, Kpi, Application, Persona, DocStore, Page, SearchQuery
## Search Operations
```java
// Simple search
String results = Search.search("customer");
// Search with index
String results = Search.search("customer", "table_search_index");
// Advanced search with pagination and sorting
String results = Search.search(
"customer",
"table_search_index",
0, 100,
"name.keyword", "asc"
);
// Suggestions
String suggestions = Search.suggest("cust");
String suggestions = Search.suggest("cust", "table_search_index", 10);
// Aggregations
String aggregations = Search.aggregate("type:Table", "table_search_index", "database");
// Advanced search with custom request
Map searchRequest = Map.of(
"query", Map.of("match", Map.of("name", "customer")),
"size", 50
);
String results = Search.searchAdvanced(searchRequest);
// Reindex operations
Search.reindex("table");
Search.reindexAll();
// Using the builder
String results = Search.builder()
.query("customer")
.index("table_search_index")
.from(0)
.size(100)
.sortField("name.keyword")
.sortOrder("asc")
.execute();
```
## Lineage Operations
```java
// Get lineage for an entity
String lineage = Lineage.getLineage("entity-fqn");
// Get lineage with depth control
String lineage = Lineage.getLineage("entity-fqn", "3", "2");
// Get entity lineage by type and ID
String lineage = Lineage.getEntityLineage("table", "entity-id");
String lineage = Lineage.getEntityLineage("table", "entity-id", "3", "2");
// Add lineage relationship
Lineage.addLineage(
"source-entity-id", "table",
"target-entity-id", "dashboard"
);
// Delete lineage
Lineage.deleteLineage("from-entity", "to-entity");
// Export lineage
String export = Lineage.exportLineage("table", "entity-id");
// Using the builder
String lineage = Lineage.builder()
.entityType("table")
.entityId("entity-id")
.upstreamDepth(3)
.downstreamDepth(2)
.execute();
```
## Bulk Operations
```java
// Bulk create entities
List