package com.gettingmobile.google.reader.db; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import com.gettingmobile.google.reader.ElementId; import com.gettingmobile.google.reader.ElementType; import com.gettingmobile.google.reader.Tag; import com.gettingmobile.util.StringUtils; import java.util.Collection; import java.util.List; import static com.gettingmobile.google.reader.db.TagTable.*; public class TagDatabaseAdapter extends SortedElementDatabaseAdapter<Tag> { public TagDatabaseAdapter() { super(TagTable.TABLE_NAME); } public List<Tag> readAll(SQLiteDatabase db) { return readList(db.rawQuery( "SELECT t.*, " + " (SELECT COUNT(DISTINCT i._id) " + " FROM item i " + " LEFT JOIN feed f ON f.id=i.feedId " + " LEFT JOIN feedTag ft ON ft.feedKey=f._id " + " LEFT JOIN itemTag it ON it.itemKey=i._id " + " WHERE (it.tagKey=t._id OR ft.tagKey=t._id) AND i.read=0) unreadCount " + "FROM tag t " + "ORDER BY t.sortOrder, lower(t.title)", null)); } public List<Tag> readUserLabels(SQLiteDatabase db) { return readList(db.rawQuery( "SELECT t.*, COUNT(i._id) unreadCount " + "FROM tag t " + "LEFT OUTER JOIN feedTag ft ON ft.tagKey=t._id " + "LEFT OUTER JOIN feed f ON f._id=ft.feedKey " + "LEFT OUTER JOIN itemTag it ON it.tagKey=t._id " + "LEFT OUTER JOIN item i ON (i._id=it.itemKey OR i.feedId=f.id) AND i.read=0 " + "WHERE t.isUserLabel<>0 " + "GROUP BY t._id", null)); } public List<Tag> readUnreadUserLabels(SQLiteDatabase db) { return readList(db.rawQuery( "SELECT t.*, COUNT(i._id) unreadCount " + "FROM tag t " + "LEFT OUTER JOIN feedTag ft ON ft.tagKey=t._id " + "LEFT OUTER JOIN feed f ON f._id=ft.feedKey " + "LEFT OUTER JOIN itemTag it ON it.tagKey=t._id " + "LEFT OUTER JOIN item i ON (i._id=it.itemKey OR i.feedId=f.id) AND i.read=0 " + "WHERE t.isUserLabel<>0 " + "GROUP BY t._id HAVING (unreadCount>0 OR t.isFeedFolder=0)", null)); } public List<Tag> readUserLabelsIgnoreFolders(SQLiteDatabase db) { return readList(db.query( TABLE_NAME, null, "isUserLabel<>0 AND isFeedFolder=0" , null, null, null, TITLE)); } public Tag readById(SQLiteDatabase db, ElementId id) { return readFirst(db.query(TABLE_NAME, null, "id=?", new String[] { id.getId() }, null, null, null)); } public long readKeyById(SQLiteDatabase db, ElementId id) { final Cursor c = db.query(TABLE_NAME, new String[] {"_id"}, "id=?", new String[] { id.getId() }, null, null, null); try { return c.moveToFirst() ? c.getLong(0) : 0; } finally { c.close(); } } @Override public Tag readCurrent(Cursor c) { final Tag label = super.readCurrent(c); label.setFeedFolder(c.getInt(c.getColumnIndex(IS_FEED_FOLDER)) != 0); label.setRootSortOrder(c.getInt(c.getColumnIndex(SORT_ORDER))); return label; } public void updateById(SQLiteDatabase db, Tag tag) { db.update(TABLE_NAME, createRowValues(db, tag, null), "id=?", new String[] {tag.getId().getId()}); } public void updateFeedFolderFlags(SQLiteDatabase db) { db.execSQL( "UPDATE " + TABLE_NAME + " " + "SET isFeedFolder=(SELECT COUNT(*) FROM feedTag ft WHERE ft.tagKey=_id)"); } public void deleteById(SQLiteDatabase db, Collection<ElementId> ids) { final StringBuilder idList = new StringBuilder(); for (ElementId id : ids) { if (ElementType.LABEL.equals(id.getType())) { if (idList.length() > 0) { idList.append(','); } idList.append('\'').append(id.getId()).append('\''); } } if (idList.length() > 0) { db.execSQL( "DELETE FROM itemTag " + "WHERE tagKey IN (SELECT t._id FROM tag t WHERE t.id IN (" + StringUtils.explode(ids, ",", "'") + "))"); db.delete(TABLE_NAME, "id IN (" + idList.toString() + ")", null); } } @Override protected void setRowValues(SQLiteDatabase db, ContentValues columns, Tag entity, Bundle parameters) { super.setRowValues(db, columns, entity, parameters); columns.put(IS_USER_LABEL, entity.isUserLabel()); columns.put(IS_FEED_FOLDER, entity.isFeedFolder()); columns.put(SORT_ORDER, entity.getRootSortOrder()); } @Override protected Tag create() { return new Tag(); } }