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