1
0
mirror of https://github.com/mariadb-corporation/mariadb-columnstore-engine.git synced 2025-04-18 21:44:02 +03:00
2025-02-21 20:02:38 +04:00

170 lines
4.2 KiB
C++

/* Copyright (C) 2014 InfiniDB, Inc.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; version 2 of
the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA. */
/******************************************************************************
* $Id: objectreader.h 9633 2013-06-19 13:36:01Z rdempsey $
*
*****************************************************************************/
/** @file
* class ObjectReader interface
*/
#pragma once
#include <exception>
#include <string>
#include <cstdint>
namespace messageqcpp
{
class ByteStream;
}
namespace execplan
{
class TreeNode;
class ParseTree;
class CalpontExecutionPlan;
/** @brief A class for creating execplan classes from ByteStreams.
*
* A class currently used for recreating execplan polymorphic classes
* and dynamic objects from ByteStreams.
*/
class ObjectReader
{
public:
class UnserializeException : public std::exception
{
public:
explicit UnserializeException(std::string) noexcept;
~UnserializeException() noexcept override;
const char* what() const noexcept override;
private:
std::string fWhat;
};
/** @brief Enumerates classes supporting serialization
*
* This defines one constant for each class that supports
* serialization.
*/
enum CLASSID
{
ZERO, // an appropriate initializer
NULL_CLASS, // to denote that some member is NULL
/**** TreeNodes */
TREENODE,
TREENODEIMPL,
RETURNEDCOLUMN,
AGGREGATECOLUMN,
GROUPCONCATCOLUMN,
ARITHMETICCOLUMN,
CONSTANTCOLUMN,
ROLLUPMARKCOLUMN,
FUNCTIONCOLUMN,
ROWCOLUMN,
WINDOWFUNCTIONCOLUMN,
PSEUDOCOLUMN,
SIMPLECOLUMN,
SIMPLECOLUMN_INT1,
SIMPLECOLUMN_INT2,
SIMPLECOLUMN_INT4,
SIMPLECOLUMN_INT8,
SIMPLECOLUMN_UINT1,
SIMPLECOLUMN_UINT2,
SIMPLECOLUMN_UINT4,
SIMPLECOLUMN_UINT8,
SIMPLECOLUMN_DECIMAL1,
SIMPLECOLUMN_DECIMAL2,
SIMPLECOLUMN_DECIMAL4,
SIMPLECOLUMN_DECIMAL8,
FILTER,
CONDITIONFILTER,
EXISTSFILTER,
SELECTFILTER,
SIMPLEFILTER,
SIMPLESCALARFILTER,
OPERATOR,
ARITHMETICOPERATOR,
PREDICATEOPERATOR,
LOGICOPERATOR,
/**** /TreeNodes */
PARSETREE,
CALPONTSELECTEXECUTIONPLAN,
CONSTANTFILTER,
OUTERJOINONFILTER,
/** UDAF SDK */
MCSV1_CONTEXT,
UDAFCOLUMN,
/** ANALYZE TABLE */
MCSANALYZETBLEXECUTIONPLAN,
};
typedef uint8_t id_t; // expand as necessary
/** @brief Creates a new TreeNode object from the ByteStream
*
* @param b The ByteStream to create it from
* @return A newly allocated TreeNode
*/
static TreeNode* createTreeNode(messageqcpp::ByteStream& b);
/** @brief Creates a new ParseTree from the ByteStream
*
* @param b The ByteStream to create it from
* @return A newly allocated ParseTree
*/
static ParseTree* createParseTree(messageqcpp::ByteStream& b);
/** @brief Creates a new CalpontExecutionPlan from the ByteStream
*
* @param b The ByteStream to create it from
* @return A newly allocated CalpontExecutionPlan
*/
static CalpontExecutionPlan* createExecutionPlan(messageqcpp::ByteStream& b);
/** @brief Serialize() for ParseTrees
*
* This function effectively serializes a ParseTree.
* @param tree The ParseTree to write out
* @param b The ByteStream to write tree to
*/
static void writeParseTree(const ParseTree* tree, messageqcpp::ByteStream& b);
/** @brief Verify the type of the next object in the ByteStream
*
* @param b The ByteStream to read from
* @param type The type it should be
* @throw UnserializeException if the type does not match; this is a fatal error.
*/
static void checkType(messageqcpp::ByteStream& b, const CLASSID type);
};
} // namespace execplan