|
21 | 21 | import static com.google.firebase.firestore.util.Util.repeatSequence;
|
22 | 22 |
|
23 | 23 | import android.database.Cursor;
|
24 |
| -import android.util.Log; |
25 | 24 | import androidx.annotation.NonNull;
|
26 | 25 | import androidx.annotation.VisibleForTesting;
|
27 | 26 | import com.google.firebase.Timestamp;
|
@@ -378,58 +377,58 @@ void add(String path, int readTimeSeconds, int readTimeNanos, MutableDocument do
|
378 | 377 | }
|
379 | 378 |
|
380 | 379 | BackfillResult backfill(SQLitePersistence db) {
|
381 |
| - ArrayList<String> caseClauses = new ArrayList<>(); |
382 |
| - ArrayList<Object> caseClauseBindings = new ArrayList<>(); |
383 |
| - ArrayList<String> whereClauses = new ArrayList<>(); |
384 |
| - ArrayList<Object> whereClauseBindings = new ArrayList<>(); |
| 380 | + StringBuilder caseClauses = new StringBuilder(); |
| 381 | + StringBuilder whereClauses = new StringBuilder(); |
| 382 | + ArrayList<Object> bindings = new ArrayList<>(); |
385 | 383 |
|
386 | 384 | Iterator<BackfillKey> backfillKeys = documentTypeByBackfillKey.keySet().iterator();
|
387 |
| - while (backfillKeys.hasNext() |
388 |
| - && caseClauseBindings.size() + whereClauseBindings.size() < 900) { |
| 385 | + while (backfillKeys.hasNext() && bindings.size() < SQLitePersistence.LongQuery.LIMIT) { |
389 | 386 | BackfillKey backfillKey = backfillKeys.next();
|
390 | 387 | DocumentType documentType = documentTypeByBackfillKey.remove(backfillKey);
|
391 | 388 | if (documentType == null) {
|
392 | 389 | continue;
|
393 | 390 | }
|
394 | 391 |
|
395 |
| - caseClauses.add("WHEN path=? AND read_time_seconds=? AND read_time_nanos=? THEN ?"); |
396 |
| - caseClauseBindings.add(backfillKey.path); |
397 |
| - caseClauseBindings.add(backfillKey.readTimeSeconds); |
398 |
| - caseClauseBindings.add(backfillKey.readTimeNanos); |
399 |
| - caseClauseBindings.add(documentType.dbValue); |
400 |
| - |
401 |
| - whereClauses.add("(path=? AND read_time_seconds=? AND read_time_nanos=?)"); |
402 |
| - whereClauseBindings.add(backfillKey.path); |
403 |
| - whereClauseBindings.add(backfillKey.readTimeSeconds); |
404 |
| - whereClauseBindings.add(backfillKey.readTimeNanos); |
405 |
| - } |
406 |
| - |
407 |
| - if (!caseClauseBindings.isEmpty()) { |
408 |
| - String sql; |
409 |
| - { |
410 |
| - StringBuilder sb = new StringBuilder("UPDATE remote_documents SET document_type = CASE"); |
411 |
| - for (String caseClause : caseClauses) { |
412 |
| - sb.append(' ').append(caseClause); |
413 |
| - } |
414 |
| - sb.append(" ELSE NULL END WHERE "); |
415 |
| - boolean isFirstWhereClause = true; |
416 |
| - for (String whereClause : whereClauses) { |
417 |
| - if (isFirstWhereClause) { |
418 |
| - isFirstWhereClause = false; |
419 |
| - } else { |
420 |
| - sb.append(" OR "); |
421 |
| - } |
422 |
| - sb.append(whereClause); |
423 |
| - } |
424 |
| - sql = sb.toString(); |
| 392 | + bindings.add(backfillKey.path); |
| 393 | + int pathBindingNumber = bindings.size(); |
| 394 | + bindings.add(backfillKey.readTimeSeconds); |
| 395 | + int readTimeSecondsBindingNumber = bindings.size(); |
| 396 | + bindings.add(backfillKey.readTimeNanos); |
| 397 | + int readTimeNanosBindingNumber = bindings.size(); |
| 398 | + bindings.add(documentType.dbValue); |
| 399 | + int dbValueBindingNumber = bindings.size(); |
| 400 | + |
| 401 | + caseClauses |
| 402 | + .append(" WHEN path=?") |
| 403 | + .append(pathBindingNumber) |
| 404 | + .append(" AND read_time_seconds=?") |
| 405 | + .append(readTimeSecondsBindingNumber) |
| 406 | + .append(" AND read_time_nanos=?") |
| 407 | + .append(readTimeNanosBindingNumber) |
| 408 | + .append(" THEN ?") |
| 409 | + .append(dbValueBindingNumber); |
| 410 | + |
| 411 | + if (whereClauses.length() > 0) { |
| 412 | + whereClauses.append(" OR"); |
425 | 413 | }
|
| 414 | + whereClauses |
| 415 | + .append(" (path=?") |
| 416 | + .append(pathBindingNumber) |
| 417 | + .append(" AND read_time_seconds=?") |
| 418 | + .append(readTimeSecondsBindingNumber) |
| 419 | + .append(" AND read_time_nanos=?") |
| 420 | + .append(readTimeNanosBindingNumber) |
| 421 | + .append(')'); |
| 422 | + } |
426 | 423 |
|
427 |
| - caseClauseBindings.addAll(whereClauseBindings); |
428 |
| - Object[] bindings = caseClauseBindings.toArray(); |
429 |
| - |
430 |
| - Log.i("zzyzx", "sql=sql"); |
431 |
| - |
432 |
| - db.execute(sql, bindings); |
| 424 | + if (!bindings.isEmpty()) { |
| 425 | + String sql = |
| 426 | + "UPDATE remote_documents SET document_type = CASE" |
| 427 | + + caseClauses |
| 428 | + + " ELSE NULL END WHERE" |
| 429 | + + whereClauses; |
| 430 | + android.util.Log.i("zzyzx", sql); |
| 431 | + db.execute(sql, bindings.toArray()); |
433 | 432 | }
|
434 | 433 |
|
435 | 434 | return documentTypeByBackfillKey.isEmpty()
|
|
0 commit comments