1 30 31 32 package org.hsqldb; 33 34 import org.hsqldb.lib.ArrayUtil; 35 import org.hsqldb.lib.HashSet; 36 import org.hsqldb.lib.Iterator; 37 38 66 67 class GroupedResult { 69 70 71 private Result result; 72 int groupBegin; 73 int groupEnd; 74 private final boolean isGrouped; 75 private final boolean isAggregated; 76 private HashSet groups; 77 private ResultGroup currGroup; 78 79 GroupedResult(Select select, Result.ResultMetaData meta) { 80 81 result = new Result(meta); 82 groupBegin = select.iResultLen; 83 groupEnd = groupBegin + select.iGroupLen; 84 isGrouped = groupBegin != groupEnd; 85 isAggregated = select.isAggregated; 86 87 if (isGrouped) { 88 groups = new HashSet(); 89 } 90 } 91 92 Object [] getRow(Object [] row) { 93 94 if (isGrouped) { 95 ResultGroup newGroup = new ResultGroup(row); 96 ResultGroup group = (ResultGroup) groups.get(newGroup); 97 98 if (group != null) { 99 ArrayUtil.copyArray(group.row, row, row.length); 100 } 101 } else if (isAggregated) { 102 if (currGroup != null) { 103 ArrayUtil.copyArray(currGroup.row, row, row.length); 104 } 105 } 106 107 return row; 108 } 109 110 void addRow(Object [] row) { 111 112 if (isGrouped) { 113 ResultGroup newGroup = new ResultGroup(row); 114 115 currGroup = (ResultGroup) groups.get(newGroup); 116 117 if (currGroup == null) { 118 currGroup = newGroup; 119 120 groups.add(currGroup); 121 result.add(row); 122 } else { 123 System.arraycopy(row, 0, currGroup.row, 0, row.length); 124 } 125 } else if (isAggregated) { 126 if (currGroup == null) { 127 currGroup = new ResultGroup(row); 128 129 result.add(row); 130 } else { 131 System.arraycopy(row, 0, currGroup.row, 0, row.length); 132 } 133 } else { 134 result.add(row); 135 } 136 } 137 138 int size() { 139 return result.getSize(); 140 } 141 142 Iterator iterator() { 143 return result.iterator(); 144 } 145 146 Result getResult() { 147 return result; 148 } 149 150 class ResultGroup { 151 152 Object [] row; 153 int hashCode; 154 155 private ResultGroup(Object [] row) { 156 157 this.row = row; 158 hashCode = 0; 159 160 for (int i = groupBegin; i < groupEnd; i++) { 161 if (row[i] != null) { 162 hashCode += row[i].hashCode(); 163 } 164 } 165 } 166 167 public int hashCode() { 168 return hashCode; 169 } 170 171 public boolean equals(Object obj) { 172 173 if (obj == this) { 174 return true; 175 } 176 177 if (obj == null ||!(obj instanceof ResultGroup)) { 178 return false; 179 } 180 181 ResultGroup group = (ResultGroup) obj; 182 183 for (int i = groupBegin; i < groupEnd; i++) { 184 if (!equals(row[i], group.row[i])) { 185 return false; 186 } 187 } 188 189 return true; 190 } 191 192 private boolean equals(Object o1, Object o2) { 193 return (o1 == null) ? o2 == null 194 : o1.equals(o2); 195 } 196 } 197 } 198 | Popular Tags |