/**
* 默认返回select * 的结果 输入就是生成的数据 输入的数据不同于cloudwave的就是没有排序
*
* @param type
* 0没有括号 1max 2min 3sum 4avg 5count
*/
public static Object[][] groupby(OneRow[] rows,
int[] groupbyIndex,
int type) {
display(rows);
Object[][] resultMatrix = new Object[rows.length][OneRow.colCount];
if (type == 0) {
// 鉴于有很多groupby的列,就从前到后 两两 两两 的分析
List<KeyAndRows>[] map = new ArrayList[groupbyIndex.length];
for (int i = 0; i < map.length; i++) {
map[i] = new ArrayList<KeyAndRows>();
}
int groupbyColumn = groupbyIndex[0];
for (int i = 0; i < rows.length; i++) {
Object key = rows[i].column[groupbyColumn];
if (contains(map[0],
key)) {
int index = indexOf(map[0],
key);
map[0].get(index).list.add(i);
map[0].add(index,
map[0].get(index));
map[0].remove(index+1);
} else {
List<Integer> list = new ArrayList();
KeyAndRows kr = new KeyAndRows(key,
list);
kr.list.add(i);
map[0].add(kr);
}
}
System.out.println();
KeyAndRows[] krs = map[0].toArray(new KeyAndRows[0]);
display2(krs);
for (int i = 0; i < map[0].size(); i++) {
KeyAndRows kr = map[0].get(i);
groupbyColumn = groupbyIndex[1];
for (int row : kr.list) {
Object key = rows[row].column[groupbyColumn];
if (contains(map[1],
key)) {
int index = indexOf(map[1],
key);
map[1].get(index).list.add(row);
map[1].add(index,
map[1].get(index));
map[1].remove(index+1);
} else {
List<Integer> list = new ArrayList();
KeyAndRows kr2 = new KeyAndRows(key,
list);
kr2.list.add(row);
map[1].add(kr2);
}
}
for (KeyAndRows krTemp : map[1]) {
krTemp.key = null;
}
}
System.out.println();
krs = map[1].toArray(new KeyAndRows[0]);
display2(krs);
}
return null;
}
static class KeyAndRows {
public Object key;
public List<Integer> list;
public KeyAndRows(Object key,
List<Integer> list) {
this.key = key;
this.list = list;
}
}
public static void display(OneRow[] rows) {
for (int i = 0; i < rows.length; i++) {
for (int j = 0; j < 13; j++) {
System.out.print(rows[i].column[j]
+ " ");
}
System.out.println();
}
}
public static boolean contains(List<KeyAndRows> map,
Object key) {
int count = map.size();
for (int i = 0; i < count; i++) {
if (map.get(i).key != null
&& map.get(i).key.equals(key)) {
return true;
}
}
return false;
}
public static int indexOf(List<KeyAndRows> map,
Object key) {
int count = map.size();
for (int i = 0; i < count; i++) {
if (map.get(i).key != null
&& map.get(i).key.equals(key)) {
return i;
}
}
return -1;
}
private static void display2(KeyAndRows[] krs) {
for (int i = 0; i < krs.length; i++) {
System.out.print(krs[i].key);
for (int j = 0; j < krs[i].list.size(); j++) {
System.out.print(" "
+ krs[i].list.get(j));
}
System.out.println();
}
}