/******************************************************************************* * Copyright (c) 2010 Denis Solonenko. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v2.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * * Contributors: * Denis Solonenko - initial API and implementation ******************************************************************************/ package ru.orangesoftware.orb; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; public class Query<T> { private final Class<T> clazz; private final EntityDefinition ed; private final SQLiteDatabase db; private final LinkedList<String> orderBy = new LinkedList<String>(); private String where; private String[] whereArgs; Query(EntityManager em, Class<T> clazz) { this.db = em.db(); this.clazz = clazz; this.ed = EntityManager.getEntityDefinitionOrThrow(clazz); } public Query<T> where(Expression ex) { Selection s = ex.toSelection(ed); where = s.selection; List<String> args = s.selectionArgs; whereArgs = args.toArray(new String[args.size()]); return this; } public Query<T> asc(String field) { orderBy.add(ed.getColumnForField(field)+" asc"); return this; } public Query<T> desc(String field) { orderBy.add(ed.getColumnForField(field)+" desc"); return this; } public Cursor execute() { String query = ed.sqlQuery; String where = this.where; String[] whereArgs = this.whereArgs; StringBuilder sb = new StringBuilder(query); if (where != null) { sb.append(" where ").append(where); } if (orderBy.size() > 0) { sb.append(" order by "); boolean addComma = false; for (String order : orderBy) { if (addComma) { sb.append(", "); } sb.append(order); addComma = true; } } query = sb.toString(); Log.d("QUERY "+clazz, query); Log.d("WHERE", where != null ? where : ""); Log.d("ARGS", whereArgs != null ? Arrays.toString(whereArgs) : ""); return db.rawQuery(query, whereArgs); } public T uniqueResult() { Cursor c = execute(); try { if (c.moveToFirst()) { return EntityManager.loadFromCursor(c, clazz); } return null; } finally { c.close(); } } public List<T> list() { Cursor c = execute(); try { List<T> list = new ArrayList<T>(); while (c.moveToNext()) { T e = EntityManager.loadFromCursor(c, clazz); list.add(e); } return list; } finally { c.close(); } } }