public static boolean fixRelaxTable(int tableIndex, int localPartSize){	
		boolean ret = false;
		if(tableIndex >= localPartSize)
			return searchProcedure(relaxedProcedureIndex);
		
		if(!flipBase[tableIndex])				
			return fixRelaxTable(tableIndex + 1, localPartSize);
		/* DEBUG
		if(current.tableList.get(tableIndex).replication
				|| (current.tableList.get(tableIndex).attrCdt.size() == 0))
			System.err.println("Something Wrong with fixRelaxTable()");
		*/
		Table tmp = current.partitionList.get(tableIndex);
		// use all attrCdt to set routing attribute
		for(String attrC: tmp.attrCdt){	
			tmp.fixRelaxPartitionAttr(attrC);
			if(fixRelaxTable(tableIndex + 1, localPartSize))
				ret = true;
		}
		
		int i;
		// replicate originally partitioned table
		tmp.replication = true;
//zt		current.tableList.remove(tableIndex);
		current.partitionList.remove(tableIndex);
		current.replicationList.addFirst(tmp);
		
		for(i = tableIndex; i < localPartSize - 1; i++)
			flipBase[i] = flipBase[i+1];
		
		if(fixRelaxTable(tableIndex , localPartSize - 1))
			ret = true;
		
		for(i = tableIndex; i < localPartSize - 1; i++)
			flipBase[i+1] = flipBase[i];
		flipBase[tableIndex] = true;
		
		current.replicationList.removeFirst();
		current.partitionList.add(tableIndex, tmp);
//zt		current.tableList.add(tableIndex, tmp);
		tmp.replication = false;
		
		return ret;
	}