/*
* 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 com.lidroid.xutils.db.table.TableUtils;
import java.util.ArrayList;
import java.util.List;
/**
* Author: wyouflf
* Date: 13-8-9
* Time: 下午10:19
*/
public class Selector {
protected Class<?> entityType;
protected String tableName;
protected WhereBuilder whereBuilder;
protected List<OrderBy> orderByList;
protected int limit = 0;
protected int offset = 0;
private Selector(Class<?> entityType) {
this.entityType = entityType;
this.tableName = TableUtils.getTableName(entityType);
}
public static Selector from(Class<?> entityType) {
return new Selector(entityType);
}
public Selector where(WhereBuilder whereBuilder) {
this.whereBuilder = whereBuilder;
return this;
}
public Selector where(String columnName, String op, Object value) {
this.whereBuilder = WhereBuilder.b(columnName, op, value);
return this;
}
public Selector and(String columnName, String op, Object value) {
this.whereBuilder.and(columnName, op, value);
return this;
}
public Selector and(WhereBuilder where) {
this.whereBuilder.expr("AND (" + where.toString() + ")");
return this;
}
public Selector or(String columnName, String op, Object value) {
this.whereBuilder.or(columnName, op, value);
return this;
}
public Selector or(WhereBuilder where) {
this.whereBuilder.expr("OR (" + where.toString() + ")");
return this;
}
public Selector expr(String expr) {
if (this.whereBuilder == null) {
this.whereBuilder = WhereBuilder.b();
}
this.whereBuilder.expr(expr);
return this;
}
public Selector expr(String columnName, String op, Object value) {
if (this.whereBuilder == null) {
this.whereBuilder = WhereBuilder.b();
}
this.whereBuilder.expr(columnName, op, value);
return this;
}
public DbModelSelector groupBy(String columnName) {
return new DbModelSelector(this, columnName);
}
public DbModelSelector select(String... columnExpressions) {
return new DbModelSelector(this, columnExpressions);
}
public Selector orderBy(String columnName) {
if (orderByList == null) {
orderByList = new ArrayList<OrderBy>(2);
}
orderByList.add(new OrderBy(columnName));
return this;
}
public Selector orderBy(String columnName, boolean desc) {
if (orderByList == null) {
orderByList = new ArrayList<OrderBy>(2);
}
orderByList.add(new OrderBy(columnName, desc));
return this;
}
public Selector limit(int limit) {
this.limit = limit;
return this;
}
public Selector offset(int offset) {
this.offset = offset;
return this;
}
@Override
public String toString() {
StringBuilder result = new StringBuilder();
result.append("SELECT ");
result.append("*");
result.append(" FROM ").append(tableName);
if (whereBuilder != null && whereBuilder.getWhereItemSize() > 0) {
result.append(" WHERE ").append(whereBuilder.toString());
}
if (orderByList != null) {
for (int i = 0; i < orderByList.size(); i++) {
result.append(" ORDER BY ").append(orderByList.get(i).toString());
}
}
if (limit > 0) {
result.append(" LIMIT ").append(limit);
result.append(" OFFSET ").append(offset);
}
return result.toString();
}
public Class<?> getEntityType() {
return entityType;
}
protected class OrderBy {
private String columnName;
private boolean desc;
public OrderBy(String columnName) {
this.columnName = columnName;
}
public OrderBy(String columnName, boolean desc) {
this.columnName = columnName;
this.desc = desc;
}
@Override
public String toString() {
return columnName + (desc ? " DESC" : " ASC");
}
}
}