Skip to content
This repository was archived by the owner on Aug 17, 2020. It is now read-only.

Commit 91807ff

Browse files
committed
Merge pull request #87 from square/jw/log-when-query-runs-with-times
Switch logging to happen at query run, not trigger. Add timing.
2 parents 8bc1876 + 43edb48 commit 91807ff

2 files changed

Lines changed: 37 additions & 17 deletions

File tree

sqlbrite/src/main/java/com/squareup/sqlbrite/BriteContentResolver.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
import static com.squareup.sqlbrite.SqlBrite.Logger;
3535
import static com.squareup.sqlbrite.SqlBrite.Query;
36+
import static java.lang.System.nanoTime;
37+
import static java.util.concurrent.TimeUnit.NANOSECONDS;
3638

3739
/**
3840
* A lightweight wrapper around {@link ContentResolver} which allows for continuously observing
@@ -80,19 +82,24 @@ public QueryObservable createQuery(@NonNull final Uri uri, @Nullable final Strin
8082
final String sortOrder, final boolean notifyForDescendents) {
8183
final Query query = new Query() {
8284
@Override public Cursor run() {
83-
return contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
85+
long startNanos = nanoTime();
86+
Cursor cursor = contentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
87+
long tookMillis = NANOSECONDS.toMillis(nanoTime() - startNanos);
88+
89+
if (logging) {
90+
log("QUERY (%sms)\n uri: %s\n projection: %s\n selection: %s\n selectionArgs: %s\n "
91+
+ "sortOrder: %s\n notifyForDescendents: %s", tookMillis, uri,
92+
Arrays.toString(projection), selection, Arrays.toString(selectionArgs), sortOrder,
93+
notifyForDescendents);
94+
}
95+
96+
return cursor;
8497
}
8598
};
8699
OnSubscribe<Query> subscribe = new OnSubscribe<Query>() {
87100
@Override public void call(final Subscriber<? super Query> subscriber) {
88101
final ContentObserver observer = new ContentObserver(contentObserverHandler) {
89102
@Override public void onChange(boolean selfChange) {
90-
if (logging) {
91-
log("QUERY\n uri: %s\n projection: %s\n selection: %s\n selectionArgs: %s\n "
92-
+ "sortOrder: %s\n notifyForDescendents: %s", uri,
93-
Arrays.toString(projection), selection, Arrays.toString(selectionArgs), sortOrder,
94-
notifyForDescendents);
95-
}
96103
subscriber.onNext(query);
97104
}
98105
};

sqlbrite/src/main/java/com/squareup/sqlbrite/BriteDatabase.java

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@
4343
import static android.database.sqlite.SQLiteDatabase.CONFLICT_NONE;
4444
import static android.database.sqlite.SQLiteDatabase.CONFLICT_REPLACE;
4545
import static android.database.sqlite.SQLiteDatabase.CONFLICT_ROLLBACK;
46+
import static java.lang.System.nanoTime;
4647
import static java.lang.annotation.RetentionPolicy.SOURCE;
48+
import static java.util.concurrent.TimeUnit.NANOSECONDS;
4749

4850
/**
4951
* A lightweight wrapper around {@link SQLiteOpenHelper} which allows for continuously observing
5052
* the result of a query. Create using a {@link SqlBrite} instance.
5153
*/
5254
public final class BriteDatabase implements Closeable {
53-
private static final Set<String> INITIAL_TRIGGER = Collections.singleton("<initial>");
54-
5555
private final SQLiteOpenHelper helper;
5656
private final SqlBrite.Logger logger;
5757

@@ -285,7 +285,17 @@ private QueryObservable createQuery(final Func1<Set<String>, Boolean> tableFilte
285285
if (transactions.get() != null) {
286286
throw new IllegalStateException("Cannot execute observable query in a transaction.");
287287
}
288-
return getReadableDatabase().rawQuery(sql, args);
288+
289+
long startNanos = nanoTime();
290+
Cursor cursor = getReadableDatabase().rawQuery(sql, args);
291+
long tookMillis = NANOSECONDS.toMillis(nanoTime() - startNanos);
292+
293+
if (logging) {
294+
log("QUERY (%sms)\n tables: %s\n sql: %s\n args: %s", tookMillis, tableFilter, sql,
295+
Arrays.toString(args));
296+
}
297+
298+
return cursor;
289299
}
290300

291301
@Override public String toString() {
@@ -295,16 +305,12 @@ private QueryObservable createQuery(final Func1<Set<String>, Boolean> tableFilte
295305

296306
Observable<Query> queryObservable = triggers //
297307
.filter(tableFilter) // Only trigger on tables we care about.
298-
.startWith(INITIAL_TRIGGER) // Immediately execute the query for initial value.
299308
.map(new Func1<Set<String>, Query>() {
300309
@Override public Query call(Set<String> trigger) {
301-
if (logging) {
302-
log("QUERY\n trigger: %s\n tables: %s\n sql: %s\n args: %s", trigger, tableFilter,
303-
sql, Arrays.toString(args));
304-
}
305310
return query;
306311
}
307312
}) //
313+
.startWith(query) // Immediately trigger the query for initial value.
308314
.onBackpressureLatest() //
309315
.doOnSubscribe(new Action0() {
310316
@Override public void call() {
@@ -324,8 +330,15 @@ private QueryObservable createQuery(final Func1<Set<String>, Boolean> tableFilte
324330
*/
325331
@CheckResult // TODO @WorkerThread
326332
public Cursor query(@NonNull String sql, @NonNull String... args) {
327-
if (logging) log("QUERY\n sql: %s\n args: %s", sql, Arrays.toString(args));
328-
return getReadableDatabase().rawQuery(sql, args);
333+
long startNanos = nanoTime();
334+
Cursor cursor = getReadableDatabase().rawQuery(sql, args);
335+
long tookMillis = NANOSECONDS.toMillis(nanoTime() - startNanos);
336+
337+
if (logging) {
338+
log("QUERY (%sms)\n sql: %s\n args: %s", tookMillis, sql, Arrays.toString(args));
339+
}
340+
341+
return cursor;
329342
}
330343

331344
/**

0 commit comments

Comments
 (0)