-
Notifications
You must be signed in to change notification settings - Fork 304
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[#420] feat(trino-connector): Implement list and show metadata in tri…
…no. (#421) ### What changes were proposed in this pull request? Support trino using graviton to manager catalogs and query data. 1. Implemented graviton hive catalog connector creation. 2. Implemented show graviton catalogs. 3. Implemented list/show schemas from graviton catalogs. 4. Implemented list/show tables from graviton schema. ### Why are the changes needed? Fix: #420 Implement list/show catalogs schemas and tables on graviton-connector ### Does this PR introduce _any_ user-facing change? ### How was this patch tested? 1. UT
- Loading branch information
Showing
30 changed files
with
1,504 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
64 changes: 64 additions & 0 deletions
64
...connector/src/main/java/com/datastrato/graviton/trino/connector/GravitonColumnHandle.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
/* | ||
* Copyright 2023 Datastrato. | ||
* This software is licensed under the Apache License version 2. | ||
*/ | ||
package com.datastrato.graviton.trino.connector; | ||
|
||
import static com.google.common.base.MoreObjects.toStringHelper; | ||
|
||
import com.fasterxml.jackson.annotation.JsonCreator; | ||
import com.fasterxml.jackson.annotation.JsonProperty; | ||
import com.google.common.base.Preconditions; | ||
import io.trino.spi.connector.ColumnHandle; | ||
|
||
/** | ||
* The GravitonColumnHandle is used to transform column information between Trino and Graviton, as | ||
* well as to wrap the inner connector column handle for data access. | ||
*/ | ||
public final class GravitonColumnHandle implements ColumnHandle { | ||
private final String columnName; | ||
private final ColumnHandle internalColumnHandler; | ||
|
||
@JsonCreator | ||
public GravitonColumnHandle( | ||
@JsonProperty("columnName") String columnName, | ||
@JsonProperty("internalColumnHandler") ColumnHandle columnHandle) { | ||
Preconditions.checkArgument(columnName != null, "columnName is not null"); | ||
Preconditions.checkArgument(columnHandle != null, "columnHandle is not null"); | ||
this.columnName = columnName; | ||
this.internalColumnHandler = columnHandle; | ||
} | ||
|
||
@JsonProperty | ||
public String getColumnName() { | ||
return columnName; | ||
} | ||
|
||
@JsonProperty | ||
public ColumnHandle getInternalColumnHandler() { | ||
return internalColumnHandler; | ||
} | ||
|
||
@Override | ||
public int hashCode() { | ||
return columnName.hashCode(); | ||
} | ||
|
||
@Override | ||
public boolean equals(Object obj) { | ||
if (this == obj) { | ||
return true; | ||
} | ||
if ((obj == null) || (getClass() != obj.getClass())) { | ||
return false; | ||
} | ||
|
||
GravitonColumnHandle other = (GravitonColumnHandle) obj; | ||
return columnName.equals(other.columnName); | ||
} | ||
|
||
@Override | ||
public String toString() { | ||
return toStringHelper(this).add("columnName", columnName).toString(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
152 changes: 152 additions & 0 deletions
152
trino-connector/src/main/java/com/datastrato/graviton/trino/connector/GravitonMetadata.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,152 @@ | ||
/* | ||
* Copyright 2023 Datastrato. | ||
* This software is licensed under the Apache License version 2. | ||
*/ | ||
package com.datastrato.graviton.trino.connector; | ||
|
||
import com.datastrato.graviton.trino.connector.catalog.CatalogConnectorMetadata; | ||
import com.datastrato.graviton.trino.connector.catalog.CatalogConnectorMetadataAdapter; | ||
import com.datastrato.graviton.trino.connector.metadata.GravitonColumn; | ||
import com.datastrato.graviton.trino.connector.metadata.GravitonSchema; | ||
import com.datastrato.graviton.trino.connector.metadata.GravitonTable; | ||
import com.google.common.collect.ImmutableList; | ||
import com.google.common.collect.ImmutableMap; | ||
import com.google.common.collect.ImmutableSet; | ||
import io.trino.spi.connector.ColumnHandle; | ||
import io.trino.spi.connector.ColumnMetadata; | ||
import io.trino.spi.connector.ConnectorMetadata; | ||
import io.trino.spi.connector.ConnectorSession; | ||
import io.trino.spi.connector.ConnectorTableHandle; | ||
import io.trino.spi.connector.ConnectorTableMetadata; | ||
import io.trino.spi.connector.ConnectorTableProperties; | ||
import io.trino.spi.connector.ConnectorTableVersion; | ||
import io.trino.spi.connector.SchemaTableName; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Optional; | ||
import java.util.Set; | ||
|
||
/** | ||
* The GravitonMetadata class provides operations for Graviton metadata on the Graviton server. It | ||
* also transforms the different metadata formats between Trino and Graviton. Additionally, it wraps | ||
* the internal connector metadata for accessing data. | ||
*/ | ||
public class GravitonMetadata implements ConnectorMetadata { | ||
// Handling metadata operations on graviton server | ||
private final CatalogConnectorMetadata catalogConnectorMetadata; | ||
|
||
// Transform different metadata format | ||
private final CatalogConnectorMetadataAdapter metadataAdapter; | ||
|
||
private final ConnectorMetadata internalMetadata; | ||
|
||
public GravitonMetadata( | ||
CatalogConnectorMetadata catalogConnectorMetadata, | ||
CatalogConnectorMetadataAdapter metadataAdapter, | ||
ConnectorMetadata internalMetadata) { | ||
this.catalogConnectorMetadata = catalogConnectorMetadata; | ||
this.metadataAdapter = metadataAdapter; | ||
this.internalMetadata = internalMetadata; | ||
} | ||
|
||
@Override | ||
public List<String> listSchemaNames(ConnectorSession session) { | ||
return catalogConnectorMetadata.listSchemaNames(); | ||
} | ||
|
||
@Override | ||
public Map<String, Object> getSchemaProperties(ConnectorSession session, String schemaName) { | ||
GravitonSchema schema = catalogConnectorMetadata.getSchema(schemaName); | ||
return metadataAdapter.getSchemaProperties(schema); | ||
} | ||
|
||
@Override | ||
public ConnectorTableProperties getTableProperties( | ||
ConnectorSession session, ConnectorTableHandle tableHandle) { | ||
GravitonTableHandle gravitonTableHandle = (GravitonTableHandle) tableHandle; | ||
GravitonTable table = | ||
catalogConnectorMetadata.getTable( | ||
gravitonTableHandle.getSchemaName(), gravitonTableHandle.getTableName()); | ||
return metadataAdapter.getTableProperties(table); | ||
} | ||
|
||
@Override | ||
public GravitonTableHandle getTableHandle( | ||
ConnectorSession session, | ||
SchemaTableName tableName, | ||
Optional<ConnectorTableVersion> startVersion, | ||
Optional<ConnectorTableVersion> endVersion) { | ||
boolean tableExists = | ||
catalogConnectorMetadata.tableExists(tableName.getSchemaName(), tableName.getTableName()); | ||
if (!tableExists) return null; | ||
|
||
ConnectorTableHandle internalTableHandle = | ||
internalMetadata.getTableHandle(session, tableName, startVersion, endVersion); | ||
return new GravitonTableHandle( | ||
tableName.getSchemaName(), tableName.getTableName(), internalTableHandle); | ||
} | ||
|
||
@Override | ||
public ConnectorTableMetadata getTableMetadata( | ||
ConnectorSession session, ConnectorTableHandle tableHandle) { | ||
GravitonTableHandle gravitonTableHandle = (GravitonTableHandle) tableHandle; | ||
GravitonTable table = | ||
catalogConnectorMetadata.getTable( | ||
gravitonTableHandle.getSchemaName(), gravitonTableHandle.getTableName()); | ||
return metadataAdapter.getTableMetadata(table); | ||
} | ||
|
||
@Override | ||
public List<SchemaTableName> listTables( | ||
ConnectorSession session, Optional<String> optionalSchemaName) { | ||
Set<String> schemaNames = | ||
optionalSchemaName | ||
.map(ImmutableSet::of) | ||
.orElseGet(() -> ImmutableSet.copyOf(listSchemaNames(session))); | ||
|
||
ImmutableList.Builder<SchemaTableName> builder = ImmutableList.builder(); | ||
for (String schemaName : schemaNames) { | ||
List<String> tableNames = catalogConnectorMetadata.listTables(schemaName); | ||
for (String tableName : tableNames) { | ||
builder.add(new SchemaTableName(schemaName, tableName)); | ||
} | ||
} | ||
return builder.build(); | ||
} | ||
|
||
@Override | ||
public Map<String, ColumnHandle> getColumnHandles( | ||
ConnectorSession session, ConnectorTableHandle tableHandle) { | ||
GravitonTableHandle gravitonTableHandle = (GravitonTableHandle) tableHandle; | ||
|
||
GravitonTable table = | ||
catalogConnectorMetadata.getTable( | ||
gravitonTableHandle.getSchemaName(), gravitonTableHandle.getTableName()); | ||
|
||
ImmutableMap.Builder<String, ColumnHandle> columnHandles = ImmutableMap.builder(); | ||
|
||
Map<String, ColumnHandle> internalColumnHandles = | ||
internalMetadata.getColumnHandles(session, gravitonTableHandle.getInternalTableHandle()); | ||
for (GravitonColumn column : table.getColumns()) { | ||
GravitonColumnHandle columnHandle = | ||
new GravitonColumnHandle(column.getName(), internalColumnHandles.get(column.getName())); | ||
columnHandles.put(column.getName(), columnHandle); | ||
} | ||
return columnHandles.buildOrThrow(); | ||
} | ||
|
||
@Override | ||
public ColumnMetadata getColumnMetadata( | ||
ConnectorSession session, ConnectorTableHandle tableHandle, ColumnHandle columnHandle) { | ||
GravitonTableHandle gravitonTableHandle = (GravitonTableHandle) tableHandle; | ||
GravitonTable table = | ||
catalogConnectorMetadata.getTable( | ||
gravitonTableHandle.getSchemaName(), gravitonTableHandle.getTableName()); | ||
|
||
GravitonColumnHandle gravitonColumnHandle = (GravitonColumnHandle) columnHandle; | ||
String columName = gravitonColumnHandle.getColumnName(); | ||
|
||
GravitonColumn column = table.getColumn(columName); | ||
return metadataAdapter.getColumnMetadata(column); | ||
} | ||
} |
Oops, something went wrong.