Column-oriented GPU-accelerated Database Management System
CoGaDB
|
00001 #pragma once 00002 00003 #include <query_processing/definitions.hpp> 00004 #include <util/get_name.hpp> 00005 00006 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::Map_Init_Function ColumnWise_Map_Init_Function; 00007 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::Physical_Operator_Map ColumnWise_Physical_Operator_Map; 00008 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::Physical_Operator_Map_Ptr ColumnWise_Physical_Operator_Map_Ptr; 00009 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::TypedOperatorPtr ColumnWise_TypedOperatorPtr; 00010 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::TypedLogicalNode ColumnWise_TypedLogicalNode; 00011 // typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::PhysicalQueryPlanPtr ColumnWise_PhysicalQueryPlanPtr; 00012 // 00013 // typedef hype::queryprocessing::LogicalQueryPlan<ColumnPtr> ColumnWise_LogicalQueryPlan; 00014 00015 namespace CoGaDB { 00016 namespace query_processing { 00017 namespace physical_operator { 00018 00019 class CPU_ColumnAlgebraOperation : public hype::queryprocessing::BinaryOperator<ColumnPtr, ColumnPtr, ColumnPtr> { 00020 public: 00021 typedef hype::queryprocessing::OperatorMapper_Helper_Template<ColumnPtr>::TypedOperatorPtr ColumnWise_TypedOperatorPtr; 00022 00023 CPU_ColumnAlgebraOperation(const hype::SchedulingDecision& sched_dec, 00024 ColumnWise_TypedOperatorPtr left_child, 00025 ColumnWise_TypedOperatorPtr right_child, 00026 ColumnAlgebraOperation op, 00027 MaterializationStatus mat_stat = MATERIALIZE) : BinaryOperator<ColumnPtr, ColumnPtr, ColumnPtr>(sched_dec, left_child, right_child), 00028 op_(op), 00029 mat_stat_(mat_stat) { 00030 } 00031 00032 virtual bool execute() { 00033 std::cout << "Execute Column Operator CPU" << std::endl; 00034 00035 if (op_ == ADD) { 00036 this->getInputDataLeftChild()->add(this->getInputDataRightChild()); 00037 } else if (op_ == SUB) { 00038 this->getInputDataLeftChild()->minus(this->getInputDataRightChild()); 00039 } else if (op_ == MUL) { 00040 this->getInputDataLeftChild()->multiply(this->getInputDataRightChild()); 00041 } else if (op_ == DIV) { 00042 this->getInputDataLeftChild()->division(this->getInputDataRightChild()); 00043 } 00044 00045 this->result_ = this->getInputDataLeftChild(); 00046 00047 if (this->result_) 00048 return true; 00049 else 00050 return false; 00051 } 00052 00053 virtual ~CPU_ColumnAlgebraOperation() { 00054 } 00055 private: 00056 ColumnAlgebraOperation op_; 00057 MaterializationStatus mat_stat_; 00058 }; 00059 00060 class GPU_ColumnAlgebraOperation : public hype::queryprocessing::BinaryOperator<gpu::GPU_Base_ColumnPtr, gpu::GPU_Base_ColumnPtr, gpu::GPU_Base_ColumnPtr> { 00061 public: 00062 typedef hype::queryprocessing::OperatorMapper_Helper_Template<gpu::GPU_Base_ColumnPtr>::TypedOperatorPtr GPU_ColumnWise_TypedOperatorPtr; 00063 00064 GPU_ColumnAlgebraOperation(const hype::SchedulingDecision& sched_dec, 00065 GPU_ColumnWise_TypedOperatorPtr left_child, 00066 GPU_ColumnWise_TypedOperatorPtr right_child, 00067 ColumnAlgebraOperation op, 00068 MaterializationStatus mat_stat = MATERIALIZE) : BinaryOperator<gpu::GPU_Base_ColumnPtr, gpu::GPU_Base_ColumnPtr, gpu::GPU_Base_ColumnPtr>(sched_dec, left_child, right_child), 00069 op_(op), 00070 mat_stat_(mat_stat) { 00071 } 00072 00073 virtual bool execute() { 00074 std::cout << "Execute Column Operator GPU" << std::endl; 00075 //const TablePtr sort(TablePtr table, const std::string& column_name, SortOrder order=ASCENDING, MaterializationStatus mat_stat=MATERIALIZE, ComputeDevice comp_dev=CPU); 00076 //this->result_=BaseTable::sort(this->getInputData(), column_name_,order_, mat_stat_,CPU); 00077 //JoinAlgorithm{SORT_MERGE_JOIN,NESTED_LOOP_JOIN,HASH_JOIN}; 00078 //this->result_=BaseTable::join(this->getInputDataLeftChild(), join_column1_name_, this->getInputDataRightChild(), join_column2_name_, NESTED_LOOP_JOIN, mat_stat_, CPU); 00079 00080 if (this->result_) 00081 return true; 00082 else 00083 return false; 00084 } 00085 00086 virtual ~GPU_ColumnAlgebraOperation() { 00087 } 00088 private: 00089 ColumnAlgebraOperation op_; 00090 MaterializationStatus mat_stat_; 00091 }; 00092 00093 ColumnWise_Physical_Operator_Map_Ptr map_init_function_column_algebra_operator(); //erfordert dass object auf unterschiedliche Processing devices gleich behandelt werden kann, was aber in diesem Fall nicht gegeben ist, weil CPU und GPU columns nix miteinander zu tun haben! -> 00094 ColumnWise_TypedOperatorPtr create_CPU_ColumnAlgebraOperator(ColumnWise_TypedLogicalNode& logical_node, const hype::SchedulingDecision&, ColumnWise_TypedOperatorPtr left_child, ColumnWise_TypedOperatorPtr right_child); 00095 GPU_ColumnWise_TypedOperatorPtr create_GPU_ColumnAlgebraOperator(GPU_ColumnWise_TypedLogicalNode& logical_node, const hype::SchedulingDecision&, GPU_ColumnWise_TypedOperatorPtr left_child, GPU_ColumnWise_TypedOperatorPtr right_child); 00096 00097 }//end namespace physical_operator 00098 00099 //extern Map_Init_Function init_function_Join_operator; 00100 00101 //Map_Init_Function init_function_Join_operator=physical_operator::map_init_function_Join_operator; //boost::bind(); 00102 00103 namespace logical_operator { 00104 00105 class Logical_ColumnAlgebraOperation : public hype::queryprocessing::TypedNode_Impl<ColumnPtr, physical_operator::map_init_function_column_algebra_operator> //init_function_Join_operator> 00106 { 00107 public: 00108 00109 Logical_ColumnAlgebraOperation(ColumnAlgebraOperation op, 00110 MaterializationStatus mat_stat = MATERIALIZE) : TypedNode_Impl<ColumnPtr, physical_operator::map_init_function_column_algebra_operator>(), 00111 op_(op), 00112 mat_stat_(mat_stat) { 00113 } 00114 00115 virtual unsigned int getOutputResultSize() const { 00116 return 0; 00117 } 00118 00119 virtual double getCalculatedSelectivity() const { 00120 return 1; 00121 } 00122 00123 virtual std::string getOperationName() const { 00124 return util::getName(op_); 00125 } 00126 00127 virtual ColumnAlgebraOperation getColumnAlgebraOperation() const { 00128 return op_; 00129 } 00130 00131 const MaterializationStatus& getMaterializationStatus() const { 00132 return mat_stat_; 00133 } 00134 private: 00135 ColumnAlgebraOperation op_; 00136 MaterializationStatus mat_stat_; 00137 }; 00138 00139 }//end namespace logical_operator 00140 00141 }//end namespace query_processing 00142 00143 }; //end namespace CogaDB