/* * 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"); } } }