private Set<EdgeOperator> getFirstStage(List<Edge> edges) {
		Set<EdgeOperator> firststage = new HashSet<EdgeOperator>();
		List<Edge> toberemove = new ArrayList<Edge>();
		for(Edge e:edges) {
			Edge se = (Edge) e;
			if(se.getV1().getNode().isConcrete() || se.getV2().getNode().isConcrete()) {
				firststage.add(new HashJoin(se));
				toberemove.add(e);
			}
			
			if(!se.getV1().isConsumed()) {
				firststage.add(new BindJoin(se.getV1(),se));
				toberemove.add(e);
			} else if(!se.getV2().isConsumed()) {
				firststage.add(new BindJoin(se.getV2(),se));
				toberemove.add(e);
			}
		}
		edges.removeAll(toberemove);
		return firststage;
	}