contrib/native/client/src/clientlib/metadata.hpp (245 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#ifndef DRILL_METADATA_H
#define DRILL_METADATA_H
#include <boost/ref.hpp>
#include <boost/unordered_set.hpp>
#include "drill/common.hpp"
#include "drill/drillClient.hpp"
#include "env.h"
#include "User.pb.h"
namespace Drill {
class DrillClientImpl;
namespace meta {
class DrillCatalogMetadata: public meta::CatalogMetadata {
public:
DrillCatalogMetadata(const ::exec::user::CatalogMetadata& metadata):
meta::CatalogMetadata(),
m_pMetadata(metadata){
}
bool hasCatalogName() const { return m_pMetadata.get().has_catalog_name(); }
const std::string& getCatalogName() const { return m_pMetadata.get().catalog_name(); }
bool hasDescription() const { return m_pMetadata.get().has_description(); }
const std::string& getDescription() const { return m_pMetadata.get().description(); }
bool hasConnect() const { return m_pMetadata.get().has_connect(); }
const std::string& getConnect() const { return m_pMetadata.get().connect(); }
private:
boost::reference_wrapper<const ::exec::user::CatalogMetadata> m_pMetadata;
};
class DrillSchemaMetadata: public meta::SchemaMetadata {
public:
DrillSchemaMetadata(const ::exec::user::SchemaMetadata& metadata):
meta::SchemaMetadata(),
m_pMetadata(metadata){
}
bool hasCatalogName() const { return m_pMetadata.get().has_catalog_name(); }
const std::string& getCatalogName() const { return m_pMetadata.get().catalog_name(); }
bool hasSchemaName() const { return m_pMetadata.get().has_schema_name(); }
const std::string& getSchemaName() const { return m_pMetadata.get().schema_name(); }
bool hasOwnerName() const { return m_pMetadata.get().has_owner(); }
const std::string& getOwner() const { return m_pMetadata.get().owner(); }
bool hasType() const { return m_pMetadata.get().has_type(); }
const std::string& getType() const { return m_pMetadata.get().type(); }
bool hasMutable() const { return m_pMetadata.get().has_mutable_(); }
const std::string& getMutable() const { return m_pMetadata.get().mutable_(); }
private:
boost::reference_wrapper<const ::exec::user::SchemaMetadata> m_pMetadata;
};
class DrillTableMetadata: public meta::TableMetadata {
public:
DrillTableMetadata(const ::exec::user::TableMetadata& metadata):
meta::TableMetadata(),
m_pMetadata(metadata){
}
bool hasCatalogName() const { return m_pMetadata.get().has_catalog_name(); }
const std::string& getCatalogName() const { return m_pMetadata.get().catalog_name(); }
bool hasSchemaName() const { return m_pMetadata.get().has_schema_name(); }
const std::string& getSchemaName() const { return m_pMetadata.get().schema_name(); }
bool hasTableName() const { return m_pMetadata.get().has_table_name(); }
const std::string& getTableName() const { return m_pMetadata.get().table_name(); }
bool hasType() const { return m_pMetadata.get().has_type(); }
const std::string& getType() const { return m_pMetadata.get().type(); }
private:
boost::reference_wrapper<const ::exec::user::TableMetadata> m_pMetadata;
};
class DrillColumnMetadata: public meta::ColumnMetadata {
public:
DrillColumnMetadata(const ::exec::user::ColumnMetadata& metadata):
meta::ColumnMetadata(),
m_pMetadata(metadata){
}
bool hasCatalogName() const { return m_pMetadata.get().has_catalog_name(); }
const std::string& getCatalogName() const { return m_pMetadata.get().catalog_name(); }
bool hasSchemaName() const { return m_pMetadata.get().has_schema_name(); }
const std::string& getSchemaName() const { return m_pMetadata.get().schema_name(); }
bool hasTableName() const { return m_pMetadata.get().has_table_name(); }
const std::string& getTableName() const { return m_pMetadata.get().table_name(); }
bool hasColumnName() const { return m_pMetadata.get().has_column_name(); }
const std::string& getColumnName() const { return m_pMetadata.get().column_name(); }
bool hasOrdinalPosition() const { return m_pMetadata.get().has_ordinal_position(); }
std::size_t getOrdinalPosition() const { return m_pMetadata.get().ordinal_position(); }
bool hasDefaultValue() const { return m_pMetadata.get().has_default_value(); }
const std::string& getDefaultValue() const { return m_pMetadata.get().default_value(); }
bool hasNullable() const { return m_pMetadata.get().has_is_nullable(); }
bool isNullable() const { return m_pMetadata.get().is_nullable(); }
bool hasDataType() const { return m_pMetadata.get().has_data_type(); }
const std::string& getDataType() const { return m_pMetadata.get().data_type(); }
bool hasColumnSize() const { return m_pMetadata.get().has_column_size(); }
std::size_t getColumnSize() const { return m_pMetadata.get().column_size(); }
bool hasCharMaxLength() const { return m_pMetadata.get().has_char_max_length(); }
std::size_t getCharMaxLength() const { return m_pMetadata.get().char_max_length(); }
bool hasCharOctetLength() const { return m_pMetadata.get().has_char_octet_length(); }
std::size_t getCharOctetLength() const { return m_pMetadata.get().char_octet_length(); }
bool hasNumericPrecision() const { return m_pMetadata.get().has_numeric_precision(); }
int32_t getNumericPrecision() const { return m_pMetadata.get().numeric_precision(); }
bool hasNumericRadix() const { return m_pMetadata.get().has_numeric_precision_radix(); }
int32_t getNumericRadix() const { return m_pMetadata.get().numeric_precision_radix(); }
bool hasNumericScale() const { return m_pMetadata.get().has_numeric_scale(); }
int32_t getNumericScale() const { return m_pMetadata.get().numeric_scale(); }
bool hasIntervalType() const { return m_pMetadata.get().has_interval_type(); }
const std::string& getIntervalType() const { return m_pMetadata.get().interval_type(); }
bool hasIntervalPrecision() const { return m_pMetadata.get().has_interval_precision(); }
int32_t getIntervalPrecision() const { return m_pMetadata.get().interval_precision(); }
private:
boost::reference_wrapper<const ::exec::user::ColumnMetadata> m_pMetadata;
};
struct ConvertSupportHasher {
std::size_t operator()(const exec::user::ConvertSupport& key) const {
std::size_t hash = 0;
boost::hash_combine(hash, key.from());
boost::hash_combine(hash, key.to());
return hash;
}
};
struct ConvertSupportEqualTo {
bool operator()(exec::user::ConvertSupport const& cs1, exec::user::ConvertSupport const& cs2) const {
return cs1.from() == cs2.from() && cs1.to() == cs2.to();
}
};
typedef boost::unordered_set<exec::user::ConvertSupport, ConvertSupportHasher, ConvertSupportEqualTo> convert_support_set;
class DrillMetadata: public Metadata {
public:
static const std::string s_connectorName;
static const std::string s_connectorVersion;
static const std::string s_serverName;
static const std::string s_serverVersion;
// Default server meta, to be used as fallback if cannot be queried
static const exec::user::ServerMeta s_defaultServerMeta;
DrillMetadata(DrillClientImpl& client, const exec::user::ServerMeta& serverMeta);
~DrillMetadata() {}
DrillClientImpl& client() { return m_client; }
const std::string& getConnectorName() const { return s_connectorName; };
const std::string& getConnectorVersion() const { return s_connectorVersion; }
uint32_t getConnectorMajorVersion() const { return DRILL_VERSION_MAJOR; }
uint32_t getConnectorMinorVersion() const { return DRILL_VERSION_MINOR; }
uint32_t getConnectorPatchVersion() const { return DRILL_VERSION_PATCH; }
const std::string& getServerName() const;
const std::string& getServerVersion() const;
uint32_t getServerMajorVersion() const;
uint32_t getServerMinorVersion() const;
uint32_t getServerPatchVersion() const;
status_t getCatalogs(const std::string& catalogPattern, Metadata::pfnCatalogMetadataListener listener, void* listenerCtx, QueryHandle_t* qHandle);
status_t getSchemas(const std::string& catalogPattern, const std::string& schemaPattern, Metadata::pfnSchemaMetadataListener listener, void* listenerCtx, QueryHandle_t* qHandle);
status_t getTables(const std::string& catalogPattern, const std::string& schemaPattern, const std::string& tablePattern, const std::vector<std::string>* tableTypes, Metadata::pfnTableMetadataListener listener, void* listenerCtx, QueryHandle_t* qHandle);
status_t getColumns(const std::string& catalogPattern, const std::string& schemaPattern, const std:: string& tablePattern, const std::string& columnPattern, Metadata::pfnColumnMetadataListener listener, void* listenerCtx, QueryHandle_t* qHandle);
bool areAllTableSelectable() const { return m_allTablesSelectable; }
bool isCatalogAtStart() const { return m_catalogAtStart; }
const std::string& getCatalogSeparator() const { return m_catalogSeparator; }
const std::string& getCatalogTerm() const { return m_catalogTerm; }
bool isColumnAliasingSupported() const { return m_columnAliasingSupported; }
bool isNullPlusNonNullNull() const { return m_nullPlusNonNullEqualsNull; }
bool isConvertSupported(common::MinorType from, common::MinorType to) const;
meta::CorrelationNamesSupport getCorrelationNames() const { return m_correlationNamesSupport; }
bool isReadOnly() const { return m_readOnly; }
meta::DateTimeLiteralSupport getDateTimeLiteralsSupport() const { return m_dateTimeLiteralsSupport; }
meta::CollateSupport getCollateSupport() const { return m_collateSupport; }
meta::GroupBySupport getGroupBySupport() const { return m_groupBySupport; }
meta::IdentifierCase getIdentifierCase() const { return m_identifierCase; }
const std::string& getIdentifierQuoteString() const { return m_identifierQuoteString; }
const std::vector<std::string>& getSQLKeywords() const { return m_sqlKeywords; }
bool isLikeEscapeClauseSupported() const { return m_likeEscapeClauseSupported; }
std::size_t getMaxBinaryLiteralLength() const { return m_maxBinaryLiteralLength; }
std::size_t getMaxCatalogNameLength() const { return m_maxCatalogNameLength; }
std::size_t getMaxCharLiteralLength() const { return m_maxCharLIteralLength; }
std::size_t getMaxColumnNameLength() const { return m_maxColumnNameLength; }
std::size_t getMaxColumnsInGroupBy() const { return m_maxColumnsInGroupBy; }
std::size_t getMaxColumnsInOrderBy() const { return m_maxColumnsInOrderBy; }
std::size_t getMaxColumnsInSelect() const { return m_maxColumnsInSelect; }
std::size_t getMaxCursorNameLength() const { return m_maxCursorNameLength; }
std::size_t getMaxLogicalLobSize() const { return m_maxLogicalLobSize; }
std::size_t getMaxStatements() const { return m_maxStatements; }
std::size_t getMaxRowSize() const { return m_maxRowSize; }
bool isBlobIncludedInMaxRowSize() const { return m_blobIncludedInMaxRowSize; }
std::size_t getMaxSchemaNameLength() const { return m_maxSchemaNameLength; }
std::size_t getMaxStatementLength() const { return m_maxStatementLength; }
std::size_t getMaxTableNameLength() const { return m_maxTableNameLength; }
std::size_t getMaxTablesInSelect() const { return m_maxTablesInSelectLength; }
std::size_t getMaxUserNameLength() const { return m_maxUserNameLength; }
meta::NullCollation getNullCollation() const { return m_nullCollation; }
const std::vector<std::string>& getNumericFunctions() const { return m_numericFunctions; }
meta::OuterJoinSupport getOuterJoinSupport() const { return m_outerJoinSupport; }
bool isUnrelatedColumnsInOrderBySupported() const { return m_unrelatedColumnsInOrderBySupported; }
meta::QuotedIdentifierCase getQuotedIdentifierCase() const { return m_quotedIdentifierCase; }
const std::string& getSchemaTerm() const { return m_schemaTerm; }
const std::string& getSearchEscapeString() const { return m_searchEscapeString; }
const std::string& getSpecialCharacters() const { return m_specialCharacters; }
const std::vector<std::string>& getStringFunctions() const { return m_stringFunctions; }
meta::SubQuerySupport getSubQuerySupport() const { return m_subQuerySupport; }
const std::vector<std::string>& getSystemFunctions() const { return m_systemFunctions; }
const std::string& getTableTerm() const { return m_tableTerm; }
const std::vector<std::string>& getDateTimeFunctions() const { return m_dateTimeFunctions; }
bool isTransactionSupported() const { return m_transactionSupported; }
meta::UnionSupport getUnionSupport() const { return m_unionSupport; }
bool isSelectForUpdateSupported() const { return m_selectForUpdateSupported; }
private:
DrillClientImpl& m_client;
bool m_allTablesSelectable;
bool m_blobIncludedInMaxRowSize;
bool m_catalogAtStart;
std::string m_catalogSeparator;
std::string m_catalogTerm;
Drill::meta::CollateSupport m_collateSupport;
bool m_columnAliasingSupported;
Drill::meta::CorrelationNamesSupport m_correlationNamesSupport;
convert_support_set m_convertSupport;
std::vector<std::string> m_dateTimeFunctions;
Drill::meta::DateTimeLiteralSupport m_dateTimeLiteralsSupport;
Drill::meta::GroupBySupport m_groupBySupport;
Drill::meta::IdentifierCase m_identifierCase;
std::string m_identifierQuoteString;
bool m_likeEscapeClauseSupported;
std::size_t m_maxBinaryLiteralLength;
std::size_t m_maxCatalogNameLength;
std::size_t m_maxCharLIteralLength;
std::size_t m_maxColumnNameLength;
std::size_t m_maxColumnsInGroupBy;
std::size_t m_maxColumnsInOrderBy;
std::size_t m_maxColumnsInSelect;
std::size_t m_maxCursorNameLength;
std::size_t m_maxLogicalLobSize;
std::size_t m_maxRowSize;
std::size_t m_maxSchemaNameLength;
std::size_t m_maxStatementLength;
std::size_t m_maxStatements;
std::size_t m_maxTableNameLength;
std::size_t m_maxTablesInSelectLength;
std::size_t m_maxUserNameLength;
Drill::meta::NullCollation m_nullCollation;
bool m_nullPlusNonNullEqualsNull;
std::vector<std::string> m_numericFunctions;
Drill::meta::OuterJoinSupport m_outerJoinSupport;
Drill::meta::QuotedIdentifierCase m_quotedIdentifierCase;
bool m_readOnly;
std::string m_schemaTerm;
std::string m_searchEscapeString;
bool m_selectForUpdateSupported;
std::string m_specialCharacters;
std::vector<std::string> m_sqlKeywords;
std::vector<std::string> m_stringFunctions;
Drill::meta::SubQuerySupport m_subQuerySupport;
std::vector<std::string> m_systemFunctions;
std::string m_tableTerm;
bool m_transactionSupported;
Drill::meta::UnionSupport m_unionSupport;
bool m_unrelatedColumnsInOrderBySupported;
};
} // namespace meta
} // namespace Drill
#endif // DRILL_METADATA