// Constructor TableScanTranslator::TableScanTranslator(const planner::SeqScanPlan &scan, CompilationContext &context, Pipeline &pipeline) : OperatorTranslator(context, pipeline), scan_(scan), table_(*scan_.GetTable()) { LOG_DEBUG("Constructing TableScanTranslator ..."); // The restriction, if one exists const auto *predicate = GetScanPlan().GetPredicate(); if (predicate != nullptr) { // If there is a predicate, prepare a translator for it context.Prepare(*predicate); // If the scan's predicate is SIMDable, install a boundary at the output if (predicate->IsSIMDable()) { pipeline.InstallBoundaryAtOutput(this); } } auto &codegen = GetCodeGen(); auto &runtime_state = context.GetRuntimeState(); selection_vector_id_ = runtime_state.RegisterState( "scanSelVec", codegen.VectorType(codegen.Int32Type(), Vector::kDefaultVectorSize), true); LOG_DEBUG("Finished constructing TableScanTranslator ..."); }
// Get the stringified name of this scan std::string TableScanTranslator::GetName() const { std::string name = "Scan('" + GetTable().GetName() + "'"; auto *predicate = GetScanPlan().GetPredicate(); if (predicate != nullptr && predicate->IsSIMDable()) { name.append(", ").append(std::to_string(Vector::kDefaultVectorSize)); } name.append(")"); return name; }
// Constructor TableScanTranslator::TableScanTranslator(const planner::SeqScanPlan &scan, CompilationContext &context, Pipeline &pipeline) : OperatorTranslator(context, pipeline), scan_(scan), table_(*scan_.GetTable()) { LOG_DEBUG("Constructing TableScanTranslator ..."); // The restriction, if one exists const auto *predicate = GetScanPlan().GetPredicate(); if (predicate != nullptr) { // If there is a predicate, prepare a translator for it context.Prepare(*predicate); // If the scan's predicate is SIMDable, install a boundary at the output if (predicate->IsSIMDable()) { pipeline.InstallBoundaryAtOutput(this); } } LOG_DEBUG("Finished constructing TableScanTranslator ..."); }
// Produce! void TableScanTranslator::Produce() const { auto &codegen = GetCodeGen(); auto &table = GetTable(); LOG_TRACE("TableScan on [%u] starting to produce tuples ...", table.GetOid()); // Get the table instance from the database llvm::Value *storage_manager_ptr = GetStorageManagerPtr(); llvm::Value *db_oid = codegen.Const32(table.GetDatabaseOid()); llvm::Value *table_oid = codegen.Const32(table.GetOid()); llvm::Value *table_ptr = codegen.Call(StorageManagerProxy::GetTableWithOid, {storage_manager_ptr, db_oid, table_oid}); // The selection vector for the scan auto *raw_vec = codegen.AllocateBuffer( codegen.Int32Type(), Vector::kDefaultVectorSize, "scanSelVector"); Vector sel_vec{raw_vec, Vector::kDefaultVectorSize, codegen.Int32Type()}; auto predicate = const_cast<expression::AbstractExpression *>( GetScanPlan().GetPredicate()); llvm::Value *predicate_ptr = codegen->CreateIntToPtr( codegen.Const64((int64_t)predicate), AbstractExpressionProxy::GetType(codegen)->getPointerTo()); size_t num_preds = 0; auto *zone_map_manager = storage::ZoneMapManager::GetInstance(); if (predicate != nullptr && zone_map_manager->ZoneMapTableExists()) { if (predicate->IsZoneMappable()) { num_preds = predicate->GetNumberofParsedPredicates(); } } ScanConsumer scan_consumer{*this, sel_vec}; table_.GenerateScan(codegen, table_ptr, sel_vec.GetCapacity(), scan_consumer, predicate_ptr, num_preds); LOG_TRACE("TableScan on [%u] finished producing tuples ...", table.GetOid()); }