Mholloway has uploaded a new change for review.
https://gerrit.wikimedia.org/r/230129
Change subject: WIP: Add db query support for null selection arguments
......................................................................
WIP: Add db query support for null selection arguments
This (WIP, POC) patch allows deleting saved pages singly whether they are
in mainspace (i.e., have a NULL value stored in the db as their namespace)
or they are in another namespace. It does this by implementing a fallback
query selecting for namespace IS NULL if a null value is passed in as a
selection argument.
(Unfortunately, it doesn't immediately update the saved pages fragment to
reflect the deletion, for reasons I haven't yet discovered, and I also
haven't found the incantation to make it do so. But they're really being
deleted!)
This approach could be generalized to anywhere we're currently able to
properly handle either mainspace or non-mainspace entries, but not both --
which I believe is every context in which we store page data in the DB.
Bug: T102293
Change-Id: I7f310b298c6f1ddfa263f2682b58622c1b99c261
---
M app/src/main/java/org/wikipedia/data/ContentPersister.java
M app/src/main/java/org/wikipedia/data/PersistenceHelper.java
M app/src/main/java/org/wikipedia/savedpages/DeleteSavedPageTask.java
M app/src/main/java/org/wikipedia/savedpages/SavedPagePersistenceHelper.java
4 files changed, 49 insertions(+), 4 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/android/wikipedia
refs/changes/29/230129/1
diff --git a/app/src/main/java/org/wikipedia/data/ContentPersister.java
b/app/src/main/java/org/wikipedia/data/ContentPersister.java
index 8102ba5..87a4a38 100644
--- a/app/src/main/java/org/wikipedia/data/ContentPersister.java
+++ b/app/src/main/java/org/wikipedia/data/ContentPersister.java
@@ -2,8 +2,12 @@
import android.content.ContentProviderClient;
import android.database.Cursor;
+import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.RemoteException;
+import android.util.Log;
+
+import org.wikipedia.WikipediaApp;
public abstract class ContentPersister<T> {
private final ContentProviderClient client;
@@ -82,8 +86,44 @@
}
-
public void cleanup() {
this.client.release();
}
+
+ public void deleteRawWithNamespace(String tableName, String
primaryKeySelection, String[] primaryKeySelectionArgs) {
+ SQLiteDatabase db =
WikipediaApp.getInstance().getDbOpenHelper().getWritableDatabase();
+ String rawQuery = "DELETE FROM " + tableName + " WHERE " +
constructQueryArgs(primaryKeySelection, primaryKeySelectionArgs);
+ Log.d("PersistenceHelperTest", "Executing: " + rawQuery);
+ db.execSQL(rawQuery);
+ if (hasNullSelectionArgument(primaryKeySelectionArgs)) {
+ String fallbackRawQuery = "DELETE FROM " + tableName + " WHERE " +
constructQueryArgs(primaryKeySelection, primaryKeySelectionArgs, true);
+ Log.d("PersistenceHelperTest", "Executing: " + fallbackRawQuery);
+ db.execSQL(fallbackRawQuery);
+ }
+ }
+
+ private String constructQueryArgs(String primaryKeySelection, String[]
primaryKeySelectionArgs) {
+ return constructQueryArgs(primaryKeySelection,
primaryKeySelectionArgs, false);
+ }
+
+ private String constructQueryArgs(String primaryKeySelection, String[]
primaryKeySelectionArgs, boolean isNullNamespaceFallbackQuery) {
+ String queryArgsString = primaryKeySelection;
+ for (int i = 0; i < primaryKeySelectionArgs.length; i++) {
+ if (isNullNamespaceFallbackQuery && primaryKeySelectionArgs[i] ==
null) {
+ queryArgsString = queryArgsString.replaceFirst("= \\?", "IS
NULL");
+ } else {
+ queryArgsString = queryArgsString.replaceFirst("\\?", "\"" +
primaryKeySelectionArgs[i] + "\"");
+ }
+ }
+ return queryArgsString;
+ }
+
+ private boolean hasNullSelectionArgument(String[] primaryKeySelectionArgs)
{
+ for (String arg : primaryKeySelectionArgs) {
+ if (arg == null) {
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/app/src/main/java/org/wikipedia/data/PersistenceHelper.java
b/app/src/main/java/org/wikipedia/data/PersistenceHelper.java
index 5ca541c..3dfaed4 100644
--- a/app/src/main/java/org/wikipedia/data/PersistenceHelper.java
+++ b/app/src/main/java/org/wikipedia/data/PersistenceHelper.java
@@ -7,6 +7,8 @@
import android.text.TextUtils;
import android.util.Log;
+import org.wikipedia.WikipediaApp;
+
import java.util.ArrayList;
import java.util.Arrays;
diff --git
a/app/src/main/java/org/wikipedia/savedpages/DeleteSavedPageTask.java
b/app/src/main/java/org/wikipedia/savedpages/DeleteSavedPageTask.java
index b74fd1f..8b00b90 100644
--- a/app/src/main/java/org/wikipedia/savedpages/DeleteSavedPageTask.java
+++ b/app/src/main/java/org/wikipedia/savedpages/DeleteSavedPageTask.java
@@ -1,6 +1,8 @@
package org.wikipedia.savedpages;
import android.content.Context;
+import android.util.Log;
+
import org.wikipedia.WikipediaApp;
import org.wikipedia.concurrency.SaneAsyncTask;
@@ -18,7 +20,7 @@
public Boolean performTask() throws Throwable {
savedPage.deleteFromFileSystem();
SavedPagePersister persister = (SavedPagePersister)
app.getPersister(SavedPage.class);
- persister.delete(savedPage);
+
persister.deleteRawWithNamespace(SavedPage.PERSISTENCE_HELPER.getTableName(),
SavedPage.PERSISTENCE_HELPER.getPrimaryKeySelection(),
SavedPage.PERSISTENCE_HELPER.getPrimaryKeySelectionArgs(savedPage));
WikipediaApp.getInstance().getFunnelManager().getSavedPagesFunnel(savedPage.getTitle().getSite()).logDelete();
return true;
}
diff --git
a/app/src/main/java/org/wikipedia/savedpages/SavedPagePersistenceHelper.java
b/app/src/main/java/org/wikipedia/savedpages/SavedPagePersistenceHelper.java
index d3d5d96..c087780 100644
--- a/app/src/main/java/org/wikipedia/savedpages/SavedPagePersistenceHelper.java
+++ b/app/src/main/java/org/wikipedia/savedpages/SavedPagePersistenceHelper.java
@@ -68,14 +68,15 @@
@Override
protected String getPrimaryKeySelection() {
- return COL_SITE + " = ? AND " + COL_TITLE + " = ?";
+ return COL_SITE + " = ? AND " + COL_NAMESPACE + " = ? AND " +
COL_TITLE + " = ?";
}
@Override
protected String[] getPrimaryKeySelectionArgs(SavedPage obj) {
return new String[] {
obj.getTitle().getSite().getDomain(),
- obj.getTitle().getPrefixedText()
+ obj.getTitle().getNamespace(),
+ obj.getTitle().getText()
};
}
}
--
To view, visit https://gerrit.wikimedia.org/r/230129
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I7f310b298c6f1ddfa263f2682b58622c1b99c261
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits