예제 #1
0
//处理添加边的函数,如果边的源顶点不存在,则返回错误的状态,如果成功插入,则返回ok状态
//加边的同时,如果成功,要添加边的属性索引,边的属性索引是针对整个图的,而不是子图
void handler_add_edge(Replier &rep){
	proto_edge_u *req_arg=(proto_edge_u*)rep.get_arg();//获取参数
	Subgraph *sub=graph_set->get_subgraph(req_arg->graph_name,req_arg->edge.s_id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
	Edge e(req_arg->edge);
	int res;
	while(true){
		res=sub->add_edge(req_arg->edge.s_id,e);
		if(res==1){
			rep.ans(STATUS_V_NOT_EXIST,"vertex not exist",strlen("vertex not exist")+1);
			break;
		}
		if(res==0) break;
		if(res==-1){
			rep.ans(STATUS_E_EXIST,"edge has exist",strlen("edge has exist")+1);
			break;
		}
	}
	if(res==0){
        //添加边属性的索引
        Graph *graph=graph_set->get_graph(req_arg->graph_name);
        Key k(req_arg->edge.blog_id);
        Value v(req_arg->edge.s_id,req_arg->edge.d_id);
        //graph->add_edge_index(k,v); 
        graph_set->get_graph(req_arg->graph_name)->edge_num_increment();
		rep.ans(STATUS_OK,"ok",strlen("ok")+1);
	}
}
예제 #2
0
//处理批量添加边的函数,边都属于一个图
//加边的同时,如果成功,要添加边的属性索引,边的属性索引是针对整个图的,而不是子图
void handler_add_edges(Replier &rep){
	string graph_name=rep.get_graph_name();
	list<Edge_u> &edges=rep.get_edges();
	list<Edge_u>::iterator it=edges.begin();
	Subgraph *sub;
	uint32_t num=0;
	while(it!=edges.end()){
		sub=graph_set->get_subgraph(graph_name,(*it).s_id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
		Edge e(*it);
		int res=sub->add_edge((*it).s_id,e);
		if(res==0||res==1||res==-1) {
			if(res==0){
            	//添加边属性的索引
                Graph *graph=graph_set->get_graph(graph_name);
                Key k((*it).blog_id);
                Value v((*it).s_id,(*it).d_id);
                //graph->add_edge_index(k,v); 
               	graph_set->get_graph(graph_name)->edge_num_increment();
                num++;//添加成功,记录一笔
			}
			edges.erase(it);
			it=edges.begin();
        }
		else{
			it++;
			if(it==edges.end()){
				it=edges.begin();
			}
		}
	}
	ostringstream stream_num;
	stream_num<<num;
	string string_num=stream_num.str();
	rep.ans(STATUS_OK,string_num.c_str(),string_num.size()+1);
}
예제 #3
0
//处理批量添加边的函数,边都属于一个图
void handler_add_vertexes(Replier &rep){
	string graph_name=rep.get_graph_name();
	list<Vertex_u> &vertexes=rep.get_vertexes();
	list<Vertex_u>::iterator it=vertexes.begin();
	Subgraph *sub;
	uint32_t num=0;
	while(it!=vertexes.end()){
		sub=graph_set->get_subgraph(graph_name,(*it).id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
		Vertex v(*it);
		int res=sub->add_vertex(v);
		if(res==0||res==1){
					if(res==0){
                    	graph_set->get_graph(graph_name)->vertex_num_increment();
                    	num++;//添加成功,记录一笔
					}
					vertexes.erase(it);
					it=vertexes.begin();
                }
		else{
			it++;
			if(it==vertexes.end()){
				it=vertexes.begin();
			}
		}
	}
	ostringstream stream_num;
	stream_num<<num;
	string string_num=stream_num.str();
	rep.ans(STATUS_OK,string_num.c_str(),string_num.size()+1);
}
예제 #4
0
//处理批量read边的函数,边都属于一个图
void handler_read_two_edges(Replier &rep){
	string graph_name=rep.get_graph_name();
	list<Two_vertex> &vertexes=rep.get_two_vertexes();
	list<Two_vertex>::iterator it=vertexes.begin();
	Subgraph *sub;
	uint32_t num=0;
	list<Edge_u> edges;
	while(it!=vertexes.end()){
		int res;
		sub=graph_set->get_subgraph(graph_name,(*it).s_id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
		//sub->read_edges((*it).s_id,(*it).d_id,edges);
		res=sub->read_all_edges((*it).s_id,edges);
		if(res==1||res==0){
			vertexes.erase(it);
			it=vertexes.begin();
		}
		if(res==2){
			it++;
			if(it==vertexes.end()){
				it=vertexes.begin();
			}
			
		}
	}
	rep.ans(STATUS_OK,edges);
}
예제 #5
0
//读取顶点的所有边,如果边的源顶点不存在,则返回错误的状态,如果成功插入,则返回ok状态
void handler_read_edges(Replier &rep){
	proto_graph_vertex *req_arg=(proto_graph_vertex*)rep.get_arg();
	Subgraph *sub=graph_set->get_subgraph(req_arg->graph_name,req_arg->vertex_id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
	list<Edge_u> edges;
	int res;
	while(true){
		res=sub->read_all_edges(req_arg->vertex_id,edges);
		if(res==1){		
			rep.ans(STATUS_V_NOT_EXIST,"vertex not exist",strlen("vertex not exist")+1);
			break;
		}
		if(res==0) break;
	}
	if(res==0){
		rep.ans(STATUS_OK,edges);	
	}
}
예제 #6
0
//处理添加顶点的函数,只要客户端把顶点的请求发过来了,说明该顶点就属于该slave节点了,这是一个异步的过程
void handler_add_vertex(Replier &rep){
	proto_graph_vertex_u *req_arg=(proto_graph_vertex_u*)rep.get_arg();//获取参数
	Subgraph *sub=graph_set->get_subgraph(req_arg->graph_name,req_arg->vertex.id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
	Vertex v(req_arg->vertex);
	int res;
	while(true){
		res=sub->add_vertex(v);
		if(res==1){
			rep.ans(STATUS_V_EXIST,"vertex exist",strlen("vertex exist")+1);
			break;
		}
		if(res==0) break;
	}
	if(res==0){
                graph_set->get_graph(req_arg->graph_name)->vertex_num_increment();
		rep.ans(STATUS_OK,"ok",strlen("ok")+1);
	} 	
}
예제 #7
0
//处理查找该子图的某个图的边数目的函数
void handler_get_edge_num(Replier &rep){
	proto_graph *req_arg=(proto_graph*)rep.get_arg();
    Graph *graph=graph_set->get_graph(req_arg->graph_name);
    uint32_t num=graph->edge_num; 
    ostringstream stream_num;
	stream_num<<num;
	string string_num=stream_num.str();
	rep.ans(STATUS_OK,string_num.c_str(),string_num.size()+1);
}
예제 #8
0
//读取顶点,如果顶点不存在,则返回错误的状态,如果存在,则返回ok状态和顶点的信息
void handler_read_vertex(Replier &rep){
	proto_graph_vertex *req_arg=(proto_graph_vertex*)rep.get_arg();
	Subgraph *sub=graph_set->get_subgraph(req_arg->graph_name,req_arg->vertex_id);//得到该图该顶点所在的子图,子图不存在,则会创建一个
        Vertex_u v;
        uint32_t num;
	while(true){
        int res=sub->read_vertex(req_arg->vertex_id,v,&num);
		if(res==1){		
			rep.ans(STATUS_V_NOT_EXIST,"vertex not exist",strlen("vertex not exist")+1);
			break;
		}
		if(res==0){
			proto_vertex_num mes;
        	mes.vertex=v;
        	mes.num=num;
			rep.ans(STATUS_OK,&mes,sizeof(proto_vertex_num));	
			break;
		}
	}
}
예제 #9
0
//处理查找该节点所有子图的所有顶点
void handler_read_all_vertex(Replier &rep){
	proto_graph *req_arg=(proto_graph*)rep.get_arg();
    Graph *graph=graph_set->get_graph(req_arg->graph_name);
	list<Vertex_u> vertexes;
	//遍历所有子图
	unordered_map<uint32_t,Subgraph*>::iterator it;
	for(it=graph->sgs.begin();it!=graph->sgs.end();it++){
		it->second->read_all_vertex(vertexes);
	}
	rep.ans(STATUS_OK,vertexes);
}
예제 #10
0
//处理根据属性查找边的函数
void handler_read_edge_index(Replier &rep){
	proto_blog_id *req_arg=(proto_blog_id*)rep.get_arg();
	list<Edge_u> edges;//存储返回的结果
        Key k(req_arg->blog_id);
        Graph *graph=graph_set->get_graph(req_arg->graph_name);
        list<Value> vs;
        unordered_map<int,unordered_map<int,int>*> repeated;//这个map用来查重,重复的两个顶点就不用再找边了
        unordered_map<int,unordered_map<int,int>*>::iterator it_out;
        unordered_map<int,int>::iterator it_in;
        list<Value>::iterator it;
        graph->get_edge_index(k,vs);
        for(it=vs.begin();it!=vs.end();it++){
               v_type s_id=(*it).s_id;
               v_type d_id=(*it).d_id;
               //查看
               it_out=repeated.find(s_id);
               int flag;//0代表没有重复,1代表重复
               if(it_out==repeated.end()){
                    unordered_map<int,int>*tmp=new unordered_map<int,int>();
                    (*tmp)[d_id]=1;
                    repeated[s_id]=tmp; 
                    flag=0;
               }else{
                    unordered_map<int,int>*tmp=it_out->second;
                    if(tmp->find(d_id)==tmp->end()){
                         flag=0;
                         (*tmp)[d_id]=1;
                    }else{
                         flag=1;
                    }
               }
               if(flag==0){
                    //顶点没有重复的时候就去查找边
                    Subgraph *sub=graph_set->get_subgraph(req_arg->graph_name,s_id);
					int res;
					while(true){
                    	res=sub->read_edges(s_id,d_id,req_arg->blog_id,edges);    
						if(res==1||res==0){
							break;
						}
					}
               }
        }
        //释放内存
        for(it_out=repeated.begin();it_out!=repeated.end();it_out++)
              delete it_out->second;
	rep.ans(STATUS_OK,edges);
}