aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/datasets
diff options
context:
space:
mode:
authorOguz Kocer <oguz.kocer@automattic.com>2016-07-01 18:14:29 +0300
committerOguz Kocer <oguz.kocer@automattic.com>2016-07-01 18:14:29 +0300
commit8fffc78ac05c469f7f3548637fc87e4626e44fdb (patch)
tree5f5a0375f66a92561661f9e4984086565b1c44c2 /WordPress/src/main/java/org/wordpress/android/datasets
parent05d5773a3b85b97c488e5d67e6b9f40b26604901 (diff)
downloadgradle-perf-android-medium-8fffc78ac05c469f7f3548637fc87e4626e44fdb.tar.gz
Major rework of PeopleTable
People table has been removed and instead each filter now has it's own table. This change allowed us to simplify a lot of the methods.
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/datasets')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java250
1 files changed, 125 insertions, 125 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java b/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java
index 769a78d49..08539094d 100644
--- a/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java
+++ b/WordPress/src/main/java/org/wordpress/android/datasets/PeopleTable.java
@@ -14,7 +14,9 @@ import java.util.ArrayList;
import java.util.List;
public class PeopleTable {
- private static final String PEOPLE_TABLE = "people";
+ private static final String TEAM_TABLE = "people_team";
+ private static final String FOLLOWERS_TABLE = "people_followers";
+ private static final String EMAIL_FOLLOWERS_TABLE = "people_email_followers";
private static SQLiteDatabase getReadableDb() {
return WordPress.wpDB.getDatabase();
@@ -23,32 +25,44 @@ public class PeopleTable {
return WordPress.wpDB.getDatabase();
}
- /**
- * We use people table to store users, followers, email followers & viewers. A person can belong to multiple sites
- * and can be a user, follower and viewer of a site at the same time. So, a combination of `person_id`,
- * `local_blog_id`, `is_follower` and `is_viewer` columns is required to identify a record.
- */
public static void createTables(SQLiteDatabase db) {
- db.execSQL("CREATE TABLE " + PEOPLE_TABLE + " ("
+ db.execSQL("CREATE TABLE " + TEAM_TABLE + " ("
+ "person_id INTEGER DEFAULT 0,"
- + "blog_id TEXT,"
+ "local_blog_id INTEGER DEFAULT 0,"
+ "user_name TEXT,"
- + "first_name TEXT,"
- + "last_name TEXT,"
+ "display_name TEXT,"
+ "avatar_url TEXT,"
+ "role TEXT,"
+ + "PRIMARY KEY (person_id, local_blog_id)"
+ + ");");
+
+ db.execSQL("CREATE TABLE " + FOLLOWERS_TABLE + " ("
+ + "person_id INTEGER DEFAULT 0,"
+ + "local_blog_id INTEGER DEFAULT 0,"
+ + "user_name TEXT,"
+ + "display_name TEXT,"
+ + "avatar_url TEXT,"
+ "subscribed TEXT,"
- + "is_follower BOOLEAN DEFAULT false,"
- + "is_email_follower BOOLEAN DEFAULT false,"
- + "is_viewer BOOLEAN DEFAULT false,"
- + "PRIMARY KEY (person_id, local_blog_id, is_follower, is_viewer)"
+ + "PRIMARY KEY (person_id, local_blog_id)"
+ + ");");
+
+ db.execSQL("CREATE TABLE " + EMAIL_FOLLOWERS_TABLE + " ("
+ + "person_id INTEGER DEFAULT 0,"
+ + "local_blog_id INTEGER DEFAULT 0,"
+ + "display_name TEXT,"
+ + "avatar_url TEXT,"
+ + "subscribed TEXT,"
+ + "PRIMARY KEY (person_id, local_blog_id)"
+ ");");
}
private static void dropTables(SQLiteDatabase db) {
- db.execSQL("DROP TABLE IF EXISTS " + PEOPLE_TABLE);
+ // People table is not used anymore, each filter now has it's own table
+ db.execSQL("DROP TABLE IF EXISTS PEOPLE");
+
+ db.execSQL("DROP TABLE IF EXISTS " + TEAM_TABLE);
+ db.execSQL("DROP TABLE IF EXISTS " + FOLLOWERS_TABLE);
+ db.execSQL("DROP TABLE IF EXISTS " + EMAIL_FOLLOWERS_TABLE);
}
public static void reset(SQLiteDatabase db) {
@@ -57,72 +71,45 @@ public class PeopleTable {
createTables(db);
}
- public static void save(Person person) {
- save(person, getWritableDb());
+ public static void save(String table, Person person) {
+ save(table, person, getWritableDb());
}
- public static void save(Person person, SQLiteDatabase database) {
+ public static void save(String table, Person person, SQLiteDatabase database) {
ContentValues values = new ContentValues();
values.put("person_id", person.getPersonID());
- values.put("blog_id", person.getBlogId());
values.put("local_blog_id", person.getLocalTableBlogId());
values.put("user_name", person.getUsername());
- values.put("first_name", person.getFirstName());
- values.put("last_name", person.getLastName());
values.put("display_name", person.getDisplayName());
values.put("avatar_url", person.getAvatarUrl());
values.put("role", person.getRole());
values.put("subscribed", person.getSubscribed());
- values.put("is_follower", person.isFollower());
- values.put("is_email_follower", person.isEmailFollower());
- values.put("is_viewer", person.isViewer());
- database.insertWithOnConflict(PEOPLE_TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE);
+
+ database.insertWithOnConflict(table, null, values, SQLiteDatabase.CONFLICT_REPLACE);
}
public static void saveUsers(List<Person> peopleList, int localTableBlogId, boolean isFreshList) {
- getWritableDb().beginTransaction();
- try {
- // We have a fresh list, remove the previous list of users in case it was deleted on remote
- if (isFreshList) {
- PeopleTable.deleteUsersForLocalBlogId(localTableBlogId);
- }
-
- for (Person person : peopleList) {
- PeopleTable.save(person);
- }
- getWritableDb().setTransactionSuccessful();
- } finally {
- getWritableDb().endTransaction();
- }
+ savePeople(TEAM_TABLE, peopleList, localTableBlogId, isFreshList);
}
public static void saveFollowers(List<Person> peopleList, int localTableBlogId, boolean isFreshList) {
- getWritableDb().beginTransaction();
- try {
- // We have a fresh list, remove the previous list of followers in case it was deleted on remote
- if (isFreshList) {
- PeopleTable.deleteFollowersForLocalBlogId(localTableBlogId);
- }
-
- for (Person person : peopleList) {
- PeopleTable.save(person);
- }
- getWritableDb().setTransactionSuccessful();
- } finally {
- getWritableDb().endTransaction();
- }
+ savePeople(FOLLOWERS_TABLE, peopleList, localTableBlogId, isFreshList);
}
public static void saveEmailFollowers(List<Person> peopleList, int localTableBlogId, boolean isFreshList) {
+ savePeople(EMAIL_FOLLOWERS_TABLE, peopleList, localTableBlogId, isFreshList);
+ }
+
+ private static void savePeople(String table, List<Person> peopleList, int localTableBlogId, boolean isFreshList) {
getWritableDb().beginTransaction();
try {
// We have a fresh list, remove the previous list of email followers in case it was deleted on remote
if (isFreshList) {
- PeopleTable.deleteEmailFollowersForLocalBlogId(localTableBlogId);
+ PeopleTable.deletePeople(table, localTableBlogId);
}
for (Person person : peopleList) {
- PeopleTable.save(person);
+ PeopleTable.save(table, person);
}
getWritableDb().setTransactionSuccessful();
} finally {
@@ -131,136 +118,149 @@ public class PeopleTable {
}
public static void deletePeopleForLocalBlogId(int localTableBlogId) {
- String[] args = new String[]{Integer.toString(localTableBlogId)};
- getWritableDb().delete(PEOPLE_TABLE, "local_blog_id=?", args);
- }
-
- public static void deleteUsersForLocalBlogId(int localTableBlogId) {
- String[] args = new String[]{Integer.toString(localTableBlogId), Integer.toString(0)};
- getWritableDb().delete(PEOPLE_TABLE, "local_blog_id=?1 AND is_follower=?2 " +
- "AND is_email_follower=?2 AND is_viewer=?2", args);
+ deletePeople(TEAM_TABLE, localTableBlogId);
+ deletePeople(FOLLOWERS_TABLE, localTableBlogId);
+ deletePeople(EMAIL_FOLLOWERS_TABLE, localTableBlogId);
}
- public static void deleteFollowersForLocalBlogId(int localTableBlogId) {
- String[] args = new String[]{Integer.toString(localTableBlogId), Integer.toString(1), Integer.toString(0)};
- getWritableDb().delete(PEOPLE_TABLE, "local_blog_id=?1 AND is_follower=?2 " +
- "AND is_email_follower=?3 AND is_viewer=?3", args);
- }
-
- public static void deleteEmailFollowersForLocalBlogId(int localTableBlogId) {
- String[] args = new String[]{Integer.toString(localTableBlogId), Integer.toString(0), Integer.toString(1)};
- getWritableDb().delete(PEOPLE_TABLE, "local_blog_id=?1 AND is_follower=?2 AND is_email_follower=?3 " +
- "AND is_viewer=?2", args);
+ private static void deletePeople(String table, int localTableBlogId) {
+ String[] args = new String[]{Integer.toString(localTableBlogId)};
+ getWritableDb().delete(table, "local_blog_id=?1", args);
}
- public static void deletePeopleForLocalBlogIdExceptForFirstPage(int localTableBlogId) {
- int size = getPeopleCountForLocalBlogId(localTableBlogId);
+ /**
+ * In order to avoid syncing issues, this method will be called when People page is created. We only keep
+ * the first page of users, so we don't show an empty screen. When fresh data is received, it'll replace
+ * the existing page.
+ * @param localTableBlogId - the local blog id people will be deleted from
+ */
+ public static void deletePeopleExceptForFirstPage(int localTableBlogId) {
int fetchLimit = PeopleUtils.FETCH_LIMIT;
- if (size > fetchLimit) {
- int deleteCount = size - fetchLimit;
- String[] args = new String[] {
- Integer.toString(localTableBlogId),
- Integer.toString(deleteCount)
- };
- getWritableDb().delete(PEOPLE_TABLE, "local_blog_id=?1 AND person_id IN (SELECT person_id FROM "
- + PEOPLE_TABLE + " WHERE local_blog_id=?1 " +
- "ORDER BY display_name DESC LIMIT ?2)", args);
+ String[] tables = {TEAM_TABLE, FOLLOWERS_TABLE, EMAIL_FOLLOWERS_TABLE};
+ for (String table : tables) {
+ int size = getPeopleCountForLocalBlogId(table, localTableBlogId);
+ if (size > fetchLimit) {
+ int deleteCount = size - fetchLimit;
+ String[] args = new String[] {Integer.toString(localTableBlogId), Integer.toString(deleteCount)};
+ getWritableDb().delete(table, "local_blog_id=?1 AND person_id IN (SELECT person_id FROM "
+ + table + " WHERE local_blog_id=?1" + orderByString(table) + " DESC LIMIT ?2)", args);
+ }
}
}
public static int getUsersCountForLocalBlogId(int localTableBlogId) {
- String[] args = new String[]{Integer.toString(localTableBlogId), Integer.toString(0)};
- String sql = "SELECT COUNT(*) FROM " + PEOPLE_TABLE
- + " WHERE local_blog_id=?1 AND is_follower=?2 AND is_email_follower=?2 AND is_viewer=?2";
- return SqlUtils.intForQuery(getReadableDb(), sql, args);
+ return getPeopleCountForLocalBlogId(TEAM_TABLE, localTableBlogId);
}
- private static int getPeopleCountForLocalBlogId(int localTableBlogId) {
+ private static int getPeopleCountForLocalBlogId(String table, int localTableBlogId) {
String[] args = new String[]{Integer.toString(localTableBlogId)};
- String sql = "SELECT COUNT(*) FROM " + PEOPLE_TABLE + " WHERE local_blog_id=?";
+ String sql = "SELECT COUNT(*) FROM " + table + " WHERE local_blog_id=?";
return SqlUtils.intForQuery(getReadableDb(), sql, args);
}
- public static void deletePerson(long personID, int localTableBlogId, boolean isFollower, boolean isViewer) {
- String[] args = new String[]{Long.toString(personID), Integer.toString(localTableBlogId),
- Integer.toString(isFollower ? 1 : 0), Integer.toString(isViewer ? 1 : 0)};
- getWritableDb().delete(PEOPLE_TABLE, "person_id=? AND local_blog_id=? AND is_follower=? AND is_viewer=?", args);
+ public static void deleteUser(long personID, int localTableBlogId) {
+ deletePerson(TEAM_TABLE, personID, localTableBlogId);
+ }
+
+ public static void deleteFollower(long personID, int localTableBlogId) {
+ deletePerson(FOLLOWERS_TABLE, personID, localTableBlogId);
+ }
+
+ public static void deleteEmailFollower(long personID, int localTableBlogId) {
+ deletePerson(EMAIL_FOLLOWERS_TABLE, personID, localTableBlogId);
+ }
+
+ private static void deletePerson(String table, long personID, int localTableBlogId) {
+ String[] args = new String[]{Long.toString(personID), Integer.toString(localTableBlogId)};
+ getWritableDb().delete(table, "person_id=? AND local_blog_id=?", args);
}
public static List<Person> getUsers(int localTableBlogId) {
- String[] args = { Integer.toString(localTableBlogId), Integer.toString(0) };
- String where = "WHERE local_blog_id=?1 AND is_follower=?2 AND is_email_follower=?2 AND is_viewer=?2";
- return PeopleTable.getPeople(localTableBlogId, where, args, true);
+ return PeopleTable.getPeople(TEAM_TABLE, localTableBlogId);
}
public static List<Person> getFollowers(int localTableBlogId) {
- String[] args = { Integer.toString(localTableBlogId), Integer.toString(1), Integer.toString(0) };
- String where = "WHERE local_blog_id=?1 AND is_follower=?2 AND is_email_follower=?3 AND is_viewer=?3";
- return PeopleTable.getPeople(localTableBlogId, where, args, false);
+ return PeopleTable.getPeople(FOLLOWERS_TABLE, localTableBlogId);
}
public static List<Person> getEmailFollowers(int localTableBlogId) {
- String[] args = { Integer.toString(localTableBlogId), Integer.toString(0), Integer.toString(1)};
- String where = "WHERE local_blog_id=?1 AND is_follower=?2 AND is_email_follower=?3 AND is_viewer=?2";
- return PeopleTable.getPeople(localTableBlogId, where, args, false);
+ return PeopleTable.getPeople(EMAIL_FOLLOWERS_TABLE, localTableBlogId);
}
- private static List<Person> getPeople(int localTableBlogId, String whereStatement, String[] args, boolean ordered) {
- List<Person> people = new ArrayList<>();
- // order is disabled for followers for now since the API is not supporting it
- String orderBy = ordered ? " ORDER BY lower(display_name), lower(user_name)" : "";
- Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE + " " + whereStatement + orderBy, args);
+ private static List<Person> getPeople(String table, int localTableBlogId) {
+ String[] args = {Integer.toString(localTableBlogId)};
+ String orderBy = orderByString(table);
+ Cursor c = getReadableDb().rawQuery("SELECT * FROM " + table + " WHERE local_blog_id=?" + orderBy, args);
+ List<Person> people = new ArrayList<>();
try {
while (c.moveToNext()) {
- Person person = getPersonFromCursor(c, localTableBlogId);
+ Person person = getPersonFromCursor(c, table, localTableBlogId);
people.add(person);
}
-
- return people;
} finally {
SqlUtils.closeCursor(c);
}
+ return people;
+ }
+
+ public static Person getUser(long personId, int localTableBlogId) {
+ return getPerson(TEAM_TABLE, personId, localTableBlogId);
+ }
+
+ public static Person getFollower(long personId, int localTableBlogId) {
+ return getPerson(FOLLOWERS_TABLE, personId, localTableBlogId);
+ }
+
+ public static Person getEmailFollower(long personId, int localTableBlogId) {
+ return getPerson(EMAIL_FOLLOWERS_TABLE, personId, localTableBlogId);
}
/**
- * retrieve a single person
+ * retrieve a person
+ * @param table - sql table the person record is in
* @param personId - id of a person in a particular blog
* @param localTableBlogId - the local blog id the user belongs to
- * @param isFollower - if the person is a follower
* @return Person if found, null otherwise
*/
- public static Person getPerson(long personId, int localTableBlogId, boolean isFollower, boolean isViewer) {
- String[] args = { Long.toString(personId), Integer.toString(localTableBlogId),
- Integer.toString(isFollower ? 1 : 0), Integer.toString(isViewer ? 1 : 0)};
- Cursor c = getReadableDb().rawQuery("SELECT * FROM " + PEOPLE_TABLE +
- " WHERE person_id=?1 AND local_blog_id=?2 AND is_follower=?3 AND is_viewer=?4", args);
+ private static Person getPerson(String table, long personId, int localTableBlogId) {
+ String[] args = { Long.toString(personId), Integer.toString(localTableBlogId)};
+ Cursor c = getReadableDb().rawQuery("SELECT * FROM " + table +
+ " WHERE person_id=? AND local_blog_id=?", args);
try {
if (!c.moveToFirst()) {
return null;
}
- return getPersonFromCursor(c, localTableBlogId);
+ return getPersonFromCursor(c, table, localTableBlogId);
} finally {
SqlUtils.closeCursor(c);
}
}
- private static Person getPersonFromCursor(Cursor c, int localTableBlogId) {
+ private static Person getPersonFromCursor(Cursor c, String table, int localTableBlogId) {
long personId = c.getInt(c.getColumnIndex("person_id"));
String blogId = c.getString(c.getColumnIndex("blog_id"));
Person person = new Person(personId, blogId, localTableBlogId);
person.setUsername(c.getString(c.getColumnIndex("user_name")));
- person.setFirstName(c.getString(c.getColumnIndex("first_name")));
- person.setLastName(c.getString(c.getColumnIndex("last_name")));
person.setDisplayName(c.getString(c.getColumnIndex("display_name")));
person.setAvatarUrl(c.getString(c.getColumnIndex("avatar_url")));
person.setRole(c.getString(c.getColumnIndex("role")));
person.setSubscribed(c.getString(c.getColumnIndex("subscribed")));
- person.setFollower(c.getInt(c.getColumnIndex("is_follower")) > 0);
- person.setEmailFollower(c.getInt(c.getColumnIndex("is_email_follower")) > 0);
- person.setViewer(c.getInt(c.getColumnIndex("is_viewer")) > 0);
+ if (table.equals(FOLLOWERS_TABLE)) {
+ person.setFollower(true);
+ } else if (table.equals(EMAIL_FOLLOWERS_TABLE)) {
+ person.setEmailFollower(true);
+ }
return person;
}
+
+ // order is disabled for followers for now since the API is not supporting it
+ private static String orderByString(String table) {
+ if (table.equals(FOLLOWERS_TABLE) || table.equals(EMAIL_FOLLOWERS_TABLE)) {
+ return "";
+ }
+ return " ORDER BY lower(display_name), lower(user_name)";
+ }
}