protected void refresh()
{
	// New dataRows
	dataRows = new ArrayList(mainU.getRowCount());
	for (int i=0; i<mainU.getRowCount(); ++i) dataRows.add(newDataRow());
	
	// Map the rows in mainU
	HashMap<HKey, int[]> mainMap = new HashMap();;
	for (int row=0; row<mainU.getRowCount(); ++row) {
		HKey hkey = new HKey(keyColsM.length);
		for (int j=0; j<keyColsM.length; ++j)
			hkey.val[j] = mainU.getValueAt(row, keyColsM[j]);
		mainMap.put(hkey, dataRows.get(row));
	}
	
	
	// Match up each row in dataU to a row/col in mainU
	HKey hkey = new HKey(keyColsD.length);
	for (int i=0; i<dataU.getRowCount(); ++i) {
		// Match to a row in dataRow
		for (int j=0; j<keyColsD.length; ++j)
			hkey.val[j] = dataU.getValueAt(i, keyColsD[j]);
		int[] row = mainMap.get(hkey);
		if (row == null) continue;		// Row does not exist in mainU
		
		// Figure out which column
		Integer Col = iPivotVals.get(dataU.getValueAt(i, pivotKeyColD));
		if (Col == null) continue;
		
		// set...
		row[Col] = i;
	}
	
	fireTableDataChanged();
}