-
Notifications
You must be signed in to change notification settings - Fork 18
/
AggregateQueryBase.java
153 lines (128 loc) Β· 4.32 KB
/
AggregateQueryBase.java
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package com.reactiveandroid.query;
import android.database.Cursor;
import com.reactiveandroid.ReActiveAndroid;
import java.util.concurrent.Callable;
import io.reactivex.Single;
/**
*
*/
public abstract class AggregateQueryBase<TableClass> extends ResultQueryBase<TableClass> {
public AggregateQueryBase(Query parent, Class<TableClass> table) {
super(parent, table);
}
public int count() {
return getAsInt(getAggregateFunctionSql("COUNT(*)"));
}
public float avg(String columnName) {
return getAsFloat(getAggregateFunctionSql("AVG(" + columnName + ") "));
}
public float min(String columnName) {
return getAsFloat(getAggregateFunctionSql("MIN(" + columnName + ") "));
}
public float max(String columnName) {
return getAsFloat(getAggregateFunctionSql("MAX(" + columnName + ") "));
}
public float sum(String columnName) {
return getAsFloat(getAggregateFunctionSql("SUM(" + columnName + ") "));
}
public float total(String columnName) {
return getAsFloat(getAggregateFunctionSql("TOTAL(" + columnName + ") "));
}
public String groupConcat(String columnName) {
return getAsString("GROUP_CONCAT(" + columnName + ") ");
}
public Single<Integer> countAsync() {
return Single.fromCallable(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return count();
}
});
}
public Single<Float> avgAsync(final String columnName) {
return Single.fromCallable(new Callable<Float>() {
@Override
public Float call() throws Exception {
return avg(columnName);
}
});
}
public Single<Float> minAsync(final String columnName) {
return Single.fromCallable(new Callable<Float>() {
@Override
public Float call() throws Exception {
return min(columnName);
}
});
}
public Single<Float> maxAsync(final String columnName) {
return Single.fromCallable(new Callable<Float>() {
@Override
public Float call() throws Exception {
return max(columnName);
}
});
}
public Single<Float> sumAsync(final String columnName) {
return Single.fromCallable(new Callable<Float>() {
@Override
public Float call() throws Exception {
return sum(columnName);
}
});
}
public Single<Float> totalAsync(final String columnName) {
return Single.fromCallable(new Callable<Float>() {
@Override
public Float call() throws Exception {
return total(columnName);
}
});
}
public Single<String> groupConcatAsync(final String columnName) {
return Single.fromCallable(new Callable<String>() {
@Override
public String call() throws Exception {
return groupConcat(columnName);
}
});
}
private String getAggregateFunctionSql(String aggregateFunction) {
String originalSql = getSql();
int fromIndex = originalSql.indexOf(" FROM");
return "SELECT " + aggregateFunction + originalSql.substring(fromIndex);
}
private int getAsInt(String sql) {
int result;
Cursor cursor = ReActiveAndroid.getWritableDatabaseForTable(table).rawQuery(sql, getArgs());
if (!cursor.moveToFirst()) {
result = 0;
} else {
result = cursor.getInt(0);
}
cursor.close();
return result;
}
private float getAsFloat(String sql) {
float result;
Cursor cursor = ReActiveAndroid.getWritableDatabaseForTable(table).rawQuery(sql, getArgs());
if (!cursor.moveToFirst()) {
result = 0f;
} else {
result = cursor.getFloat(0);
}
cursor.close();
return result;
}
private String getAsString(String sql) {
String result;
Cursor cursor = ReActiveAndroid.getWritableDatabaseForTable(table).rawQuery(sql, getArgs());
if (!cursor.moveToFirst()) {
result = null;
} else {
result = cursor.getString(0);
}
cursor.close();
return result;
}
}