Dataflow LogicalIndexScan::getDataflow() { if(!scan_projection_->AllPartitionBound()){ printf("Binded!\n"); Catalog::getInstance()->getBindingModele()->BindingEntireProjection(scan_projection_->getPartitioner(),DESIRIABLE_STORAGE_LEVEL); } dataflow_.attribute_list_ = scan_projection_->getAttributeList(); Partitioner* par = scan_projection_->getPartitioner(); dataflow_.property_.partitioner = DataflowPartitioningDescriptor(*par); dataflow_.property_.commnication_cost = 0; return dataflow_; }
//LogicalProjection LogicalScan::getLogcialProjection()const{ // return logical_projection_; //} //can only scan all attributes in a projection Dataflow LogicalScan::getDataflow(){ if(dataflow_==0) dataflow_=new Dataflow(); else return *dataflow_; TableID table_id=scan_attribute_list_[0].table_id_; TableDescriptor* table=Catalog::getInstance()->getTable(table_id); if(target_projection_==0){ ProjectionOffset target_projection_off=-1; unsigned int min_projection_cost = -1; /* * TODO: get real need column as scan_attribute_list_, otherwise, optimization don't work -Yu */ for(ProjectionOffset projection_off=0;projection_off<table->getNumberOfProjection();projection_off++){ ProjectionDescriptor* projection=table->getProjectoin(projection_off); bool fail=false; for(std::vector<Attribute>::iterator it=scan_attribute_list_.begin();it!=scan_attribute_list_.end();it++){ if(!projection->hasAttribute(*it)){ /*the attribute *it is not in the projection*/ fail=true; break; } } if(fail==true){ continue; } unsigned int projection_cost = projection->getProjectionCost(); //get the projection with minimum cost if (min_projection_cost > projection_cost) { target_projection_off = projection_off; min_projection_cost = projection_cost; cout<<"in "<<table->getNumberOfProjection()<<" projections, " "projection "<<projection_off<<" has less cost:"<<projection_cost<<endl; } // projection_candidate.push_back(projection_off); // break; } if(target_projection_off==-1){ /*fail to find a projection that contains all the scan attribute*/ printf("The current implementation does not support the scanning that involves more than one projection.\n"); assert(false); } target_projection_=table->getProjectoin(target_projection_off); cout<<"in "<<table->getNumberOfProjection()<<" projections, " "projection "<<target_projection_off<<" has min cost:"<<min_projection_cost<<endl; } if(!target_projection_->AllPartitionBound()){ Catalog::getInstance()->getBindingModele()->BindingEntireProjection(target_projection_->getPartitioner(),DESIRIABLE_STORAGE_LEVEL); } /*build the data flow*/ dataflow_->attribute_list_=scan_attribute_list_; /*attribute_list*/ Partitioner* par=target_projection_->getPartitioner(); dataflow_->property_.partitioner=DataflowPartitioningDescriptor(*par); dataflow_->property_.commnication_cost=0; return *dataflow_; }