|
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