|  | /** | 
|  | *   Copyright 2016, Quickstep Research Group, Computer Sciences Department, | 
|  | *   University of Wisconsin—Madison. | 
|  | *   Copyright 2016 Pivotal Software, Inc. | 
|  | * | 
|  | *   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. | 
|  | **/ | 
|  |  | 
|  | #ifndef QUICKSTEP_EXPRESSIONS_TABLE_GENERATOR_GENERATOR_FUNCTION_HPP_ | 
|  | #define QUICKSTEP_EXPRESSIONS_TABLE_GENERATOR_GENERATOR_FUNCTION_HPP_ | 
|  |  | 
|  | #include <exception> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "utility/Macros.hpp" | 
|  |  | 
|  | namespace quickstep { | 
|  |  | 
|  | class GeneratorFunctionHandle; | 
|  | class TypedValue; | 
|  |  | 
|  | /** \addtogroup Expressions | 
|  | *  @{ | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @brief A class representing a particular generator function in the abstract | 
|  | *        sense. | 
|  | * | 
|  | * Generator functions are used for generating tables. A generator function | 
|  | * takes a list of constant arguments at query compile time, and populates the | 
|  | * given ColumnVectorValueAccesor at query run time. | 
|  | * | 
|  | * The GeneratorFunction class provides informational methods about the | 
|  | * applicability of a particular generator function to particular constant | 
|  | * arguments. The actual implementation of the generator functions' logic is in | 
|  | * the GeneratorFunctionHandle class hierarchy, and can be different depending | 
|  | * on the particular arguments given to the function. At query compile time, | 
|  | * a caller should first call GeneratorFunction::generateHandle() to instantiate | 
|  | * an GeneratorFunctionHandle object. The handle object provides information | 
|  | * about the concrete function, e.g. the number and types of the output columns | 
|  | * Then, at query run time, the backend also uses the handle object's methods | 
|  | * to actually generate a table. | 
|  | * | 
|  | * To add a new generator function, subclass both GeneratorFunction and | 
|  | * GeneratorFunctionHandle to implement the logics. Also add a line in | 
|  | * GeneratorFunctionFactory's constructor to make the new function registered. | 
|  | * | 
|  | * See GenerateSeries and GenerateSeriesHandle as an example of how to implement | 
|  | * new generator funcitons. | 
|  | **/ | 
|  | class GeneratorFunction { | 
|  | public: | 
|  | /** | 
|  | * @brief Get the name of this generator function. The name should be unique | 
|  | * as it is used to register this function into the generator function pool. | 
|  | * | 
|  | * @return The name of this generator function. | 
|  | **/ | 
|  | virtual const std::string getName() const = 0; | 
|  |  | 
|  | /** | 
|  | * @brief Get the usage syntax of this generator function in text form. The | 
|  | *        syntax information will be displayed when the end users ask for help | 
|  | *        on the usage of this function. | 
|  | * | 
|  | * @return The usage syntax of this generator function in text form. | 
|  | **/ | 
|  | virtual const std::string getSyntax() const = 0; | 
|  |  | 
|  | /** | 
|  | * @brief Create an GeneratorFunctionHandle. | 
|  | * | 
|  | * @param arguments A list of zero or more constant arguments to this | 
|  | *        generator funciton. | 
|  | * @exception GeneratorFunctionInvalidArguments The arguments to this | 
|  | *            generator function are invalid. | 
|  | * @return A new GeneratorFunctionHandle object that is used to do the actual | 
|  | *         table generation. Caller is responsible for deleting the returned | 
|  | *         object. | 
|  | **/ | 
|  | virtual GeneratorFunctionHandle* createHandle( | 
|  | const std::vector<TypedValue> &arguments) const = 0; | 
|  |  | 
|  | protected: | 
|  | GeneratorFunction() { | 
|  | } | 
|  |  | 
|  | private: | 
|  | DISALLOW_COPY_AND_ASSIGN(GeneratorFunction); | 
|  | }; | 
|  |  | 
|  |  | 
|  | /** | 
|  | * @brief Exception thrown for invalid arguments to a generator function. | 
|  | **/ | 
|  | class GeneratorFunctionInvalidArguments : public std::exception { | 
|  | public: | 
|  | /** | 
|  | * @brief Constructor. | 
|  | * | 
|  | * @param message The error message. | 
|  | **/ | 
|  | explicit GeneratorFunctionInvalidArguments(const std::string &message) | 
|  | : message_(message) { | 
|  | } | 
|  |  | 
|  | ~GeneratorFunctionInvalidArguments() throw() { | 
|  | } | 
|  |  | 
|  | virtual const char* what() const throw() { | 
|  | return message_.c_str(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | std::string message_; | 
|  | }; | 
|  |  | 
|  | /** @} */ | 
|  |  | 
|  | }  // namespace quickstep | 
|  |  | 
|  | #endif /* QUICKSTEP_EXPRESSIONS_TABLE_GENERATOR_GENERATOR_FUNCTION_HPP_ */ |