Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.trino.plugin.exasol;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject;
import io.trino.plugin.base.mapping.IdentifierMapping;
import io.trino.plugin.jdbc.BaseJdbcClient;
import io.trino.plugin.jdbc.BaseJdbcConfig;
import io.trino.plugin.jdbc.ColumnMapping;
import io.trino.plugin.jdbc.ConnectionFactory;
import io.trino.plugin.jdbc.JdbcColumnHandle;
import io.trino.plugin.jdbc.JdbcExpression;
import io.trino.plugin.jdbc.JdbcJoinCondition;
import io.trino.plugin.jdbc.JdbcOutputTableHandle;
import io.trino.plugin.jdbc.JdbcTableHandle;
import io.trino.plugin.jdbc.JdbcTypeHandle;
import io.trino.plugin.jdbc.LongReadFunction;
import io.trino.plugin.jdbc.LongWriteFunction;
import io.trino.plugin.jdbc.QueryBuilder;
import io.trino.plugin.jdbc.WriteFunction;
import io.trino.plugin.jdbc.WriteMapping;
import io.trino.plugin.jdbc.logging.RemoteQueryModifier;
import io.trino.spi.TrinoException;
import io.trino.spi.connector.AggregateFunction;
import io.trino.spi.connector.ColumnHandle;
import io.trino.spi.connector.ColumnMetadata;
import io.trino.spi.connector.ConnectorSession;
import io.trino.spi.connector.ConnectorTableMetadata;
import io.trino.spi.type.Type;
import java.sql.Connection;
import java.sql.Date;
import java.sql.Types;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.Set;
import static io.trino.plugin.jdbc.StandardColumnMappings.bigintColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.booleanColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.decimalColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.defaultCharColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.defaultVarcharColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.doubleColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.integerColumnMapping;
import static io.trino.plugin.jdbc.StandardColumnMappings.smallintColumnMapping;
import static io.trino.plugin.jdbc.TypeHandlingJdbcSessionProperties.getUnsupportedTypeHandling;
import static io.trino.plugin.jdbc.UnsupportedTypeHandling.CONVERT_TO_VARCHAR;
import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED;
import static io.trino.spi.connector.ConnectorMetadata.MODIFYING_ROWS_MESSAGE;
import static io.trino.spi.type.DateType.DATE;
import static io.trino.spi.type.DecimalType.createDecimalType;
import static java.util.Locale.ENGLISH;
public class ExasolClient
extends BaseJdbcClient
{
private static final Set INTERNAL_SCHEMAS = ImmutableSet.builder()
.add("EXA_STATISTICS")
.add("SYS")
.build();
@Inject
public ExasolClient(
BaseJdbcConfig config,
ConnectionFactory connectionFactory,
QueryBuilder queryBuilder,
IdentifierMapping identifierMapping,
RemoteQueryModifier queryModifier)
{
super("\"", connectionFactory, queryBuilder, config.getJdbcTypesMappedToVarchar(), identifierMapping, queryModifier, false);
}
@Override
protected boolean filterSchema(String schemaName)
{
if (INTERNAL_SCHEMAS.contains(schemaName.toUpperCase(ENGLISH))) {
return false;
}
return super.filterSchema(schemaName);
}
@Override
public OptionalLong delete(ConnectorSession session, JdbcTableHandle handle)
{
throw new TrinoException(NOT_SUPPORTED, MODIFYING_ROWS_MESSAGE);
}
@Override
public void truncateTable(ConnectorSession session, JdbcTableHandle handle)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support truncating tables");
}
@Override
public void createTable(ConnectorSession session, ConnectorTableMetadata tableMetadata)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support creating tables");
}
@Override
public void commitCreateTable(ConnectorSession session, JdbcOutputTableHandle handle, Set pageSinkIds)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support creating tables");
}
@Override
public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns");
}
@Override
public void renameColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle jdbcColumn, String newColumnName)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming columns");
}
@Override
public void setColumnType(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column, Type type)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support setting column types");
}
@Override
public void dropColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support dropping columns");
}
@Override
public void dropTable(ConnectorSession session, JdbcTableHandle handle)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support dropping tables");
}
@Override
public void rollbackCreateTable(ConnectorSession session, JdbcOutputTableHandle handle)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support creating tables");
}
@Override
public String buildInsertSql(JdbcOutputTableHandle handle, List columnWriters)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support inserts");
}
@Override
public void createSchema(ConnectorSession session, String schemaName)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support creating schemas");
}
@Override
public void dropSchema(ConnectorSession session, String schemaName, boolean cascade)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support dropping schemas");
}
@Override
public void renameSchema(ConnectorSession session, String schemaName, String newSchemaName)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming schemas");
}
@Override
protected void renameTable(ConnectorSession session, Connection connection, String catalogName, String remoteSchemaName, String remoteTableName, String newRemoteSchemaName, String newRemoteTableName)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support renaming tables");
}
@Override
protected boolean isSupportedJoinCondition(ConnectorSession session, JdbcJoinCondition joinCondition)
{
// Deactivated because test 'testJoinPushdown()' requires write access which is not implemented for Exasol
return false;
}
@Override
public Optional implementAggregation(ConnectorSession session, AggregateFunction aggregate, Map assignments)
{
// Deactivated because test 'testCaseSensitiveAggregationPushdown()' requires write access which is not implemented for Exasol
return Optional.empty();
}
@Override
public Optional toColumnMapping(ConnectorSession session, Connection connection, JdbcTypeHandle typeHandle)
{
Optional mapping = getForcedMappingToVarchar(typeHandle);
if (mapping.isPresent()) {
return mapping;
}
switch (typeHandle.jdbcType()) {
case Types.BOOLEAN:
return Optional.of(booleanColumnMapping());
case Types.SMALLINT:
return Optional.of(smallintColumnMapping());
case Types.INTEGER:
return Optional.of(integerColumnMapping());
case Types.BIGINT:
return Optional.of(bigintColumnMapping());
case Types.DOUBLE:
return Optional.of(doubleColumnMapping());
case Types.DECIMAL:
int decimalDigits = typeHandle.requiredDecimalDigits();
int columnSize = typeHandle.requiredColumnSize();
return Optional.of(decimalColumnMapping(createDecimalType(columnSize, decimalDigits)));
case Types.CHAR:
return Optional.of(defaultCharColumnMapping(typeHandle.requiredColumnSize(), true));
case Types.VARCHAR:
// String data is sorted by its binary representation.
// https://docs.exasol.com/db/latest/sql/select.htm#UsageNotes
return Optional.of(defaultVarcharColumnMapping(typeHandle.requiredColumnSize(), true));
case Types.DATE:
return Optional.of(dateColumnMapping());
}
if (getUnsupportedTypeHandling(session) == CONVERT_TO_VARCHAR) {
return mapToUnboundedVarchar(typeHandle);
}
return Optional.empty();
}
private static ColumnMapping dateColumnMapping()
{
// Exasol driver does not support LocalDate
return ColumnMapping.longMapping(
DATE,
dateReadFunctionUsingSqlDate(),
dateWriteFunctionUsingSqlDate());
}
private static LongReadFunction dateReadFunctionUsingSqlDate()
{
return (resultSet, columnIndex) -> {
Date date = resultSet.getDate(columnIndex);
return date.toLocalDate().toEpochDay();
};
}
private static LongWriteFunction dateWriteFunctionUsingSqlDate()
{
return LongWriteFunction.of(Types.DATE, (statement, index, value) -> {
LocalDate localDate = LocalDate.ofEpochDay(value);
statement.setDate(index, Date.valueOf(localDate));
});
}
@Override
public WriteMapping toWriteMapping(ConnectorSession session, Type type)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support writing");
}
@Override
public JdbcOutputTableHandle beginCreateTable(ConnectorSession session, ConnectorTableMetadata tableMetadata)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support creating tables with data");
}
@Override
public JdbcOutputTableHandle beginInsertTable(ConnectorSession session, JdbcTableHandle tableHandle, List columns)
{
throw new TrinoException(NOT_SUPPORTED, "This connector does not support inserts");
}
}