Index: src/main/java/org/apache/hadoop/hbase/client/coprocessor/GroupByClient.java
===================================================================
--- src/main/java/org/apache/hadoop/hbase/client/coprocessor/GroupByClient.java (revision 0)
+++ src/main/java/org/apache/hadoop/hbase/client/coprocessor/GroupByClient.java (revision 0)
@@ -0,0 +1,343 @@
+/**
+ * Copyright 2011 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.client.coprocessor;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.client.HTable;
+import org.apache.hadoop.hbase.client.Scan;
+import org.apache.hadoop.hbase.coprocessor.ColumnInterpreter;
+import org.apache.hadoop.hbase.coprocessor.GroupByProtocol;
+import org.apache.hadoop.hbase.coprocessor.GroupByStatsValues;
+import org.apache.hadoop.hbase.util.Bytes;
+
+/**
+ * This client class is for invoking the aggregate functions deployed on the
+ * Region Server side via the GroupByProtocol. This class will implement the
+ * supporting functionality for merging the individual results obtained from the
+ * GroupByProtocol for each region.
+ *
+ * This will serve as the client side handler for invoking the group by
+ * functions.
+ *
+ * For all group by functions,
+ * - start row < end row is an essential condition (if they are not
+ * {@link HConstants#EMPTY_BYTE_ARRAY})
+ *
- Column family can't be null. In case where multiple families are
+ * provided, an IOException will be thrown. An optional column qualifier can
+ * also be defined.
+ *
- For methods to find maximum, minimum, sum, rowcount, it returns the
+ * parameter type. For average and std, it returns a double value. For row
+ * count, it returns a long value.
+ */
+public class GroupByClient {
+
+ Configuration conf;
+ private int MAP_SIZE = 16;
+ private float LOAD_FACTOR = 0.75f;
+
+ protected static Log log = LogFactory.getLog(GroupByClient.class);
+
+ /**
+ * Constructor with Conf object
+ *
+ * @param cfg
+ */
+ public GroupByClient(Configuration cfg) {
+ this.conf = cfg;
+ }
+
+ /**
+ * @param
+ * @param
+ * @param tableName
+ * @param scan
+ * @param groupByFam
+ * the family to group by on
+ * @param groupByQual
+ * the qualifier to qroup by on
+ * @param statsFam
+ * the family to calculate stats for
+ * @param statsQual
+ * the qualifier to calculate stats for
+ * @param statsCI
+ * the column interpreter speicifying how the stats column's values
+ * should be interpreted
+ * @return A Map with group by column (as a String) as key and
+ * GroupByStatsValue object as value
+ * @throws Throwable
+ */
+ public Map> getStats(
+ final byte[] tableName, final Scan scan, final byte[] groupByFam,
+ final byte[] groupByQual, final byte[] statsFam, final byte[] statsQual,
+ final ColumnInterpreter statsCI) throws Throwable {
+
+ validateParameters(scan, groupByFam, groupByQual, statsFam, statsQual);
+ HTable table = new HTable(conf, tableName);
+
+ class RowNumCallback implements
+ Batch.Callback