@Override
	public List<EdgeOperator> nextStage() {
		if(g.getEdges().isEmpty())
			return null;
		List<EdgeOperator> operators = new ArrayList<EdgeOperator>();
		int size = Integer.MAX_VALUE;
		Vertex mini = null;
		for(Vertex v:g.getVertices()) {
			if(v.getNumber()<size) {
				mini = v;
				size = v.getNumber();
			}
		}
		
		remainVertices.remove(mini);
		Set<Edge> edges = new HashSet<Edge>(mini.getEdges());
		for(Edge e:edges) {
			g.removeEdge(e);
			if(e.getV1().getNode().isConcrete() || e.getV2().getNode().isConcrete()) {
				operators.add(new HashJoin((Edge) e));
			} else {
				operators.add(new BindJoin(mini,(Edge) e));
			}
		}
		return operators;
	}