/*
* Copyright (c) 2013. wyouflf (wyouflf@gmail.com)
*
* Licensed 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 com.lidroid.xutils.db.sqlite;
import android.text.TextUtils;
/**
* Author: wyouflf
* Date: 13-8-10
* Time: 下午2:15
*/
public class DbModelSelector {
private String[] columnExpressions;
private String groupByColumnName;
private WhereBuilder having;
private Selector selector;
private DbModelSelector(Class<?> entityType) {
selector = Selector.from(entityType);
}
protected DbModelSelector(Selector selector, String groupByColumnName) {
this.selector = selector;
this.groupByColumnName = groupByColumnName;
}
protected DbModelSelector(Selector selector, String[] columnExpressions) {
this.selector = selector;
this.columnExpressions = columnExpressions;
}
public static DbModelSelector from(Class<?> entityType) {
return new DbModelSelector(entityType);
}
public DbModelSelector where(WhereBuilder whereBuilder) {
selector.where(whereBuilder);
return this;
}
public DbModelSelector where(String columnName, String op, Object value) {
selector.where(columnName, op, value);
return this;
}
public DbModelSelector and(String columnName, String op, Object value) {
selector.and(columnName, op, value);
return this;
}
public DbModelSelector and(WhereBuilder where) {
selector.and(where);
return this;
}
public DbModelSelector or(String columnName, String op, Object value) {
selector.or(columnName, op, value);
return this;
}
public DbModelSelector or(WhereBuilder where) {
selector.or(where);
return this;
}
public DbModelSelector expr(String expr) {
selector.expr(expr);
return this;
}
public DbModelSelector expr(String columnName, String op, Object value) {
selector.expr(columnName, op, value);
return this;
}
public DbModelSelector groupBy(String columnName) {
this.groupByColumnName = columnName;
return this;
}
public DbModelSelector having(WhereBuilder whereBuilder) {
this.having = whereBuilder;
return this;
}
public DbModelSelector select(String... columnExpressions) {
this.columnExpressions = columnExpressions;
return this;
}
public DbModelSelector orderBy(String columnName) {
selector.orderBy(columnName);
return this;
}
public DbModelSelector orderBy(String columnName, boolean desc) {
selector.orderBy(columnName, desc);
return this;
}
public DbModelSelector limit(int limit) {
selector.limit(limit);
return this;
}
public DbModelSelector offset(int offset) {
selector.offset(offset);
return this;
}
public Class<?> getEntityType() {
return selector.getEntityType();
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
result.append("SELECT ");
if (columnExpressions != null && columnExpressions.length > 0) {
for (int i = 0; i < columnExpressions.length; i++) {
result.append(columnExpressions[i]);
result.append(",");
}
result.deleteCharAt(result.length() - 1);
} else {
if (!TextUtils.isEmpty(groupByColumnName)) {
result.append(groupByColumnName);
} else {
result.append("*");
}
}
result.append(" FROM ").append(selector.tableName);
if (selector.whereBuilder != null && selector.whereBuilder.getWhereItemSize() > 0) {
result.append(" WHERE ").append(selector.whereBuilder.toString());
}
if (!TextUtils.isEmpty(groupByColumnName)) {
result.append(" GROUP BY ").append(groupByColumnName);
if (having != null && having.getWhereItemSize() > 0) {
result.append(" HAVING ").append(having.toString());
}
}
if (selector.orderByList != null) {
for (int i = 0; i < selector.orderByList.size(); i++) {
result.append(" ORDER BY ").append(selector.orderByList.get(i).toString());
}
}
if (selector.limit > 0) {
result.append(" LIMIT ").append(selector.limit);
result.append(" OFFSET ").append(selector.offset);
}
return result.toString();
}
}