111 lines
3.4 KiB
Java
111 lines
3.4 KiB
Java
package androidx.sqlite.db;
|
|
|
|
import c.d.b.a.a;
|
|
import java.util.regex.Pattern;
|
|
public final class SupportSQLiteQueryBuilder {
|
|
private static final Pattern sLimitPattern = Pattern.compile("\\s*\\d+\\s*(,\\s*\\d+\\s*)?");
|
|
private Object[] mBindArgs;
|
|
private String[] mColumns = null;
|
|
private boolean mDistinct = false;
|
|
private String mGroupBy = null;
|
|
private String mHaving = null;
|
|
private String mLimit = null;
|
|
private String mOrderBy = null;
|
|
private String mSelection;
|
|
private final String mTable;
|
|
|
|
private SupportSQLiteQueryBuilder(String str) {
|
|
this.mTable = str;
|
|
}
|
|
|
|
private static void appendClause(StringBuilder sb, String str, String str2) {
|
|
if (!isEmpty(str2)) {
|
|
sb.append(str);
|
|
sb.append(str2);
|
|
}
|
|
}
|
|
|
|
private static void appendColumns(StringBuilder sb, String[] strArr) {
|
|
int length = strArr.length;
|
|
for (int i = 0; i < length; i++) {
|
|
String str = strArr[i];
|
|
if (i > 0) {
|
|
sb.append(", ");
|
|
}
|
|
sb.append(str);
|
|
}
|
|
sb.append(' ');
|
|
}
|
|
|
|
public static SupportSQLiteQueryBuilder builder(String str) {
|
|
return new SupportSQLiteQueryBuilder(str);
|
|
}
|
|
|
|
private static boolean isEmpty(String str) {
|
|
return str == null || str.length() == 0;
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder columns(String[] strArr) {
|
|
this.mColumns = strArr;
|
|
return this;
|
|
}
|
|
|
|
public SupportSQLiteQuery create() {
|
|
if (!isEmpty(this.mGroupBy) || isEmpty(this.mHaving)) {
|
|
StringBuilder sb = new StringBuilder(120);
|
|
sb.append("SELECT ");
|
|
if (this.mDistinct) {
|
|
sb.append("DISTINCT ");
|
|
}
|
|
String[] strArr = this.mColumns;
|
|
if (strArr == null || strArr.length == 0) {
|
|
sb.append(" * ");
|
|
} else {
|
|
appendColumns(sb, strArr);
|
|
}
|
|
sb.append(" FROM ");
|
|
sb.append(this.mTable);
|
|
appendClause(sb, " WHERE ", this.mSelection);
|
|
appendClause(sb, " GROUP BY ", this.mGroupBy);
|
|
appendClause(sb, " HAVING ", this.mHaving);
|
|
appendClause(sb, " ORDER BY ", this.mOrderBy);
|
|
appendClause(sb, " LIMIT ", this.mLimit);
|
|
return new SimpleSQLiteQuery(sb.toString(), this.mBindArgs);
|
|
}
|
|
throw new IllegalArgumentException("HAVING clauses are only permitted when using a groupBy clause");
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder distinct() {
|
|
this.mDistinct = true;
|
|
return this;
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder groupBy(String str) {
|
|
this.mGroupBy = str;
|
|
return this;
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder having(String str) {
|
|
this.mHaving = str;
|
|
return this;
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder limit(String str) {
|
|
if (isEmpty(str) || sLimitPattern.matcher(str).matches()) {
|
|
this.mLimit = str;
|
|
return this;
|
|
}
|
|
throw new IllegalArgumentException(a.s("invalid LIMIT clauses:", str));
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder orderBy(String str) {
|
|
this.mOrderBy = str;
|
|
return this;
|
|
}
|
|
|
|
public SupportSQLiteQueryBuilder selection(String str, Object[] objArr) {
|
|
this.mSelection = str;
|
|
this.mBindArgs = objArr;
|
|
return this;
|
|
}
|
|
}
|