// Copyright 2012 Citrix Systems, Inc. Licensed under the // Apache License, Version 2.0 (the "License"); you may not use this // file except in compliance with the License. Citrix Systems, Inc. // reserves all rights not expressly granted by 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. // // Automatically generated by addcopyright.py at 04/03/2012 package com.cloud.utils.db; import java.util.ArrayList; import java.util.List; import com.cloud.utils.Pair; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; public class GroupBy<T, R> { GenericSearchBuilder<T, R> _builder; List<Pair<Func, Attribute>> _groupBys; Having _having; public GroupBy(GenericSearchBuilder<T, R> builder) { _builder = builder; _groupBys = new ArrayList<Pair<Func, Attribute>>(); _having = null; for (Attribute attr : _builder.getSpecifiedAttributes()) { _groupBys.add(new Pair<Func, Attribute>(null, attr)); } _builder.getSpecifiedAttributes().clear(); } public GroupBy<T, R> group(Object useless) { _groupBys.add(new Pair<Func, Attribute>(null, _builder.getSpecifiedAttributes().get(0))); _builder.getSpecifiedAttributes().clear(); return this; } public GroupBy<T, R> group(Func func, Object useless) { _groupBys.add(new Pair<Func, Attribute>(func, _builder.getSpecifiedAttributes().get(0))); _builder.getSpecifiedAttributes().clear(); return this; } public GenericSearchBuilder<T, R> having(Func func, Object obj, Op op, Object value) { assert(_having == null) : "You can only specify one having in a group by"; List<Attribute> attrs = _builder.getSpecifiedAttributes(); assert attrs.size() == 1 : "You didn't specified an attribute"; _having = new Having(func, attrs.get(0), op, value); _builder.getSpecifiedAttributes().clear(); return _builder; } public void toSql(StringBuilder builder) { builder.append(" GROUP BY "); for (Pair<Func, Attribute> groupBy : _groupBys) { if (groupBy.first() != null) { String func = groupBy.first().toString(); func.replaceFirst("@", groupBy.second().table + "." + groupBy.second().columnName); builder.append(func); } else { builder.append(groupBy.second().table + "." + groupBy.second().columnName); } builder.append(", "); } builder.delete(builder.length() - 2, builder.length()); if (_having != null) { _having.toSql(builder); } } protected class Having { public Func func; public Attribute attr; public Op op; public Object value; public Having(Func func, Attribute attr, Op op, Object value) { this.func = func; this.attr = attr; this.op = op; this.value = value; } public void toSql(StringBuilder builder) { if (func != null) { String f = func.toString(); f.replaceFirst("@", attr.toString()); builder.append(func); } else { builder.append(attr.toString()); } builder.append(op.toString()); } } }