示例#1
0
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_;
}
示例#2
0
//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_;

}