forked from AnythingLinux/cloudstack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGroupBy.java
More file actions
108 lines (93 loc) · 3.7 KB
/
GroupBy.java
File metadata and controls
108 lines (93 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
// 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
// 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 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<J extends SearchBase<?, T, R>, T, R> {
J _builder;
List<Pair<Func, Attribute>> _groupBys;
Having _having;
public GroupBy(J 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<J, T, R> group(Object useless) {
_groupBys.add(new Pair<Func, Attribute>(null, _builder.getSpecifiedAttributes().get(0)));
_builder.getSpecifiedAttributes().clear();
return this;
}
public GroupBy<J, T, R> group(Func func, Object useless) {
_groupBys.add(new Pair<Func, Attribute>(func, _builder.getSpecifiedAttributes().get(0)));
_builder.getSpecifiedAttributes().clear();
return this;
}
public J 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());
}
}
}