PageRenderTime 45ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/release-0.1-rc2/hive/external/odbc/src/cpp/HiveResultSet.h

#
C Header | 190 lines | 90 code | 26 blank | 74 comment | 0 complexity | 8dc2512563a7ff71e23961626b21b9e7 MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause, JSON, CPL-1.0
  1. /**************************************************************************//**
  2. *
  3. * Licensed to the Apache Software Foundation (ASF) under one
  4. * or more contributor license agreements. See the NOTICE file
  5. * distributed with this work for additional information
  6. * regarding copyright ownership. The ASF licenses this file
  7. * to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. ******************************************************************************
  20. *
  21. * @file HiveResultSet.h
  22. * @brief Provides the HiveResultSet interface definition and subclasses.
  23. *
  24. *****************************************************************************/
  25. #ifndef __hive_resultset_h__
  26. #define __hive_resultset_h__
  27. #include <iostream>
  28. #include "hive_metastore_types.h"
  29. #include "hiveconstants.h"
  30. #include "HiveConnection.h"
  31. #include "HiveRowSet.h"
  32. #include "HiveColumnDesc.h"
  33. using namespace std;
  34. /*************************************************************************************************
  35. * Base HiveResultSet Class Abstract Declaration
  36. ************************************************************************************************/
  37. /**
  38. * @brief HiveResultSet interface definition.
  39. *
  40. * Abstract base class for Hive resultsets. Does not provide any additional logic for
  41. * subclasses, but defines the interface expected for all HiveResultSets.
  42. * All subclasses extending HiveResultSet need to at least implement the below methods.
  43. */
  44. class HiveResultSet {
  45. public:
  46. virtual ~HiveResultSet() {} ///< The constructor should be defined independently by each subclass
  47. virtual HiveReturn fetchNext(char* err_buf, size_t err_buf_len) =0;
  48. virtual HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len) =0;
  49. virtual HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len) =0;
  50. virtual HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr,
  51. char* err_buf, size_t err_buf_len) =0;
  52. /// The rowset will ONLY be valid after fetchNext has been called at least once
  53. virtual HiveRowSet& getRowSet() =0;
  54. };
  55. /*************************************************************************************************
  56. * HiveQueryResultSet Subclass Declaration
  57. ************************************************************************************************/
  58. /**
  59. * @brief A container for the resultsets of Hive queries.
  60. *
  61. * Container class for a query result set (the result of a DBExecute).
  62. * This class was only meant to be created by DBExecute and destroyed by DBCloseResultSet.
  63. * Implements a lazy row/field extraction approach.
  64. * A single instance should only belong to no more than one thread.
  65. * All errors messages will be written to err_buf if err_buf and err_buf_len are provided.
  66. */
  67. class HiveQueryResultSet: public HiveResultSet {
  68. public:
  69. HiveQueryResultSet(int max_buf_rows);
  70. virtual ~HiveQueryResultSet();
  71. HiveReturn initialize(HiveConnection* connection, char* err_buf, size_t err_buf_len);
  72. HiveReturn fetchNext(char* err_buf, size_t err_buf_len);
  73. HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len);
  74. HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len);
  75. HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf,
  76. size_t err_buf_len);
  77. HiveRowSet& getRowSet();
  78. private:
  79. HiveConnection* m_connection; ///< Hive connection handle
  80. HiveSerializedRowSet m_serial_rowset; ///< Rowset associated with the current fetched row (if any)
  81. int m_max_buffered_rows; ///< Max number of rows to buffer in client memory
  82. int m_fetch_idx; ///< Last row fetched by the client
  83. bool m_has_results; ///< Indicates that at least one result row has been successfully fetched
  84. bool m_fetch_attempted; ///< Indicates that a Hive server fetch call has successfully executed
  85. vector<string> m_result_set_data; ///< Vector of serialized rows
  86. Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table
  87. HiveReturn initializeSchema(char* err_buf, size_t err_buf_len);
  88. HiveReturn fetchNewResults(char* err_buf, size_t err_buf_len);
  89. };
  90. /*************************************************************************************************
  91. * HiveTablesResultSet Subclass Declaration
  92. ************************************************************************************************/
  93. /**
  94. * @brief A container for resultsets describing the database table catalog.
  95. *
  96. * Container class for a pre-scripted table list resultset (the result of a DBTables).
  97. * This class was only meant to be created by DBTables and destroyed by DBCloseResultSet.
  98. * All error messages will be written to err_buf if err_buf and err_buf_len are provided.
  99. * This is a very rudimentary implementation b/c not much table info is available.
  100. */
  101. class HiveTablesResultSet: public HiveResultSet {
  102. public:
  103. HiveTablesResultSet();
  104. virtual ~HiveTablesResultSet();
  105. HiveReturn initialize(HiveConnection* connection, const char* tbl_search_pattern, char* err_buf,
  106. size_t err_buf_len);
  107. HiveReturn fetchNext(char* err_buf, size_t err_buf_len);
  108. HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len);
  109. HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len);
  110. HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf,
  111. size_t err_buf_len);
  112. HiveRowSet& getRowSet();
  113. private:
  114. int m_fetch_idx; ///< Last row fetched by the client
  115. /// OK to use vector<string> b/c greatly simplifies work and class not used often
  116. vector<string> m_curr_row_data; ///< Vector with row data corresponding to row at m_fetch_idx
  117. /// Rowset associated with the current fetched row (if any)
  118. HiveStringVectorRowSet m_vecstring_rowset;
  119. vector<string> m_tables; ///< Vector of table names
  120. Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table
  121. HiveReturn initializeSchema(char* err_buf, size_t err_buf_len);
  122. HiveReturn constructCurrentRow(char* err_buf, size_t err_buf_len);
  123. };
  124. /*************************************************************************************************
  125. * HiveColumnsResultSet Subclass Declaration
  126. ************************************************************************************************/
  127. /**
  128. * @brief A container for resultsets describing the columns of table(s).
  129. *
  130. * Container class for a pre-scripted column info resultset (the result of a DBColumns).
  131. * This class was only meant to be created by DBColumns and destroyed by DBCloseResultSet.
  132. * All error messages will be written to err_buf if err_buf and err_buf_len are provided.
  133. * This is a very rudimentary implementation b/c not much column info is available.
  134. */
  135. class HiveColumnsResultSet: public HiveResultSet {
  136. public:
  137. /// Constructor requires a Hive-to-SQL type convert function pointer as an argument
  138. HiveColumnsResultSet(int(*fpHiveToSQLType)(HiveType));
  139. virtual ~HiveColumnsResultSet();
  140. HiveReturn initialize(HiveConnection* connection, const char* tbl_search_pattern,
  141. const char* col_search_pattern, char* err_buf, size_t err_buf_len);
  142. HiveReturn fetchNext(char* err_buf, size_t err_buf_len);
  143. HiveReturn hasResults(int* results, char* err_buf, size_t err_buf_len);
  144. HiveReturn getColumnCount(size_t* col_count, char* err_buf, size_t err_buf_len);
  145. HiveReturn createColumnDesc(size_t column_idx, HiveColumnDesc** column_desc_ptr, char* err_buf,
  146. size_t err_buf_len);
  147. HiveRowSet& getRowSet();
  148. private:
  149. HiveConnection* m_connection; ///< Hive connection handle
  150. int (*m_fpHiveToSQLType)(HiveType); ///< Pointer to HiveType to SQLType convert function
  151. int m_tbl_fetch_idx; ///< Last table fetched
  152. int m_col_fetch_idx; ///< Last column fetched
  153. vector<string> m_tables; ///< Vector of table names
  154. vector<Apache::Hadoop::Hive::FieldSchema> m_columns; ///< Vector of column field schemas
  155. /// OK to use vector<string> b/c greatly simplifies work and class not used often
  156. vector<string> m_curr_row_data; ///< Vector with constructed row data
  157. /// Rowset associated with the current constructed row (if any)
  158. HiveStringVectorRowSet m_vecstring_rowset;
  159. Apache::Hadoop::Hive::Schema m_schema; ///< Schema of the result table
  160. HiveReturn getNextTableFields(char* err_buf, size_t err_buf_len);
  161. HiveReturn initializeSchema(char* err_buf, size_t err_buf_len);
  162. HiveReturn constructCurrentRow(char* err_buf, size_t err_buf_len);
  163. };
  164. #endif // __hive_resultset_h__